讲一下epoll

先认识一下select 和 poll

select 过程:

首先将一个连接分配一个channel,然后注册到select上面,每一个channel都有一个自己的状态,表示自己是否就绪,然后select 会遍历所有的channel,然后判断是都就绪,就绪的话就开启一个线程为他分配一个buffer,然后去读写操作

poll : 因为select能存储的fd,只有1024个,所以会限制并发量。select 采用类似于数组存储 fd, 而 poll 是采用链表存储的。所以没有限制 fd的大小。

 

epoll : 和上面两种完全不一样,epoll 是采用的回调的形式出发 fd 进入就绪链表。是这样的,首先 epoll_ctl 会将所有的fd都加载到 内核并绑定一个 回调函数,也就是当 fd 进入就绪状态他就会触发回调函数,将 fd 加入到就绪链表里面,然后就 epoll_wait 就只需要判断 就绪链表是不是为空就可以。 然后去启动线程分配buffer。

关于epoll的两种触发模式 

LT: 水平触发,意思就是只要是读写状态就会触发。

ET:边缘触发,只有在从不可读写变成可读写才会触发。

一般epoll都是使用ET模式的,因为 LT会对 一个 fd  有多次触发。 而ET不会。

 

 

另外说一下, nginx,nginx是基于epoll 的 IO多路复用。

nginx有一个master进程,还有多个worker进程。wroker进程数 = cpu个数。

 master负责监控 worker进程,如果worker挂掉了,master就会启动一个worker。(fork)

 

你可能感兴趣的:(讲一下epoll)