IO多路复用简介

Posted cmdch2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO多路复用简介相关的知识,希望对你有一定的参考价值。

IO多路复用

使用IO多路复用的并发图,性能几乎不受连接数的影响。

多路复用与多线程的区别

多路复用和多线程都可以用来实现并发处理,但它们有不同的实现方式和应用场景。

多线程是一种通过创建多个执行线程来实现并发处理的方式。每个线程都有自己的堆栈和程序计数器,它们之间共享进程的资源(如内存、文件描述符等)。多线程可以让程序同时执行多个任务,从而提高程序的响应速度和吞吐量。

多路复用是一种通过监视多个文件描述符来实现并发处理的方式。它使用一个系统调用(如select、poll、epoll等)来等待多个IO事件的发生,当有事件发生时,它会将这些事件通知给程序,让程序可以及时地处理它们。多路复用可以让程序在单个线程内同时处理多个IO事件,从而避免了创建多个线程所带来的开销和竞争。

在应用场景上,多线程适合处理CPU密集型的任务,如计算、排序等;而多路复用适合处理IO密集型的任务,如网络通信、文件读写等。此外,多路复用还可以用于实现服务器的高并发处理,而多线程则更适合用于实现并行计算等任务。

总的来说,多路复用和多线程是两种不同的并发处理方式,它们各有优缺点,需要根据实际需求和场景选择合适的方式来实现并发处理。

两者区别的故事

假设有一个咖啡店需要处理顾客的订单,每个订单包含了顾客的要求和饮品制作需要的时间。这个咖啡店只有一名员工,因此需要考虑如何提高处理订单的效率。

多线程的实现方式类似于这名员工将订单分成几份,每份交给一名助手处理,这些助手可以同时制作多杯饮品,然后将制作好的饮品交给员工。员工收到所有的饮品后,将它们分配给对应的顾客,最后完成所有的订单。这种方式可以让员工同时处理多个订单,提高处理效率。

多路复用的实现方式类似于这名员工将所有的订单都放到一个订单列表中,然后等待饮品制作完成。当一杯饮品制作完成时,员工会查看订单列表中是否有对应的订单,如果有,则将饮品交给对应的顾客,继续等待下一杯饮品制作完成。这种方式只需要一名员工就可以同时处理多个订单,而不需要额外的助手,从而降低了成本和复杂度。

这个故事中,多线程是将任务分配给多个工作者并行处理,而多路复用则是在单个工作者中并发处理多个任务,通过等待事件完成来切换处理任务,从而提高处理效率。两种方式各有优缺点,需要根据具体情况进行选择。

多路复用比传统单线程有都什么优点呢?

高效利用系统资源:在传统单线程中,当程序执行某个IO操作时,线程会一直等待该操作完成后再执行下一个操作,期间无法处理其他任务。而在多路复用中,一个线程可以同时监听多个IO操作,当其中任何一个IO操作完成时,线程就会处理该IO操作的回调函数,从而实现高效利用系统资源。

避免了线程切换开销:线程的创建和销毁、线程切换等都会产生开销,而多路复用避免了线程的频繁创建和销毁以及线程之间的切换开销,从而提高了系统的效率。

支持高并发:多路复用可以同时监听多个IO事件,从而支持高并发的处理方式。在服务器端,多路复用可以大大提高服务器的处理能力和响应速度,支持处理大量的并发连接请求。

简化了编程模型:在传统单线程编程中,开发者需要考虑如何处理多个IO事件的回调函数,以及如何正确的控制事件的状态。而多路复用的编程模型相对简单,只需要一个事件循环和事件处理器,开发者只需要编写少量的代码即可处理多个IO事件。

综上所述,多路复用相对于传统单线程处理方式,可以提高系统的效率和性能,并且支持高并发处理。同时,多路复用的编程模型也相对简单,便于开发者使用。

io多路复用简介

redis之所以可以高效的执行命令,单线程每秒qps达到10w左右,是因为起io多路复用技术效率很高。

io多路复用解决了什么问题?

没有io多路复用,那么当服务器操作某一个fd执行read的时候,如果fd对应的客户端没有执行写操作,那么服务端就会阻塞,这个时候客户端2来了数据,服务端就没办法读取了

那么什么是io多路复用呢?

io多路复用就是服务器可以同时处理多个客户端发来的请求(其实并不是同时,只是分时),但是很多的fd可以被一个中间件解决(select poll 或者epoll),不需要服务端去阻塞读(写)了,这个任务交给了中间件,接下来讲一下select poll epoll这三个中间件的区别

select 有最大socket限制1024,每次有事件,就会通知服务器,去遍历这个数组,去判断到底是哪个socket有数据,然后读取,o n的时间复杂度

poll和select基一致,只是没有1024的限制,用为fd用的是链表实现的,有请求过来 处理的时间复杂度也是o n

epoll和select poll都不一样,服务端可以在每个fd注册一个事件,当该fd有数据的时候,就会通知用户空间,具体哪个fd有数据,可以读取(写入) o 1的时间复杂度

以上是关于IO多路复用简介的主要内容,如果未能解决你的问题,请参考以下文章

Netty——NIO(Selector)

IO多路复用深入浅出

io多路复用简介

io多路复用简介

Java多线程:Linux多路复用,Java NIO与Netty简述

IO多路复用简介