I/O复用-epoll模型
epoll函数
epoll函数的使用与select、poll上有很大的差异.
- epoll使用一组函数来完成任务,而不是单个函数.
- epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无需每次都要重复传入文件描述符集或者事件集.
- epoll需要一个额外的文件描述符,来唯一标示内核中的这个事件表.
epoll函数
#include <sys/epoll.h>
int epoll_create(int size); //size并不起作用,只是给内核一个提示,告诉它事件表需要多大.
下面函数用来操作epoll的内核事件表
#include <sys/epoll.h>
int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event);
/*fd参数是要操作的文件描述符,op指定操作类型*/
op操作类型有如下3种:
- EPOLL_CTL_ADD 往事件表中注册fd上的事件.
- EPOLL_CTL_MOD 修改事件表中的注册事件.
- EPOLL_CTL_DEL s删除fd上的注册事件.
event参数指定事件,它是epoll_event结构指针类型.epoll_event的定义如下:
struct epoll_event{
__uint32_t events; /*epoll事件*/
epoll_data_t data; /*用户数据*/
};
其中events成员描述事件类型,它与poll模型的事件类型基本相同.只是要在其类型前面加上"E",比如EPOLLIN.但epoll有两个额外的事件类型-EPOLLINET和EPOLLONESHOT,它们对于epoll的高效运作非常关键.具体请查阅资料.
data成员用于存储用户数据,其类型epoll_data_t的类型如下:
typedef union epoll_data{
void* ptr;
int fd;
uint32_t u32;
uint64_t u64;
}epoll_data_t;
epoll_data_t是一个联合体,其4个成员中使用最多的是fd.
epoll_ctl成功时返回0,失败则返回-1并设置errno.
epoll_wait函数
#include <sys/epoll.h>
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);
函数成功时返回就绪的文件描述符的个数,失败时返回-1并设置errno.
epoll_wait函数如果检测到事件,就将所有就绪的事件从内核事件表中(由epfd参数指定)中复制到它的第二个参数events指向的数组中.这个数组只用于输出epoll_wait检测到的就绪事件,而不像select和poll的数组参数那样既用于传入用户注册的事件,又用于输出内核检测到的就绪事件.这样极大的提高了应用程序索引就绪文件描述符的效率.
poll和epoll在使用上的差别
/*如何索引poll返回的就绪文件描述符*/
int ret=poll(fds,MAX_EVENT_NUMBER,-);
/*必须遍历所有已注册文件描述符并找到其中的就绪*/
for(int i=;i<MAX_EVENT_NUMBER;i++){
if(fds[i].revents & POLLIN){
int sockfd=fds[i].fd;
/*处理sockfd*/
}
} /*如何索引epoll返回的就绪的文件描述符*/
int ret=epoll(epollfd,events,MAX_EVENTS,-);
/*仅遍历就绪的ret个文件描述符*/
for(int i=;i<ret;i++){
int sockfd=events[i].data.fd;
/*sockfd肯定就绪,直接处理*/
}
epoll的LT和ET模式
epoll对文件描述符的操作有两种模式:LT和ET.当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以ET模式来操作该文件描述符.ET模式是epoll的高效工作模式.
LT:当epoll_wait检测到其文件描述符上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件。这样,当应用程序下一次调用epoll_wait时,epoll_wait还会再次向应用程序通告此事件,直到该事件被处理。
ET:当epoll_wait检测到其文件描述上的事件发生并将此通知应用程序后,应用程序必须立即处理,因为后续的epoll_wait调用将不再向应用程序通知这一事件.
因此,ET模式在很大程度上降低了同一个epoll事件被触发的次数.所以效率要比LT模式高.
参考于 《Linux高性能服务器端编程》
I/O复用-epoll模型的更多相关文章
- (OK) Linux epoll模型—socket epoll server client chat
http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html http://blog.csdn.net/denkensk/article/d ...
- nginx中的epoll模型
要了解epoll模型,就要一个一个知识点由浅至深地去探索. 1.IO复用技术 IO流请求操作系统内核,有串行处理和并行处理两种概念. 串行处理是前面一个操作处理地时候,后面的所有操作都需要等待.因此, ...
- Nginx 所使用的 epoll 模型是什么?
对于 Nginx,相信有过 Web 服务部署经验的同学都不陌生,它有以下特点: 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 相较于 A ...
- 一只简单的网络爬虫(基于linux C/C++)————浅谈并发(IO复用)模型
Linux常用的并发模型 Linux 下设计并发网络程序,有典型的 Apache 模型( Process Per Connection ,简称 PPC ), TPC ( Thread Per Conn ...
- Epoll模型详解
Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数. 1.为什么select落后 首先,在Lin ...
- 【转】select和epoll模型的差异
http://www.cppblog.com/converse/archive/2008/10/12/63836.html epoll为什么这么快 epoll是多路复用IO(I/O Multiplex ...
- linux epoll模型
原文:http://yjtjh.blog.51cto.com/1060831/294119 Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数.Linux ...
- Linux网络服务器epoll模型的socket通讯的实现(一)
准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码: 1 #include <s ...
- select 和epoll模型区别
1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...
随机推荐
- web标准(复习)--5 超链接伪类
今天我们开始学习超链接伪类,包含以下内容和知识点: 链接的四种样式 将链接转换为块状 用css制作按钮 首字下沉 一.超链接的四种样式 超链接可以说是网页发展史上一个伟大的发明,它使得许多页面相互链接 ...
- 02.Lua的数据类型
简单认识Lua 百度了一下(偷哈懒就不自己写了) Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janei ...
- [Mugeda HTML5技术教程之6]添加元素
我们上节讲了怎么创建新作品.新作品创建好后,我们就可以在里面添加内容了.这一节,我们将要讲述如何在作品中添加元素.动画的中的内容都是以各种元素的形式组成的.对于添加到舞台上的元素,我们可以在时间线上添 ...
- centos 安装,配置memcached
先查看是否已经安装了memcached输入memcached -h会输出memcached版本,或print phpinfo查看: memcached需要libevent支持,没有libevent,就 ...
- Android再学习-20141022-Activity的生命周期
20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...
- C程序设计语言练习题1-4
练习1-4 编写一个程序打印摄氏温度转换为相应华氏温度的转换表. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的 ...
- 移动端远程关闭PC端实现(一)需求设计
公司有台半新不旧的电脑,因无甚大用,就拿来做了服务器,服务于民.服务器所提供的功能不是太多,无非是数据库以及svn服务. 公司每天下班会断电,我们吧会常常忘记关闭服务器,所以服务器非正常关机的次数约等 ...
- Swift 总结使用问号(?)和感叹号(!)-备用
在使用可选类型和可选链时,多次使用了问号(?)和感叹号(!),但是它们的含义是不同的,下面我来详细说明一下. 1. 可选类型中的问号(?) 声明这个类型是可选类型,访问这种类型的变量或常量时要使用感叹 ...
- 在NGINX作反向代理,CI(CodeIgniter)的PHP框架下限制管理目录的IP的实现
这个搞得有点久,不过,还算完美解决. 主要是前端NGINX,后端也是NGINX. 前端的NGINX不好作相关的URL权限限制,因为所有的URL在CI里都要经过INDEX.PHP重定向. 并且,在后端N ...
- Codeforces 56D Changing a String
http://codeforces.com/contest/56/problem/D 题目大意: 一个字符串变为目标字符串,可以执行插入,置换和删除3种操作,求最少操作数. 思路:dp[i][j]代表 ...