码迷,mamicode.com
首页 > 其他好文 > 详细

I/O复用

时间:2017-12-03 00:30:51      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:场景   成功   函数   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模型

I/O复用(select和poll)

信号驱动式I/O模型

异步I/O模型

 

什么叫数据准备好?

数据准备分两个阶段:1、等待网络数据到达,数据被复制到内核缓冲区,即内核空间;2、把内核数据复制到用户进程缓冲区,即用户空间

 

阻塞式I/O模型

以recvfrom系统调用为例,用户调用recvfrom,然后切换到内核态,内核等待数据到来,此时有可能阻塞(如果网络数据还没到达的话)。然后网络数据到达后将内核缓冲区数据复制到用户空间,返回成功。这时候从内核态再切换到用户态,处理数据报。

技术分享图片

类似这种进程一直等待数据到来,从系统调用开始到它返回,整段时间是被阻塞的。成功返回后开始处理数据报。 (进程等待的时候是被挂起休眠么?还是在干嘛?

非阻塞式I/O模型

把一个套接字或FD设置为非阻塞,就是通知内核,当数据没准备好时,返回一个错误,而不是一直等待。 如果有数据准备好,则复制到用户空间并返回成功指示。

技术分享图片

常见的用法是用一个循环去不断的调用recvfrom,去查看属否有数据准备好,这种方式被称为轮询(polling)。应用进程持续轮询内核,这么做消耗大量CPU资源。所以这种模型很少见。

I/O复用模型

有了I/O复用,如select,poll,我们就可以调用select或者poll,阻塞在这两个系统调用上,而不是阻塞在真正的I/O系统调用上。

技术分享图片

我们调用select,等待fd或者socket变为可读。当select返回套接字可读这一条件时,我们再调用recvfrom把所有可读数据从内核复制到用户空间。 

信号驱动式I/O模型

 

异步I/O模型

 

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

 同步I/O操作:请求导致进程阻塞,直到I/O操作完成;

异步I/O操作:不导致进程阻塞。

select函数

 

I/O复用

标签:场景   成功   函数   tip   这一   alt   i/o模型   驱动   span   

原文地址:http://www.cnblogs.com/howo/p/7956436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!