关于5种I/O模型的理解

在读《Netty权威指南》时,关于I/O模型的描述,个人感觉还是不是很容易理解。这里想用通俗一点的方式表达清楚。

关于I/O模型的发展这里不再描述,简要说明现在的几种I/O模型:

根据UNIX网络编程对I/O模型的分类,UNIX提供了5中I/O模型,分别如下:

1. 阻塞I/O模型

2. 非阻塞I/O模型

3. I/O复用模型

4. 信号驱动I/O模型

5. 异步I/O模型

具体的描述直接上书中的截图:

怎么理解呢?看文字描述,阻塞I/O模型,在套接字建立连接后,系统分配了一个进程用于接受这个套接字接口的信息,即数据,数据先从接口传入系统内核(我理解系统的内存区域),然后复制到应用程序的缓存区(用户空间)中,这个过程一直是阻塞的,即系统分配的进程一直挂起并等待这一过程。

打个比方:计算机相当于一个公司,分配的socket相当于一部电话,系统分配的进程(应用程序的线程)相当于接电话的员工,公司的日常工作时,接到电话会有人来送货,关键是从接到电话,到货物到达公司的院子(内核),这段时间也要保持电话连接,然后货物从公司的院子(内核)送到对应的仓库中(用户空间),在接到电话到货物送到仓库中这一时间段内,这位员工需要全程看护(阻塞),不能干其它事情。

这样看来,如果系统能养100个员工,那么最多一次只能处理100个送货的请求,而且货物如果比较多,员工会一直阻塞在那里,浪费了公司的人力资源(系统资源)

 

再来看看非阻塞I/O模型:

根据上面的例子,接下来这个是不是好理解一些了?

用阻塞式I/O的模式工作了一段时间,公司觉得这样处理效率很低,做了以下的优化:

 员工接到送货电话(连接),知道将要有货物过来,就隔一段时间跑出去看一眼就没有货物到院子(内核),如果没有,就回去继续工作,有的话再监护(阻塞)货物送到仓库(用户空间)的操作。

这样一来,在数据没有完全到达之前,进程就不用一直阻塞在那里了。

下面是第三种模型,I/O复用模型:

非阻塞式I/O的效率还是太低了,一个员工在收到送货请求以后才能开始另外一个送货请求。虽然货物没到院子之前他可以去干别的什么工作。

看这个图可以发现,在数据就绪(货物到达院子)的阶段,进程又是阻塞的了,那这个模型和阻塞I/O有什么区别呢?I/O复用,即一个线程可以同时处理多个连接,即一个员工,可以同时接收好几个送货的请求,接到请求后,他不会回去处理别的事情(阻塞),而是不停的查看哪个客户端的货物(数据)过来了(select/poll),然后在监护这些货物送到仓库中。还有另外一种工作方式,公司在院子里安装了一个门铃(事件通知),当货物送到院子里的时候,门铃会通知员工有货物到达(epoll)。

下面是信号驱动I/O模型:

信号驱动I/O模型,可以理解为,公司专门请了一个跑腿的,负责看管院子里是否有货物过来,员工接到电话后告诉跑腿的,xx货物来的时候告诉我一声,然后该干嘛干嘛去了,货物来的时候跑腿的就去找该员工,然后员工再继续监护这些货物送到仓库。

信号驱动I/O模型,让应用程序的线程再一次减少了阻塞时间,但是数据从内核到用户空间这段时间仍然是阻塞的,当然阻塞的时间相对来说大大减少了。

 

最后是异步I/O模型:

从描述来看,这些员工监护货物从院子到仓库这段阻塞时间都减少了,他接到电话,直接告诉跑腿的要放到xx仓库,放好了再通知我,然后员工几乎不再有I/O的阻塞时间了。

写到这,以上的理解或许对或许有些偏差,希望大家能够给与指正。

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章