LINUX教程:Linux下的I/O模型以及各自的优缺点
《LINUX教程:Linux下的I/O模型以及各自的优缺点》要点: 其实关于这方面的知识,我阅读的是《UNIX网络编程:卷一》,书里是以UNIX为中心展开描述的,根据这部门知识,在网上参考了部门资料.以Linux为中心整理了这篇博客. UNIX 收集编程(第2版)第1卷:套接口API和X/Open 传输接口API PDF? UNIX网络编程卷1:套接字联网API(第3版) 中文高清带完备书签 PDF? Linux的I/O模型和Unix的I/O模型根本一致,Linux下一共有5种I/O模型[1]
上面这个列表,算是绝大部门关于Linux I/O模型博客中都会贴出来的. 在上述5种I/O模子中,前4种,其实都可以划分为同步I/O方式,只有最有一种异步I/O模子才使用异步I/O方式. 行文须知下文中对各个模型的描述,都是使用数据报(UDP)套接字作为例子进行说明的. 一、阻塞式I/O通常我们使用的I/O都是阻塞式I/O,在编程时使用的年夜多数也是阻塞式I/O.在默认情况下,所有的套接字(socket)都是阻塞的.下图解释了阻塞式I/O模型的流程 上图中,我们说从调用recvfrom开始到它返回的整段时间内是被阻塞的,recvfrom胜利返回后,引用程序才开始处理数据报. 阻塞式I/O的优缺点优点:
二、非阻塞式I/O有阻塞I/O,那么也会有非阻塞I/O,在上文说过默认情况下,所有的套接字都是阻塞的,那么通过设置套接字的NONBLOCK(一般在 可以看到,前三次recvfrom时没有数据可以返回,此时内核不阻塞进程,转而立即返回一个EWOULDBLOCK差错.第四次调用recvfrom时已经有一个数据报准备好了,此时它将被复制到应用进程的缓冲区,于是recvfrom调用成功返回. 非阻塞式I/O的优缺点优点: 三、I/O复用模型上文中说到,在出现大量的链接时,使用多线程+阻塞I/O的编程模型会占用大量的内存.那么I/O复用技术在内存占用方面,就有着很好的控制. 那到底什么是I/O复用(I/O multiplexing).根据我的理解,复用指的是复用线程,从阻塞式I/O来看,基本一个套接字就占领了整个线程.例如当对一个套接字调用recvfrom调用时,整个线程将被阻塞挂起,直到数据报准备完毕. 线程将阻塞在上面的三个系统挪用中的某一个之上,而不是阻塞在真正的I/O系统挪用上.I/O复用允许对多个套接字进行监听,当有某个套接字准备就绪(可读/可写/异常)时,系统挪用将会返回. I/O复用模型的优缺点优点 四、信号驱动式I/O模子当然你可能会想到使用信号这一机制来避免I/O时线程陷入阻塞状态.那么内核开发者怎么可能会想不到.那么我们来看看信号驱动式I/O模子的具体流程 从上图可以看到,我们首先开启套接字的信号驱动式I/O功能,并通过sigaction系统调用来安装一个信号处理函数,我们进程不会被阻塞. 信号驱动式I/O模型的优缺点长处 稍微歇息一下,还记得我们前面说过这4种I/O模型都可以划分为同步I/O方式,那我们来看看为什么. 下面所说的异步I/O模型将会有所分歧 五、异步I/O模型异步I/O,是由POSIX规范定义的.这个规范定义了一些函数,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作完成后再通知我们.(包含将数据从内核复制到我们进程的缓冲区) 全程没有阻塞,真正做到了异步 but 异步I/O在Linux2.6才引入,并且到现在仍然未成熟. 引入异步I/O可能会代码难以理解的问题,这个站在软件工程的角度也是必要细细衡量的. 总结关于对Linux 的I/O模型的学习就写到这里,每个模型都有本身使用的范围 Talk is cheap,show me the code 参考文献
UNIX 网络编程(第2版)第1卷:套接口API和X/Open 传输接口API PDF? UNIX网络编程卷1:套接字联网API(第3版) 中文高清带完备书签 PDF? 本文永远更新链接地址: 欢迎参与《LINUX教程:Linux下的I/O模型以及各自的优缺点》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |