poll

epoll 简单介绍

喜欢而已 提交于 2020-04-07 13:43:02
Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。 1、为什么select落后 首先,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在我用的2.6.15-25-386内核中,该值是1024,搜索内核源代码得到: include/linux/posix_types.h: #define __FD_SETSIZE 1024 也 就是说,如果想要同时检测1025个句柄的可读状态是不可能用select实现的。或者同时检测1025个句柄的可写状态也是不可能的。其次,内核中实现 select是用轮询方法,即每次检测都会遍历所有FD_SET中的句柄,显然,select函数执行时间与FD_SET中的句柄个数有一个比例关系,即 select要检测的句柄数越多就会越费时。当然,在前文中我并没有提及poll方法,事实上用select的朋友一定也试过poll,我个人觉得 select和poll大同小异,个人偏好于用select而已。 2、内核中提高I/O性能的新方法epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调用:epoll_create

数据结构 - Queue、Deque 接口

寵の児 提交于 2020-04-04 11:52:12
简介 队列是一种特殊的线性表。队列有单向队列和双向队列,队列内部结构多大使用数组和链表存储,一般使用数组存储的都会有初试长度和最大长度等,一般使用链表存储没有长度限制。平时在使用中最好不要像队列中插入null(通常也不允许,LinkedList除外),因为null值通常用于poll方法表示当前队列没有元素了,插入null值poll就有歧义。 Queue 接口 public interface Queue<E> extends Collection<E> Queue继承Collection,它是单向队列,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。 Queue 方法 // 添加元素到尾部,队列满时抛IllegalStateException异常 boolean add(E e); // 添加元素到尾部,队列满时返回false boolean offer(E e); // 移除头部元素,队列空时抛NoSuchElementException异常 E remove(); // 移除并返回头部元素,队列为空时返回null E poll(); // 查询头部元素,队列为空时抛NoSuchElementException异常 E element(); // 查询头部元素,队列为空时返回null E peek(); Deque 接口 public interface Deque<E

【Java并发编程】4、JDK7中TransferQueue的使用以及TransferQueue与SynchronousQueue的差别

喜你入骨 提交于 2020-04-02 14:07:14
转自: http://blog.csdn.net/aitangyong/article/details/46472643 JDK7对JDK5中的J.U.C并发工具进行了增强,其中之一就是新增了TransferQueue。 Java 并发相关的JSR规范,可以查看Doug Lea 维护的blog 。现在简单介绍下这个类的使用方式。 [java] view plain copy public interface TransferQueue<E> extends BlockingQueue<E> { /** * Transfers the element to a waiting consumer immediately, if possible. * * <p>More precisely, transfers the specified element immediately * if there exists a consumer already waiting to receive it (in * {@link #take} or timed {@link #poll(long,TimeUnit) poll}), * otherwise returning {@code false} without enqueuing the element. * * @param e the

初步了解Unix系统的I/O模式

ε祈祈猫儿з 提交于 2020-03-29 13:37:12
I/O模式 对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。 当一个read操作发生时,它会经历两个阶段: 等待数据准备 将数据从内核拷贝到进程中 因为这两个阶段,Unix系统的IO分为五种模式: 阻塞 I/O(blocking IO) 非阻塞 I/O(nonblocking IO) I/O 多路复用( IO multiplexing) 信号驱动 I/O( signal driven IO) 异步 I/O(asynchronous IO) 阻塞 I/O 特点就是在IO执行的两个阶段,用户进程都被block了。 Linux中,默认情况下所有的socket都是blocking 非阻塞 I/O 特点是用户进程要不断得通过系统调用询问内核,文件描述的数据是否准备好了,这种方式称为轮询(polling)。 如果数据还没有准备好,用户进程不会被阻塞,而是立刻返回一个error。用户进程收到error可以再次进行read操作。 I/O 多路复用 特点是单个用户进程可以处理多个 I/O 事件,减少多进程切换带来的系统开销。 分成三种形式: select poll epoll select 或者 poll 可以监视多个文件描述符,期间会被阻塞,任何一个描述符的数据准备好后通知用户进程,进程调用 recvfrom

Linux网络IO模型

