关于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的阻塞时间了。

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

 

 

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于多进程、I/O多路复用和libevent开发服务器端有各自的优点和缺点,下面进行比较: 优点: 1. 多进程模型的优点: - 简单易用:多进程模型相对于多线程模型来说,编程更简单,容易理解和维护。 - 隔离性好:每个子进程都有独立的内存空间,进程之间不会相互影响。 - 可靠性高:一个子进程崩溃不会影响其他子进程的正常运行。 2. I/O多路复用的优点: - 高效性:通过使用I/O多路复用技术,可以同时监听多个文件描述符的可读/可写事件,减少系统调用的次数,提高服务器的性能。 - 节省资源:相比多线程或多进程模型,使用I/O多路复用可以减少线程或进程的创建和管理,从而节省系统资源。 - 简化编程:使用I/O多路复用可以简化服务器端的编程过程,减少编码工作量。 3. libevent库的优点: - 封装底层细节:libevent提供了对底层I/O多路复用机制的封装,屏蔽了不同操作系统之间的差异,让开发者能够更专注于业务逻辑的实现。 - 异步事件处理:libevent支持异步事件处理,能够处理大量的并发连接,并且能够高效地响应事件。 - 跨平台支持:libevent支持多个操作系统,可以在不同的平台上进行开发和部署。 缺点: 1. 多进程模型的缺点: - 资源消耗:每个子进程都需要占用一定的系统资源,包括内存和CPU资源。 - 进程间通信复杂:多进程模型需要进行进程间的通信和同步,这增加了编程的复杂性。 2. I/O多路复用的缺点: - 编程复杂性:相比于单线程模型,使用I/O多路复用需要更多的编程工作,对于初学者来说可能会有一定的学习曲线。 - 可读性降低:由于事件驱动的特性,代码逻辑可能会分散在多个事件回调函数中,可读性可能会降低。 3. libevent库的缺点: - 学习成本:使用libevent需要学习其提供的接口和使用方法,对于不熟悉的开发者来说可能需要一定时间来适应。 - 依赖性:使用libevent需要将其集成到项目中,可能会增加项目的依赖关系。 综上所述,基于多进程、I/O多路复用和libevent开发服务器端的优点是简单易用、高效节省资源、提供了高并发和跨平台支持。而缺点是资源消耗较大、编程复杂性较高、使用libevent需要学习和依赖。根据具体的应用场景和需求,选择合适的技术方案来开发服务器端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值