下面分析一下5种基本模型的区别:
·阻塞式IO;
·非阻塞使IO;
·IO复用
·信号驱动式IO
·异步IO
一个输入操作通常包含两个不同的阶段
(1)等待数据准备好
(2)从内核向进程复制数据
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待的分组到达时,它被复制到内核的某个缓冲区中。第二步就是把数据从内核缓冲区复制到应用进程的缓冲区
1.阻塞式I/O模型
进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回
2.非阻塞式I/O模型
当进程把一个套接字设置为非阻塞时是通知内核:当所请求的I/O操作非得把进程投入睡眠时,不要将其投入睡眠,而是返回一个错误。
3.I/O复用模型
有了IO复用,我们可以使用epoll或select,阻塞在这两个系统调用之上,而不是阻塞在真正的I/O系统调用之上。
我们阻塞于select调用,等待数据报套接字变为可读
4. 信号驱动式模型
让内核在描述符就绪时发送SIGIO信号通知我们
我们既可以在信号处理函数中调用recvfrom读取数据报,也可以立即通知主循环,让它读数据
5. 异步I/O模型
工作机制:告知内核启动某个操作,并让内核在整个操作(包括数据从内核复制到我们自己的缓冲区)完成后通知我们
信号驱动模式是由内核通知我们何时启动一个IO操作,而异步I/O模型是由内核通知我们I/O操作何时完成
6.各种I/O模型的比较
·同步I/O操作:导致请求进程阻塞,直到I/O完成
·异步I/O操作:不导致请求进程阻塞
上述的前四种模型都是同步I/O模型,因为其中真正的IO操作将阻塞进程。