别来无恙 提交于 2020-03-24 13:53:25
同步和异步,阻塞和非阻塞 同步和异步 关注的是结果消息的通信机制 同步 : 同步的意思就是调用方需要主动等待结果的返回 异步 : 异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函数等。 阻塞和非阻塞 主要关注的是等待结果返回调用方的状态 阻塞 : 是指结果返回之前,当前线程被挂起,不做任何事 非阻塞 : 是指结果在返回之前,线程可以做一些其他事,不会被挂起。 两者的组合 1. 同步阻塞 : 同步阻塞基本也是编程中最常见的模型,打个比方你去商店买衣服,你去了之后发现衣服卖完了,那你就在店里面一直等,期间不做任何事 ( 包括看手机 ) ,等着商家进货,直到有货为止,这个效率很低。 2. 同步非阻塞 : 同步非阻塞在编程中可以抽象为一个轮询模式,你去了商店之后,发现衣服卖完了,这个时候不需要傻傻的等着,你可以去其他地方比如奶茶店,买杯水,但是你还是需要时不时的去商店问老板新衣服到了吗。 3. 异步阻塞 : 异步阻塞这个编程里面用的较少,有点类似你写了个线程池 ,submit 然后马上 future.get () ,这样线程其实还是挂起的。有点像你去商店买衣服,这个时候发现衣服没有了,这个时候你就给老板留给电话,说衣服到了就给我打电话,然后你就守着这个电话,一直等着他响什么事也不做。这样感觉的确有点傻,所以这个模式用得比较少。 4. 异步非阻塞 : 异步非阻塞

select poll和epoll

孤街醉人 提交于 2020-03-24 11:32:37
select poll epoll都是IO多路复用机制。这里的复用其实可以理解为复用的线程,即一个(或者较少的)线程完成多个IO的读写。这里总结下这三个函数的区别。 1 select 1.1 select原理分析 1 select的函数原型是 int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout); 使用的时候需要将fd_set从用户空间copy到内核空间。select的使用方式类似如下 while true { select(streams[]) for i in streams[] { //需要遍历所有的fd_set if i has data // 判断是否有数据 read until unavailable } } 2 select的核心是do_select()。do_select首先会注册回调函数__pollwait,__pollwait会在被调用的时候将当前进程添加到设备的等待队列里。 do_select会在一个for循环里调用设备的f_op->poll。而该函数有两个作用,一个是调用poll_wait()函数,一个是检测设备当前状态。而poll

IO多路复用之select poll epoll

夙愿已清 提交于 2020-03-24 11:31:37
参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制。I/O多路复用通过一种机制, 可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作 。 但select(),poll(),epoll()本质上都是同步I/O ,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 与多线程和多进程相比,I/O 多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。 select 监视并等待多个文件描述符的属性变化(可读、可写或错误异常) select()函数监视的文件描述符分 3 类,分别是writefds、readfds、和 exceptfds 调用后 select() 函数会阻塞,直到有描述符就绪(有数据可读、可写、或者有错误异常),或者超时( timeout 指定等待时间),函数才返回 当 select()函数返回后,可以通过遍历 fdset,来找到就绪的描述符 int select(int nfds, fd_set

I/O 多路复用之select、poll、epoll详解

风流意气都作罢 提交于 2020-03-24 11:13:34
  select,poll,epoll都是IO多路复用的机制。I/O多路复用就是 通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 1.select   select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。    select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 。select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。   select有3个缺点:     每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大。  

LinkedTransferQueue 1.8 源码解析

≯℡__Kan透↙ 提交于 2020-03-23 15:41:14
[TOC] LinkedTransferQueue 1.8 源码解析 一,简介 LinkedTransferQueue 是一个由链表结构组成的wujie阻塞传输队列,它是一个很多队列的结合体(ConcurrentLinkedQueue,LinkedBlockingQueue,SynchronousQueue),在除了有基本阻塞队列的功能(但是这个阻塞队列没有使用锁)之外;队列实现了TransferQueue接口重写了tryTransfer和transfer方法,这组方法和SynchronousQueue公平模式的队列类似,具有匹配的功能。 二,UML图 三,基本成员 // 是否是多核 private static final boolean MP = Runtime.getRuntime().availableProcessors() > 1; // 自旋次数 private static final int FRONT_SPINS = 1 << 7; // 前驱节点正在处理,当前节点需要自旋的次数 private static final int CHAINED_SPINS = FRONT_SPINS >>> 1; // 容忍清除节点失败次数的阈值 static final int SWEEP_THRESHOLD = 32; static final class Node { /

Django 笔记 1

牧云@^-^@ 提交于 2020-03-23 13:00:16
一、在django中创建工程 django-admin.py startproject mysite 于是生成了一个mysite文件夹,里面有manage.py(是一个command line utility),和另一个mysite文件夹,这个才是这个工程真正的python包,import的时候就是用的这个名字。 mysite/__init__.py就是告诉python这个文件夹是一个python package; mysite/settings.py是为这个project进行设置的地方; mysite/wsgi.py是使用WSGI的地方; 启动的时候就是python manage.py runserver(或者指定其他端口号)。 二、建立并同步数据库 在settings.py里将DATABASES ENGINE更改为"django.db.backends.#" (#为sqlite3,mysql,oracle或者postgresql) 如果使用mysql,需要下载 mysql-python: http://sourceforge.net/projects/mysql-python/ 然后设置Name,即数据库名,如果是sqlite3,就写数据库文件的路径。 接下来设置USER,PASS,HOST和PORT,即数据库的用户名,密码,ip和端口号。 设置完数据库之后需要同步数据库