python基础27 -----python进程终结篇-----IO模型
一、IO模型
1、IO模型分类
1.阻塞IO--------blocking IO
2.非阻塞IO------nonblocking IO
3. 多路复用IO------- multiplexing
4.信号驱动IO-------signal driven IO (工作中不会使用到,只是作为了解)
5.异步IO------- asynchronous IO
2、通常情况下IO默认操作分为两个阶段(默认都是阻塞IO)
1.准备等待数据阶段,相当于请求操作系统是否有数据发送过来(调用IO操作)。
2.将数据从内核缓存拷贝到进程缓存中。
二、不同的IO操作
1、阻塞IO(blocking io)
1.在Linux系统中默认情况下所有的socket都是阻塞IO,如图所示
2.阻塞IO工作原理():
当用户进程调用了recvfrom这个系统调用(相当于用户进程发送请求像操作系统要数据),kernel就开始了IO的第一个阶段:准备 数据。对于network io来说,很多时候数据在一开始还没有到达,这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个 进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除 block的状态,重新运行起来。所以,blocking IO的特点就是在IO执行的两个阶段都被block了。
2、非阻塞IO
1.在Linux操作系统可以通过设置socket使其变为non-blocking。当对一个non-blocking socket执行读操作时,流程是这个样子
2.非阻塞IO工作原理:
从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一 个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它 就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么 它马上就将数据拷贝到了用户内存,然后返回。所以,用户进程其实是需要不断的主动询问kernel数据好了没有。如果数据还没准备好,此 时会返回一个error。进程在接收到error后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform 系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整 个过程,进程仍然是属于阻塞的状态。
3.代码原理:
3、IO多路复用
1、以上情况只能应用于一个server处理一个客户sock,如果想让一个server处理多个客户sock那就要用到IO多路复用
2、多路复用流程图:
当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的 数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。这个图和blocking IO的图 其实并没有太大的不同,事实上,还更差一些。因为这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一 个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection,在IO multiplexing Model中,实际中,对于 每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的process其实是一直被block的。只不过process是被 select这个函数block,而不是被socket IO给block。
3.代码实现原理:
4、利用selectors来实现IO的多路复用
5、注释:在windows下只支持python中的select阻塞,而在linux下是三者都支持。我们通过selectors模块python可以自动判断
使用什么阻塞方式。
6、各个IO模型比较图:
转载于:https://www.cnblogs.com/xuanan/p/7219227.html
python基础27 -----python进程终结篇-----IO模型相关推荐
- python基础语法--python语言及其应用
python基础语法 python引言 python python语言是一种高级动态.完全面向对象的语言. python中函数.模块.数字.字符串都是对象. python完全支持继承.重载.派生.多继 ...
- Python基础了解 python自带IDLE编译
目录 学习小标 学习产出: 前言 一.Python版本 二.语言运用的占比 2021年 6 月编程语言排行榜前 20名 三.Python的应用 1.Web开发 2.网络爬虫 3.大数据处理 4.人工智 ...
- 我的全栈之路-Python基础之Python概述与开发环境搭建
我的全栈之路-Python基础之Python概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 1.2 浅谈计算机系统架构 1.2.1 计算机系统架构概述 1.2.2 计算机硬件系统 1.2. ...
- 二十一. Python基础(21)--Python基础(21)
二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性: #类.属性: 调用的就是类中的属性 #对象.属性: 先从自己的内存空间里找名 ...
- Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho
Python基础学习-Python中最常见括号().[].{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho ...
- python基础类型,Python基础-类
Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...
- 视频教程-扣丁学堂Python基础视频教程-Python
扣丁学堂Python基础视频教程 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即订阅 扫码下载「CSD ...
- python基础代码-python基础,python基础代码大全
Python是现在非常流行的编程语百言,也是四大编程语言之一,而且Python具有简单.易学.上手容易.功能强大等优势,非度常适合零基础人员学习,也是问初学者的首要选择. 而对于初学Python入门时 ...
- python基础指令-python基础语法,python 代码命令大全
python: 1.语法强制缩进 2.区分大小写:iLoop与iloop是两个变量 3.变量无需申明,但是变量赋值前无法使用:a=3合法,b=a+3合法,b=a+c不合法,因为c未赋值前不能使用 4. ...
最新文章
- 细胞因子风暴与新冠肺炎
- Swift反射API及其用法
- C语言函数集(二十一)
- C的指针疑惑:C和指针8数组
- 【风控】团伙挖掘中的14大关系类型
- Jquery函数大全 - 案例说明
- HDU 3934 Summer holiday(凸包内接最大三角形)
- 用NSoup解析HTML
- 吃糖果(信息学奥赛一本通-T1193)
- (16)Verilog HDL常量:数值表示
- 1018.eclipse工具使用记录
- [Java] ArrayList、LinkedList、Vector的区别
- C# OpenFileDialog 打开文件对话框 打开多文件对话框; 并获取其路径,文件名,扩展名/后缀名
- 【Redis系列】Redis 入门指南
- 格林高斯斯托克斯 通量散度旋度
- Java_实现身份证信息提取个人信息
- CSS学习笔记 - 布局
- 信息安全行业从业指南2.0
- 常见多变量/多元统计分析方法分类图
- ssh免密登陆远程linux服务器
热门文章
- NOIP 2014 Day1 T3飞扬的小鸟
- jsp 中的时间格式化
- Windows8Windows Phone 做一个图片效果
- Mr.J-- 图片墙动画效果
- vue项目中iview表单验证 this.$refs[name].validate(valid = { }无效
- Git-根据tag创建分支
- John's trip(POJ1041+欧拉回路+打印路径)
- JAVA maven Spring 开发 webservice 步骤
- 爬虫实践---电影排行榜和图片批量下载
- cocos2dx打飞机项目笔记六:GameScene类和碰撞检测 boundingbox