做网站 包含详情页设计吗,网站模块标准版,广州做淘宝的化妆品网站好,wordpress epix v1.21.IO多路复用介绍
在使用单进程或单线程情况下#xff0c;同时处理多个输入输出请求#xff0c;需要用到IO多路复用#xff1b;IO多路复用有select/poll/epoll三种实现方式#xff1b;由于不需要创建新的进程和线程#xff0c;减少了系统资源的开销#xff0c;减少了上下…1.IO多路复用介绍
在使用单进程或单线程情况下同时处理多个输入输出请求需要用到IO多路复用IO多路复用有select/poll/epoll三种实现方式由于不需要创建新的进程和线程减少了系统资源的开销减少了上下文切换的次数 上下文切换从A进程切换到B进程A进程的资源要完全替换成B进程的资源是一个耗时的操作如果进程同时监听的多个硬件数据都没有准备好进程切换进入休眠状态当一个或者多个硬件数据准备就绪后休眠的进程被唤醒读取准备好的硬件数据。 2.相似的select/epoll方式介绍
框架图 原理(fd代表文件描述符)
应用层将要监听的fd添加到可集合中判断事件的发生发生的事件保留到集合中没发生的被清除
VFS层虚拟文件系统自动执行 将用户空间的fd拷贝到内核空间用户空间的fd被清空 通过fd回调每个fd对应的操作方法 判断操作方法的返回值如果全为0硬件数据都没准备好进程进入休眠态 收到事件唤醒提示根据集合中的每一个fd回调poll方法找出发生事件的fd 将发生事件的fd重新拷贝回用户空间事件集合
驱动层向上提交等待队列头判断condition的值根据事件是否发生给一个合适的返回值
硬件中断层更改condition值唤醒进程 select和poll 都需要把监控的文件描述符集合都在用户空间和内核空间来回拷贝消耗资源大 当有事件发生都需要遍历文件描述符集合确认哪一个事件发生 select方式能监听的文件描述符有限1024个poll使用pollfd结构解决了此问题 3.epoll方式介绍 被称为当前时代最好用的io多路复用方式epoll最大的好处在是监听的fd数目的增长不会影响执行效率 核心操作一棵树红黑树、一张表内核链表以及三个接口epoll_create/epoll_ctl/epoll_wait
epoll_create创建一个epoll句柄红黑树根节点epoll_ctl实现对于epoll的控制添加/修改/删除事件epoll_wait阻塞等待准备好的文件描述符 框架图 原理 epoll要把检测的事件fd挂载到内核空间红黑树上遍历红黑树调用每个fd对应的操作方法找到发生事件的fd,如果没有发生事件的fd进程休眠如果事件发生将发生事件的fd拷贝一份放到内核链表每个节点对应一个fd最后把链表的节点信息传递到用户空间的数组中用户空间无需判断事件的发生只需要判断事件类型读写类型等。 应用层 创建句柄红黑树 打开设备文件 将fd添加到红黑树上 监听事件是否发生 循环遍历数组做事件的处理判断事件类型进行读写
VFS层虚拟文件系统自动执行 通过fd回调每个fd对应的操作方法 判断操作方法的返回值如果全为0硬件数据都没准备好进程进入休眠态 收到事件唤醒提示根据集合中的每一个fd回调poll方法找出发生事件的fd 将发生事件的fd拷贝到内核链表中
驱动层向上提交等待队列头判断condition的值根据事件是否发生给一个合适的返回值
硬件中断层更改condition值唤醒进程 4.select/poll,epoll对比总结
相同点 select,poll,epoll都是IO多路复用方式本质上都是同步IO读写就绪后自己负责读写
不同点 select/poll每次调用都要把fd集合从用户空间拷贝到内核空间最后在从内核空间拷贝到用户空间epoll每次调用任意个发生事件fd往内核队列挂一次链表数据从内核空间拷贝到用户空间一次 select最大监测事件有限1024个poll/epoll不受限制 判断事件发生select/poll需要不断轮询监测集合fdepoll直接检查内核链表即可