现在的位置: 首页 > 综合 > 正文

unp笔记三 IO复用基础概念

2017年10月28日 ⁄ 综合 ⁄ 共 965字 ⁄ 字号 评论关闭

IO复用的使用场合

客户端

客户处理多个描述符(交互式输入和网络套接字),或者客户处理多个套接字

服务器

服务器处理监听套接字和已连接套接字,处理TCP和UDP,或者处理多个协议多个服务等

理解IO中的简单例子,读数据,两个阶段

1 等待数据准备好(数据从网络中到达内核缓冲区)

2 从内核缓冲区向应用进程缓冲区复制数据

UNIX下的IO模型

阻塞式IO

进程调用recvfrom,从调用recvfrom开始到数据报到达,到被复制到应用进程缓冲区中,recvfrom才返回
当然中间要是发生错误(被信号中断)也会返回

非阻塞式IO

进程把一个套接字设置成非阻塞是在通知内核:当请求的IO操作非得把本进程投入睡眠(阻塞起来)才能完成时,不要这样做,而是马上返回一个错误。
当把套接字设置成非阻塞时,调用recvfrom,在没有数据可以返回时,内核立即返回一个EWOULDBLOCK。
当内核中的数据准备好时,将数据复制到用户空间,这段时间是在recvfrom中要消耗的。
非阻塞IO往往消耗大量CPU。

IO复用

不要把IO复用看成神,其实它和阻塞IO还挺像的。select的优势在于我们可以同时等待多个描述符就绪。阻塞式IO只能同一时刻等待一个描述符,如果我们在多线程中使用阻塞式IO,则与IO复用非常相似。
我们举个往套接字上读的例子:1、进程阻塞中select上,等待内核准备好数据,当套接字可读,select返回
2、接着可以调用recvfrom,将数据从内核复制到用户进程缓冲区

信号驱动式IO

首先开启套接字的信号驱动式IO功能,安装自己建立SIGIO的信号处理函数。系统调用立即返回,进程继续工作,当数据准备好时,内核发送SIGIO信号给进程。在没收到信号的这段时间,我们各忙各的。收到信号后,再调用读写函数。

异步IO

说了那么久,现在才说异步IO,这么说,刚刚写的,以上的4中IO模型都不是异步IO,都是同步IO!
那样的话,什么才叫同步IO,什么叫异步IO?
异步IO:在IO操作过程中,不导致进程阻塞
同步IO:导致进程阻塞,直至IO操作完成。
以上4中IO,在最终从内核复制数据到进程空间时,都是要调用读写函数,并且会导致进程阻塞在此复制过程中。
这么说,异步IO就相当厉害了。所有事情完成后再通知进程,异步IO直接自己处理好2个阶段。阶段?什么阶段?看上面讲的。。。。

抱歉!评论已关闭.