poll

0MQ 事件驱动 以及 poller

孤街浪徒 提交于 2020-01-03 02:40:47
底层IO事件,以及借用socket poller的上层0MQ socket事件。 先来看用于底层和上层的两种poller。 这是用于底层io事件的poller_t,每个socket_base_t都关联到一个poller_t,这个poller_t运行在io_thread_t线程上。 这是运行在0MQ socket层的事件poller。运行在你的控制线程,也就是你编程的线程。 每次你使用zmq_poller_poll都会创建一个sokcet_poller_t去进行poll。 我们要去轮询一个0MQ socket层事件,我们会通过zmq_poll将socket_base_t添加到poller而不是底层fd。 item_t的第二个成员是pollfd,在这里设置为0,表示并不使用fd进行poll。 下面再看socket_poller_t::wait 注释写得很清楚,并不是在poll底层的fd,在poll返回后,遍历所有socket_base_t,并getsocket去取ZMQ_EVENTS事件。zmq_poll被唤醒一般是0MQ socket通过signaler_t去发送唤醒信号。 再来看socket_poller_t::rebuild(), 这是每次socket_poller_t::wait()之初都调用的。 其中它为我们需要进行zmq_poll的socket_base

网络IO模型

拈花ヽ惹草 提交于 2020-01-02 09:21:16
在介绍网络IO模型,我们先来看一下同步和异步,以及阻塞和非阻塞的概念。 同步和异步关注的是结果消息的通信机制 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函数等。 阻塞和非阻塞主要关注的是等待结果返回调用方的状态 阻塞:是指结果返回之前,当前线程被挂起,不做任何事 非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。 然后我们就来了解一些基本的网络IO模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 、poll和epoll) (I/O multiplexing) 信号驱动I/O (signal driven I/O (SIGIO)) 异步I/O (asynchronous I/O ) 阻塞I/O模型 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待,知道数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。 当调用recvfrom()函数时,系统首先查是否有准备好的数据。如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接应用程序中,当调用recvfrom()函数时,未必用户空间就已经存在数据

并发编程(IO多路复用)

被刻印的时光 ゝ 提交于 2019-12-31 23:29:37
转: https://www.cnblogs.com/cainingning/p/9556642.html 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 IO模型介绍   为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6

elect、poll、epoll优缺点

