标签:场景 成功 函数 tip 这一 alt i/o模型 驱动 span
内核一旦发现进程指定的一个或者多个I/O条件就绪(也就是说输入已准备好被读取,或者描述符已能承受更多的输出),它就通知进程。这个能力称为I/O复用(I/O multiplexing)。
使用场景
当处理多个多个文件描述符或者监听多个socket时,必须使用I/O复用。
如果一个服务器要同时处理TCP和UDP,一般要使用I/O复用。
阻塞式I/O模型
非阻塞式I/O模型
I/O复用(select和poll)
信号驱动式I/O模型
异步I/O模型
什么叫数据准备好?
数据准备分两个阶段:1、等待网络数据到达,数据被复制到内核缓冲区,即内核空间;2、把内核数据复制到用户进程缓冲区,即用户空间。
以recvfrom系统调用为例,用户调用recvfrom,然后切换到内核态,内核等待数据到来,此时有可能阻塞(如果网络数据还没到达的话)。然后网络数据到达后将内核缓冲区数据复制到用户空间,返回成功。这时候从内核态再切换到用户态,处理数据报。
类似这种进程一直等待数据到来,从系统调用开始到它返回,整段时间是被阻塞的。成功返回后开始处理数据报。 (进程等待的时候是被挂起休眠么?还是在干嘛?)
把一个套接字或FD设置为非阻塞,就是通知内核,当数据没准备好时,返回一个错误,而不是一直等待。 如果有数据准备好,则复制到用户空间并返回成功指示。
常见的用法是用一个循环去不断的调用recvfrom,去查看属否有数据准备好,这种方式被称为轮询(polling)。应用进程持续轮询内核,这么做消耗大量CPU资源。所以这种模型很少见。
有了I/O复用,如select,poll,我们就可以调用select或者poll,阻塞在这两个系统调用上,而不是阻塞在真正的I/O系统调用上。
我们调用select,等待fd或者socket变为可读。当select返回套接字可读这一条件时,我们再调用recvfrom把所有可读数据从内核复制到用户空间。
同步I/O操作:请求导致进程阻塞,直到I/O操作完成;
异步I/O操作:不导致进程阻塞。
标签:场景 成功 函数 tip 这一 alt i/o模型 驱动 span
原文地址:http://www.cnblogs.com/howo/p/7956436.html