1、监听端口
1.1、开启监听端口
2、epoll技术简介
2.1、epoll概述
I/O多路复用技术:最大特点是支持高并发。
传统多路复用技术还有select、poll,在并发量达到1000或者2000时,性能就会明显下降。
从linux内核2.6开始引入的。单台支撑少则数万,多则数十上百万连接的核心技术。
性能一般不会随着并发量的提高而出现明显下降的情况,并发每增加一个,必定要消耗一定的能存去保存这个连接相关的数据。并发量还是有限制的。
同一时刻可能只有几十上百个客户端给服务器发送数据。epoll只处理这些客户端。select每次都要判断所有连接上有没有数据。
很多服务器程序用多进程,或者多线程与连接一一对应。
epoll事件驱动机制,在单独的进程或者线程里面运行,收集、处理事件,没有进程/线程间切换的消耗。
适合高并发,融合epoll技术到项目中,作为从事服务器开发工作的立身之本。
2.2、学习epoll要达到的效果及一些说明
a、理解epoll的工作原理。面试必然会考。
b、开始写代码
c、认可nginx epoll部分源码,以后自己可以从nginx中拿出代码来用吗?
3、epoll原理与函数介绍
3.1、课件介绍
理解好三个函数就等于掌握了epoll的工作原理。
https://github.com/wangbojing
c1000k_test:测试操作系统并发量,学完视频回头去看。
NtyTcp:epoll源码实现。nty_epoll_inner.h nty_epoll_rb.c
3.2、epoll_create()函数
格式: int epoll_creat( int size);
功能:创建一个eventepoll对象,返回对象描述符,这个文件描述符就能代表epoll对象,后续会用到。
这个epoll对象最终要用close()关闭,文件描述符嘛。
size>0就行。
原理:创建一颗空的红黑树,rbr指向根节点的指针。
创建一个空双向链表,rdlist指向双向链表的头指针。:从头遍历每个元素特别快。
3.3、epoll_ctl()函数
格式:int epoll_ctl(int efpd, int op, int sockid, struct epoll_event *event);
功能:把一个socket以及socket相关的事件添加到epoll对象描述符中去,
目的是通过epoll对象监视这个socket【tcp连接】。
当有数据来往时,系统会通知我们。
我们把感兴趣的事件添加到系统。
efpd:epoll_create返回的的epoll对象描述符。
op:动作,添加删除修改,
EPOLL_CTL_ADD,EPOLL_CTL_DEL,EPOLL_CTL_MOD
添加事件就等于往红黑树添加节点。socket作为key。
每个客户端连入服务器后,服务器都会产生一个对应的socket,
每个socket都是不一样的。
修改事件:是指查找红黑树,把感兴趣的事件移除。
删除节点EPOLL_CTL_DEL:从红黑树上移除连接。
sockid:accept()返回的。
event : 事件信息。增加和修改都要用到。
原理:节点的内容是epitem结构对象。
rbn是三个指针的结构,指向左子树,右子树,父节点。
红黑树的节点是epoll_ctl【EPOLL_CTL_ADD】往里面增加的。
3.4、epoll_wait()函数
格式:int epoll(int epfd, struct epoll_event *events, int maxevents, int timeout);
功能:阻塞一小段时间并等待时间发生,返回事件集合,也就是获取内核的事件通知。(遍历双向链表,把双向链表节点数据拷贝出去,拷贝完毕就从双向链表移除,因为双向链表的节点也是红黑树里面的节点,所以不能释放掉内存),因为双向链表记录的是所有有数据/有事件的socket【tcp连接】。
efpd:epoll_create返回的的epoll对象描述符。
events:是内存,是数组,长度:maxevents。表示此次epoll_wait调用可以收集到的maxevents个已经就绪的读写事件。(实际发生事件的tcp连接数目)
timeout:阻塞,等待的时间长度。
3.5、内核向双向链表增加节点
epitem设计的高明之处,既能够作为红黑树中的节点,又能够为双向链表中的节点。
什么时候,谁向双向链表中插入节点?
内核,当某个tcp中发生了epoll_ctl增加的感兴趣的事件时。
一般有4种情况会使操作系统把节点插入到双向链表中。
a、客户端完成三路握手,服务器要accept;
b、当客户端关闭连接的时候,服务器要调用close,
c、客户端发送数据来的时候,服务器read,recv来接收数据
d、当可以发送数据时,服务器可以调用send,write。
e、其他情况,实战再说。
3.6、源码阅读额外说明
epoll_event_callback():往双向链表中插入数据。
网友评论