僤鯓⒐⒋嵵緔 提交于 2019-12-31 11:04:51
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的 ,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 select的几大缺点: (1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 (2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大 (3)select支持的文件描述符数量太小了,默认是1024 2 poll实现   poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。 select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。但是解决了select的文件描述符的最大上线数 3、epoll   epoll既然是对select和poll的改进,就应该能避免上述的三个缺点。那epoll都是怎么解决的呢?在此之前

深入理解nodejs event loop机制

99封情书 提交于 2019-12-31 08:14:58
浏览器环境和nodejs环境的事件循环机制是不一样的,首先看一个demo: 在浏览器环境中运行结果如下: 在nodejs环境中运行结果如下: 上面例子说明浏览器和nodejs的时间循环是有区别的。 nodejs的事件处理 nodejs采用V8作为js的解析引擎,而I/O处理方面使用自己设计的libuv,libuv是一个基于事件驱动的跨平台抽象层,封装了不同操作系统的一些底层特性,对外提供统一API,事件循环机制也是在它里面实现的, 核心代码参考 : 根据Nodejs官方介绍,每次事件循环都包含了6个阶段,对应libuv源码中的实现,如下图: timers阶段:这个阶段执行timer(setTimeout、setInterval)的回调 I/O callbacks阶段:执行一些系统调用错误,比如网络通信的错误回调 idle,prepare阶段:仅供node内部使用 poll阶段:获取新的I/O事件,适当的条件下node将阻塞在这里 check阶段:执行setImmediate()的回调 close callbacks阶段:执行socket的close事件回调 重点看timers、poll、check这3个阶段,因为日常开发中的绝大部分异步都是在这3个阶段处理。 timers阶段 timers是事件循环的第一个阶段,node会去检查有无过期的timer

[原]HAproxy 代理技术原理探究

╄→尐↘猪︶ㄣ 提交于 2019-12-31 02:04:11
HAproxy 技术分享 简介 HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 4.高稳定性 使用案例 淘宝CDN(HTTP反向代理) 测试: HTTP代理 ab -i -c 500 -n 100000 | --- node 8910 URL = / HAproxy| --- node 8911 URL = / | --- node 8912 URL = / | --- node 8913 /test/ (reqisetbe ^[^\ ]*\ /(test|uri)/ server_uri_route) #按照规则转发 ####### haproxy : (单独由haproxy进行均衡负载) Concurrency Level: 500 Time taken for tests: 32.562 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 36606588 bytes HTML transferred: 0 bytes Requests per second: 3071.02 [#/sec] (mean) Time per

epoll、多线程模型

我怕爱的太早我们不能终老 提交于 2019-12-29 14:50:12
如何切换epoll event_loop.c 文件的 event_loop_init_with_name 函数是关键,通过宏 EPOLL_ENABLE 来决定是使用 epoll 还是 poll 的。 struct event_loop * event_loop_init_with_name ( char * thread_name ) { . . . # ifdef EPOLL_ENABLE yolanda_msgx ( "set epoll as dispatcher, %s" , eventLoop -> thread_name ) ; eventLoop -> eventDispatcher = & epoll_dispatcher ; # else yolanda_msgx ( "set poll as dispatcher, %s" , eventLoop -> thread_name ) ; eventLoop -> eventDispatcher = & poll_dispatcher ; # endif eventLoop -> event_dispatcher_data = eventLoop -> eventDispatcher -> init ( eventLoop ) ; . . . } 根目录下的 CMakeLists.txt 文件里,引入

Redis之上的分布式Java队列

我的梦境 提交于 2019-12-29 00:19:21
通过优锐课的java架构学习分享中,讨论了让我们使用Redisson Java框架讨论六种不同类型的基于Redis的分布式队列。 在Redis中使用队列 Redis是一个功能强大的工具,支持从字符串和列表到映射和流的许多不同类型的数据结构。 开发人员将Redis用于多种目的,包括用于数据库,缓存和消息代理。 像任何消息代理一样,Redis需要以正确的顺序发送消息。 可以根据消息的年龄或某些其他预定义的优先级等级发送消息。 为了存储这些未决消息,Redis开发人员需要队列数据结构。 Redisson是使用Redis和Java进行分布式编程的框架,它提供了许多分布式数据结构(包括队列)的实现。 Redisson通过提供Java API使Redis开发更加容易。 Redisson不需要开发人员学习Redis命令,而是包括所有众所周知的Java接口,例如Queue和BlockingQueue。 Redisson还处理Redis中繁琐的幕后工作,例如连接管理,故障转移处理和数据序列化。 基于Redis的分布式Java队列 Redisson提供了Java中基本队列数据结构的多个基于Redis的实现,每种实现都有不同的功能。 这使你可以选择最适合你目的的队列类型。 下面,我们将使用Redisson Java框架讨论六种不同类型的基于Redis的分布式队列。 队列

poll, select & epoll 原理比较分析

 ̄綄美尐妖づ 提交于 2019-12-26 23:46:52
因为需要了解底层设备访问的原理,所以惯用高层应用语言的我,需要了解一下Linux的设备访问机制,尤其是处理一组非阻塞IO的原理方法,标准的术语好像是叫多路复用。以下文章部分句子有引用之处,恕没有一一指出出处。 对于接触过Linux内核或设备驱动开发的读者,一定清楚poll和select系统调用,以及从2.5版本引入的epoll机制(epoll机制包含三个系统调用)。网上关于它们的文章,有说用法的,甚为详细,更有分析源代码的,又比较深入,且枝节颇多。经过几篇文章的阅读,我把觉得比较核心的东西写下来吧。我的用意是尽可能以简单的概念,比对他们三者的异同。 几经查找我才确定下来,poll和select应该被归类为这样的系统调用,它们可以阻塞地同时探测一组支持非阻塞的IO设备,是否有事件发生(如可读,可写,有高优先级的错误输出,出现错误等等),直至某一个设备触发了事件或者超过了指定的等待时间——也就是它们的职责不是做IO,而是帮助调用者寻找当前就绪的设备。同类型的产品是Windows的IOCP,它也是处理多路复用,只是把IO和探测封装在了一起了。 准备的知识有两点:1、fd;2、op->poll。 在Linux里面,设备都被抽象为文件,一系列的设备文件就有自己独立的虚拟文件系统,所以,设备在系统调用参数中的表示就是file description。fd其实就是一个整数(特别地,标准输入,输出

013_Linux驱动之_poll机制

走远了吗. 提交于 2019-12-26 12:36:48
功能:poll的机制与select相似,与select在本质上没有多大差别。管理多个描写叙述符也是进行轮询,依据描写叙述符的状态进行处理,可是poll没有最大文件描写叙述符数量的限制。 技术资料:poll多路复用 这篇文章写得很好 技术资料:poll机制分析 首先我们看应用程序中poll的调用原型 //文件 数量 时间以毫秒为单位 static unsigned int poll(struct file *file, struct socket *sock,poll_table *wait) 首先我们看看简单应用程序中如何使用的 第一点中我们定义一个pollfd的数组变量,为什么是数组呢,因为调用poll函数时候可以同时调用很多个,所 以第三点传入数组地址时候就能够同时调用很多个 第二点我们设置了文件和事件,具体其他的可以看看poll多路复用 第三点就是我们应用程序中调用了,当我们运行这个时候,会调用到驱动程序中的.poll机制的程序 当我们上面运行应用程序时候,调用到ret = poll(fds, 1, 5000);这条时候驱动程序中就会运行forth_drv_poll函数 从上面看,当调用到驱动程序之后会在poll_wait(file, &button_waitq, wait);停下来 解析poll_wait,函数原型 // 文件 等待队列头 poll_table就是传入的时间