IO多路复用的三种机制Select,Poll,Epoll

IO多路复用的本质是通过系统内核缓冲IO数据让单个进程可以监视多个文件描述符,一旦某个进程描述符就绪(读/写就绪),就能够通知程序进行相应的读写操作。

select poll epoll都是Linux提供的IO复用方式,它们本质上都是同步IO,因为它们都需要在读写事件就绪后自己负责进行读写,读写的过程是阻塞的。

IO复用技术最大优势就是系统开销小,系统不必创建进程或线程,也不必维护这些进程线程。

基础知识

用户空间与内核空间:操作系统将虚拟空间划分为两个部分,一部分为内核空间,一部分为用户空间。内核可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

进程切换:为了控制进程执行,内核必须有能力挂起正在CPU执行的进程,然后恢复之前被挂起的进程。进程切换非常消耗资源

进程阻塞:正在执行的进程,由于等待某些事件,如请求资源、等待某些操作完成、等待读取新数据,这些系统自动执行阻塞原语,使进程变为阻塞态。所以说进程的阻塞是进程自身的主动行为。进入阻塞态是不会占用CPU资源的。

文件描述符:形式上是一个非负整数,实际上是个索引,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个文件或者创建一个新文件时,内核向进程返回一个文件描述符。

缓存IO:操作系统会将IO的数据缓存在文件系统的页缓存中,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从内核缓冲区拷贝到应用程序的地址空间。

select运行机制

提供fd_set的数据结构,实际上为一个long类型的数组,每一个数组元素都能与一个打开的文件句柄建立联系。当调用select时,内核根据IO状态修改fd_set的内容,由此来通知执行了select的进程哪一个文件可读。

从流程上看,select函数与同步阻塞模型无太大区别,甚至多了添加监视socket,以及调用select的额外操作。

但是select以后最大的优势就是用户可以在一个线程内同时处理多个socket的Io请求。用户可以注册多个socket,然后不断调用select读取被激活的socket。达成同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

select机制的问题

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

2、每次调用select都需要在内核中遍历fd_set,如果集合很大,开销也大

3、为了减少数据拷贝带来的性能损失,内核对被监控的fd_set集合大小做限制,限制为1024

Poll

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

epoll

epoll是基于事件驱动的IO方式。

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

2、并且,它在获取事件的时候,无须遍历整个被侦听的描述符集合,只要遍历哪些被内核IO事件异步唤醒而加入redy队列的描述符集合就行了。

3、epoll除了提供select/poll那种IO事件的水平触发,还提供了边缘触发,使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

水平触发:当epoll_wait检测到某描述符事件就绪,并且通知应用程序时,应用程序可以不立即处理该事件;下次调用epoll_wait时,会再次通知此事件

边缘触发:当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait的时候,不会再次通知此事件。

一图总结:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt中按钮贴图

一.QT之QPushButton按钮贴图 二.QT之QToolButton按钮贴图 一.QT之QPushButton按钮贴图具体操作流程 1. Qt Designer中拖入一Tool Button 2. 选择图标的图片放入工程目录下,如放在Resources内 3. 双击工程的Resource Files下的qrc文件,如图 4. 在弹出的窗…

Android Activity类讲解(一)

--by CY[kotomifigmail.com] 1.protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException("Stub!");   } 当创建一个Activity时,系统会自动调用onCreate方法来完成创建工作.该创建工作包括布…

Mysql的undo、redo、bin log分析

目录关于undo log关于redolog关于binlog一个事务的提交流程undo log :记录数据被修改之前的样子 redo log:记录数据被修改之后的样子 bin log:记录整个操作。 关于undo log 关于undo log: 在执行一条涉及数据变更的sql时,在数据…

JPA概要

本文最新版已更新至:http://thinkinside.tk/2012/12/30/JPA.html JPA定义了Java ORM及实体操作API的标准。本文摘录了JPA的一些关键信息以备查阅。 如果有hibernate的基础,通过本文也可以快速掌握JPA的基本概念及使用。 Table of Contents 1 JPA概述2 实…

如何配置能让fiddler抓去https的请求?

1、打开fiddler,>>Tools>>Fiddler Options, 打开如图所示的HTTPS配置项:点击Export Rppt Certifica to Desktop :桌面上多了一个证书:下面就是将证书导入:点击开始-运行,输入:mmc,…

【闲聊】Baidu Map,excellent !!!Diaoyv island is China 's

