`
haoningabc
  • 浏览: 1474430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

能跑的epoll

 
阅读更多
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/time.h> 
#include <sys/socket.h> 
#include <sys/signal.h> 
#include <sys/resource.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <errno.h> 

#include <sys/epoll.h> 


#define RUNTIMES 16 


static int count, writes, fired; 
static int *pipes; 
static int num_pipes, num_active, num_writes; 
static int epfd; 
static struct epoll_event *events; 



unsigned long long getustime(void) { 
   struct timeval tm; 

   gettimeofday(&tm, NULL); 
   return (unsigned long long) tm.tv_sec * 1000000ULL + (unsigned long long) tm.tv_usec; 
} 


void read_cb(int fd, int idx) { 
   int widx = idx + num_active + 1; 
   u_char ch; 

   if (read(fd, &ch, sizeof(ch))) 
      count++; 
   else 
      fprintf(stderr, "false read event: fd=%d idx=%d\n", fd, idx); 
   if (writes) { 
      if (widx >= num_pipes) 
         widx -= num_pipes; 
      write(pipes[2 * widx + 1], "e", 1); 
      writes--; 
      fired++; 
   } 
} 


int run_once(long *work, unsigned long long *tr) { 
   int i, res; 
   unsigned long long ts, te; 

   fired = 0; 
   for (i = 0; i < num_active; i++, fired++) 
      write(pipes[i * 2 + 1], "e", 1); 

   count = 0; 
   writes = num_writes; 

   ts = getustime(); 
   do { 
      res = epoll_wait(epfd, events, num_pipes, 0); 
      for (i = 0; i < res; i++) 
         read_cb(pipes[2 * events[i].data.u32], events[i].data.u32); 
   } while (count != fired); 
   te = getustime(); 

   *tr = te - ts; 
   *work = count; 

   return (0); 
} 


int main (int argc, char **argv) { 
   struct rlimit rl; 
   int i, c; 
   long work; 
   unsigned long long tr; 
   int *cp; 
   struct epoll_event ev; 
   extern char *optarg; 

   num_pipes = 100; 
   num_active = 1; 
   num_writes = num_pipes; 
   while ((c = getopt(argc, argv, "n:a:w:")) != -1) { 
      switch (c) { 
      case 'n': 
         num_pipes = atoi(optarg); 
         break; 
      case 'a': 
         num_active = atoi(optarg); 
         break; 
      case 'w': 
         num_writes = atoi(optarg); 
         break; 
      default: 
         fprintf(stderr, "Illegal argument \"%c\"\n", c); 
         exit(1); 
      } 
   } 

   rl.rlim_cur = rl.rlim_max = num_pipes * 2 + 50; 
   if (setrlimit(RLIMIT_NOFILE, &rl) == -1) { 
      perror("setrlimit"); 
      exit(1); 
   } 

   events = calloc(num_pipes, sizeof(struct epoll_event)); 
   pipes = calloc(num_pipes * 2, sizeof(int)); 
   if (events == NULL || pipes == NULL) { 
      perror("malloc"); 
      exit(1); 
   } 

   if ((epfd = epoll_create(num_pipes)) == -1) { 
      perror("epoll_create"); 
      exit(1); 
   } 

   for (cp = pipes, i = 0; i < num_pipes; i++, cp += 2) { 
      if (pipe(cp) == -1) { 
         perror("pipe"); 
         exit(1); 
      } 
      fcntl(cp[0], F_SETFL, fcntl(cp[0], F_GETFL) | O_NONBLOCK); 
   } 

   for (cp = pipes, i = 0; i < num_pipes; i++, cp += 2) { 
      ev.events = EPOLLIN; 
      ev.data.u32 = i; 
      if (epoll_ctl(epfd, EPOLL_CTL_ADD, cp[0], &ev) < 0) { 
         perror("epoll_ctl"); 
         exit(1); 
      } 
   } 

   for (i = 0; i < RUNTIMES; i++) { 
      run_once(&work, &tr); 
      if (!work) 
         exit(1); 
      fprintf(stdout, "%lf\n", (double) tr / (double) work); 
   } 

   exit(0); 
}
分享到:
评论

相关推荐

    Delphi 跨平台 Socket 通讯库

    &gt; 能跑10万以上的并发数, 需要修改注册表调整默认的最大端口数 - Mac &gt; 做了初步测试, 测试环境为虚拟机中的 OSX 10.9.5, 即便修改了系统的句柄数限制, &gt; 最多也只能打开32000多个并发连接, 或许 OSX Server 版...

    NginX VS2013工程

    直接打开简单配置以下nginx_conf就能跑。 需要的第三方库已经包含了进去。 因为有一些系统函数windows实在没有,移植工作太耗费时间。 就直接把一些模块删掉了。 epoll和poll肯定是用select了。 不过对于初学者,...

    LibraryCodeComments:通用开源库(muduo,云风coroutine库,epoll,go1.5.1)源码注释,保证保证一直更新

    包含自己学习过的开源库,开源代码的注释版本,目前包括muduo,云风协程,epoll,go1.5.1 库名 语言 进度 木多 C ++ 已完成 云风协程 C 已完成 投票 C 已完成 go1.5.1 去 未完成

    haproxy-1.7.11 windows 最新稳定版本

    -db 禁用后台模式,程序跑在前台 -sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后 -st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后

    nginx v1.5.9 for windows

    2 在Windows下 只支持select和iocp两种网络IO模型 其中iocp模型虽然可以支持高并发连接 但目前版本的iocp只支持Web服务器(有的版本使用iocp作WEB服务器都跑不通) 不支持反向代理服务器 更不支持SSL连接;...

    nginx v1.5.9 for windows 源程序

    2 在Windows下 只支持select和iocp两种网络IO模型 其中iocp模型虽然可以支持高并发连接 但目前版本的iocp只支持Web服务器(有的版本使用iocp作WEB服务器都跑不通) 不支持反向代理服务器 更不支持SSL连接;...

    Linux高性能服务器编程_随书代码

    此外,高性能服务器通常需要高效的I/O模型,例如异步非阻塞I/O(epoll)、事件驱动编程(如libevent或libev)和信号驱动I/O。书中的代码可能演示了如何利用这些机制来提高服务器的并发处理能力。 内存管理也是关键...

    csapp proxylab

    这可能涉及到多线程或异步I/O模型,如epoll或select。 2. **协议转换**:由于代理需要在客户端和服务器之间传递HTTP请求,它需要正确处理请求和响应的编码、解码,例如URL编码、字符集转换等。 3. **安全性**:...

    nginx配置详解

    `:指定每个工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把 CPU 跑到 100%。 keepalive 超时时间 * `keepalive_timeout 60;`:指定 keepalive 超时时间为 60 秒。 客户端...

    跟我学Nginx+Lua开发

    本文目的是学习Nginx+Lua开发,nginx+lua还会...在这里需要注意的是因为openresty其实也是集成了nginx,所以在一台机器上跑两个nginx可能有相应的问题,所以在安装openresty之后,机器上已有的nginx可能会有一定影响。

    nginx+tomcat.docx

    * 非阻塞、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数 * 事件驱动:通信机制采用epoll模型,支持更大的并发连接 Nginx的应用现状: * Nginx已经在俄罗斯最大的门户网站── ...

    高性能服务器架构设计和调优

    4. **小包跑满万兆网卡,中断平衡**:通过调整网络配置和优化数据包处理逻辑,确保网络带宽得到充分利用。 #### 四、CDN Cache系统模型 ##### Net模块 - 使用 **epoll + O_NONBLOCK** 的I/O模型,支持高并发连接...

    Xserver:C 语言实现的一个 web server,使用 JSON 格式的配置文件,支持静态请求和 PHP 文件,以及GET POST方法

    I / O复用(epoll ET) 无阻塞I / O,有限状态机 线程池 怎么跑 请确保您已安装 。 git clone git@github.com:Tanswer/Xserver.git cd Xserver ./autorun 完全的 http持久连接 投放静态(.html) 支持PHP...

    Nginx+Tomcat负载均衡

    我们需要在一台机器上跑 2 个不同的 tomcat ,避免出现端口被占用的情况,为了规范统一,我们修改全部tomca端口。分别找到tomcat6的1和2 的conf下的 server.xml。 修改Server端口 找到Server将: 改为 XXXX 在...

    tinyasync:使用C ++ 20协程的微型异步网络库

    它支持Windows和Linux(epoll)。 有教育意义! 有教育意义! 有教育意义的!缺点: 现在它的功能还不够。 虽然它有几个工作示例。 它缺少很多功能,对于工业生产来说是必需的。 它目前不支持多线程。 虽然,我试图...

    后端开发基础知识整理JAVA、JVM、操作系统、网络、设计模式、mysql、redis、多线程、spring、springboo

    - **Select、epoll区别**:Select受限于文件描述符数量,epoll无此限制且效率更高。 - **高并发解决方案**:使用NIO、AIO、线程池等技术提高并发能力。 - **Zero Copy**:减少数据复制次数,提高性能。 - **字节流、...

    基于linux/C++的网络爬虫

    - **异步IO**:考虑到爬虫的效率,可以使用epoll或libevent等库实现异步I/O,提高并发处理能力。 3. **线程与多进程** - **线程池**:为避免频繁创建和销毁线程的开销,可使用线程池管理多个任务,提高效率。 - ...

    webserv

    - **事件驱动模型**:如使用epoll、kqueue等系统调用实现异步非阻塞I/O,以高效处理大量并发连接。 - **多线程模型**:每个连接由一个单独的线程处理,确保并发处理的并行性,但需要考虑线程同步问题。 - **工作进程...

Global site tag (gtag.js) - Google Analytics