I/O模型的种类
阻塞式I/O、非阻塞式I/O、I/O复用(select, poll)、信号驱动式I/O(SIGIO)、异步I/O
一个输入操作通常包括两个不同的阶段:
(1)等待数据准备好
(2)从内核向进程复制数据
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区.
1.阻塞式I/O模型
默认情况下,所有的套接字都是阻塞的。以数据报套接字为例,阻塞式I/O如下图所示。
阻塞式I/O模型进程从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据。
2.非阻塞式I/O模型
进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成,不要把本进程投入睡眠,而是返回一个错误。(???怎么理解???)
非阻塞式I/O模型当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,我们称之为轮询(polling)。应用进程持续轮询内核,以查看某个操作是否就绪,这么做往往耗费大量的cpu时间。
3.I/O复用模型
有了I/O复用(I/O multiplexing),就可以使用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。
I/O复用模型比较阻塞式I/O模型与I/O复用模型,I/O复用看起来并没有显出什么优势,事实上由于使用select需要两个而不是单个系统调用,I/O复用还稍微有劣势。但是,使用select的优势在于我们可以等待多个描述符就绪。
注:与I/O复用密切相关的另一种I/O模型是在多线程中使用阻塞式I/O,这种模型与上述模型极为相似,但是它没有使用select阻塞在多个文件描述符上,而是,使用多线程(每个文件描述符一个线程),这样每个线程都可以自由的调用诸如recvfrom之类的阻塞式I/O系统调用了。
4.信号驱动式I/O模型
信号驱动式I/O模型5.异步I/O模型
异步I/O模型同步I/O与异步I/O对比
posix对这两个术语定义:
同步I/O操作:导致请求线程阻塞,直到I/O操作完成;
异步I/O操作:不导致请求线程阻塞。
5种I/O模型的比较根据上述定义,前四种模型——阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型和信号驱动式I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom)将阻塞进程。只有异步I/O模型与POSIX定义的异步I/O相匹配。
注:摘抄自——UNIX网络编程卷一:套接字联网API(第三版)
网友评论