poll

队列操作

笑着哭i 提交于 2019-11-30 18:33:07
一,队列的定义   ♦ 和栈相反,队列是一种 先进先出 的线性表。它只允许在表的一端进行插入,而在另一端进行删除元素。   ♦在队列中,允许插入的一端叫队尾。允许删除的一端叫队头。   ♦队列中的元素按a0,a1.....an这个顺序入队,退队时也必须按这个顺序出队。即a0出队后,a1才可以出队。 二,顺序队列的表示和实现     在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存储从队头到队尾的元素外, 还需附设两个指针front和rear分别指向队列头元素及队尾元素的位置。     初始化建立空队列时,令front=rear=0;每当插入新的队列尾元素时,“尾指针增1”,每当删除 队列头元素时,“头指针增1”。     因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置。 代码展示: 1 import java.util.*; 2 class Queue{ 3 // 存储队列的元素 4 private int[] queue; 5 // 队头 6 private int front; 7 // 队尾 8 private int rear; 9 10 public Queue() { // 初始化一个长度为15的队列 11 /*this.queue=new int[15]; 12 this.front=0; 13 this.rear=0;

Concurrency and Parallelism

﹥>﹥吖頭↗ 提交于 2019-11-30 12:21:18
0 Concurrency and Parallelism 当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。区别:并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 1. 网络编程 1.1 TCP/IP网络编程 Client: socket connect write recv Server: socket bind listen accept read send An example: Simple TCP/IP C/S . a. socket #include <sys/socket.h> sockfd = socket(int socket_family, int socket_type, int protocol); b. connect #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); c. bind #include <sys/types.h> #include <sys/socket.h> int bind

select、poll、epoll之间的区别总结

家住魔仙堡 提交于 2019-11-30 11:47:56
   select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的 ,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 关于这三种IO多路复用的用法,前面三篇总结写的很清楚,并用服务器回射echo程序进行了测试。连接如下所示: select: http://www.cnblogs.com/Anker/archive/2013/08/14/3258674.html poll: http://www.cnblogs.com/Anker/archive/2013/08/15/3261006.html epoll: http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html   今天对这三种IO多路复用进行对比,参考网上和书上面的资料,整理如下: 1、select实现 select的调用过程如下所示: (1)使用copy_from_user从用户空间拷贝fd_set到内核空间 (2)注册回调函数__pollwait (3)遍历所有fd

select,epoll,poll比较

蹲街弑〆低调 提交于 2019-11-30 11:47:42
select,poll,epoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是: 1 单个进程可监视的fd 数量被限制 2 需要维护一个用来存放大量fd的数据结构,这样会使得用 户空间和内核空间在传递该结构时复制开销大 3 对socket进行扫描时是 线性扫描 poll poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后 查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。 它 没有最大连接数的限制 ,原因是它是基于链表来存储的,但是同样有一个缺点: 大量的fd的数组被整体 复制于用户态和内核地址空间之间 ,而不管这样的复制是不是有意义。 poll还有一个特点是“水平触发” , 如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd 。 epoll epoll支持水平触发和边缘触发,最大的特点在于边缘触发, 它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。 在前面说到的复制问题上,epoll使用mmap减少复制开销。 还有一个特点是, epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd

AttributeError: module ‘select’ has no attribute 'epoll’

蹲街弑〆低调 提交于 2019-11-30 11:24:27
场景:mac 下导入的 ‘select’ 包 import select, 然后在 主函数 中创建的 epoll 对象 epl = select.epoll(),运行报错如下 Traceback (most recent call last): File "tests.py", line 77, in <module> emsc.run() File "tests.py", line 16, in run epoll = select.epoll() AttributeError: module 'select' has no attribute 'epoll' python官方文档介绍 select.epoll([sizehint=-1]) (Only supported on Linux 2.5.44 and newer.) Returns an edge polling object, which can be used as Edge or Level Triggered interface for I/O events; see section Edge and Level Trigger Polling (epoll) Objects below for the methods supported by epolling objects. 答案:仅仅支持Linux2.5

epoll模型详解

若如初见. 提交于 2019-11-30 10:30:53
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据, 但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办? 阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者说接下来的事要等快递来了才能做);那么你可以去睡觉了,因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。 非阻塞忙轮询:接着上面等快递的例子,如果用忙轮询的方法,那么你需要知道快递员的手机号,然后每分钟给他挂个电话:“你到了没?” 很明显一般人不会用第二种做法,不仅显很无脑,浪费话费不说,还占用了快递员大量的时间。 大部分程序也不会用第二种做法,因为第一种方法经济而简单,经济是指消耗很少的CPU时间,如果线程睡眠了,就掉出了系统的调度队列,暂时不会去瓜分CPU宝贵的时间片了。 为了了解阻塞是如何进行的,我们来讨论缓冲区,以及内核缓冲区,最终把I/O事件解释清楚。缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用 (你知道它很慢的)

