IO多路复用的理解/演变过程】的更多相关文章

目录 阻塞IO 非阻塞 IO select epoll 总结一下. 阻塞IO 服务端为了处理客户端的连接和请求的数据,写了如下代码. listenfd = socket(); // 打开一个网络通信端口 bind(listenfd); // 绑定 listen(listenfd); // 监听 while(1) { connfd = accept(listenfd); // 阻塞建立连接 int n = read(connfd, buf); // 阻塞读数据 doSomeThing(buf);…
最近看了<后台开发核心技术与应用实践>有关select.poll和epoll部分以及相关的一些博客,学习了这三个函数的使用方法和区别,写一个易理解的总结. IO多路复用 之前程序中使用的IO函数都是同步的,无论阻塞式还是非阻塞式,在数据从内核拷贝到用户空间过程,用户线程都是被阻塞的.非阻塞IO只是当内核还没准备好数据时立即返回不等待,需要用户自己去不断检查内核数据是否准备好,依然不高效.IO多路复用提出了新的思路,将IO过程分为等待内核数据准备好和读取/写入内核两部分.一个IO函数监控多个IO…
一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是文件,一切都是流.在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write.不过话说回来了 ,计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是文件描述符,即通常所说的fd,一…
在看这三个东西之前,先从宏观的角度去看一下,他们的上一个范畴(阻塞IO和非阻塞IO和IO多路复用) 阻塞IO:套接口阻塞(connect的过程是阻塞的).套接口都是阻塞的. 应用程序进程-----recvfrom-----系统内核,这个过程是阻塞的,进程调用recvfrom后发现没有数据可用,就杵在原地等着了.数据从网络返回,再到内核缓冲区,再到进程缓冲区.这时,recvfrom发现数据来了,开始上班了.比较有惰性,你不给我资源我不做事情,就在这干等 非阻塞IO:套接口非阻塞(connect的过…
通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import time start = time.time() url = 'http://www.xiaohuar.com/' result = requests.get(url).text print(result) print(time.time()-start) 这样子是显然没啥问题的,总共耗时约为6秒 但是有没有办法更进一步优化呢,这里如果需要优化我…
在讲解IO多路复用之前,我们需要预习一下文件以及文件描述符. 什么是文件 程序员使用I/O最终都逃不过文件. 因为这篇同属于高性能.高并发系列,讲到高性能.高并发就离不开Linux/Unix,因此这里就来讨论一下Linux世界中的文件. 实际上对于程序员来说文件是一个很简单的概念,我们只需要将其理解为一个N byte的序列就可以了: b1, b2, b3, b4, --. bN 实际上所有的I/O设备都被抽象为了文件这个概念,一切皆文件,Everything isFile,磁盘.网络数据.终端,…
三种并行的应用程序: 1. 基于进程的并发编程: 2. 基于IO多路复用的并发: 3. 基于线程的并发编程: 12.1 基于进程的并发编程 进程的优劣: (1)进程间共享文件表,但不共享用户地址空间,拥有独立的地址空间,这样一个进程不会不小心将另一个进程的虚拟 存储器给覆盖了. (2)独立的地址空间使得进程间通信很困难,很难共享信息,需要IPC(进程间通信机制),这样开销很大. 进程间通信机制: (1)waitpid函数  (2)unix信号  (3)套接字  (4)管道  (5)FIFO  (…
1:IO的过程 当我们调用系统函数read时,一般会经历两个阶段: 1:等待数据准备(waiting for the data be ready) 2:将数组从内核拷贝到进程(从内核态到用户态)(copying the data from the kernel to the process) 在"等待数据准备"这个状态,我们最常见到的就是网路请求,即内核等待网络中的数据到网口的缓冲区.在数据到网口的缓冲区后,才会发生第二阶段,将数据从内核态拷贝到用户进程(用户态). 所以我么常说各种I…
1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用. (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现. (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用. (4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. (5)如果一个服务器要处理多个服务或多个协议,一…
提问一: Linux IO多路复用有 epoll, poll, select,知道epoll性能比其他几者要好.也在网上查了一下这几者的区别,表示没有弄明白. IO多路复用是什么意思,在实际的应用中是指什么情况? 以及IO多路复用在一些异步web server中的实际应用,就好比nginx是怎样使用epoll来实现异步IO处理的,一个请求到来了,nginx使用epoll接收请求的过程是怎样的? 回答1 作者:罗志宇 这个还是很好说清楚的. 假设你是一个机场的空管, 你需要管理到你机场的所有的航线…
本节内容: 课前准备知识: 函数嵌套函数的使用方法: 我们在使用函数嵌套函数的时候,是学习装饰器的时候,出现过,由一个函数返回值是一个函数体情况. 我们在使用函数嵌套函数的时候,最好也这么写. def test(): name= def test1(): print(name) return test1 test()() 通过返回值调用嵌套函数.或者你想执行函数test1的函数体,也可以如下操作但是不建议这么做. def test(): name= def test1(): print(name…
本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538922&idx=1&sn=e6b436efd6a4f53dcbf20f4ce11a986a&scene=23&srcid=0425xFfzV9LmmVrdeEQ4He1W#rd IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络…
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的.下面记录下分别基于Select/Poll/Epoll的echo server实现.Python Select Server,可监控事件数量有限制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14…
除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #define STDIN 0 // file descriptor for standard inpu…
IO多路复用之select总结   1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用. (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现. (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用. (4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. (5)如果一…
前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信框架用的都不是异步IO模型,而是IO多路复 用中的epoll.因为Python提供了对Linux内核API的友好封装,所以我选择Python来学习IO多路复用. IO多路复用 select 举一个EchoServer的例子,客户端发送任何内容,服务端会原模原样返回. #!/usr/bin/env p…
网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 1 基础知识回顾 注意:咱们下面说的都是Linux环境下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间 现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最后处理器拿到某个物理地址返回的字节. 对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作…
IO多路复用之select.poll.epoll IO多路复用:通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. 应用:适用于针对大量的io请求的情况,对于服务器必须在同时处理来自客户端的大量的io操作的时候,就非常适合 与多进程和多线程技术相比,I/O多路复用技术的最大优势就是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销.       目前支持I/O多路复用的系统调用有select…
转自:http://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral 同步.异步 是对 调用 来说的 阻塞.非阻塞 是对 进程或者线程 来说的 io多路复用 主要解决 同步非阻塞中反复轮询的问题,使用信号事件驱动进行回调通知 一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO…
转自:https://www.cnblogs.com/welhzh/p/4950341.html 除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #de…
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理 首先我们来定义流的概念,一个流可以是文件,socket,pipe等可以进行I/O操作的内核对象.不管是文件,还是套接字(socket),还是管道(pipe),我们都可以把他们看作流. 之后我们来讨论I/O操作,通过read,我们可以从流中读入数据:通过write,我们可以往流中写…
先百度或者知乎,找到这篇文章 [1] IO 多路复用是什么意思? 文中提到: 第一种好理解,就是来一个请求,fork一个进程,第二种提到I/O多路复用使用单个线程实现的,作者肯定没有写错,因为后面的文章也都是写的线程,我的问题是为什么不是进程来管理?参考文章[2] 里面的code 给出的是通过一个进程来服务多个client 连接请求. 我理解这是通过单进程的里面的一个线程来处理的,所以这里进程线程就不作区分.   还有,下面引文中一个问题问的很好 “ Q: 那这样子,在读取socket1的数据时…
io多路复用 selectors模块 概要: 并发编程需要掌握的知识点: 开启进程/线程 生产者消费者模型!!! GIL全局解释器锁(进程与线程的区别和应用场景) 进程池线程池 IO模型(理论) 1 多线程 线程的概念? 一个进程内默认就会有一个控制线程,该控制线程可以执行代码从而创建新的线程 该控制线程的执行周期就代表改进程的执行周期 线程VS进程 1.线程的创建开销小于进程,创建速度快 2.同一进程下的多个线程共享该进程的地址空间 GIL全局解释器锁 线程池 开启线程的两种方式: from…
IO模型介绍: * blocking IO 阻塞IO * nonblocking IO 非阻塞IO * IO multiplexing IO多路复用 * signal driven IO 信号驱动IO () * asynchronous IO 异步IO IO模型介绍: 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,…
事件驱动模型 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 很多程序员可能会考虑使用“线程池”或“连接池”.“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务.“连接池”维持连接的缓存池,尽量重用已有的连接.减少创建和关闭连接的频率. 这两种技术都可以很好的降低系统开销,都被广泛应用很多大型系统,如websphere.tomcat和各种数据库等.但是,“线程池”和“连接池”技术也只是在一定程度上缓解了频繁调用IO接口带来…
这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就这样一个服务员服务好多人,有时没人喝酒,服务员处于空闲状态,可以干点别的玩玩手机.至于epoll与select,poll的区别在于后两者的场景中醉汉不说话,你要挨个问要不要酒,没时间玩手机了.io多路复用大概就是指这几个醉汉共用一个服务员.   前言 从零单排高性能问题,这次轮到异步通信了.这个领域…
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻塞问题. 昨天没有讲到的小问题,看下面的例子: import gevent def func(): print('eating') gevent.spawn(func) # 协程任务开启 执行程序,没有输出结果 加上join import gevent def func(): print('eati…
阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)I…
io多路复用:可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,即可感知. sk1 = socket.socket() sk1.bind(('127.0.0.1',8001)) sk1.listen() # sk2 = socket.socket() # sk2.bind(('127.0.0.1',8002)) # sk2.listen() while True: conn,address = sk.accept()#阻塞等待客户端连接.连接.客户端地址信息 prin…
先来说一下什么是IO复用? IO复用解决的就是并发行的问题,比如多个用户并发访问一个WEB网站,对于服务端后台而言就会产生多个请求,处理多个请求对于中间件就会产生多个IO流对于系统的读写.那么对于IO流请求操作系统内核有并行处理和串行处理的概念,串行处理的方式是一个个处理,前面的发生阻塞,就没办法完成后面的请求.这个时候我们必须考虑并行的方式完成整个IO流的请求来实现最大的并发和吞吐,这时候就是用到IO复用技术.IO复用就是让一个Socket来作为复用完成整个IO流的请求.当然实现整个IO流的请…