1. select (能监控数量有限,不能告诉用户程序具体哪个连接有数据)
1. select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点
2. select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024
3. select监控socket连接时不能准确告诉用户是哪个,比如:现在用socket监控10000链接,
如果其中有一个链接有数据了,select就会告诉用户程序,你有socket来数据了,那样就只能自己循环10000次判断哪个活跃
2. poll(和select一样,仅仅去除了最大监控数量,可以理解为poll是一个过渡阶段,大家也都不用他)
1. poll和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制
3. epoll (不仅没有最大监控数量限制,还能告诉用户程序哪个连接有活跃)
注:epoll被认为是linux下性能最好的多路io就绪通知方法
1. epoll直到Linux2.6(centos6以后)才出现了由内核直接支持
2.epoll没有最大文件描述符数量限制
ps: epoll最重要的优点是他可以直接告诉用户程序哪一个,比如现在用epoll去监控10000个socket链接,
交给内核去监测,现在有一个连接有数据了,在有有一个连接有数据了,epoll会直接高数用户程序哪个连接有数据了
4. epoll能实现高并发原理
1. epoll() 中内核则维护一个链表,epoll_wait 直接检查链表是不是空就知道是否有文件描述符准备好了。
2. 在内核实现中 epoll 是根据每个 sockfd 上面的与设备驱动程序建立起来的回调函数实现的。
3. 某个 sockfd 上的事件发生时,与它对应的回调函数就会被调用,把这个 sockfd 加入链表。
4. epoll上面链表中获取文件描述,这里使用内存映射(mmap)技术, 避免了复制大量文件描述符带来的开销
内存映射(mmap):内存映射文件,是由一个文件到一块内存的映射,将不必再对文件执行I/O操作