epoll

epoll实现Reactor模式

夙愿已清 提交于 2019-11-29 03:17:25
转自:http://blog.csdn.net/analogous_love/article/details/53319815 最近一直在看游双的《高性能 Linux 服务器编程》一书,下载链接: http://download.csdn.net/detail/analogous_love/9673008 书上是这么介绍Reactor模式的: 按照这个思路,我写个简单的练习: [cpp] view plain copy /** * @desc : 用reactor模式练习服务器程序,main.cpp * @author : zhangyl * @date : 2016.11.23 */ #include <iostream> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> //for htonl() and htons() #include <unistd.h> #include <fcntl.h> #include <sys/epoll.h> #include <signal.h> //for signal() #include <pthread.h> #include <semaphore.h>

epoll的ET和LT模式下,accept,recv,send写法

北城以北 提交于 2019-11-29 03:14:52
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/peng314899581/article/details/78066374 epoll的ET和LT模式触发场景 accept的写法 while (true) { struct sockaddr_in addr; socklen_t addr_len = sizeof(addr); evutil_socket_t fd = accept(fd, (struct sockaddr *)&addr, &addr_len); if (fd == -1) { break; } log(LOG_DEBUG, "New accept ip:%s socket:%d", inet_ntoa(addr.sin_addr), fd); evutil_make_socket_nonblocking(fd); int optval = 1; setsockopt(fd, SOL_SOCKET, TCP_NODELAY, &optval, sizeof(optval)); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 为什么要用while?当epoll的读事件触发之后,我们要判断这个套接字是不是监听套接字

Epoll on regular files

六眼飞鱼酱① 提交于 2019-11-29 02:31:22
问题 Can epoll (on Linux) be somehow useful for regular files? I know it's primarily used with sockets but just wonder. 回答1: Not really. epoll only makes sense for file descriptors which would normally exhibit blocking behavior on read/write, like pipes and sockets. Normal file descriptors will always either return a result or end-of-file more or less immediately, so epoll wouldn't do anything useful for them. 回答2: I think, it will fail at epoll_ctl with EPERM: EPERM The target file fd does not

epoll+线程池实现高并发

我是研究僧i 提交于 2019-11-29 01:32:34
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_38506897/article/details/82863066 epoll模型是linux实现高并发的一种方法,基于事件驱动模型,相比于select/poll 模型具有更高的效率,本人对epoll模型做了一个简易的封装,更多的功能还在完善中,在这里仅做学习参考用。 在epoll编程中,有三个非常重要的函数: 1. int epoll_create(int size) :创建epoll 句柄, 入参是表示监听的数目是多大。 2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) : 事件注册函数, @param1:epoll句柄,epoli_create()的返回值, @param2: 表示注册的行为, 有ADD事件 、MOD事件、DEL事件, @param3: 注册的fd,在网络编程中,一般为sockfd,@param4:表示事件类型, 3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout) 等待事件的产生

Linux, sockets, non-blocking connect

扶醉桌前 提交于 2019-11-29 01:12:20
问题 I want to create a non-blocking connect. Like this: socket.connect(); // returns immediately For this, I use another thread, an infinite loop and Linux epoll. Like this(pseudocode): // in another thread { create_non_block_socket(); connect(); epoll_create(); epoll_ctl(); // subscribe socket to all events while (true) { epoll_wait(); // wait a small time(~100 ms) check_socket(); // check on EPOLLOUT event } } If I run a server and then a client, all it works. If I first run a client, wait a

Redis 基础

