(第6章)Unix网络编程卷1之select和poll函数

一、I/O复用

1.I/O复用的概念

(第6章)Unix网络编程卷1之select和poll函数

2.I/O复用的典型场景

(第6章)Unix网络编程卷1之select和poll函数

二、I/O模型

1.5种I/O模型简介与I/O操作必经的两阶段

(1)Unix下的5种I/O模型
(第6章)Unix网络编程卷1之select和poll函数
(第6章)Unix网络编程卷1之select和poll函数
(2)两阶段
(第6章)Unix网络编程卷1之select和poll函数

2.阻塞式I/O模型

(1)默认情况下,所有的套接字都是阻塞的。下面的eg是以UDP为例子。
(第6章)Unix网络编程卷1之select和poll函数

3.非阻塞式I/O模型

(1)进程把一个套接字设置成非阻塞,是在通知内核:当所有的I/O操作没有完成时,不要把本进程投入睡眠,而是返回一个错误。还是以UDP为例子。
(第6章)Unix网络编程卷1之select和poll函数

(2)轮询的简单含义?

(第6章)Unix网络编程卷1之select和poll函数
轮询还要结合下面select中的timeval结构体进行分析

4.I/O复用:select和poll

(1)I/O复用会阻塞在select和poll这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。下面以UDP为例子。
(第6章)Unix网络编程卷1之select和poll函数
(第6章)Unix网络编程卷1之select和poll函数

(2)I/O复用和多线程使用阻塞I/O的区别

(第6章)Unix网络编程卷1之select和poll函数

5.信号驱动式I/O模型

(1)通过信号,让内核在描述符就绪时,发送SIGIO信号来通知我们。以UDP为例子
(第6章)Unix网络编程卷1之select和poll函数

6.异步I/O模型:非阻塞

(1)异步I/O与信号驱动I/O的区别

信号驱动I/O是由内核通知我们何时可以启动一个I/O操作;
异步I/O是由内核通知我们I/O操作何时完成

(2)这些aio_read等异步函数的工作机制是:告知内核启动某个操作,并让内核在整个操作完成后通知我们 (包括数据从内核复制到我们自己的缓冲区)
(第6章)Unix网络编程卷1之select和poll函数

7.各种I/O模型的比较

  • 阻塞式I/O,非阻塞式I/O,I/O多路复用,信号驱动I/O主要区别在于第一阶段,他们的第二阶段是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用。
  • 异步I/O模型在这两个阶段都要处理,从而不同于其他4种模型。

8.同步I/O和异步I/O的对比

(第6章)Unix网络编程卷1之select和poll函数
(第6章)Unix网络编程卷1之select和poll函数

三、select函数

1.

(1)timeout参数

(2)readset,writeset和execeptset

2.描述符的就绪条件