1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > io多路复用的原理和实现_IO多路复用的三种机制:select poll epoll

io多路复用的原理和实现_IO多路复用的三种机制:select poll epoll

时间:2023-10-20 14:37:03

相关推荐

io多路复用的原理和实现_IO多路复用的三种机制:select  poll  epoll

目录

概述IO多路复用本质IO多路复用的优势IO多路复用Select机制IO多路复用Poll机制IO多路复用Epoll机制select,poll,epoll机制区别总结php7进阶到架构师相关阅读

概述

这是关于php进阶到架构之后端开发必备学习的第篇文章:IO多路复用的三种机制:select 、poll 、epoll

第一篇:理解TCP/IP与UDP协议、Socket的正确姿势第二篇:一文搞懂进程,线程,CPU核心数,时间片轮转机制第三篇:IO多路复用的三种机制:select 、poll 、epoll

IO多路复用本质

检测多个文件描述符是否有变化 。

让单个进程可以监视多个文件描述符,

一旦某个描述符就绪(一般是读就绪或写就绪),

能够通知程序进行相应的读写操作

select,poll,epoll都是IO多路复用的机制。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞

IO多路复用的优势

与多进程和多线程技术相比,

I/O多路复用技术的最大优势是系统开销小,

系统不必创建进程/线程,

也不必维护这些进程/线程,

从而大大减小了系统的开销。

在介绍select、poll、epoll之前,首先介绍一下Linux操作系统中基础的概念:

用户空间 / 内核空间

操作系统的核心是内核,

独立于普通的应用程序,

可以访问受保护的内存空间,

也有访问底层硬件设备的所有权限。

为了保证用户进程(如qq,新浪等进程)不能直接操作内核(kernel),保证内核的安全,

操作系统将虚拟空间划分为两部分,

一部分为内核空间,

一部分为用户空间。

进程切换

为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。

任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的,并且进程切换是非常耗费资源的。

进程阻塞

正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使进程由运行状态变为阻塞状态

只有处于运行态的进程(获得了CPU资源),才可能将其转为阻塞状态。

当进程进入阻塞状态,是不占用CPU资源的。

文件描述符

文件描述符(File descriptor),是一个用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一个非负整数。

实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。

当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。

但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

IO多路复用Select机制

select机制中提供一种fd_set的数据结构,实际上是一个long类型的数组。

每一个数组元素都能与一打开的文件句柄建立联系,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读。

select机制的问题

1.每次调用select,都需要把fd_set集合从用户态拷贝到内核态,如果fd_set集合很大时,那这个开销也很大

2.同时每次调用select都需要在内核遍历传递进来的所有fd_set,如果fd_set集合很大时,那这个开销也很大

3.为了减少数据拷贝带来的性能损坏,内核对被监控的fd_set集合大小做了限制,并且这个是通过宏控制的,大小不可改变(限制为1024)

IO多路复用Poll机制

poll改变了文件描述符集合的描述方式,

使用了pollfd结构而不是select的fd_set结构,

使得poll支持的文件描述符集合限制远大于select的1024

poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。

也就是说,poll只解决了上面select的问题3,并没有解决问题1,2的性能开销问题。

IO多路复用Epoll机制

epoll在Linux2.6内核正式提出,是基于事件驱动的I/O方式。

相对于select来说,epoll没有描述符个数限制,使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

select,poll,epoll机制区别总结

epoll是Linux目前大规模网络并发程序开发的首选模型。在绝大多数情况下性能远超select和poll。

既然如此,为何select,poll,epoll同时存在呢?那是因为它们也是不同历史时期的产物。

1984,在BSD实现select

1997,实现了poll

2002, 大神 Davide Libenzi 实现了epoll

php7进阶到架构师相关阅读

/gofor/gofor

最后,欢迎大家留言补充,讨论~~~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。