IO多路复用

作者: 布兰特 | 来源:发表于2021-04-04 22:50 被阅读0次

Unix五种IO模型:

[1] blocking IO - 阻塞IO

老李去火车站买票,排队三天买到一张退票。

耗费:在车站吃喝拉撒睡 3天,其他事一件没干。

进程阻塞,资源消耗严重

[2] nonblocking IO - 非阻塞IO

老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。

不阻塞进程,但是会导致任务的延迟,以及大量的轮训请求

[3] IO multiplexing - IO多路复用

一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力。

1).select/poll

老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。

耗费:打电话

2).epoll

老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。

耗费:无需打电话

[4] signal driven IO - 信号驱动IO

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。

耗费:无需打电话

[5] asynchronous IO - 异步IO

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。

耗费:无需打电话

其中前面4种IO都可以归类为synchronous IO - 同步IO,而select、poll、epoll本质上也都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

下面引用知乎一书焚城的回答再次巩固一下IO模型

阻塞IO, 给女神发一条短信, 说我来找你了, 然后就默默的一直等着女神下楼, 这个期间除了等待你不会做其他事情, 属于备胎做法.

非阻塞IO, 给女神发短信, 如果不回, 接着再发, 一直发到女神下楼, 这个期间你除了发短信等待不会做其他事情, 属于专一做法.

IO多路复用, 是找一个宿管大妈来帮你监视下楼的女生, 这个期间你可以些其他的事情. 例如可以顺便看看其他妹子,玩玩王者荣耀, 上个厕所等等. IO复用又包括 select, poll, epoll 模式. 那么它们的区别是什么?

1】select大妈 每一个女生下楼, select大妈都不知道这个是不是你的女神, 她需要一个一个询问, 并且select大妈能力还有限, 最多一次帮你监视1024个妹子

2】poll大妈不限制盯着女生的数量, 只要是经过宿舍楼门口的女生, 都会帮你去问是不是你女神

3】epoll大妈不限制盯着女生的数量, 并且也不需要一个一个去问. 那么如何做呢? epoll大妈会为每个进宿舍楼的女生脸上贴上一个大字条,上面写上女生自己的名字, 只要女生下楼了, epoll大妈就知道这个是不是你女神了, 然后大妈再通知你.

上面这些同步IO有一个共同点就是, 当女神走出宿舍门口的时候, 你已经站在宿舍门口等着女神的, 此时你属于阻塞状态

接下来是异步IO的情况

你告诉女神我来了, 然后你就去王者荣耀了, 一直到女神下楼了, 发现找不见你了, 女神再给你打电话通知你, 说我下楼了, 你在哪呢? 这时候你才来到宿舍门口. 此时属于逆袭做法

swoole本质上是个异步编程框架。他内置了一些异步编程的解决方案。包括像node.js或者前端ajax那样的基于回调函数事件的io通信api。

比如说做tcp服务器或者客户端,推送,游戏服务端那种。客户端的话,用传统php的话就是socket或者curl那样,那样是同步的。

如果是服务端,用php的话,就得用到fork函数使用多进程来解决多个客户端同时连接服务端的并发问题。

而swoole底层调用了linux提供的一个叫epoll的io多路复用器来解决这个并发问题。

如果是做单纯的web程序,用这个就意义不大,但是如果是用php做服务端,也就是把php当做像python那样的脚本语言,以守护进程的方式长时间运行在控制台,那就可以。说白了就是模仿node.js的编程风格,但是语法却是更加友好的php。

相关文章

网友评论

    本文标题:IO多路复用

    本文链接:https://www.haomeiwen.com/subject/btdrkltx.html