File tree 1 file changed +12
-1
lines changed
1 file changed +12
-1
lines changed Original file line number Diff line number Diff line change @@ -31,6 +31,17 @@ Epoll模型属于诸多IO多路服用模型中的一种,但是相比其他IO
31
31
> - select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符IO操作,那么之后每次select调用还是会将这些文件描述符通知进程去处理;
32
32
> - poll相比select模型,poll使用链表保存描述符,因此没有监视文件数量的限制,pollfd支持复用仅初始化一次,但是依然存在fd拷贝和遍历问题;
33
33
34
- ** Epoll IO多路复用模型实现机制**
34
+ ** Epoll IO多路复用模型实现机制:**
35
+ 由于epoll的实现机制与select/poll机制完全不同,上面所说的select的缺点在epoll中不复存在。
36
+ epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子:在1GB的内存机器上大约是10万左右的最大连接。
37
+
38
+ Epoll如何实现高并发的?
39
+ 在select/poll时代,服务器进程每次都需要把连接告诉操作系统(从用户态复制句柄数据到内核态),让操作系统内核去内核查询这些套接字上是否有事件变化,轮训完后再复制到用户态,让服务器应用程序轮询处理已发生的网络事件,这个过程消耗较大,因此select/poll无法处理几千个并发连接。
40
+ epoll的设计和实现与select完全不同,epoll通过在linux内核中申请一个简易的文件系统(采用B+Tree结构存储)。把原先的select/poll调用分为3个部分:
41
+ > - 调用epoll_create()建立一个epoll对象(在epoll文件系统中这个句柄对象分配资源);
42
+ > - 调用epoll_ctl向epoll对象添加套接字;
43
+ > - 调用epoll_wait收集发生事件的连接;
44
+ 在进程启动时创建一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。同时,epoll_wait的效率也非常高,因为epoll_wait时,并没有一股脑的想操作系统复制连接句柄数据,内核也不需要去遍历全部连接。
45
+
35
46
36
47
You can’t perform that action at this time.
0 commit comments