python io操作需要用到什么硬件_Python I/O 操作(一)

一、I/O 概念

I/O 指的是相对内存而言的 input 和 output

从文件、数据库、网络向内存中写入数据叫做 input

从内存向文件、数据库、网络中输出数据叫做 output

I/O 操作相比 CPU 操作而言是极慢的,往往 CPU 运行一秒钟,I/O 要忙几个月,所以要提高 I/O 密集型程序的运行效率,异步 I/O 是毫无疑问的

举例说明 io 模块的使用:

import io

strio = io.StringIO()

strio.writelines('hello\n')

strio.writelines('world')

print('1、StringIO:')

print(strio.getvalue())

byteio = io.BytesIO()

byteio.write('你好'.encode())

print('2、BytesIO:')

print(byteio.getvalue().decode())

二、异步 I/O

2.1 系统调用

现代的操作系统通常都具有多任务处理的功能,通常靠进程来实现。操作系统的运算器(或处理器)快速在每个进程间切换执行,所以看起来就像多个进程同时运行。这样就带来了很多安全问题,例如一个进程可以轻易修改进程的内存空间中的数据来使另一个进程异常或达到一些其它目的,因此操作系统必须保证每一个进程都能安全地执行。这一问题的解决方法是在处理器中加入基址寄存器和界限寄存器。这两个寄存器中的内容限制了存取指令所访问的储存器的地址范围,这样就可以在系统切换进程时写入这两个寄存器的内容到该进程被分配的地址范围,从而避免恶意软件

为了防止用户程序修改基址寄存器和界限寄存器中的内容来达到访问其它内存空间的目的,这两个寄存器必须通过一些特殊的指令来访问。通常,处理器设有两种模式:“用户模式” 与 “内核模式” ,通过一个标签位来鉴别当前正处于什么模式。一些诸如修改基址寄存器内容的指令只有在内核模式中可以执行,而处于用户模式的时候硬件会直接跳过这个指令并继续执行下一个

同样,为了安全问题,一些 I/O 操作的指令都被设置为只有在内核模式下可以执行,因此操作系统有必要为应用程序提供诸如读取磁盘某位置的数据的接口,这些接口就被称为系统调用

当操作系统接收到系统调用请求后,会让处理器进入内核模式,从而执行诸如 I/O 操作、修改基址寄存器内容等指令,当处理完系统调用内容后,操作系统会让处理器返回用户模式,来执行用户代码

2.2 用户态和内核态

在 CPU 执行的所有指令中,有一些指令是非常危险的,如果错用将导致整个系统崩溃,例如清内存、设置时钟等。如果所有程序都能使用这些指令,那么你的系统将极不稳定,死机可能经常发生。所以 CPU 将指令分为特权指令和非特权指令。对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令(例如 Intel 的 CPU 将特权级别由高到低分为四个级别:RING0,RING1,RING2 和 RING3)

Linux 内核是一个有机的整体,每一个用户进程运行时都有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级(即上文提到的用户模式和内核模式),此时进程在内核的地址空间中运行

当一个任务(进程)执行系统调用而进入内核空间中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0 级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3 级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似

处理器总处于以下状态中的一种:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间

3、用户态,运行于用户空间

三、Linux 系统中的 I/O 模型

计算机有运算器、控制器、存储器、输入设备、输出设备五部分组成。运算器(或处理器)的速度是最快的,内存读写数据、磁盘寻址、网络传输相对而言是极慢的,运算器和控制器主要集成在 CPU 中,其它的都是 I/O ,CPU 大部分时间都是在等待 I/O 完成操作,会浪费大量的时间,I/O 成了最大的性能瓶颈

网络通信是两个主机之间的通信,需要有外设接收外部的数据,再将数据存放到内存,整个过程是很消耗时间的。计算机之间互连离不开网络,而网络 I/O 相对来说速度最慢。为了提高 I/O 操作效率,操作系统提供了几种高性能的 I/O 模型,其中异步 I/O 是一个比较好的解决方案,性能得到了大幅提升

Linux 系统中有五种 I/O 模型,本文重点介绍的是 I/O 复用模型,广泛使用的 I/O 多路复用机制的系统调用有 select, poll, epoll 这三种

3.1 阻塞 I/O

当用户态进程调用系统函数获取数据时,如果内核中还没有准备好数据,用户态进程将挂起一直等待,不进行其它操作,等内核将数据准备好之后,将数据从内核空间拷贝到用户空间,这时候系统调用函数返回,解除阻塞状态,用户态进程处理接收到的数据