java Queue 的remove/poll, add/offer, element/peek

冷暖自知 提交于 2019-11-30 09:47:31
原文链接: https://blog.csdn.net/liuyongvs2009/article/details/42454779 这里简单对其重复的方法做点简单的区分。 offer,add区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。 这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。 poll,remove区别: remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。 peek,element区别: element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null 来源: https://www.cnblogs.com/doyi111/p/11577402.html

LeetCode 23. 合并K个排序链表

梦想与她 提交于 2019-11-30 07:58:01
执行用时 :4 ms, 在所有 Java 提交中击败了98.35% 的用户 内存消耗 :38.9 MB, 在所有 Java 提交中击败了94.11%的用户 原本是“逐一两两合并链表”,用时118ms,换成假分治后只用4ms,震惊!代码其实就是把遍历换成了队列…… 关键代码变化: “分治”: 1 static public ListNode mergeKLists(ListNode[] lists) { 2 if (lists == null || lists.length == 0) return null; 3 Queue<ListNode> q = new ArrayDeque<>(); 4 for (ListNode n : lists) if (n != null) q.add(n); 5 while (q.size() > 1) { 6 q.add(merge2(q.poll(), q.poll())); 7 } 8 return q.poll(); 9 } 逐一两两合并链表: 1 public ListNode mergeKLists(ListNode[] lists) { 2 if (lists.length==0)return null; 3 ListNode head = lists[0]; 4 for (int i = 1; i < lists.length;

Java NIO之理解I/O模型(二)

此生再无相见时 提交于 2019-11-30 06:36:17
前言 上一篇文章 讲解了I/O模型的一些基本概念,包括同步与异步,阻塞与非阻塞,同步IO与异步IO,阻塞IO与非阻塞IO。这次一起来了解一下现有的几种IO模型,以及高效IO的两种设计模式,也都是属于IO模型的基础知识。 UNIX下可用的五种I/O模型 根据UNIX网络编程对IO模型的分类,UNIX提供了5中IO模型,下面分别来介绍一下。 阻塞I/O模型 最常见的一种IO模型,之前介绍过,一个read操作是分两个阶段的,第一个阶段是,等待数据准备就绪,第二个阶段是将数据拷贝到调用这个IO得线程中。阻塞是发生在第一个阶段的,当数据没有准备好时,会一直阻塞用户线程,当数据就绪后再将数据拷贝到线程中,并返回结果给用户线程。 大致过程如下图。 其实,大部分的socket接口都是典型的阻塞型。所谓阻塞型的接口是指系统调用(一般是IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。 通过介绍了阻塞IO,我们很容易就会发现它的问题,那就是阻塞会是用户线程无法进行任何运算和请求。一般我们的处理这种问题的情况是使用多线程,每个链接创建一个线程,或是使用线程池来管理线程,或许可以缓解部分压力,但是不能解决所有问题。多线程模型可以方便高效的解决小规模的服务请求,但面对大规模的服务请求,多线程模型也会遇到瓶颈,可以用非阻塞接口来尝试解决这个问题。 非阻塞I/O模型

Websocket原理

空扰寡人 提交于 2019-11-30 03:49:00
(本文转自知乎上别人分享的一篇文章,让我这个初学者对于websocket有了形象的理解,特此拿来与大家分享) 一、websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解 有交集,但是并不是全部。 另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。= 再简单来说,层级不一样。 二、Websocket是什么样的协议,具体有什么优点 首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。 HTTP的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。 在HTTP1