操作系统IO多路复用select,poll,epoll
什么是文件描述符fd
文件描述符是一个非负整数,是进程用于标识打开文件或I/O 资源的索引。
在 Linux 系统中,当进程通过系统调用,打开一个文件或创建一个新的 I/O 资源时,内核会为其分配一个唯一的文件描述符,进程通过这个文件描述符来对相应的文件或资源进行读写、控制等操作。
IO多路复用
在计算机系统中,I/O 操作指的是计算机与外部设备之间的数据传输过程。
“多路” 指的是多个文件描述符(即多个 I/O 资源),“复用” 表示使用同一个线程或进程来监控和处理多个文件描述符的 I/O 事件。(避免为每个 I/O 操作创建一个单独的线程或进程,从而提高系统资源的利用率。)
核心是通过一种机制,让进程能够同时监视多个文件描述符的状态变化,当其中某个或某些文件描述符上有可读、可写或其他事件发生时,进程能够得到通知,并及时对这些事件进行处理。这样,进程就可以在单线程或单进程中管理多个 I/O 操作,而不需要阻塞在某个特定的 I/O 操作上等待其完成。
IO多路复用的实现方式
select
监视一组文件描述符,将集合传给内核,内核会遍历检查是否有事件发生。缺点:数量有限;数量大时效率低。
poll
与select相似,但数量无限。缺点:高并发场景下依然效率低。
epoll
linux特有。使用事件通知的方式,只有在文件描述符就绪时才会通知应用程序,而不需要应用程序轮询。
当有事件发生时,它会返回并告诉进程哪些文件描述符上有事件,而且只返回有事件发生的文件描述符,不需要遍历所有的文件描述符。
适用于高并发的网络服务器等场景。