3.2 非阻塞 I/O

用户态进程调用系统函数获取数据时,如果内核中还没有准备好数据,内核会返回错误信息给进程,用户态进程接收到错误信息,不会阻塞在那里,但进程会不断调用系统函数询问内核,直到内核准备好数据,将数据从内核复制到用户空间,系统函数调用结束,开始处理接收到的数据

3.3 I/O 复用

在计算机网络里面,有很多关于 “复用” 的用法,比如多路复用。本来一条链路上一次只能传输一个数据流,如果要实现多个源之间多条数据流传输,那就得需要多条链路了,复用技术可以通过将一条链路划分频率,或者划分传输的时间,使一条链路上可以传输多条数据流。I/O 复用就是在一个进程里会处理多个消息事件

3.4 信号驱动式 I/O 模型

当用户态进程需要数据时,会向内核发送一个信号,告诉内核要什么数据,然后自己去做其它的事情,当内核态的数据准备好之后,内核马上给用户态进程发送信号,用户态进程收到信号立马调用系统函数,将数据从内核空间拷贝到用户空间,完成之后用户态进程开始处理接收到的数据

3.5 异步 I/O 模型

用户态进程需要数据时会告诉内核态需要什么,然后就不用管了,可以做其它事情,内核会将用户态需要的数据准备好,然后将数据复制到用户空间,这时才通知用户态进程直接处理用户空间的数据

我们看到前四个 I/O 模型处理数据时,都是用户态进程将数据从内核空间拷贝到用户空间,这一段时间对于进程来说是阻塞的,只有异步 I/O 是内核将数据从内核空间拷贝到用户空间,用户态进程完全是异步操作,所以前四个模型可以称为同步 I/O ,最后一个是异步 I/O

f1a98b90238a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

五个 I/O 模型的比较

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fortinate防火墙使用本地用户三步开通PPTP ***

1. 建立用户Local用户及用户组 2. 启用PPTP ***拨号功能 3. 建立***地址,并设置策略:让***用户可以访问内部和外部 (注:建***地址和策略时,接口选择是外部,因为是外部拨入的) 完成上述三步&…

李国浩20179307第二周作业

人物介绍 国内知名黑客: 吴翰青:阿里云首席安全科学家、云盾负责人,也是网络安全领域为人熟知的“刺”、“道哥”和“小黑”。他要想黑谁家的网站,别说企业、医院,银行都要彻夜难眠。但小黑是白帽子,黑客最…

转lua解释执行脚本流程

本文转自&#xff1a;http://www.cnblogs.com/zxh1210603696/p/4458473.html #include "lua.hpp"#include <iostream> using namespace std;#pragma comment(lib, "lua5.1.lib")struct lua_guard{lua_State *pL;lua_guard(lua_State *s) :pL(s){}~lu…

BZOJ1085: [SCOI2005]骑士精神

【传送门&#xff1a;BZOJ1085】 简要题意&#xff1a; 有一个5*5的棋盘&#xff0c;棋盘上有12个白棋子&#xff0c;12个黑棋子&#xff0c;和一个空格&#xff0c;每只棋子只能按照马走日的规则移动&#xff0c;求出最少步数达到以下状态 题解&#xff1a; DFSA* DFS很容易做…

软测第二周作业WordCount

一、Github地址: https://github.com/duwei1996/wc 二、PSP2.1表格 PSP2.1 PSP阶段 预估耗时 &#xff08;分钟&#xff09; 实际耗时 &#xff08;分钟&#xff09; Planning 计划 3030 Estimate 估计这个任务需要多少时间 3030 Development 开发 540900 Analysis …

java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...

如何解决跨域重定向携带参数的问题&#xff1f;不使用将参数拼接在重定向url末尾的方式需求&#xff0c;项目A在服务器A上&#xff0c;需要重定向到服务器B上项目B&#xff0c;并且需要携带参数&#xff0c;参数对用户不可见&#xff0c;所以不可以将参数拼接在重定向url后面&a…

前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS

对于富客户端的 Web 应用页面&#xff0c;自动登录、页面修改、抓取页面内容、屏幕截图、页面功能测试…面对这些需求&#xff0c;使用后端语言需要花费不少的精力才能实现。此时 SlimerJS、phantomJS 或 CasperJS 或许是更好的一种选择。 一、PhantomJS 和 SlimerJS PhantomJS…

