https://huanxi.pub/2017/01/28/io%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E7%90%86%E8%A7%A3/
前段时间看了下 NIO ,发现里面有个 I/O 多路复用技术,但是听到这个名字一直觉得难以理解,什么是多路复用呢?好奇怪的名词,于是专门找了个时间仔细去了解了下。
客栈遇到的问题
从开始学习编程后,我就想开一个 Hello World 餐厅,由于一开始资金不足,所以只能开一个古老的小客栈。
客栈运营了几天,我发现我们的客栈存在着一个问题
我们的厨师只负责炒菜,炒好了放在一边继续炒其他菜,所以店小二必须经常进出厨房,一方面看看菜到底炒好了没有,如果炒好的话,就要把菜端出来,另一方面他必须得站在外面等候客人的其他需求。并且重要的是只有一个小二,他同时只能服务一个客人,其他客人必须等待
在客栈客人少的时候问题还不明显,有时候突然来个十几个客人,看到没人招待他,掉头就走了。
第一个解决方案(多线程)
给每一位顾客配备一名店小二。
这样一来,每一个顾客都有专门的小二负责,厨师一炒好菜,小二就将菜第一时间送到客人桌上,这样一来,客人的体验提升了很多,大家都非常满意,我客栈的名声也越来越好。
随着名声越来越好,客人也越来越多,渐渐地我发现,好像有什么地方不对。
随着客人越来越多,我必须招更多的店小二,支付更多的费用在小二身上,我发现,有时候付给员工的费用都比我赚的还多
第二个解决方案(select)
我将客栈进行改造,按照桌数区分,分为 1 2 3 4 四个区,每个区招一名店小二,来服务所在区的客人,并且对厨师进行了简单的培训,让他再炒好菜后大喊一声,有菜炒好了
这次简单升级后,我的客栈现在只有 4 个小二了,每个小二负责自己的区域,并且厨师炒好菜后,他大喊一声,来来来,菜炒好了,然后比如小二 1 号进入厨房,把菜端到他对应的区域挨个问,这菜是谁点的。
随着我的客栈越来越大越来越大,为了节省成本,我并没有再招更多的小二,依然是那四个小二。
直到有一天,1 区的客人爆满,达到了 1024 个了,那一天,我看着 1 区的小二每一次上菜几乎都是跑的,并且他告诉我,如果再多来一个客人,他就要挂了。
第三个解决方案(poll)
好吧,那个小二体力上好像跟不上节奏,所以我派人连夜赶工做了传说中的木牛流马来当店小二,这样一来,即使是 10240 个客人,一个木牛流马就 hold 住了
人数上限问题已经解决了,但是现在依然存在问题。
由于人数太多,每次要将做好的菜送到对应的客人桌上,必须挨个询问过去,这个步骤太慢了,很多次客人都不愿意等待而走掉了。
最终解决方案(epoll)
对木牛流马进行加工,使其可以记录每一个客人点的菜,然后厨师炒好菜后,只要报上菜名,木牛流马根据记录的订单,自动就将对应的菜端到客人桌中
有了这个解决方案,那么当一盘菜炒好后,就不必挨个确认是谁的菜了,如果新来了客人,同样只要记录下客人的菜单,提交给厨师,然后木牛流马又可以去招待其他客人了,当菜炒好后,直接就将菜送到客人那里了。
至此,生意兴荣,长盛不衰。
总结
select
只能监听 1024 个链接
并且没有返回具体可使用的 socket ,得挨个遍历
线程不安全
poll
没有链接数限制
依然线程不安全
epoll
解决了 select poll 的问题,并且指定了 socket 回调
分享到:
相关推荐
本文将深入探讨网络I/O的基本概念,以及select、poll和epoll这三种I/O多路复用机制,并通过实际代码示例展示其在服务器并发中的应用。 首先,理解网络I/O。在网络通信中,数据传输通常涉及发送(output)和接收...
其中select/poll/epoll都是常用的多路复用技术,它们可以同时监视多个文件描述符,实现高效的I/O复用。 总之,Linux网络编程是一项重要的技能,它涉及到网络通信的基本原理以及多路复用技术的使用,对于开发网络...
Unix系统提供了多种I/O模型,如阻塞I/O、非阻塞I/O、I/O多路复用(如select、poll、epoll)、信号驱动I/O以及异步I/O。I/O聚集通常指的是在一个系统调用中处理多个文件描述符,而I/O分离则是在不同时间或通过不同...
在Linux中,I/O多路复用主要有三种实现方式:`select`、`poll`和`epoll`。这些机制都用于解决传统阻塞I/O模型中,进程在等待I/O操作完成时被挂起的问题。 阻塞I/O是最常见的I/O模型,当进程尝试从一个未准备好数据...
3. 调用I/O复用函数(如`select`、`poll`或`epoll_wait`)进入等待状态,直到至少有一个文件描述符准备好进行I/O操作。 4. 检查返回的文件描述符集合,对每个就绪的描述符执行相应的读写操作。 5. 根据需要更新文件...
总结起来,I/O多路复用是Linux系统中处理并发I/O的关键技术,通过select、poll和epoll等方式,可以在单个进程内高效地管理大量并发连接,降低CPU和内存消耗,提高系统的整体性能和可伸缩性。在选择哪种多路复用方式...
首先,`select`是较早的I/O多路复用机制,它允许程序监视多个文件描述符,等待它们中的任意一个变为可读、可写或出现错误状态。`select`函数会阻塞直到至少有一个描述符满足条件。在`select1.c`中,可以看到如何设置...
根据提供的文件信息,本文将会深入分析poll和epoll两种I/O多路复用技术的源码,并且阐述其工作原理及效率差异。 首先,poll和epoll都是Linux系统中用于处理大量文件描述符(file descriptor,简称fd)的I/O多路复用...
I/O多路复用技术如poll和select允许监听多个文件描述符,当有描述符就绪时唤醒进程。select需要每次都设置描述符集,可能影响效率,而poll使用独立的pollfd结构,无需每次都设置。两者的共同问题是当描述符列表很大...
在Linux系统中,网络编程是实现跨机器通信的关键技术,主要涉及TCP(传输控制协议)和UDP(用户数据报协议)这两种传输层协议,以及I/O多路复用技术如select、poll和epoll。这些知识点是每一个资深的Linux程序员必须...
具体内容涵盖:环境变量的设置和配置、动态库的加载方式、Makefile的基本语法和变量使用、多进程的创建和控制(如fork()函数)、进程间的通信机制(如管道、信号)和I/O多路复用(select、poll、epoll)的具体应用。...
`select`模型是一种I/O多路复用技术,允许程序同时监控多个文件描述符(FD,如套接字)的状态,等待它们变为可读、可写或出现错误。这种模型的核心在于`select`系统调用,它会阻塞直到至少有一个指定的FD准备就绪。 ...
Linux系统提供了多种实现I/O多路复用的机制,包括select、poll和epoll。这些机制允许单个进程同时监控多个文件描述符,以便于在任何时候有数据可读或可写时,程序都能及时响应。 1. **I/O多路复用概念**: I/O多路...
Linux系统编程——I/O多路复用select、poll、epoll的区别使用,相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45745887
此外,还有多路复用I/O模型,如 select、poll 和 epoll,它们允许单个线程监视多个文件描述符,当其中任何一个描述符就绪时,系统会通知程序。这种方式特别适用于需要同时处理多个连接的服务器应用。 在编写设备...
select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...
在IT行业中,网络编程是构建高并发、高性能服务器的关键技术之一。不同的操作系统提供了不同的I/O多路复用机制,如Linux中的epoll和Windows上的...通过分析这些代码,你可以更好地理解这些I/O多路复用技术的实际运用。
【网络通信】IO多路复用技术是一种高效处理并发I/O操作的方法,它允许一个进程同时监控多个I/O事件,而无需为每个事件创建单独的线程或进程。这种技术在高并发的服务器端编程中尤其重要,因为它可以显著减少系统资源...
传统的select、poll也是I/O多路复用技术,但这2种技术受内部实现的限制,不支持高并发,如同时连入超过1000个客户端,性能就会明显下降。(epoll技术从linux内核2.6开始引入的)。 (2)epoll技术的性能,可以说...
`select`、`poll`和`epoll`是三种常见的I/O多路复用技术,用于高效地管理多个文件描述符(FDs)的读写就绪状态。本文件“Help to understand select, poll, epoll.pdf”旨在帮助开发者深入理解这些机制的工作原理,...