Linux IO模式 select poll epoll详解

概念说明

  1. 内核态(内核空间)和用户态(用户空间)的区别和联系
  • 用户空间是用户进程所在的内存区域,系统空间是操作系统所在的内存区域
  • 为了保证内核安全,处于用户态的程序只能访问用户空间,而处于内核态的程序可以访问用户空间和内核空间。

2.文件描述符fd

  • linux将所有设备都当做文件来处理,文件描述符来表示每个文件对象。
  • 当程序打开一个现有文件或创建一个新文件时, 内核想进城返回一个文件描述符。

3.缓存IO

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

IO模式
对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,会经历两个阶段:
1.等待数据准备(Waiting for the data to be ready)
2.将数据从内核拷贝到进程中(Copy the data from kernel to the process)

linux系统产生了下面五种网络模式的方案:

  • 1.阻塞IO (blocking IO)
  • 2.非阻塞IO (nonblocking IO)
  • 3.IO多路复用 (IO multiplexing)
  • 4.信号驱动IO (signal driven IO) 不常用
  • 5.异步IO (asynchonous IO)

1.阻塞模式

阻塞IO流程图
  • 1.当用户进程调用了系统函数read,kernel就开始了IO的第一个阶段,准备数据(此时有可能还没有到一个完整的包,这个时候kernel就需要等待足够的数据到来),这时用户进程是阻塞的(当然是进程自己选择的阻塞)。
  • 2.当kernel一直等到数据准备好,他就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才接触block的状态,重新运行起来。
    所以blockingIO的特点就是在IO执行的两个阶段都被block了

2.非阻塞IO

Linux下。可以通过设置socket使其变为non-block。当对一个non-blocking socket执行读操作时:


非阻塞IO流程图
  • 1.当用户进程发出read操作时,如果kernel中还没有准备好数据,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲,它发起一个read操作后,并不需要等待。而是马上就得到了一个结果。
  • 2.用户进程判断结果是一个error时 ,它就知道数据还没有准备好,那么它可以再次发送read操作。
  • 3.一旦kernel中的数据准备好了,并且又再次收到了用户进程的系统调用,那么它马上就将数据拷贝到了用户内存,然后返回。
    所以,nonblockingIO的特点是用户进程需要不断的主动询问kernel数据好了没有。

3.IO多路复用

IO多路复用就是我们说的select,poll,epoll有些地方也成这种IO方式为事件驱动IO,这种好处就在于单个process就可以同时处理多个网络连接的IO.它的基本原理就是select、poll、epoll这个function会不断的轮询所负责的所有socket,只要其中一个输数据到达,就通知用户线程。


IO多路复用流程图
  • 1.当用户进程调用了select,那么整个用户进程就会被block ,而同时kernel会监视所有select负责的socket,当任何一个socket中的数据准备好,select就会返回,这个时候用户进程在调用read操作,将数据从kernel拷贝到用户进程。
  • 2.这里需要使用两个系统调用(select和read),而blocking IO 只调用了一个系统调用(read)。但是用多路复用的优势在于它可以同时处理多个connection。
  • 3.如果处理的连接说不是很高的话,使用IO多路复用不一定比多线程+阻塞IO的性能好,可能延迟还更大。IO多路复用的优势在于它可以处理更多的连接数,而不是对单个链接处理的更好。

所以,IO多路复用的特点是通过一种机制一个进程能同时等待多个文件秒数据,而这些文件描述符(socket描述符),其中的任意一个进入就绪状态,select()函数就可以返回。

4.异步IO
异步IO流程图

1.用户发起read操作之后,立刻就开始做其他事情。另一方面从kernel的角度,当它收到一个asynchronous read之后,首先会立刻返回,所以不会对用户进程产生任何block。
2.kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它操作已经完成了。

select、poll、epoll区别

select:IO多路复用 ---它仅仅知道有IO时间发生,却不知道是哪个流,只能无差别轮询所有流找出能读写数据的流,对他们进行操作 时间复杂度为O(n).
poll:IO多路复用 --- 本质上和select无区别,但是它没有最大连接数限制,原因是用链表来存储 时间复杂度为O(n)
epoll:IO多路复用 --- event poll,不同于轮询,epoll会把哪个流发生了怎样的IO事件通知我们。所以我们说epoll实际上是基于事件驱动的(每个事件关联上资源描述符fd),此时我们对这些流的操作都是有意义的。时间复杂度O(1)


总结:

最大连接数:

select:单个进程所能打开的最大连接数有限,当然可以进行修改,然后重新编译内核。但是性能可能会收到影响。
poll:本质上和select没有区别,但是没有最大连接数限制。原因是用链表来存储。
epoll:虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右连接,2G内存的机器可以20万。

FD剧增后带来的IO效率问题

select:因为每次调用都会进行线性遍历,所以随着FD增加会造成遍历速度线性下降。
poll:同select
epoll:因为使用事件触发回调机制,只有活跃的socket才会主动调用callback,所以没有线性下降的问题,但是如果所有socket都很活跃,会比select和poll效率低。

消息传递方式

select:内核需要将消息传递到用户空间,需要内核拷贝动作
poll:内核需要将消息拷贝到用户空间,需要内核拷贝动作
epoll:通过内核和用户空间共享一块内存来实现(直接内存)不需要拷贝动作。

1.表面上看epoll的性能最好,但是在连接数少并且链接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多回调函数。
2.select低效是因为每次都需要轮询,但低效也是相对的,视情况而定。可以通过良好的设计改善。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342