select poll epoll理解

1.I/O
两个相邻存储级别之间的数据传输,统称 I/O 操做(好比内存与外存,同级的不需 I/O 操做)各级存储器的访问速度相差悬殊,故应尽量地减小 I/O 操做。仍之内存和磁盘为例,其单次访问延迟大体分别在纳秒(ns)和毫秒(ms)级别,相差 5 至 6 个数量级。形象地说来,就是对内存而言的 一秒/一天,至关于磁盘的 一周/两千年。算法

所以,为减小对外存的一次访问,咱们宁愿访问内存百次,千次甚至万次。也正因如此,在衡量相关算法的性能时,基本能够忽略对内存的访问,转而更多地关注对外存的访问次数segmentfault

比较常见的IO,disk IO, net IO, std IO,等数组

2.进程和线程的区别
对每个运行的应用即进程,在内存中都有本身的一块独立的空间,不一样进程间相互隔离,在一个进程中至少有一个线程,在只有一个cpu的状况下,一个进程的多个线程间分时利用CPU执行任务,多个线程共享进程的资源,多个CPU状况下,进程的多个线程间能够真正的并发执行。当一个进程执行完毕或分配的CPU时间片用完的时候,会将进程上下文保存,而后取出另外一个进程的上下文,执行该进程,而后保存上下文,继续执行下一个...
进程是资源分配的最小单位,线程是CPU调度的最小单位
进程切换比线程切换更耗资源,不一样进程间切换须要保存上一个进程的上下文,加载下一个进程的上下文,这中间会消耗更多的资源(Java里线程好像也是要切换的)
线程粒度更小,线程是存在于进程中的,不存在独立于进程以外的线程,一个进程至少有一个线程,叫主线程
进程是静态的线是动态的,进程就是全了一块地存储资源,真正CPU运行执行任务是线程里面实现的。
知乎上一个很好的理解角度bash

做者:zhonyong
连接:https://www.zhihu.com/question/25532384/answer/81152571
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。

下面细说背景:CPU+RAM+各类资源(好比显卡,光驱,键盘,GPS, 等等外设)构成咱们的电脑
,可是电脑的运行,实际就是CPU和相关寄存器以及RAM之间的事情。
一个最最基础的事实
:CPU太快,太快,太快了,寄存器仅仅可以追的上他的脚步,RAM和别的挂在各总线上的
设备彻底是望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高
谁来?无论怎么样的策略,一句话就是在CPU看来就是轮流着来。
一个必须知道的事实:
执行一段程序代码,实现一个功能的过程介绍
,当获得CPU的时候,相关的资源必须也已经就位,就是显卡啊,GPS啊什么的必须就位
,而后CPU开始执行。这里除了CPU之外全部的就构成了这个程序的执行环境,也就是咱们
所定义的程序上下文。当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它
就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工做就是保存程序上
下文,由于这个是下次他被CPU临幸的运行环境,必须保存。串联起来的事实:前面讲过在
CPU看来全部的任务都是一个一个的轮流执行的,具体的轮流方法就是:先加载程序A的上
下文,而后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,
而后开始执行B,保存程序B的上下文。。。。=========
重要的东西出现了========进程和线程就是这样的背景出来的,两个名词不过是对应的CP
U时间段的描述,名词就是这样的功能。进程就是包换上下文切换的程序执行时间总和 =
CPU加载上下文+CPU执行+CPU保存上下文线程是什么呢?进程的颗粒度太大,每次都要有
上下的调入,保存,调出。若是咱们把进程比喻为一个运行在电脑上的软件,那么一个软
件的执行不多是一条逻辑执行的,一定有多个分支和多个程序段,就比如要实现程序A
,实际分红 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:程序A获得CPU
=》CPU加载上下文,开始执行程序A的a小段,而后执行A的b小段,而后再执行A的c小段,
最后CPU保存A的上下文。这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有
进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境
,的更为细小的CPU时间段。到此全文结束,再一个总结:进程和线程都是一个时间段的
描述,是CPU工做时间段的描述,不过是颗粒大小不一样。
复制代码

3.select poll epoll
先介绍几个概念网络

