poll

【IO多路复用】

五迷三道 提交于 2019-11-27 02:51:01
原文: http://106.13.73.98/__/8/ 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、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.2节“I/O Models ”

理解 select poll epoll

泪湿孤枕 提交于 2019-11-27 01:12:47
举例说明:老师收学生作业,相当于应用层调用I/O操作。 1、老师逐个收学生作业,学生没有做完,只能阻塞等待,收了之后,再去收下一个学生的作业。这显然存在性能问题。 2、怎么解决上面的问题? 老师找个班长,班长负责收作业,班长的做法是:遍历问学生作业写好了吗,写好的,收起来交给老师。休息一会,再去遍历。。。 这个班长就是select。 这存在问题,1、这个班长还有一个能力问题,最多只能管理1024个学生。2、很多学生的作业没有写好,而且短时间写不好,班长还是不停地遍历去问,影响效率。 3、怎么解决问题1班长的能力问题? 换一个能力更强的班长,可以管理更多的学生,这个班长就是poll。 4、怎么解决问题1、2,存在的能力问题和效率问题?换一个能力超级强的班长,可以管理无限多的学生,同时班长的做法是:遍历一次所有的学生,如果作业没有写完,告诉学生写好之后,放在一个固定的地方。这样的话,班长只需要定期到这个地方取作业就好了。这就是epoll。 转载于:https://www.cnblogs.com/nzbbody/p/4391785.html 来源: https://blog.csdn.net/weixin_30387339/article/details/99234792

【python】IO多路复用(select、poll、epoll)介绍及select、epoll的实现

╄→尐↘猪︶ㄣ 提交于 2019-11-26 19:59:21
IO多路复用(select、poll、epoll)介绍及select、epoll的实现 IO多路复用中包括 select、pool、epoll,这些都属于同步,还不属于异步 一、IO多路复用介绍 1、select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。   select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。   select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。   另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。 2、poll poll在1986年诞生于System V Release 3,它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。  

网络编程二-LINUX网络IO模型

泄露秘密 提交于 2019-11-26 19:25:31
目录 前言:网络编程里通用常识 一、同步和异步与阻塞和非阻塞 同步和异步 阻塞和非阻塞 两者的组合 二、五种I/O模型 阻塞I/O模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 5个I/O模型的比较 今天台风利奇马就要登陆浙江了,风那叫一个大啊,所以,就别出门了,老老实实在家学习看博客吧哈O(∩_∩)O 前言:网络编程里通用常识 既然是网络编程肯定是面临着通信的,既然是通信,那么是肯定是有两个对端的。在通信编程里提供服务的叫服务端,连接服务端使用服务的叫客户端。在开发过程中,如果类的名字有Server或者ServerSocket的,表示这个类是给服务端用的,如果类的名字只有Socket的,那么表示这是负责具体的网络读写的。那么对于服务端来说ServerSocket就只是个场所,具体和客户端沟通的还是一个一个的socket,所以在通信编程里,ServerSocket并不负责具体的网络读写,ServerSocket就只是负责接收客户端连接后,新启一个socket来和客户端进行沟通。这一点对所有模式的通信编程都是适用的。 在通信编程里,我们关注的其实也就是三个事情:连接(客户端连接服务器,服务器等待和接收连接)、读网络数据、写网络数据,所有模式的通信编程都是围绕着这三件事情进行的。那么今天我们围绕双方通信的模型进行展开吧。 一、同步和异步与阻塞和非阻塞

socket阻塞与非阻塞,同步与异步【转】

岁酱吖の 提交于 2019-11-26 18:31:43
原文: socket阻塞与非阻塞,同步与异步 作者: huangguisu 1. 概念理解 在进行网络编程时,我们常常见到 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock) 四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 也就是必须一件一件事做 , 等前一件做完了才能做下一件事。 例如普通 B/S 模式(同步):提交请求 -> 等待服务器处理 -> 处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 例如 ajax请求( 异步) : 请求通过事件触发 -> 服务器处理(这是浏览器仍然可以作其他事情) -> 处理完毕 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。 有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同 步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在s ocket 中调用r ecv 函数,如果缓冲区中没有数 据,这个函数就会一直等待,直到有数据才返回。而此时

关于select、poll、epoll的总结

