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第二周作业

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

rust windows 交叉编译_交叉编译和静态链接 RUST 库

在 CSIS 中,我们过去使用 Python 编写后端,同时为 Incident Response Toolkit 编写一些 C/C 代码。几年前,主要是由于性能原因,我们开始用 Rust 替换 Python 重写了一些特定的后端服务,并取得了巨大的成功。现在&#…

转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…

about hamout cloudra

http://running.iteye.com/?page3

(转)PowerHA完全手册(一,二,三)

PowerHA完全手册&#xff08;一&#xff09; 原文&#xff1a;http://www.talkwithtrend.com/Article/39889-----PowerHA完全手册&#xff08;一&#xff09; http://www.talkwithtrend.com/Article/40117---PowerHA完全手册&#xff08;二&#xff09; http://www.talkwithtre…

dial up network

dial up network 通过电话线拨号上网的网络系统

事件处理 java_Java事件处理的4种方法

第一种 自身类作为事件监听器import javax.swing.*;import java.awt.*;import java.awt.event.*;/***Java事件处理机制:自身类作为事件监听器*author Winty(wintysgmail.com)*version 2008-12-3*/class ThisClassEvent extends JFrame implements ActionListener{JButton btn;p…

新浪微博推出具有中国特色的“关注但屏蔽”功能

关注一个人&#xff0c;又偷偷屏蔽他&#xff0c;这项功能有人称之“虚伪”&#xff0c;有人称之“贴心”。 请听题&#xff0c;如何礼貌地回答熟人的这个问题&#xff1a;“你为什么取消了微博上对我的关注&#xff1f;”相信这是很多玩微博的人都会遇到的问题&#xff0c;取消…

linux shell 脚本个人规范总结

一、shell 语句格式 linux shell有一套自己的流程控制语句&#xff0c;其中包括条件语句(if)&#xff0c;循环语句(for,while)&#xff0c;选择语句(case)。下面我将通过例子介绍下&#xff0c;各个语句使用方法。 1.1、if语句结构[if/then/elif/else/fi] if 条件测试语句 then…

java循环基础知识_java基础知识—循环结构

1.while 循环语法&#xff1a;while(循环操作){循环操作&#xff1b;}特点:先判断&#xff0c;再执行&#xff1b;2. &#xff1a;用于数字比较 比较的是地址equals: 用于字符串比较 比较的是字符3.do-while语法&#xff1a;do{循环操作&#xff1b;}while(循环条件)&#xff…

android文件读写

public class service { private Context context;//引入上下文对象&#xff0c;要使用其中的方法openFileOutput public service(Context context) { super(); this.context context; } public void save(String filename,String content)throws Exception//抛出异…

接口的声明

C#中咩有多继承&#xff0c;为了解决多继承接口 什么是接口   接口可以理解为对一组方法声明进行统一命名&#xff0c;但是这些方法没有提供任何实现&#xff0c;也就是说&#xff0c;吧一组方法声明在一个接口中 然后继承于该接口的类都需要实现这些接口。 注意&#xff1a;…

C51编程在不同内存空间(data xdata bdata)定义变量的注意事项

1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以覆盖的&#xff08;某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖&#xff09;,可以提高内…

java 类调用情况_java 如何调用类?情况如下

本人目录如下&#xff1a;在surge目录下有一个java文件想创建一个LBChart2DFrameDemo对象&#xff0c;不知道如何创建&#xff1f;。注意&#xff1a;LBChart2DFrameDemo使用了Chart2D.jar包中内容。这个目录ClsChart2D尚未加在...本人目录如下&#xff1a;在surge目录下有一个…

BZOJ1085: [SCOI2005]骑士精神

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

猎豹网校 java_猎豹网校Java 零基础入门 JAVA基础视频教程(精制)

00.NetBeans_下载和安装.mp4 01.Java_语言概述.mp402.Java标识符和关键字.mp403.Java_变量和基本数据类型.mp404.Java_简单数据类型转换和类包装.mp405.Java_算术运算符表达式.mp406.Java_关系运算符和逻辑运算符.mp407.Java_位_赋值_条件运算符.mp408.Java_基本语句和跳转语句…

获取实体表相关信息

ClassMetadata meta session.getSessionFactory().getClassMetadata(clazz);//实体名称String entityName meta.getEntityName();//主键名称String pkName meta.getIdentifierPropertyName();转载于:https://blog.51cto.com/javaworker/736018

软测第二周作业WordCount

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

hook java android_Android Hook Java的的一個改進版本

Hook Java的的一個改進版本《注入安卓進程&#xff0c;並Hook java世界的方法》這篇好文相信大家都看這&#xff0c;里面所提到的方法估計大家也都試過。不過里面的所用的方法&#xff0c;我發現有兩個可以改進的地方。改進點一&#xff1a;更簡單地修改java方法為本地方法.../…