poll

epoll的一个使用例子

冷暖自知 提交于 2019-11-28 13:47:02
使用到主要函数有: #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); typedef union epoll_data {   void *ptr;   int fd;   uint32_t u32;   uint64_t u64; } epoll_data_t; struct epoll_event {   uint32_t events; /* Epoll events */   epoll_data_t data; /* User data variable */ }; 1 #define EPOLL_SIZE 1024 2 int doServiceEpoll(int listenFd) 3 { 4 struct epoll_event events[EPOLL_SIZE]; 5 6 struct epoll_event event; 7 int epollFd =

epoll完整例子

会有一股神秘感。 提交于 2019-11-28 13:45:48
#include <deque> #include <map> #include <vector> #include <pthread.h> #include <semaphore.h> #include <time.h> #include <sys/time.h> #include <sys/shm.h> #include <errno.h> #include <sys/types.h> #include <fcntl.h> #include <stdio.h> #include <string> #include <cstdio> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <cstdlib> #include <cctype> #include <sstream> #include <utility> #include <stdexcept> #include <sys/socket.h> #include <sys/epoll.h> #include <netinet/in.h> #include <arpa/inet.h> #include <iostream> #include <signal.h> using

Linux中select poll和epoll的区别

和自甴很熟 提交于 2019-11-28 12:14:47
在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并 发的场景下,nginx越来越收到欢迎。这里有个文章参考。 Nginx成为全球Top1000网站最受欢迎的Web服务器。 据 w3techs 7月 3 日的统计数据表明,在全球 Top 1000 的网站中,有 34.9% 的网站在使用 Nginx,这使得 Nginx 超越了 Apache,成为了高流量网站最信任的 Web 服务器。下图是统计数据。 select: 下面是select的函数接口: int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可)

Kqueue与epoll机制

江枫思渺然 提交于 2019-11-28 09:01:57
首先介绍阻塞与非阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者说接下来的事要等快递来了才能做);那么你可以去睡觉了,因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。非阻塞忙轮询。接着上面等快递的例子,如果用忙轮询的方法,那么你需要知道快递员的手机号,然后每分钟给他挂个电话:“你到了没?” 很明显一般人不会用第二种做法,不仅显很无脑,浪费话费不说,还占用了快递员大量的时间。 大部分程序也不会用第二种做法,因为第一种方法经济而简单,经济是指消耗很少的CPU时间,如果线程睡眠了,就掉出了系统的调度队列,暂时不会去瓜分CPU宝贵的时间片了。 为了了解阻塞是如何进行的,我们来讨论缓冲区,以及内核缓冲区,最终把I/O事件解释清楚。缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用,当你操作一个流时,更多的是以缓冲区为单位进行操作,这是相对于用户空间而言。对于内核来说,也需要缓冲区。 假设有一个管道,进程A为管道的写入方,B为管道的读出方。 假设一开始内核缓冲区是空的,B作为读出方,被阻塞着。然后首先A往管道写入,这时候内核缓冲区由空的状态变到非空状态,内核就会产生一个事件告诉B该醒来了,这个事件姑且称之为“缓冲区非空”。 但是“缓冲区非空”事件通知B后,B却还没有读出数据

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

孤街浪徒 提交于 2019-11-28 08:37:21
小白科普:Netty有什么用? 原创: 老刘 码农翻身 2017-11-20 随着移动互联网的爆发性增长,小明公司的电子商务系统访问量越来越大,由于现有系统是个单体的巨型应用,已经无法满足海量的并发请求,拆分势在必行。 在微服务的大潮之中, 架构师小明把系统拆分成了多个服务,根据需要部署在多个机器上,这些服务非常灵活,可以随着访问量弹性扩展。 世界上没有免费的午餐, 拆分成多个“微服务”以后虽然增加了弹性,但也带来了一个巨大的挑战:服务之间互相调用的开销。 比如说:原来用户下一个订单需要登录,浏览产品详情,加入购物车,支付,扣库存等一系列操作,在单体应用的时候它们都在一台机器的同一个进程中,说白了就是模块之间的函数调用,效率超级高。 现在好了,服务被安置到了不同的服务器上,一个订单流程,几乎每个操作都要越网络,都是远程过程调用(RPC), 那执行时间、执行效率可远远比不上以前了。 远程过程调用的第一版实现使用了HTTP协议,也就是说各个服务对外提供HTTP接口。 小明发现,HTTP协议虽然简单明了,但是废话太多,仅仅是给服务器发个简单的消息都会附带一大堆无用信息: GET /orders/1 HTTP/1.1 Host: order.myshop.com User-Agent: Mozilla/5.0 (Windows NT 6.1; ) Accept: text/html;

NGINX配置文件详解

