2、IO模型

一、阻塞IO(blocking io)

A拿着一支鱼竿在河边钓鱼,并且一直在鱼竿前等,在等的时候不做其他的事情,十分专心。只有鱼上钩的时,才结束掉等的动作,把鱼钓上来。

在内核将数据准备好之前,系统调用会一直等待所有的套接字。

二、非阻塞IO--NIO(noblocking io)

B也在河边钓鱼,但是B不想将自己的所有时间都花费在钓鱼上,在等鱼上钩这个时间段中,B也在做其他的事情(一会看看书,一会读读报纸,一会又去看其他人的钓鱼等),但B在做这些事情的时候,每隔一个固定的时间检查鱼是否上钩。一旦检查到有鱼上钩,就停下手中的事情,把鱼钓上来。

 备注:

(1)应用进程在等待数据期间非阻塞,但在复制数据期间也是阻塞的。

(2)轮寻对于CPU来说是较大的浪费,一般只有在特定的场景下才使用。

三、信号驱动IO(signal blocking I/O

C也在河边钓鱼,但与A、B不同的是,C比较聪明,他给鱼竿上挂一个铃铛,当有鱼上钩的时候,这个铃铛就会被碰响,C就会将鱼钓上来。

信号驱动IO模型,应用进程告诉内核:当数据报准备好的时候,给我发送一个信号,对SIGIO信号进行捕捉,并且调用我的信号处理函数来获取数据报。 

四、IO多路复用--Reactor设计模式

D同样也在河边钓鱼,但是D生活水平比较好,D拿了很多的鱼竿,一次性有很多鱼竿在等,D不断的查看每个鱼竿是否有鱼上钩。增加了效率,减少了等待的时间。

面试题:多路复用机制是如何支持海量连接?

多路复用IO虽然是属于阻塞IO,但可以对多个文件描述符进行阻塞监听,所以效率较阻塞IO的高:

(1)多路复用使用一个Selector来多路复用监听N多个Channel是否有请求,以及判断该请求是连接请求,还是发送数据请求;
 (2)当是连接请求时,将该请求注册进Selector监听范围;
(3)只有当某个Channel有对应的数据的时候才会创建线程,可能说1000个请求, 只有100个请求是有数据交互的。这个时候可能server端就提供10个线程就能够处理这些请求。这样的话就可以避免了创建大量的线程。

五、 异步IO(asynchronous I/O)--Proactor设计模式

E也想钓鱼,但E有事情,于是他雇来了F,让F帮他等待鱼上钩,一旦有鱼上钩,F就打电话给E,E就会将鱼钓上去。

当内核中有数据报就绪时,由内核将数据报拷贝到应用程序中,返回aio_read中定义好的函数处理程序。

备注:Linux系统目前不支持AIO,Windows的IOCP就是该模型。

参考:

IO模型参考:https://www.cnblogs.com/shengguorui/p/11949282.html

Reactor参考:https://www.cnblogs.com/zwt1990/p/8821185.html

多路复用源码参考:https://www.cnblogs.com/crazymakercircle/p/9833847.html

多路复用应用参考:https://zhuanlan.zhihu.com/p/115220699

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值