IO 多路复用是什么意思?

linux IO多路复用有epoll, poll, select,知道epoll性能比其他几者要好。也在网上查了一下这几者的区别,表示没有弄明白。 I…
关注者
1,921
被浏览
652,674
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

要弄清问题 先要知道问题的出现原因

原因:

由于进程的执行过程是线性的(也就是顺序执

行),当我们调用低速系统I/O(read,write,

accept等等),进程可能阻塞,此时进程就阻塞

在这个调用上,不能执行其他操作.阻塞很正

常. 接下来考虑这么一个问题:

一个服务器进程和一个客户端进程通信,服

务器端read(sockfd1,bud,bufsize),此时客户

端进程没有发送数据,那么read(阻塞调用)将

阻塞直到客户端调用write(sockfd,but,size)

发来数据. 在一个客户和服务器通信时这没

什么问题,当多个客户与服务器通信时,若服

务器阻塞于其中一个客户sockfd1,当另一个

客户的数据到达套接字sockfd2时,服务器不

能处理,仍然阻塞在read(sockfd1,...)上;此时

问题就出现了,不能及时处理另一个客户的

服务,咋么办?I/O多路复用来解决!

I/O多路复用:

继续上面的问题,有多个客户连接,

sockfd1,sockfd2,sockfd3..sockfdn

同时监听这n个客户,当其中有一个发来消息

时就从select的阻塞中返回,然后就调用read

读取收到消息的sockfd,然后又循环回select

阻塞;

这样就不会因为阻塞在其中一个上而不能处

理另一个客户的消息

Q:

那这样子,在读取socket1的数据时,如果其它socket有数据来,那么也要等到socket1读取完了才能继续读取其它socket的数据吧。那不是也阻塞住了吗?而且读取到的数据也要开启线程处理吧,那这和多线程IO有什么区别呢?

A:

1.CPU本来就是线性的 不论什么都需要顺序处理 并行只能是多核CPU

2.io多路复用本来就是用来解决对多个I/O监听时,一个I/O阻塞影响其他I/O的问题,跟多线程没关系.

3.跟多线程相比较,线程切换需要切换到内核进行线程切换,需要消耗时间和资源. 而I/O多路复用不需要切换线/进程,效率相对较高,特别是对高并发的应用nginx就是用I/O多路复用,故而性能极佳.但多线程编程逻辑和处理上比I/O多路复用简单.而I/O多路复用处理起来较为复杂.