通俗易懂理解网络I/O模型

最近可能周志明老师写的《软件架构探索》,讲解网关路由章节很形象的解释了各种网络I/O模型,这里分享出来大家细品。

 

网路请求本质

    比如你发送一次百度搜索,从远程主机返回的数据会先存放到操作系统内核的缓冲区中,然后再从内核的缓冲区复制到应用程序的地址空间,所以当发生一次网络请求发生后,将会按顺序经历“等待数据从远程主机到达缓冲区”和“将数据从缓冲区拷贝到应用程序地址空间”两个阶段,根据实现这两个阶段的不同方法,可以分为同步I/O与异步I/O。

 

网络I/O模型

    同步I/O与异步I/O

 

异步I/O

   中午想吃饭了,美团外卖订了个外卖,付款之后你你就坐等外卖小哥的电话,你可以干其他事情。外卖送到外卖小哥会打电话通知里取餐。异步I/O中数据到达缓冲区后,不需要由调用进程主动进行从缓冲区复制数据的操作,而是复制完成后由操作系统向线程发送信号,所以它一定是非阻塞的。

 

同步I/O

同步I/O又分为4种

阻塞I/O

    你去到食堂打饭,发现饭还没做好,你也干不了别的,只能打个瞌睡(线程休眠),饭做好都会被被阻塞。阻塞I/O是最直观的I/O模型,逻辑清晰,也比较节省CPU资源,但缺点就是线程休眠所带来的上下文切换,这是一种需要切换到内核态的重负载操作,不应当频繁进行。

非阻塞I/O

    你去到食堂打饭,发现饭还没做好,你就回去了,然后每隔3分钟来一次食堂看饭做好了没,直到饭做好。非阻塞I/O能够避免线程休眠,对于一些很快就能返回结果的请求,非阻塞I/O可以节省切换上下文切换的消耗,但是对于较长时间才能返回的请求,非阻塞I/O反而会浪费CPU资源,所以目前并不常用。

I/O多路复用

    I/O多路复用本质上是阻塞I/O的一种,但是它的好处是可以在同一条阻塞线程上处理多个不同端口的监听。类比的情景是你名字叫雷锋,代表整个宿舍去食堂打饭,去了食堂发现饭还没做好,还是继续打瞌睡,如果有舍友的饭好了,你就马上把那份饭送回去,然后继续打着瞌睡等待其他的饭做好。I/O多路复用是目前高并发网络应用的主流,实现方式有select、epoll、kqueue等。

信号驱动I/O四种

    你去到食堂,发现饭还没做好,但你跟厨师熟,跟他说饭做好了叫你,然后回去继续做事,等收到厨师通知后,你把饭从食堂拿回宿舍。这里厨师的通知就是那个“信号”,信号驱动I/O与异步I/O的区别是“从缓冲区获取数据”这个步骤的处理,前者收到的通知是可以开始进行复制操作,即要你自己从食堂拿回宿舍,在复制完成之前线程处于阻塞状态,所以它仍属于同步I/O操作,而后者收到的通知是复制操作已经完成,即外卖小哥已经把饭送到了。

 

以上举例是不是通俗易懂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值