poll

java nio多路复用 selector

房东的猫 提交于 2020-02-12 19:36:59
文章目录 多路复用selector 多路复用 unix内核中的select/epoll/poll select poll epoll 代码样例 多路复用selector 多路复用 I/O多路复用,I/O是指网络I/O, 多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程;简单来说:就是使用一个或者几个线程处理多个TCP连接;最大优势是减少系统开销小,不必创建过多的进程/线程,也不必维护这些进程/线程;多路复用分为三种形式select/epoll/poll,在 Java 中, Selector 这个类是 select/epoll/poll 的外包类 , 在不同的平台上, 底层的实现可能有所不同, 但其基本原理是一样的, 其原理图如下所示: unix内核中的select/epoll/poll select 函数: int select ( int maxfdp1 , fd_set * readset , fd_set * writeset , fd_set * exceptset , const struct timeval * timeout ) 返回值:就绪描述符的数目,超时返回 0 ,出错返回 - 1 maxfdp1:描述符个数 * readset、 * writeset、 * exceptset:读、写和异常条件的描述字 * timeout

redis启动时的epoll事件

泄露秘密 提交于 2020-02-11 20:50:45
initServer 1、epoll_create,创建epoll队列 aeCreateEventLoop==>aeApiCreate state->epfd = epoll_create(1024); /* 1024 is just a hint for the kernel */ 2、epoll_ctl,添加epoll事件 2.1、listenToPort /* Open the TCP listening socket for the user commands. */ if (server.port != 0 && listenToPort(server.port,server.ipfd,&server.ipfd_count) == C_ERR) exit(1); 绑定redis服务端口,并用服务端的sockfd,作为 fds[*count] 的第0个成员。count默认=0 int listenToPort(int port, int *fds, int *count) { ### /* Bind IPv4 address. */ fds[*count] = anetTcpServer(server.neterr,port,server.bindaddr[j], server.tcp_backlog); } 此时,server.ipfd[0]=server_sock 2

Nginx 简述

喜你入骨 提交于 2020-02-08 17:05:43
I/O 模型 同步/异步:关注的是消息通信机制 同步:synchronous 调用者等待被调用者返回信息,再继续执行后续操作 异步:asynchronous 被调用者通过状态、通知或回调机制主动通知调用者被调用者的状态 阻塞/非阻塞模型 阻塞:blocking IO操作需要彻底完成后才回到用户空间,调用结果返回前,调用者被挂起 非阻塞:noblocking IO操作被调用后立即给用户返回一个状态值,无需等待IO彻底完成,最终的调用结果返回前,调用者不挂起 (非阻塞型并不直接使用,程序虽然没有挂起,但是会不断发起IO请求等待答复,消耗大量CPU资源。一般在其他模型中使用) IO多路复用型 有等待机制作(select)为中间调和,负责接收请求,并不直接请求内核。本质上也是阻塞特征,阻塞点在等待机制select 使用场景: 客户端处理多个描述符是(一般为交互输入和网络套接口) 一个TCP服务器既要已连接套接字又要监听套接字 一个服务器要处理TCP、UDP 一个服务器要处理多个服务或协议 具体实现: select:linux实现,对应IO复用模型 poll:linux实现,对应IO复用模型 epoll:linux实现,对应IO复用模型,具有信号驱动IO某些特征 kqueue: FreeBSD实现,IO复用,有信号驱动IO特性 /dev/poll: SUN的Solaris实现 Iocp

272、二叉树的完全性检验

夙愿已清 提交于 2020-02-06 16:08:16
题目描述: 给定一个二叉树,确定它是否是一个完全二叉树。 百度百科中对完全二叉树的定义如下: 若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。) 示例 1: 输入:[1,2,3,4,5,6] 输出:true 解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。 示例 2: 输入:[1,2,3,4,5,null,7] 输出:false 解释:值为 7 的结点没有尽可能靠向左侧。 提示: 树中将会有 1 到 100 个结点。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/check-completeness-of-a-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 我一开始的思路比较复杂了,先算出二叉树的层高,然后我们逐层遍历,遇见倒数第二层时需要注意 代码中写的比较冗余 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left

阻塞I/O、非阻塞I/O和I/O多路复用

£可爱£侵袭症+ 提交于 2020-02-05 13:23:00
一、阻塞I/O 首先,要从你常用的IO操作谈起,比如read和write,通常IO操作都是阻塞I/O的,也就是说当你调用read时,如果没有数据收到,那么线程或者进程就会被挂起,直到收到数据。阻塞的意思,就是一直等着。阻塞I/O就是等着数据过来,进行读写操作。应用的函数进行调用,但是内核一直没有返回,就一直等着。应用的函数长时间处于等待结果的状态,我们就称为阻塞I/O。每个应用都得等着,每个应用都在等着,浪费啊!很像现实中的情况。大家都不干活,等着数据过来,过来工作一下,没有的话继续等着。 二、非阻塞I/O 非阻塞IO很简单,通过fcntl(POSIX)或ioctl(Unix)设为非阻塞模式,这时,当你调用read时,如果有数据收到,就返回数据,如果没有数据收到,就立刻返回一个错误,如EWOULDBLOCK。这样是不会阻塞线程了,但是你还是要不断的轮询来读取或写入。相当于你去查看有没有数据,告诉你没有,过一会再来吧!应用过一会再来问,有没有数据?没有数据,会有一个返回。但是依旧很不好。应用必须得过一会来一下,问问内核有木有数据啊。这和现实很像啊!好多情况都得去某些地方问问好了没有?木有,明天再过来。明天,好了木有?木有,后天再过来。。。。。忙碌的应用。。。。 三、I/O多路复用 多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态