若如初见. 提交于 2019-11-26 17:54:38
Select、poll、epoll 首先这三个函数的作用都是进行I/O复用,最早被使用的是select。Select的原理是用位数组存储要监听的套接字,然后将位数组发送给内核监听起来。但是基于它的实现,select有以下缺点: 1、监听的描述符很有限,1024 2、监听的事件也只有读、写、异常 3、每次有数据就绪,内核就将其对应的位置为1,表示有数据就绪,然后内核需要将整个位数组发送给用户,用户遍历位数组寻找有数据就绪的描述符,并做相应处理,做了处理之后又得将为数据发送给内核监听起来。这样存在着大量的换入换出,效率低下。 Poll对epoll做了一些改进,poll将每一个需要监听的描述符都存在一个结构体中,并申请一个结构体数组来存储所有需要监听的描述符结构体,注意每个结构体中可以声明需要监听的事件,poll中可以监听的事件就不止读写异常了。 Poll解决了监听事件限制的问题,并且舍弃位数组,可以监听的描述符数量得到了提高,但是最主要的问题没有解决,在监听时还是存在大量的换入换出,效率不高。 Epoll则对效率问题做了解决。Epoll有三个函数接口: (1)epoll_create Epoll_create的功能时创建出一个内核事件表,实际上就是创建文件,这其中就包括文件描述符的分配、文件实体的分配等,文件描述符中有一个private_data域,该域是epoll的核心

三种io复用的总结

邮差的信 提交于 2019-11-26 17:34:41
io复用的作用是能使程序同时监听多个文件描述符; 一般在下面几种情况下要用到io复用: 客户端程序要同时处理多个socket。 客户端程序要同时处理用户输人和网络连接。 TCP服务器要同时处理监听socket和连接socket。 服务器要同时处理TCP请求和UDP请求。 服务器要同时监听多个端口,或者处理多种服务。 Linux下实现I/O复用的系统调用主要有 select、poll 和epoll 以下依次介绍; select系统调用的原型如下: include <sys/select.h> int select( int nfds, fd_ set* readfds, fd_ set* writefds, fd_ set* exceptfds,struct timeval* timeout ) ; nfds 参数指定被监听的文件描述符的总数。它通常被设置为select 监听的所有文件描述符中的最大值加1,因为文件描述符是从0开始计数的。 readfds、 writefds 和exceptfds参数分别指向可读、可写和异常等事件对应的文件描述符集合。应用程序调用select函数时,通过这3个参数传入自已感兴趣的文件描述符。 timeout参数用来设置select函数的超时时间。 poll的函数原型如下: #include <poll.h> int poll( struct

【IO多路复用】 -- 2019-08-09 10:54:02

ε祈祈猫儿з 提交于 2019-11-26 16:09:45
原文: http://106.13.73.98/__/8/ 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、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.2节“I/O Models ”

Linux IO 概念(2)【转】

那年仲夏 提交于 2019-11-26 15:57:02
转自: https://www.cnblogs.com/qq289736032/p/9188455.html 在上一篇 IO底层的概念 中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从linux一切皆文件的设计哲学,介绍了文件描述符,从进程的运行内存分配,进程的切换,介绍了进程的阻塞,以及引出了阻塞IO. 在讲到阻塞IO的时,候受限于知识水平,也没有实际操作过,还是没有理解进程和IO函数的调用关系,IO又是如何操作磁盘,文件描述符又是怎样工作,进程怎么去拷贝字节流, 了解linuxIO的最终目的我是想知道JavaIO和JavaNIO在虚拟机中是如何调用的,虚拟机作为一个linux进程又是如何跟底层IO进行交互的.这些问题最终还是要去图书馆查阅书籍才能理解的更清楚, 下面继续在网络上搬迁别人家的博客 注:以下下文章整理自网络 阻塞IO 非阻塞IO 多路复用IO, 多路复用IO是为了处理多个IO问价句柄的数据操作,一个典型场景是当有很多socket服务监听不同端口以接收数据时,如果采用阻塞IO则需要多线程,每个线程和进程负责一个端口socket.但是,大量的线程和进程往往造成CPU的浪费 linuxIO多路复用技术提供一个单进程,单线程内监听多个IO读写时间的机制,其基本原理是各个IO将句柄设置为非阻塞IO,然后将各个IO句柄注册到linux提供的IO复用函数上

深入理解Android消息机制

时光毁灭记忆、已成空白 提交于 2019-11-26 15:53:23
在日常的开发中,Android 的消息机制作为系统运行的根本机制之一,显得十分的重要。 从 Handler 发送消息开始 查看源码,Handler的post、send方法最终都会走到 代码 public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } sendMessageDelayed 会走到 代码 private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); } 这里可以设置 Message 为异步消息 查看 queue 的 enqueueMessage 方法, 我们剥离出核心代码: 代码 if (p == null ||