linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍

Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。

根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型。

1.1、阻塞I/O模型

最常用的I/O模型,默认情况下,所有文件操作都是阻塞的。

比如I/O模型下的套接字接口:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直等待。

进程在调用recvfrom开始到它返回的整段时间内都是被阻塞的,所以叫阻塞I/O模型。

图示:

872ba07f4fe9ae168eee5a1dac60b0d2.png

1.2、非阻塞I/O模型

recvfrom从应用层到内核的时候,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来。

图示:

10629378354b1abd229c8b932205eafa.png

1.3、I/O复用模型

Linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样,select/poll可以帮我们侦测多个fd是否处于就绪状态。

select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。

Linux还提供一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数rollback。

图示:

58c6078604ac8c4c9a84867a3309d5f8.png

1.4、信号驱动I/O模型

首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,非阻塞)。当数据准备就绪时,就为改进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理树立。

图示:

7de958e9176bf8b10b3729a10230f0a2.png

1.5、异步I/O

告知内核启动某个操作,并让内核在整个操作完成后(包括数据的复制)通知进程。

信号驱动I/O模型通知的是何时可以开始一个I/O操作,异步I/O模型有内核通知I/O操作何时已经完成。

图示:

2e91ed05380c53d44589a19a7dca160f.png

2、I/O多路复用技术

I/O编程中,需要处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。

正如前面的简介,I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。

与传统的多线程模型相比,I/O多路复用的最大优势就是系统开销小,系统不需要创建新的额外线程,也不需要维护这些线程的运行,降低了系统的维护工作量,节省了系统资源。

主要的应用场景:

服务器需要同时处理多个处于监听状态或多个连接状态的套接字。

服务器需要同时处理多种网络协议的套接字。

支持I/O多路复用的系统调用主要有select、pselect、poll、epoll。

而当前推荐使用的是epoll,优势如下:

支持一个进程打开的socket fd不受限制。

I/O效率不会随着fd数目的增加而线性下将。

使用mmap加速内核与用户空间的消息传递。

epoll拥有更加简单的API。

3、Java中的网络IO编程

如果只是做Java开发,以上内容只需了解即可,不必深究(随便说说而已)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10远程桌面连接_如何正确选择WIN10系统版本,Windows10系统各版本之间的区别...

截至2020年,Windows 10的市场份额达到了54.62%,成为了Windows家庭中占比最高的成员。微软也于2020年初对Windows 7做了不再进行技术支持的声明!毋庸置疑的是,Windows 10的系统会逐渐占有更多的比例,并且逐步取代现有的…

win10进程太多怎么优化_用过最好用的Win10优化软件,全方面优化和管理!

文 | Allen 主播 | 蓝儿喵本文首发:www.zylxb.comHi,大家好,欢迎来到:无优质,不分享!搜罗君的藏宝阁:优搜罗(id:usouluo),由于公众号改版,建议大家星标置顶…

vb.net怎么调用fastreport报表_财务分析-企业财务管理报表模板制作实现智能化的财务运营...

随着我国经济的不断发展,企业在市场环境中的竞争压力也越来越大,只有具备充足的活力和竞争力的企业才可以在竞争激烈的市场环境中处于不败之地。财务分析作为企业财务管理的重要手段之一,它能够为企业的一切财务活动提供必要的依据&#xff0…

linux编译ffmepg,在Ubuntu下编译FFmpeg

在之前,我们成功地使用mingwmsys在Windows平台下编译FFmpeg(见 http://www.linuxidc.com/Linux/2014-11/109839.htm),并生成了ffplay.exe。现在再在Ubuntu平台上重新编译一次。相对于在Windows平台上编译需要的旷日持久而且异常艰难的工作,Ub…

C++为什么空格无法输出_47个快捷键、50个CAD技巧,终于知道为什么别人用CAD总比我快了!...

终于知道为什么别人用CAD总比我快了,原来他们早就掌握了这些实用的CAD技巧,还没看完我就默默地转了,总有用得到的时候。47个快捷键1. 创建直线的快捷方式是L空格2. 创建圆的快捷方式是C空格3. 创建圆弧的快捷方式是A空格4. 创建矩形的快捷方式…

Flume环境搭建_五种案例(转)

Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example configuration file, describing a single-node Flume deployment. This configuration lets a user generate events and subsequently logs them to the con…

linux配置服务器超时退出,Linux下实现不活动用户登录超时后自动登出

摘要:方法一:通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件...方法一:通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件来实现。这两个文件选择其中一个…

只读属性怎么来的初值_设置Mysql表只读,关键时刻或许能救你一命

作为一名数据库运维人员,应该遇到过表记录被异常全表更新,这个时候该怎么办。作为Mysql数据库运维人员,第一反应,应该就是上报,然后联系开发人员,确认此表作用,然后再确定恢复方案。在这里举一个…

miui12怎么自定义开机动画_MIUI12正式发布:视觉/功能大升级

点击上方蓝字【安兔兔】关注我文章每天不断更!在今天下午举行的线上发布上,小米正式发布了MIUI12系统。从官方描述来看,MIUI12可以说是MIUI近几年来最重磅的一次更新,在UI界面、动画以及功能等方面都作出了升级。按照官方说法&…

已触发了一个断点 vs_VSCode源码分析-断点调试

背景今年年初,有幸参与了阿里集团IDE 共建项目组,打造阿里生态体系内的公共IDE底层,而作为一款面向开发者的IDE,调试能力的支持一定程度上决定着一款IDE的开发体验;VSCode作为微软体系下一款当前最热的IDE开发工具&…

移动web——touch事件介绍

基本概念 1、在移动web端点击事件或者滑动屏幕、捏合等动作都是由touchstar、touchmove、touchend这三个事件组合在一起使用的 2、click事件在移动端会有0.2秒的延迟&#xff0c;下面是测试click在移动web端的延迟&#xff0c;最好在手机浏览器中测试 <script>window.onl…

如何计算一年总共有多少周_一年有几个周?怎么计算周数及闰年?

用这一年的天数除以7。因为一周有七天。分析过程如下&#xff1a;假设这一年是2018年&#xff0c;2018年是一个平年&#xff0c;因为2018/4504……2。平年的全年有365天&#xff0c;365752……1。由此可得2018年有52周多1天。扩展资料&#xff1a;闰年的计算方法&#xff1a;1、…

linux系统安装应用商店失败,在Deepin/UOS系统应用商店中安装KiCad失败的解决方法...

在Deepin/UOS系统应用商店中搜索并安装KiCad可能会提示安装失败&#xff0c;原因就是缺少必要的依赖包及KiCad的封装库文件。下面分享解决方法及附上Deepin系统安装KiCad5的方法。参考深度商店应用Inkscape、KiCad、MyPaint、中望CAD Linux预装版。解决方法在系统中通过终端执行…

linux ubantu扩展空间,ubuntu 扩展存储空间

今天解决了一个Ubuntu存储空间不足的问题。我在网上查了很多资料&#xff0c;都没有什么让我满意的方法。我是菜鸟级的用户&#xff0c;当然使用最菜的方法。以下是我的解决方案&#xff0c;供大家参考。方法步骤&#xff1a;第一步&#xff0c;在Ubuntu系统下&#xff0c;进入…

从使用到原理学习Java线程池

来源&#xff1a;SilenceDut http://www.codeceo.com/article/java-threadpool-learn.html线程池的技术背景 在面向对象编程中&#xff0c;创建和销毁对象是很费时间的&#xff0c;因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此&#xff0c;虚拟机将试图跟…

docker 镜像修改的配置文件自动还原_PVE部署LXC运行docker

PVE部署Ubuntu20.04 LXC容器用于安装docker&#xff0c;LXC部署完成后可以进行如下操作。1、PVE打开LXC的嵌套&#xff0c;不然运行docker会报错 https://lala.im/6793.htmlLXC需要勾选“无特权的容器”在创建完成后需要到“选项-签名”下勾选“嵌套”&#xff0c;这个主要是可…

linux下c 链接mongodb,Linux下mongoDB下载与安装

百度网盘下载&#xff1a;https://pan.baidu.com/s/1r0JoOtoYzJEC_HOe-NALwg 提取码&#xff1a;rm12 此处提供的是mongodb-linux-x86_64-4.0.11.tgz 版本java开发工具下载地址及安装教程大全&#xff0c;点这里。更多深度技术文章&#xff0c;在这里。二、安装1、上传到linux系…

oracle12 pl/sql

pl/sql块介绍 介绍 块(block)是pl/sql的基本程序单元&#xff0c;编写pl/sql程序实际上就是编写pl/sql块&#xff0c;要完成相对简单的应用功能&#xff0c;可能只需要编写一个pl/sql块&#xff0c;但是如果想要实现复杂的功能&#xff0c;可能需要在一个pl/sql块中嵌套其它的p…

注册登录页面代码用js判断是否填入信息_php实现登录功能

原文&#xff1a;https://blog.csdn.net/ccy1995414/article/details/80638685自然是从最简单的功能起步&#xff0c;我第一个任务选择了做一个登录操作&#xff0c;其实也没想象中那么简单。1.首先自然是连接和创建数据库这部分我写在model.php中$userNameroot;$passWord;$hos…

CAS单点登陆的两个原理图

最近学习CAS单点登录&#xff0c;所以在网上找了两张比较清晰的原理图以供参考&#xff1a; 【CAS浏览器请求认证序列图】 其中&#xff1a;* ST&#xff1a;Service Ticket&#xff0c;用于客户端应用持有&#xff0c;每个ST对应一个用户在一个客户端上* TGT&#xff1a;Tick…