2023-2更文24-多路复用IO

110 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情

多路复用IO

前文

本文的内容主要是关于系统IO处理中多路复用IO相关知识的总结。

什么是多路复用IO

提到多路复用IO,首先我们需要了解IO的含义。IO从字面理解其实是IN和OUT,实际也就是linux系统中数据的输入与输出。而在linux系统中其实一切都会被当作文件来处理,所以IO其实也可以理解为对于文件的操作。说完了IO,我们再来具体说说关于网络连接IO。

首先来看一下最基本的socket网络模型,也就是服务器与客户端采用阻塞的方式,客户端与服务器通过socket套接字进行绑定。在数据处理时由于采用了阻塞的方式,那么当一个连接在进行中时,客户端与服务器进行数据交换,实际上其他的连接就无法完成连接的工作,导致只能应用于唯一连接。

那么如何将连接模型推广呢,这里可以采用多线程的网络模型。多线程模型的方案是每次接受到一个新的连接,便会开启一个新的线程。表面上看该方案可以实现我们的要求,但当连接数量过多时,可想而知系统中可能会出现大量的线程,这对于资源的占用也是致命的。

为了完成对多线程的优化,避免每次连接都采用新的线程,那么就要提到多路复用。多路复用是采用唯一的进程来处理连接,即使处理连接由同一个进程完成,但单个连接的处理过程很快,也就保证了整体连接的处理效率。那么多路复用中,首先说一下select/poll模型。这个模型的方案是将连接的文件描述符存储起来,通过不停的遍历来处理连接请求,一旦检测到有事件发生时,就会完成内核态到用户态的处理,用户态再完成同样的处理过程,通过遍历来实现。而除了select/poll模型之外,还有一种是epoll模型。epoll模型是采用事件驱动的方式,当有事件出现时,就会对该事件的文件描述符进行特殊的处理,这样也就避免了select/poll模型中大量的循环性能损耗问题。

而由于epoll模型的好处,现在大量的程序例如nginx等等处理高并发时采用的都是epoll多路复用模型。

总结

本文主要对于几种IO方式进行了介绍,并对多路复用模型对系统性能的提升进行了总结。