拥有回忆 提交于 2019-11-28 06:29:28
worker_cpu_affinity auto; Binds worker processes to the sets of CPUs. worker_rlimit_nofile number; worker进程所能打开的最大文件描述符数量,一般与ulimit -n相同即可 error_log logs/error.log; 存放错误日志路径 pid logs/nginx.pid; pid进程路径 event{ use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能 worker_connections 1024; #单个后台worker process进程的最大并发链接数 accept_mutex off; #当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」。一般为了吞吐量还是关闭好一点。 multi_accept on; #尽可能多的接受请求,否则一个worker进程只接收一个连接。 }

高级IO

有些话、适合烂在心里 提交于 2019-11-28 06:24:22
高级IO: 五种IO模型:阻塞IO; 非阻塞IO; 信号驱动IO;异步IO;多路转接IO IO操作分为两个过程:等待/数据拷贝 阻塞IO: 发起IO调用后,若不具备IO条件,则等待IO条件具备,拷贝数据后返回 非阻塞IO: 发起IO调用后,若不具备IO条件,则立即报错返回,若具备IO条件则立即拷贝数据后返回 信号驱动IO: 先定义IO信号处理,若IO条件具备则直接信号通知进程,发起调用,拷贝数据后返回 异步IO: 先定义IO信号处理,发起异步IO调用,直接返回。让别人进行IO等待,等待IO条件具备后拷贝数据 (与信号驱动的区别是拷贝数据是由别人来完成的)信号通知进程IO完成 ** 阻塞:为了完成功能发起调用,如果当前不具备完成条件,则一直等待,直到完成后返回。 非阻塞:为了完成功能发起调用,如果当前不具备完成条件,直接报错返回;通常需要循环处理 阻塞与非阻塞:调用功能当前不具备完成条件是否立即返回。 同步:为了完成功能发起调用,如果当前不具备完成条件,则自己等待完成功能后返回 异步:为了完成功能发起调用,但是功能由别人来完成 同步与异步的区别:功能是否由自己来完成 同步操作通常都是阻塞操作 异步包含两种: 异步阻塞操作:等待别人完成操作 异步非阻塞操作:不等待别人完成操作 同步与异步的优缺点: 同步:流程控制简单,但是效率相对较低 异步:流程控制较难,但是效率相对较高 多路转接IO

【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

末鹿安然 提交于 2019-11-28 05:37:48
【摘要】 官网博文翻译,nodejs中的定时器 示例代码托管在: http://www.github.com/dashnowords/blogs 原文地址: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick 如果你常年游走于 Nodejs中文网 ,可能已经错过了官方网站上的第一手资料, Nodejs中文网 并没有翻译这些非常高质量的核心文章,只提供了中文版的API文档(已经很不容易了,没有任何黑它的意思,我也是中文网的受益者),它们涵盖了Node.js中从核心概念到相关工具等等非常重要的知识,下面是博文的目录,你知道该怎么做了。 Event Loop 是什么? 事件循环是 Node.js 能够实现非阻塞I/O的基础,尽管JavaScript应用是单线程运行的,但是它可以将操作向下传递到系统内核去执行。 大多数现代系统内核都是支持多线程的,它们可以同时在后台处理多个操作。当其中任何一个任务完成后,内核会通知 Node.js ,这样它就可以把对应的回调函数添加进 poll 队列,回调函数最终就能够被执行,后文中我们还会进行更详细的解释。 Event Loop 基本解释 当 Node.js 开始运行时,它就会初始化 Event Loop ,然后处理脚本文件(或者在 REPL ( read-eval-print

美团后台面经

末鹿安然 提交于 2019-11-28 03:12:51
日期:2019.08.21 1、14道选择题,一道编程题(十进制转十六进制)30分钟左右做完 3、介绍一下做过的项目,功能、技术、负责哪些部分? 2、struct和class的区别 3、C++模板关键字 4、纯虚函数作用,纯虚函数可不可以有实现体? 5、linux I/O 模型,几种方式(从select答到epoll) 6、STL常用的容器及用法 7、如果元素是复杂的结构体,map插入时怎么处理? 8、动态库和静态库,动态库有几种调用方式? 9、linux大小端模式(说了高位地址、低位地址) 10、有什么问题问我? 感觉C++底层的知识答得不太好,也确实是自己理解得不够深入,继续加油吧! 来源: https://www.cnblogs.com/myblog1993/p/11388243.html

Linux 内核收发包流程

人走茶凉 提交于 2019-11-28 01:00:29
转载: https://blog.csdn.net/kklvsports/article/details/74452953 收包流程: 传统方式和NAPI方式收包流程是有差异的,如图所示。 传统收包是中断,驱动处理完后直接调用netif_rx将报文送入内核处理,内核将报文skb挂到该CPU的softnet_data结构input_pkt_queue队列上, 为了统一传统收包和NAPI设备收包的处理,内核为所有不使用NAPI的驱动程序提供一个虚拟设备,叫做积压设备,每个CPU一个积压设备,对应结构softnet_data->backlog_dev。input_pkt_queue即是该设备的积压队列,用于存储skb,该队列是一个双向链表,组织结构如下。中断上半部只是将报文入队,并将backlog的实例挂到poll_list上,等待下半部软中断轮询poll_list net_rx_action->preocess_backlog将报文进一步处理。 input_pkt_queue structure +------------------------------------------------------------+ | | | skb_buff_head skb_buff skb_buff | | _______ _______________ _______________ |