IO多路复用学习笔记(摘自网络)

一、I/O模型

首先,输入操作一般包含两个步骤:

1、等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区

2、将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。

二、I/O模型类型

其次了解一下五种I/O模型:

1、阻塞I/O模型

  最广泛的模型是阻塞I/O模型,默认情况下,所有套接口都是阻塞的。

  进程调用recvfrom系统调用,整个过程是阻塞的,直到数据复制到进程缓冲区时才返回(当然,系统调用被中断也会返回)。

IO多路复用学习笔记(摘自网络)

2、非阻塞I/O模型

  当我们把一个套接口设置为非阻塞时,就是在告诉内核,当请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。当数据没有准备好时,内核立即返回EWOULDBLOCK错误,第四次调用系统调用时,数据已经存在,这时将数据复制到进程缓冲区中。这其中有一个操作时轮询(polling)。

IO多路复用学习笔记(摘自网络)

3、I/O复用模型

  此模型用到select和poll函数,这两个函数也会使进程阻塞,select先阻塞,有活动套接字才返回,但是和阻塞I/O不同的是,这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写。select被调用后,进程会被阻塞,内核监视所有select负责的socket,当有任何一个socket的数据准备好了,select就会返回套接字可读,我们就可以调用recvfrom处理数据。

IO多路复用学习笔记(摘自网络)

4、信号驱动I/O模型(signal driven I/O, SIGIO)

  首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它来读取数据报。无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达(第一阶段)期间,进程可以继续执行,不被阻塞。免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。

IO多路复用学习笔记(摘自网络)

5、异步I/O模型(AIO, asynchronous I/O)

  进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

  这个模型工作机制是:告诉内核启动某个操作,并让内核在整个操作(包括第二阶段,即将数据从内核拷贝到进程缓冲区中)完成后通知我们。

这种模型和前一种模型区别在于:信号驱动I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。

IO多路复用学习笔记(摘自网络)

 

 相关网址:

http://www.sogou.com/labs/report/1-1.pdf

 

http://www.kegel.com/c10k.html

 

http://blog.csdn.net/shallwake/article/details/5265287

 

http://www.cppblog.com/sherrylso/archive/2007/07/01/27330.html

 

http://www.smithfox.com/?e=191

你可能感兴趣的:(学习笔记)