关于I/O模型的记录

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(第三版)

你可能感兴趣的:(关于I/O模型的记录)