django 官方教程翻译-part4

我们两清 提交于 2020-02-05 09:10:07
写一个简单的表单 更新detail.html,代码: <h1>{{ poll.question }}</h1> {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} <form action="{% url 'polls:vote' poll.id %}" method="post"> {% csrf_token %} {% for choice in poll.choice_set.all %} <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" /> <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br /> {% endfor %} <input type="submit" value="Vote" /> </form> 解释一下上面的代码: 1 上面代码为poll对象的每个choice对应一个单选按钮,每个单选按钮的value就是choice的id号,name为choice,也就是说,按下提交按钮,发送的POST数据是这样的choice=3. 2

ansible异步任务

不羁的心 提交于 2020-02-05 00:12:52
转载于简书博客 https://www.jianshu.com/p/3962bf94ae70 ansible方便在于能批量下发,并返回结果和呈现。简单、高效。 但有的任务执行起来却不那么直接,可能会花比较长的时间,甚至可能会比ssh的超时时间还要长。这种情况任务是不是没法执行了? ansible考虑到了这种情况,官方文档介绍了这个问题的解决方法,就是让下发的任务执行的连接变为异步:任务下发之后,长连接不再保持,而是每隔一段时间轮询结果,直到任务结束。 这是官网相关的介绍 他们在playbook的任务中加入两个参数:async和poll。 async参数值代表了这个任务执行时间的上限值。即任务执行所用时间如果超出这个时间,则认为任务失败。此参数若未设置,则为同步执行。 poll参数值代表了任务异步执行时轮询的时间间隔。 官方给出例子: ---- hosts: all remote_user: root tasks: - name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec command: /bin/sleep 15 async: 45 poll: 5 这时候已经不怕任务超时了。可以执行一个45s的任务,当然也可以根据需要自己设置。另外,如果poll为0

Event Loop事件循环,GET!

爷,独闯天下 提交于 2020-02-03 18:26:58
JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求。在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件之间又是怎么样的一个顺序呢,比如多个setTimeout事件又是怎么样一个执行顺序?这就涉及到事件循环:Event Loop。 JS的单线程 虽然现在的JS可以用来做多方面的开发,但是最初的JS是浏览器的专用语言,用来操作DOM。所以从诞生之初,JS就被设计成单线程语言,原因是不想让浏览器变得太复杂,因为多线程需要共享资源、且有可能修改彼此的运行结果,对于一种网页脚本语言来说,这就太复杂了。如果 JavaScript 同时有两个线程,一个线程在网页 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?是不是还要有锁机制?所以,为了避免复杂性,JavaScript 一开始就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 但是这种单线程机制却制造了另一个麻烦,假如一个操作需花费很长时间,那么此时浏览器就会一直等待这个操作完成,就会造成不好的体验。因此,JS的另一个事件就是异步事件。异步事件是专门将一些事件以队列的形式储存到浏览器的任务队列中,等同步事件执行完后再去执行,这样就避免了页面堵塞。 JavaScript 引擎怎么知道异步任务有没有结果

I/O多路复用之select

大城市里の小女人 提交于 2020-02-02 00:20:02
1、select的些许缺点 回忆一下 select接口 int select ( int nfds , fd _ set *readfds , fd _ set *writefds , fd _ set *exceptfds, struct timeval *timeout ); select需要我们指定文件描述符的最大值,然后取[0,nfds)这个范围内的值查看是在集合readfds,writefds或execptfds中,也就是说这个范围内存在一些不是我们感兴趣的文件描述符,cpu做了一些无用功,poll对她进行了改进,下面就看看poll是怎么做的。 2、poll接口 #include <poll.h> int poll ( struct pollfd *fds, nfds_t nfds, int timeout ); 跟select不同的是,poll不再告知内核一个范围,而是通过struct pollfd结构体数组精确的告知内核用户关心哪些文件描述符(流)。参数nfds指示结构体数组的大小。timeout表示程序员的忍耐度, 有三种取值: 0,poll函数不阻塞 整数,阻塞timeout时间 负数,无限阻塞 下面来看一下struct pollfd结构体,以及其中的事件有哪些取值,及其含义 struct pollfd {   int fd; /* an open file

linux poll机制分析(二)

て烟熏妆下的殇ゞ 提交于 2020-01-31 00:31:54
一、回顾 在 linux poll机制使用(一) 写了个实现poll机制的简单例子。在驱动模块中需要实现 struct file_operations 的 .poll 成员。在驱动模块中 xxx_poll函数 的的作用是将当前进程添加到等待队列中;然后判断事件是否发生,发生则返回 POLLIN | POLLRDNORM ,否则返回0(可以看看上一章的例子);接下来分析一下 linux 内核中 poll 机制的实现。 二、poll机制分析 1、系统调用 当应用层调用poll函数时,linux发生系统调用( 系统调用入口CALL(sys_poll) ),程序从应用空间切换到内核空间,然后执行 sys_poll 函数(sys_poll函数在 fs\select.c 文件中)。 sys_poll 函数的作用是 根据时间计算滴答频率数,然后调用 do_sys_poll 函数。代码块如下: /* ufds:应用层传递过来的struct pollfd结构体数组 * nfds:应用层传递过来的struct pollfd结构体个数 * timeout_msecs:超时时间*/ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,long timeout_msecs) { s64 timeout_jiffies;