文件描述符fd
文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者建立一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写每每会围绕着文件描述符展开。可是文件描述符这一律念每每只适用于UNIX、Linux这样的操做系统。
复制代码
什么是I/O多路复用
IO multiplexing就是咱们说的select,poll,epoll,有些地方也称这种IO方式为event
driven IO。select/epoll的好处就在于单个process就能够同时处理多个网络链接的IO。
它的基本原理就是select,poll,epoll这些function会不断的轮询所负责的全部socket
,当某个socket有数据到达了,就通知用户进程
I/O 多路复用的特色是经过一种机制一个进程能同时等待多个文件描述符,而这些文件描
述符(套接字描述符)其中的任意一个进入读就绪状态,select(),poll(),epoll()函数
再也不阻塞就能够返回。
复制代码

共同点并发

都是I/O多路复用,在一个进程中等待多个文件描述符,有任一个就绪,函数就中止阻塞
,函数返回,而后对就绪的文件描述符处理
复制代码

不一样点socket

对全部须要等待的文件描述符的数据封装不一样,对就绪的文件描述符寻找的方法不一样有的
要遍历有的不用,内核对文件描述符数据处理不一样,有的会修改
复制代码

select历史最为悠久,存在一些缺点ide

上图是简单的select源码实现,上半部分是对多个文件描述符获取,5个文件描述符都放在fds数组里面,文件描述符大小不定,在1024之内,select第一个缺点就是单个进程监听的文件描述符最大只能是1024,因此fds数组里面5个元素是0-1023的数,select函数第二个参数rset是bitmap结构,一共有1024位,每一位表明一个文件描述符,参数1中max是监听的文件描述符中最大值,也就是告诉内核只须要看前max+1个位,后面的都用不到,select后面几个参数分别是读写文件描述符和超时等信息,select须要将文件描述符集合从用户空间拷贝到内核空间,有用户态和空间态切换的资源消耗,这是第二个缺点,当有文件描述符就绪,内核会将rset中对应位置位,而后select函数返回,继续执行下面的代码,下面逻辑就是一次遍历rset看哪个被置位,就处理哪个,这里须要遍历一边才能找到就绪的文件描述符,复杂度是O(n),这是第三个缺点 缺点总结: 1.同一进程只能通知监听1024个文件描述符 2.文件描述符合集须要从用户空间拷贝到内核空间 3.须要遍历一遍文件描述符合集才能找到就绪文件描述符函数

poll性能

poll文件描述符采用结构体封装,poll函数中参数1是结构体的数组,数组中能够存放的元素个数不受限制,因此解决了select的第一个缺点,结构体中有文件描述符,和event,这个事件表示这个文件描述符关注那些事情,好比读写等,revent是内核返回的。若是文件描述符就绪这里就会置1.poll函数须要将文件描述符合集从用户空间拷贝到内核空间,当有文件描述符就绪,poll函数返回,继续执行下面的代码,这里也是遍历一遍文件描述符合集,查看revent是否为1,因此也须要遍历一遍 总结: 解决了select的监听文件描述符数量受限的问题,可是 1.仍是须要将文件描述符从用户空间拷贝到内核空间 2.须要遍历一遍合集才能找出就绪文件描述符

epoll

epoll_create 至关于建立了一个空白块,epfd,epoll_ctl至关于将文件描述符放进这个空白块,将文件描述符和事件相对应,epoll经过内存映射将文件描述符合集放在用户和内核共享空间,所以没有用户态内核态切换消耗,epoll_wait会等待文件描述符就绪,当有文件描述符就绪就会将全部的就绪的文件描述符往前排,而后返回就绪的文件描述符个数,返回后执行下面的代码,就能够不用遍历全部的文件描述符,而后只处理前面的文件描述符,因此epoll解决了select,poll都没有解决的问题 1.不须要将文件描述符合集拷贝到内核空间 2.不须要遍历文件描述符合集找就绪文件描述符

因为看了不少资料,每一个都有所简化或者抽象归纳,底层原理讲的有所差异,就像函数原型都不同,还有epoll如何实现不用遍历,视频是说重排,有的说是加中间层,链表,目前了解大概原理,具体暂定
上面截图的视频
好文章
好文章

相关文章
相关标签/搜索