二、UNIX网络I/O模型:
1)阻塞I/O模型(单操作而言)
等待数据阶段和拷贝数据阶段都是阻塞的。
2)非阻塞I/O模型(单操作而言)
等待数据阶段是非阻塞的(不让线程休眠),而拷贝数据仍然是阻塞的。
可以不断访问其状态(可读可写可连接),对成功与失败马上作出应对操作。
3)I/O复用模型(多操作而言)
等待数据阶段selector阻塞的,而拷贝数据仍然是阻塞的。
4)信号驱动I/O模型(单操作而言)
等待数据阶段是非阻塞的(不让线程休眠),而拷贝数据仍然是阻塞的。
5)异步I/O模型(单操作而言)
等待数据与数据拷贝的时候进程都无需阻塞。
问题一:I/O复用模型与阻塞I/O模型的区别?![]()
原理:I/O复用模型与阻塞I/O模型均在等待数据与拷贝数据中产生阻塞,复用模型使用了selector进行多操作的处理,可同时对多个IO
端口进行监听。
问题二:信号驱动I/O模型与非阻塞I/O模型的区别?
原理:信号驱动I/O模型与非阻塞I/O模型均是在等待数据阶段非阻塞,但信号驱动模型提供了信号提醒,当系统数据报准备好自动提醒
进程,而非阻塞模型则需要进程进行轮询。
问题三:异步I/O模型与信号驱动I/O模型区别?
原理:信号驱动I/O模型是何时可以开始进行I/O操作,而I/O操作时进程阻塞;而异步I/O模型是何时完成,故整个过程非阻塞。
6)I/O多路复用(selector与epoll):
Linux将存储器分为“内核空间”和“用户空间”
①selector:
1.单个进程打开的FD的FD_SETSIZE默认值为1024,也就是最大连接数为1024个客户端。(可修改宏重新编译内核,但网络效率会下降;也可以选择多进程方案解决,但进程间数据的交互非常麻烦)2.当有一个很大的socket集合,链路空闲时,每次调用会线性扫描全部的集合,导致效率呈现线性下降。3.需要把内核FD消息通知用户空间
②epoll:
1.支持一个进程打开的socket描述符(FD)不受限制(仅受限与操作系统的最大文件句柄)(1GB内存机器大概是10万个句柄)2.I/O效率不会随着FD数目的增加而线性下降(只对活跃socket进行操作)
3.使用mmap加速内核与用户空间的消息传递(内核和用户空间mmap同一个内存实现)
4.API更加简单(创建epoll描述符,添加监听事件、阻塞等待所监听事件的发生,关闭epoll描述符等)