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的系统会逐渐占有更多的比例,并且逐步取代现有的…

Oracle解析XML 节点信息并转换String 类型

select xmltype(dataxml).extract(/data/sqr_mc/text()).getstringval() as sqrmc from table_name --- dataxml其中的一个字段名里面包含有xml数据类型的字段名转载于:https://www.cnblogs.com/auldlangsynezh/p/8178196.html

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

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

js删除数组中的元素

js删除数组中的元素delete和splice的区别 例如有一个数组是 :var textArr [a,b,c,d]; 这时我想删除这个数组中的b元素: 方法一:delete 删除数组 delete textArr[1] 结果为: ["a",undefined,"c","d"…

linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md

野指针概述野指针通常指的是指针变量中保存的值不会死一个合法的内存地址,但又对其访问。需要注意的是野指针不是空指针,而是指向内存不可用的指针。C语言中对于空指针(NULL)是可以判断出来的,但是野指针是无法判断一个非空指针是否为野指针。…

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

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

通达OA general/appbuilder/web/portal/gateway/moare接口存在反序列化漏洞 附POC软件

@[toc] 通达OA general/appbuilder/web/portal/gateway/moare接口存在反序列化漏洞 附POC软件 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与…

谈谈两种标准库类型---string和vector

两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列。 一、标准库类型string 1.定义和初始化string对象:初始化string对象的方式有 strin…

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数据库运维人员,第一反应,应该就是上报,然后联系开发人员,确认此表作用,然后再确定恢复方案。在这里举一个…

天龙架设linux环境配置,《果子资源》-天龙八部-手工纯端架设教程 - T-天龙八部 - Powered by Discuz!...

宝塔纯端架设天龙八部3D教程1.我这边使用CENOTS7 系统(6系统没时间测试)2.安装宝塔3.进入宝塔 安装MySQL5.5(我这边测试MYSQL 5.7 会创建不了角色) PHP 和NGINX3.进入SSH 输入yum install unixODBC -y4. 添加mysql账号账号: app_mtlbb密码: dskfjl29091dfk导入sql目录里的数据库…

mac安装需要的骚操作

显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool true; KillAll Finder 允许任何来源sudo spctl --master-disable 安装command line toolsxcode-select --install 使用locatesudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.pl…

自动打包linux,Linux环境下Springboot自动打包发布功能

实现核心功能:完成Linux环境下Springboot自动打包发布功能详细功能:自动更新Svn最新代码删除原有打包文件自动打包将打包之后的项目文件复制到其他服务器关闭本地项目进程重新启动本地项目服务使用到的相关技术:SVN,Maven&#xf…

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

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

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

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

什么端口可以抓LINUX,linux下开启某个端口的方法:可用于SQL

php生成随机字符串SDUST 软件工程2016-作业4-A 百钱买鸡问题解决百钱买鸡问题原本并不困难,关键的是这道题对其进行了升级,测试数据太大,传统的解法,像三重循环,二重循环都会导致超时. 这道题正确的解法应该是结合数学方程进行化简,将其转化为1层循环: xyz ...BootStrap最常用的…

azure linux 磁盘,在Azure Linux VM中,还有什么?什么磁盘收费?

MikeWo..7我还没有使用过Linux的IaaS实例,但我想我可以根据我对基础设施如何工作的理解来回答其中一些问题.当您创建VM时,您拥有操作系统磁盘(它映射到上面的根目录,我相信启动也可以,但我认为这是一个基于Linux的工件,并且在使用Windows时不存在).此OS磁盘作为VHD,页面BLOB存储…