1. I/O复用的原因及场景
之所以会进行I/O复用是因为不想让代码阻塞在某一个I/O相关的系统调用中。因此,只要是涉及到操作多个文件描述府的程序,都适合使用I/O复用。
2. 基本的I/O处理模型
2.1 阻塞式I/O
“一直等待,直至有数据返回”
最常见的I/O方式,在进行IO系统调用时,进程阻塞,直至系统调用完成返回,进程继续进行。例如,程序中调用recv函数,然后该进程阻塞在这里,直到recv函数返回,才继续执行下面的代码。
2.2 非阻塞式I/O
“即刻返回,没有数据时返回错误码,可由此构造轮询IO请求模型”
也可视为轮询请求IO的一种方式。即,当调用系统调用时,如果此时无数据可返回,则直接返回一个错误码。在编程时,可根据返回值判断,若为错误码则可使进程睡眠特定时间或做一些其他的事,然后再次请求IO,如此反复,直至有数据返回。由此,构成了一个轮询的IO请求。
2.3 I/O复用(select&poll)
“也是阻塞,但是是让程序阻塞在多个文件描述符上,而非一个”
通过使用select和poll,指定需要等待I/O的文件描述符,然后让进程阻塞在select上,之后,如果文件描述符集合中任意一个准备好,select会返回,程序继续执行。