Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8392
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2017-11-01 18:02
文章分类
文章存档

2017年(1)

我的朋友
最近访客

分类: C/C++

2017-11-01 20:40:15


使用epoll,主要就是调用其API,以及相应的数据结构。

1.使用C封装的3个系统调用
 涉及到的API: 

点击(此处)折叠或打开

  1. int epoll_create(int size);
  2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
  3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
涉及到的数据结构:

点击(此处)折叠或打开

  1. typedef union epoll_data {
  2.     void *ptr;
  3.     int fd;
  4.     __uint32_t u32;
  5.     __uint64_t u64;
  6. } epoll_data_t;

  7. struct epoll_event {
  8.     __uint32_t events; /* Epoll events */
  9.     epoll_data_t data; /* User data variable */
  10. };


具体的参数调用,参考man手册就好了,主要是说明一下时序。
在使用之前首先要调用epoll_create,:每次调用都会消耗一个FD值,此时系统会为该epoll创建一个空的红黑树和就绪链表。
此时该epoll是空的,需要调用epoll_ctl添加所关注的事件。添加事件时,会对红黑树做插入操作,并且会给内核中断程序注册一个回调函数,当该句柄的中断到了,就把它放到就绪链表中。

    当然,对于内存的分配,epoll模块使用了一些内核的cache来提升性能。

添加事件后,我们就可以调用epoll_wait来进行等待该事件了。


再就是这个epoll_event,events标识的是类型,关键就是data, 在很多事例程序中,就直接使用了事件ID。其实在项目实际中,可以直接将连接的结构体指针放入其内,这样可以方便拿到连接信息。不过,如果系统本身将连接信息设计与该ID相关也可以。


2. 网络编程中的epoll

   从上面可以看出,需要将所关注的事件添加到epoll中,才能用它来监听。而使用TCP编程时,是先建立一个网络监听,其它的客户端都是通过连上这个IP+Port后再进行处理。

    所以,我们只需要将创建监听的socket添加到epoll中就可以完成连接的监听。而对于连上来的客户端,可以看成点对点的数据,将其添加到epoll中就可以处理到收发数据(每次mod一下),而在连接断开时,再将其从epoll中移除即可。
 
 3.著名的ET、LT

 



LT(level triggered)epoll缺省的工作方式,并且同时支持blockno-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你 的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.


ET (edge-triggered)是高速工作方式,只支持no-block socket,它效率要比LT更高。ETLT的区别在于,当一个新的事件到来时,ET模式下当然可以从epoll_wait调用中获取到这个事件,可是如果这次没有把这个事件对应的套接字缓冲区处理完,在这个套接字中没有新的事件再次到来时,在ET模式下是无法再次从epoll_wait调用中获取这个事件的。而LT模式正好相反,只要一个事件对应的套接字缓冲区还有数据,就总能从epoll_wait中获取这个事件。

因此,LT模式下开发基于epoll的应用要简单些,不太容易出错。而在ET模式下事件发生时,如果没有彻底地将缓冲区数据处理完,则会导致缓冲区中的用户请求得不到响应


参考文献:

API 使用:http://blog.csdn.net/ljx0305/article/details/4065058

wait与定时器:http://blog.csdn.net/gbjj123/article/details/25155501

原理:http://blog.csdn.net/hdutigerkin/article/details/7517390


阅读(1241) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~