java 封装 继承 堕胎_Java的继承、封装和多态

一、继承继承就是子类继承父类的特征和行为&#xff0c;使得子类对象(实例)具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父类相同的行为。继承的特性子类拥有父类非 private 的属性、方法。子类可以拥有自己的属性和方法&#xff0c;即子类…

P2782 友好城市

题目描述 有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸&#xff0c;而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市&#xff0c;但…

五个在线图形工具创建简单的设计元素

有很多网站可以为图形元素生成提供服务&#xff0c;但获得非常好的工具并不容易。这就是为什么我共享五个在线的图形工具的原因 Logotype Maker 这是一个简单而自由的做标志的Web工具&#xff0c;它可以帮助您创建一个标志 BgPatterns BgPatterns按几次按键&#xff0c;做背景图…

sulin Python3.6爬虫+Djiago2.0+Mysql --实例demo

1.切换到项目目录下&#xff0c;启动测试服务器 manage.py runserver 192.168.0.108:8888 2.设置相关配置 项目目录展示如下&#xff1a; beauty>settings.py 修改 2.1 添加app到应用程序中 2.2 设置模板路径 2.3 配置数据为mysql 2.4设置静态文件路径 2.5设置漏油 3.beau…

dubbo的invoke命令_dubbo 调试服务telnet命令

1.概述在我们使用dubbo实现分布式布局时&#xff0c;如果我们想测试我们刚写好的service层服务是否正确时&#xff0c;通常要将service层和web层同时开启&#xff0c;通过浏览器调用controller层端口&#xff0c;达到测试service层的目的。有时&#xff0c;这样的测试方法过于麻…

【汇总】flash单个文件上传

之前有朋友给我发送email&#xff0c;询问我是否有单个文件上传的源代码&#xff0c;因为当时写这个好像是在09年&#xff0c;所以放哪了一时也没找着。后来整理硬盘的时候&#xff0c;找到了源码&#xff0c;所以决定来个汇总&#xff08;之前写过的关于flashjs上传文件的例子…

weka的java环境配置_windows下安装和配置Weka

Weka是一款免费的&#xff0c;非商业化的&#xff0c;基于java环境下的开源的机器学习以及数据挖掘软件。Weka里含有各种数据挖掘工具&#xff1a;数据预处理&#xff0c;分类与回归&#xff0c;聚类&#xff0c;关联规则和可视化工具。一、安装weka我们首先需要到weka官网上下…

Windows部署服务WDS实例

一&#xff1a;概述<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Windows&#xff08;Windows Deployment Services&#xff09; 部署服务适用与大中型网络中的计算机操作系统部署。可以使用 Windows 部署服务来管理映像以及无…

JAVA----爬虫(一)JSoup

jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 官方api:https://jsoup.org/ 一、jsoup功能 简单的例子&#xff1a;抓取wiki的…

极速理解设计模式系列:22.状态模式(State Pattern)

四个角色&#xff1a;抽象状态类(State)、具体状态类(ConcreateState)、情景类(Context)、客户端(Client) 抽象状态类(State):提供一个与情景类有关的State行为。 具体状态类(ConcreateState):实现这个行为&#xff0c;实现一个状态。 情景类(Context):维护一个State的实例对象…

[转]extern使用方法总结

Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义。谨记&#xff1a;声明可以多次&#xff0c;定义只能一次。在使用中&#xff0c;要形成一种风格。 函数的声明extern关键词是可有可无的&#xff0c;因为函数本身不加修饰的话就是extern的。但是引用的时候一样是…

java 设置pdf 编码格式_Java如何设置PDF文档背景色详解

前言一般生成的PDF文档默认的文档底色为白色&#xff0c;我们可以通过一定方法来更改文档的背景色&#xff0c;以达到文档美化以及保护双眼的作用。 以下内容提供了Java编程来设置PDF背景色的方法。包括&#xff1a;设置纯色背景设置图片背景使用工具Spire.PDF for Java 2.0.3J…

产品架构开发方法(2011中国软件技术大会)

上周末在国家会议中心举办的2011中国软件技术大会上我做了一个分享&#xff1a;产品架构开发方法。很高兴能在不同的大会上做演讲&#xff0c;但更高兴的是能够结交更多的朋友。 这个演讲内容包括了企业架构、业务分析、软件产品线、产品管理等内容&#xff0c;知识量有点大哦。…