08.select、poll、epoll

01.select、epoll、pol

select、poll、epoll是内核的服务
1、windows下只有 select服务、poll
2、Linux下:select、poll、epoll
怎么使用
1、协程
2、tornado

1.1 I/O 多路复用

1、特点: 用户还是要等待数据从kernel拷贝到用户进程
2、IO multiplexing就是我们说的select,poll,epoll,有些地方也称这种IO方式为event driven IO
3、它的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程
1)当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket
2)当任何一个socket中的数据准备好了,select就会返回
3)这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
4)虽然是多并发但是还有一些卡,因为都要等待数据从kernel拷贝到用户进程
5)其实select,poll,epoll实质就是循环着接收数据
6)select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

1.2 I/O的实质是什么?

I/O的实质是什么?

1、I/O的实质是将硬盘中的数据,或收到的数据实现从内核态 copy到 用户态的过程
2、比如微信读取本地硬盘的过程
  微信进程会发送一个读取硬盘的请求----》操作系统
  只有内核才能够读取硬盘中的数据---》数据返回给微信程序(看上去就好像是微信直接读取)
用户态 & 内核态

1、系统空间分为两个部分,一部分是内核态,一部分是用户态的部分
2、内核态:内核态的空间资源只有操作系统能够访问
3、用户态:我们写的普通程序使用的空间

1.3 select、poll、epoll特点

select
只能处理1024个连接(每一个请求都可以理解为一个连接)
不能告诉用户程序,哪一个连接是活跃的
pool
只是取消了最大1024个活跃的限制
不能告诉用户程序,哪一个连接是活跃的
epool
不仅取消了1024这个最大连接限制
而且能告诉用户程序哪一个是活跃的

1.4 epoll本质

简单说法
协程遇到I/O后自动切换,但是会保持一个socket连接,交给系统内核去处理工作
epoll()就工作内核中,他维护了一个链表,来存放所有的socket连接
当内核处理完成后就会回调一个函数,以socket文件描述符为key,结果为value存放到字典中
此时这个列表还是在内核中,需要将这个字典拷贝到用户空间(用户进程中)

本质

1.epoll()中内核则维护一个链表,epoll_wait直接检查链表是不是空就知道是否有文件描述符准备好了。
2.在内核实现中epoll是根据每个sockfd上面的与设备驱动程序建立起来的回调函数实现的。
3.某个sockfd上的事件发生时,与它对应的回调函数就会被调用,来把这个sockfd加入链表,其他处于“空闲的”状态的则不会。
4.epoll上面链表中获取文件描述,这里使用内存映射(mmap)技术,避免了复制大量文件描述符带来的开销
内存映射(mmap):内存映射文件,是由一个文件到一块内存的映射,将不必再对文件执行I/O操作

原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/14583815.html