【钓鱼岛】钓鱼岛是中国的!Diaoyu Islands are Chinas! 釣魚島は中国のアール! ————————————youngLaker转载于:https://www.cnblogs.com/younglaker/archive/2012/12/31/2840190.html

08:vigenère密码_密码技术:Vigenére密码,Playfair密码,Hill密码

08:vigenre密码1)Vigenre密码 (1) Vigenre Cipher) This technique is an example of Polyalphabetic Substitution technique which uses 26 Caesar ciphers make up the mono-alphabetic substitution rules which follow a count shifting mechanism from 0 to 25. That is,…

node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第2部分)| Node.js

node oauth2验证In my last article (How to set up and use passport OAuth Facebook Authentication (Section 1) | Node.js), we looked at another form of authentication called the OAuth authentication which involves sign in or signup using social media. 在我的上…

东哥读书小记 之 《一个广告人的自白》

掰着指头一算,端午假期确实完成不少事情,过的太尼玛充实鸟:去健身房2小时,且老夫的平板支撑终于能坚持超过1分钟,普大喜奔有木有;给合租的室友买蛋糕过了个生日;去 去哪儿 参加W3ctech的技术交流…

Redis的文件事件与时间事件处理

目录文件事件处理事件类型客户端和服务端的通信过程时间事件处理执行器执行周期性事件作用事件的调度与执行文件事件处理 Redis基于Reactor模式开发了文件事件处理器。文件事件处理器以单线程方式运行,通过IO多路复用程序监听多个套接字,实现了高性能网…

Linux SPI框架

水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7733476 Linux的SPI子系统采用主机驱动和外设驱动分离的思想,首先主机SPI控制器是一种平台设备,因此它以platform的方式注册进内…

重构——解决过长参数列表(long parameter list)

目录1、Replace Param with Query2、Preserve Whole Object3、Introduce Param Object4、Remove Flag Argument5、Combine Functions into ClassReference当我们需要在超长函数中提炼子函数时,如果函数内有大量的参数和临时变量,这将会对函数的提炼形成很…

从uptime、stress、mpstat、pidstat观察CPU密集型、IO密集型、进程密集型切换的系统性能

uptime dyydyy-Lenovo-ThinkBook-14-IIL:~$ uptime10:27:10 up 7 min, 1 user, load average: 1.32, 0.99, 0.49结果分别对应:当前时间、系统运行时间、当前用户数目、过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average) 平均负载是指单位时间内&#xff0c…

多台计算机共享内存_共享内存多处理器和指令执行| 计算机架构

多台计算机共享内存共享内存多处理器 (Shared Memory Multiprocessor) There are three types of shared memory multiprocessor: 共有三种类型的共享内存多处理器: UMA (Uniform Memory Access) UMA(统一内存访问) NUMA (Non- uniform Memory Access) NUMA(非统一…

方法重写,隐藏在子类父类中的各种调用实践

一.子类和父类方法之间的关系 1.当子类和父类有方法完全相同的方法 namespace ConsoleApplication2 {class Program{static void Main(string[] args){B b new B();A a new A();A c new B();b.Show();a.Show();c.Show();Console.Read();}}public class A{public void Show()…

(解决)从同事那里取来的工程不能编译运行,出现以下错误,求帮助

错误 6 未能从程序集 C:\Program Files (x86)\MSBuild\Microsoft\Silverlight for Phone\v4.0\Microsoft.Phone.Build.Tasks.dll 加载任务“Microsoft.Phone.Build.Tasks.ValidateWMAppManifest”。 Could not load file or assembly Microsoft.Build.Utilities, Version2.0.0…

vmstat、sysbench、/proc/interrupts,性能压测

如何查看系统的上下文切换情况 vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。 # 每隔 5 秒输出 1 组数据 vmstat 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r …

Linux系统上的程序调优思路概要

目录文件系统Linux内核应用程序架构设计性能监控性能测试CPU内存网络磁盘IO文件系统 Linux内核 应用程序 架构设计 性能监控 性能测试 CPU 内存 网络 磁盘IO

观察者模式Java实现

观察者模式就是当⼀个⾏为发⽣时传递信息给另外⼀个⽤户接收做出相应的处理,两者之间没有直接的耦合关联。 观察者模式分为三大块: 事件监听、事件处理、具体业务流程 例子解析 模拟摇号: 代码结构: 开发中会把主线流程开发完…