poll

select、poll、epoll之间的区别总结[整理]

冷暖自知 提交于 2020-03-22 23:42:20
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

聊聊IO多路复用之select、poll、epoll详解

南笙酒味 提交于 2020-03-22 23:41:55
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。 目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,pselect,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 对于IO多路复用机制不理解的同学,可以先行参考《聊聊Linux 五种IO模型》,来了解Linux五种IO模型。

你可以这么理解五种I/O模型

北城余情 提交于 2020-03-19 02:35:48
因为项目需要,接触和使用了Netty,Netty是高性能NIO通信框架,在业界拥有很好的口碑,但知其然不知其所以然。 所以本系列文章将从基础开始学起,深入细致的学习NIO。本文主要是介绍五种I/O模型,概念是枯燥的,不过还是得理解才行。 LINUX与UNIX中一些概念 在网络管理,Linux UNIX很相似.UNIX系统一直被用做高端应用或服务器系统,因此拥有一套完善的网络管理机制和规则, Linux沿用了这些出色的规则,使网络的可配置能力很强,为系统管理提供了极大的灵活性. 通俗一点讲,就是在网络方面Linux和UNIX是非常相似的,网络模型大可借鉴UNIX网络编程中的描述。 这里介绍四个概念,方便五种I/O模型的理解: 1.所有外部设备皆文件 Linux的内核将所有的 外部设备都看作是一个文件 来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。 面对一个socket也会有相应的描述符,成为socketfd(socket描述符),描述符就是一个数字,他指向内核中的一个结构体(文件路径,数据区等一些属性)。 2.recvfrom()函数 ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, strut sockaddr *from,

Java NIO1:I/O模型概述

僤鯓⒐⒋嵵緔 提交于 2020-03-19 02:34:41
I/O模型 在开始NIO的学习之前,先对I/O的模型有一个理解,这对NIO的学习是绝对有好处的。我画一张图,简单表示一下数据从外部磁盘向运行中进程的内存区域移动的过程: 这张图片明显忽略了很多细节,只涉及了基本操作,下面分析一下这张图。 用户空间和内核空间 一个计算机通常有一定大小的内存空间,如一台计算机有4GB的地址空间,但是程序并不能完全使用这些地址空间,因为这些地址空间是被划分为用户空间和内核空间的。 程序只能使用用户空间的内存 ,这里所说的使用是指程序能够申请的内存空间,并不是真正访问的地址空间。下面看下什么是用户空间和内核空间: 1、用户空间 用户空间是常规进程所在的区域,什么是常规进程,打开任务管理器看到的就是常规进程: JVM就是常规进程,驻守于用户空间,用户空间是非特权区域,比如在该区域执行的代码不能直接访问硬件设备。 2、内核空间 内核空间主要是指操作系统运行时所使用的用于程序调度、虚拟内存的使用或者连接硬件资源等的程序逻辑。内核代码有特别的权利,比如它能与设备控制器通讯,控制着整个用于区域进程的运行状态。和I/O相关的一点是: 所有I/O都直接或间接通过内核空间 。 那么,为什么要划分用户空间和内核空间呢?这也是为了保证操作系统的稳定性和安全性。用户程序不可以直接访问硬件资源,如果用户程序需要访问硬件资源,必须调用操作系统提供的接口

IO模型

房东的猫 提交于 2020-03-17 22:17:37
说实话 只是了解了几种io模型的基础知识 但实际上相关io模型的源码知识还有待进一步的学习 一、 IO 模型基本认知 BIO 里用户最关心 “ 我要读 ” , NIO 里用户最关心 ” 我可以读了 ” ,在 AIO 模型里用户更需要关注的是 “ 读完了 ” 下面引用知乎 一书焚城 的回答再次巩固一下 IO 模型 阻塞 IO , 给女神发一条短信, 说我来找你了, 然后就默默的一直等着女神下楼, 这个期间除了等待你不会做其他事情, 属于备胎做法. 非阻塞 IO , 给女神发短信, 如果不回, 接着再发, 一直发到女神下楼, 这个期间你除了发短信等待不会做其他事情, 属于专一做法. IO多路复用 , 是找一个宿管大妈来帮你监视下楼的女生, 这个期间你可以些其他的事情. 例如可以顺便看看其他妹子,玩玩王者荣耀, 上个厕所等等. IO复用又包括 select, poll, epoll 模式. 那么它们的区别是什么? 3.1 select大妈 每一个女生下楼 , select大妈都不知道这个是不是你的女神, 她需要一个一个询问, 并且select大妈能力还有限, 最多一次帮你监视1024个妹子 3.2 poll大妈 不限制盯着女生的数量 , 只要是经过宿舍楼门口的女生, 都会帮你去问是不是你女神 3.3 epoll大妈 不限制盯着女生的数量 , 并且也不需要一个一个去问. 那么如何做呢?

Netty源码—一、server启动(1)

