美文网首页网络通讯编程
5.5、监听端口实战、epoll介绍及原理详析

5.5、监听端口实战、epoll介绍及原理详析

作者: 奥斯特洛司机 | 来源:发表于2019-03-31 18:11 被阅读0次

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():往双向链表中插入数据。

相关文章

网友评论

    本文标题:5.5、监听端口实战、epoll介绍及原理详析

    本文链接:https://www.haomeiwen.com/subject/qxuubqtx.html