ⅰ亾dé卋堺 提交于 2019-11-29 01:04:07
基本类型 String,hash,list,set,sorted set(zset) 安装 按照README的安装步骤进行 架构原理 redis单进程,单线程,并发很多的请求,如何变得很快的呢?? 当我们使用多个redis-cli进行连接的时候,我们首先对通过redis-cli连接到了linux kernel,linux kernel自带一个epoll的调用,我们在使用redis服务端去调用linux的系统内核,调用epoll。 啥是epoll? 在linux kernel中,我们使用client,可以使用socket直接连接kernel。早期,我们可以使用read fd <unistd.h>读取文件描述符,线程/进程使用 read fd去读取linux kernel(因为这时候socket这个时期是阻塞的(blocking)),整个计算机,并没有实时处理打来的线程,这是 早期的bio时期 。内核有一个跃迁,变化的过程,socket中的fd可以是nonblock的。如果有1000fd,代表用户进程轮询用1000次kernel的成本问题。于是内核更新新的调用,叫做select,实现多路复用的NIO。之后又进行了一次迭代更新,我们kernel更新mmap,我们系统开放了一个虚拟的共享空间,可以供用户调用。 mmap? 在mmap的共享空间,我们使用红黑树+链表(共享空间并非零拷贝

Redis

那年仲夏 提交于 2019-11-28 23:34:23
基本类型 String,hash,list,set,sorted set(zset) 安装 按照README的安装步骤进行 架构原理 redis单进程,单线程,并发很多的请求,如何变得很快的呢?? 当我们使用多个redis-cli进行连接的时候,我们首先对通过redis-cli连接到了linux kernel,linux kernel自带一个epoll的调用,我们在使用redis服务端去调用linux的系统内核,调用epoll。 啥是epoll? 在linux kernel中,我们使用client,可以使用socket直接连接kernel。早期,我们可以使用read fd <unistd.h>读取文件描述符,线程/进程使用 read fd去读取linux kernel(因为这时候socket这个时期是阻塞的(blocking)),整个计算机,并没有实时处理打来的线程,这是 早期的bio时期 。内核有一个跃迁,变化的过程,socket中的fd可以是nonblock的。如果有1000fd,代表用户进程轮询用1000次kernel的成本问题。于是内核更新新的调用,叫做select,实现多路复用的NIO。之后又进行了一次迭代更新,我们kernel更新mmap,我们系统开放了一个虚拟的共享空间,可以供用户调用。 mmap? 在mmap的共享空间,我们使用红黑树+链表(共享空间并非零拷贝

epoll的EPOLLIN和EPOLLOU为什么不能同时关联

做~自己de王妃 提交于 2019-11-28 23:01:16
转自: http://blog.51cto.com/laokaddk/791945 epoll的EPOLLIN和EPOLLOU为什么不能同时关联 那么在操作EPOLLIN时,发生的发送数据操作会不会响应? 在操作EPOLLOUT时,客户机发送的来的数据会不会丢失? ================================================================================== 以下转自:http://blog.csdn.net/roen/archive/2007/03/21/1536148.aspx (1)导言: 首 先,我强烈建议大家阅读Richard Stevens著作《TCP/IP Illustracted Volume 1,2,3》和《UNIX Network Programming Volume 1,2》。虽然他离开我们大家已经5年多了,但是他的书依然是进入网络编程的最直接的道路。其中的3卷的《TCP/IP Illustracted》卷1是必读-如果你不了解tcp协议各个选项的详细定义,你就失去了优化程序重要的一个手段。卷2,3可以选读一下。比如卷2 讲解的是4.4BSD内核TCP/IP协议栈实现----这个版本的协议栈几乎影响了现在所有的主流os,但是因为年代久远,内容不一定那么vogue. 在这里我多推荐一本《The

linux之epoll

流过昼夜 提交于 2019-11-28 22:54:50
1. epoll简介 2. seletc和pool 3. epoll重要实现 4. epoll实现服务器和客户端通信 回到顶部 1. epoll简介    epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。 回到顶部 2. seletc和pool   在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地越来越有限,风头已经被epoll占尽。 select的缺点: (1)单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差;(在linux内核头文件中,有这样的定义:#define __FD_SETSIZE

linuxepoll和socket非阻塞读

这一生的挚爱 提交于 2019-11-28 22:21:40
linux version: Linux version 2.6.32-5-686 (Debian 2.6.32-48squeeze4) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Mon Sep 23 23:00:18 UTC 2013 noblock测试代码: epoll使用的是边缘触发模式 view source print ? 01. #include <stdio.h> 02. #include <sys/types.h> 03. #include <sys/socket.h> 04. #include <unistd.h> 05. #include <fcntl.h> 06. #include <sys/epoll.h> 07. #include <netinet/in.h> 08. #include <arpa/inet.h> 09. #include <sys/un.h> 10. #include <sys/ioctl.h> 11. #include <string.h> 12. #include <time.h> 13. #include <sys/time.h> 14. #include <errno.h> 15. 16. int main() 17. { 18. int