标签:取数 tor 数组 框架 技术 复制 bsp io操作 丢失
select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支)。
它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。
目前几乎在所有的平台上支持,具有良好的跨平台支持。
poll在1986年诞生于System V Release 3,它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。
没有最大文件描述符数量的限制。
在实际中,poll被认为是select,poll,epoll之间的一个过渡阶段,在实际中运用不多。
epoll是在Linux2.6中提出的,是之前的select和poll的增强版本。
相对于select和poll来说,epoll更加灵活,没有描述符限制。
epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
epoll是由内核直接支持的实现方法,它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。epoll是目前最流行的,目前知名框架Tornado,Nginx,Twisted等都是使用的epoll。
如:epoll监控着100个socket,交给kernel去监测,如果kernel发现只有两个socket有数据,那么kernel会告诉用户具体是哪一个socket有数据,只需要循环去这两个活跃的socket中收取数据,节省了这部分的开销。
注:水平触发和边缘触发(Level Triggered and Edge Triggered)
水平触发Level Triggered:在kernel中数据准备好,处于ready的状态,如果进程没有对其进行IO操作,数据就还是在kernel中,只有进程再次发送一个recvfrom(system call),触发后才会将kernel中的就绪的数据拷贝到用户内存中去。
边缘触发Edge Triggered:和水平触发相反,数据在kernel中ready后,如果进程没有对其进行IO操作,那么就不会再次return readable等信息给进程。数据还是在kernel中,并不会到用户内存中去。
仅在支持2.6内核的平台中支持。
Windows 不支持epoll,支持select。
四、
标签:取数 tor 数组 框架 技术 复制 bsp io操作 丢失
原文地址:http://www.cnblogs.com/zoe233/p/7275613.html