淺唱寂寞╮ 提交于 2020-03-16 05:26:12
说明:netty源码系列是基于4.1.25版本的netty源码的 Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo、RocketMQ。可以说Netty是对Java NIO的封装,比如ByteBuf、channel等的封装让网络编程更简单。 在介绍Netty服务器启动之前需要简单了解两件事: reactor线程模型 linux中的IO多路复用 reactor线程模型 关于reactor线程模型请参考 这篇文章 ,通过不同的配置Netty可以实现对应的三种reactor线程模型 reactor单线程模型 reactor多线程模型 reactor主从多线程模型 // reactor单线程模型,accept、connect、read、write都在一个线程中执行 EventLoopGroup group = new NioEventLoopGroup(1); bootStrap.group(group); // reactor多线程,accept在bossGroup中的一个线程执行,IO操作在workerGroup中的线程执行 EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new

Java多线程:Linux多路复用,Java NIO与Netty简述

蓝咒 提交于 2020-03-15 10:11:48
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: Winsock的select模型(感谢评论指正,仅Java NIO.2使用了Windows IOCP,由于Netty没有采用NIO.2此处不展开) Free BSD, OS X: kqueue 下面仅讲解Linux的多路复用。 Linux中的IO Linux的IO将所有外部设备都看作文件来操作,与外部设备的操作都可以看做文件操作,其读写都使用内核提供的系统调用,内核会返回一个文件描述符(fd, file descriptor),例如socket读写使用socketfd。描述符是一个索引,指向内核中一个结构体,应用程序对文件的读写通过描述符完成。 一个基本的IO,涉及两个系统对象:调用这个IO进程的对象,系统内核,read操作发生时流程如下: 通过read系统调用向内核发起读请求。 内核向硬件发送读指令,并等待读就绪。 内核把将要读取的数据复制到描述符所指向的内核缓存区中。 将数据从内核缓存区拷贝到用户进程空间中。 Linux I/O模型简介 阻塞I/O模型:最常用,所有文件操作都是阻塞的。 非阻塞I/O模型:缓冲区无数据则返回,一般采用轮询的方式做状态检查。 I/O复用模型:详细见下 信号驱动I/O:使用信号回调应用,内核通知用户何时开启一个I/O操作

第5课.异步通知

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-14 19:03:35
1.按键的4种控制方式对比 1.查询 :耗资源 | 2.中断 :没有超时机制 | APP---->驱动 3.poll :加入了超时机制 | 4.异步通知 :按键发生后去通知app 驱动--->APP 异步通知的注意事项 1.不是所有的设备都支持异步通知。应用程序通常假设只有套接字和终端才有异步通知能力。 2.当进程收到SIGIO信号时,它并不知道是哪个输入文件有了新的输入。如果有多于一个文件可以异步通知输入的进程,则应用程序仍然必须借助于poll或select来确定输入的来源。 2.异步通知开发流程 1.应用程序注册信号处理函数 signal(SIGIO, my_signal_fun); 2.驱动程序发信号 void kill_fasync(struct fasync_struct **fp, int sig, int band) 3.信号被发给应用程序,应用程序需要告诉驱动pid fcntl(fd, F_SETOWN, getpid()); // 告诉内核pid,让内核知道应该通知那个进程 解析:当fcntl系统调用执行F_SETOWN命令时,属主进程的进程ID号就被保存在filp->f_owner中 Oflags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, Oflags | FASYNC); // 改变fasync标记

libevent源码剖析

Deadly 提交于 2020-03-14 14:33:40
安装与使用   libevent安装:下载地址: http://libevent.org/ 解压文件:tar -zxvf libevent- 2.1 .8-stable.tar.gz 解压后进入目录,进行配置,把库安装到/usr目录下: ./configure -- prefix= /usr 编译安装:sudo make,sudo make install   libevent将I/O事件、信号事件、定时事件三种事件进行了同一事件源,将所有的就绪事件,放入到激活链表中;然后对激活链表中的事件,调用事件的回调函数执行事件处理 一、event_base   The event_base lies at the center of Libevent; every application will have one.对应的为Reactor实例,使用 libevent 函数之前需要分配一个或者多个 event_base 结构体。每个event_base 结构体持有一个事件集合,可以检测以 确定哪个事件是激活的(相当于epoll红黑树的树根)。   因为不是所有的安插在event_base的事件在调用fork()之后都可以正常工作,所以,如果在使用fork()或者其他相关系统调用启动一个新的进程之后,要想在子进程中使用base变量,但是又想让该base变量是一个全新的没有安插事件的变量

2017 ACM/ICPC Asia Regional Beijing Online

会有一股神秘感。 提交于 2020-03-13 18:46:36
A Visiting Peking University 直接模拟 B Reverse Suffix Array unsolved C Matrix 预处理每列前缀和以及每个每个行区间的每列的最小值,枚举行的所有区间,求最长连续字段和。 D Agent Communication unsolved E Territorial Dispute n=1,2时不行 n=3时必须三点共线 n>3一定可以,任意找四个点判断即可。 好像也可以跑凸包,不在凸包上的点单独分开,如果全部在凸包上,找两个不相邻的点即可。 1 #include <bits/stdc++.h> 2 #define lson (id*2) 3 #define rson (id*2+1) 4 #define mid ((l+r)/2) 5 using namespace std; 6 7 typedef long long LL; 8 const LL MAXN=1e3+5; 9 10 LL n; 11 struct PoLL{ 12 LL x,y,id; 13 } p[MAXN]; 14 bool cmp(PoLL a,PoLL b){ 15 if(a.x==b.x) return a.y<b.y; 16 return a.x<b.x; 17 } 18 LL vis[MAXN]; 19 20 LL cross(PoLL a