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模型比较图:

        

  

时间: 2024-10-17 22:50:14

python基础27 -----python进程终结篇-----IO模型的相关文章

python基础之python中if __name__ == '__main__': 的解析

当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个模块的 __name__ 的值取决于您如何应用模块.如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名.但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__". //////

python基础31[python IDE之Eclipse+PyDev]

一 入门IDE作为python的初学者,在语法和类库学习阶段,我们可以使用以下简单使用的IDE:1) Python SDK 自带的IDEL(Python GUI)2) Komodo-Edit3) NotePad++ 二 终极IDE 之 Eclipse+PyDev1 特点1)开源免费2)代码完成和调试3)重构refactor,项目浏览explorer和类库browser4)目前最新版支持python2.1~3.0,仍不支持最新的3.1 2 下载 1)Java JDK(Eclipse运行需要)2)P

python基础===pendulum '''Python datetimes made easy.'''

https://pypi.python.org/pypi/pendulum Pendulum的一大优势是内嵌式取代Python的datetime类,可以轻易地将它整合进已有代码,并且只在需要的时候才进行调用.作者精心调校了时区,确保时区准确,还让每个实例都对时区敏感,默认使用UTC.还有就是提供了扩展的timedelta,使datetime计算更加容易. 与现有的其他库不同,它提供了一个可预测行为的API,这样就可以知道后面会发生什么.如果你正开发使用datetimes的复杂项目,这个库能让你更

Python基础之面向对象(初级篇)

概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90%: #发送邮件提醒 连接邮箱服务器 发

麦子学院 Python基础+Pythonweb+Python扩展+Python选修四大专题 视频j教

课程简介:目录:第一阶段:python基础准备第二阶段:Pythonweb开发第三阶段:Python扩展开发第四阶段:Python开发选修 下载地址:百度网盘 原文地址:http://blog.51cto.com/13888870/2150467

【Python基础】Python模块

Python模块 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中一个.py文件就称之为一个模块(Module).使用模块有什么好处?1.最大的好处是大大提高了代码的可维护性.2.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候

Python基础:Python运行的两种基本方式

完成Python的安装之后,我们可以开始编写Python代码以及运行Python程序了.我们来看一下运行Python具体有哪几种方式 1.REPL 所谓REPL即read.eva.print.loop(读取.计算.打印.循环),实现REPL运行方式有以下两种: ①IDLE ②Windows命令提示符 打开Windows命令提示符 如图,输入python开始编写python代码,当想要退出时按ctrl+z,然后回车,再次进入时继续输入python 2.运行脚本 REPL方式的优点是简单明了,但是它

python基础(2):python的安装、第一个python程序

1. 第一个python程序 1.1 python的安装 自己百度,这是自学最基本的,安装一路确定即可,记得path下打钩. 1.2 python的编写 python程序有两种编写方式: 1.进入cmd控制台,输入python进入编辑模式.这时候我们可以直接编写python程序 2.也可以在.py文件中编写python代码.通过python命令来执行python代码 注意:python2默认的编码是ASCII码编码,处理不了中文,需要替换成utf-8编码.python3默认的编码为unicode

Python基础—线程、进程和协程

今天已是学习Python的第十一天,来干一碗鸡汤继续今天的内容,今天的鸡汤是:超越别人对你的期望.本篇博客主要介绍以下几点内容: 线程的基本使用: 线程的锁机制: 生产者消费之模型(队列): 如何自定义线程池: 进程的基本使用: 进程的锁机制: 进程之间如何实现数据共享: 进程池: 协程的基本使用. 一.线程 1.创建线程 上篇博客已经介绍过如何创建多线程的程序,在这里在复习一下如何创建线程过程以及线程的一些方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1