Linux IO 概念(1)

Stella981
• 阅读 610

基础概念

文件描述fd

        文件描述符(file description),用于表述指向文件引用的抽象话题概念

文件描述符在形式上是一个非负整数,实际上它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表,当程序打开一个现有文件或者创建一个新文件时,内核就向该进程返回一个文件描述符

        unix系统把任何对象看做是文件,文件就是一串二进制流,我门对数据(流)的读写操作就是对文件的操作,所以当我们的进程在做读写操作时会返回一个记录访问位置的索引值,当我们继续操作该文件时可直接通过这个索引值到达上一次的位置.

用户空间和内核空间,与进程

        现在操作系统都是采用虚拟存储器,对于32位操作系统,它的寻址空间为4G.操作系统的核心是内核,独立于普通程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核,保证内核安全,操作系统将虚拟空间划分为两部分,一部分称为内核空间,一部分称为用户空间,这两部分空间大小和地址范围分别为1G和3G,内核空间供内核使用,用户空间供用户进程使用

        进程是程序的一次动态执行过程,它经历了从代码加载,执行到执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程,多进程操作系统能同时运行多个进程,由于CPU具备分时机制,所以每个进程都能获得自己的时间片,由于CPU执行速度非常快,使得所有程序好像是在同时运行一样

        在操作系统中进程是进行系统资源分配,调度和管理的最小单位,进程在执行过程中拥有独立的内存单元,当操作系统加载程序到内存中,操作系统会为每个进程分配4G的虚拟内存空间.地址从0x00000000到0xFFFFFFFF,其中1G(3-4)是内核所使用的内核空间,3G(0-3)是进程使用的用户空间

        这里要注意的是系统为每个进程分配4G的虚拟内存空间,实际上这4G的虚拟内存是一个可寻址的地址范围,并不是实际的物理内存,这个可寻址的4G地址范围由内存区域表来管理.每个进程所用到的内存区域会通过页表映射到物理内存,所以每个进程都可以使用同样的虚拟内存地址而不冲突,他们的实际物理地址是不同的

        为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行.这种行为被称为进程切换,任务切换或上下文切换,尽管每个进程都有自己的地址空间,但所有进程都在同一个CPU寄存器里,

        因此,在恢复一个进程执行前,内核必须确保每个寄存器中含有挂起进程时所需要的值.进程恢复执行前必须装入寄存器的一组数据,称为硬件上下文(hardware Context),硬件上下文包含了进程恢复时所需要的所有信息.

       一个进程的运行转到另一个进程上,需要做很多交接记录位置的动作,

进程的切换和阻塞

        进程的切换是内核执行该进程的时间片到期而主动挂起该进程,切换到另一个进程的动作.但是进程在一个时间片内执行过程中,遇到某些期望的事件未发生那么进程就会放弃处理机成了阻塞,致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等.

缓存IO,

        缓冲区以及对缓冲区的操作,是所有IO的基础,进程执行IO操作可以简单的描述为缓冲区的数据读与写

        在数据read传输过程中需要将数据从磁盘中拷贝到内核空间的的缓冲区,然后从内核空间拷贝到进程用户空间,这个过程会经历两个阶段:1,等待数据准备,2,将数据重内核拷贝到用户空间,而且这两个过程是需要时间的,这就造成了阻塞.称为阻塞IO

 Linux IO 概念(1)

在这个基础上,为了充分利用CPU资源,发展出了非阻塞io,IO多路复用,信号驱动IO,异步IO

阻塞IO

 Linux IO 概念(1)

当用户进程调用了recfrom这个系统调用,系统内核就开始了IO的第一个阶段,准备数据阶段(对于网络IO,很多时候数据在一开始还没有到达,没有接收到一个完整的UDP包,这个时候内核就要等待足够的数据到来,磁盘IO的情况就是等待磁盘数据从磁盘上读取到内核空间),这个过程需要等待,而用户进程这边整个进程就会被阻塞 ,当内核空间把数据准备好了,返回给用户进程一个结果,用户进程才解除阻塞状态,

非阻塞IO

Linux IO 概念(1)

非阻塞IO是对阻塞IO的一个改进,即在内核未完成准备数据的时候,返回一个状态error告诉进程我没准备好,用户进程收到error状态会继续发起发起IO请求,直到内核空间准备好了数据,返回正确的状态.

IO多路复用

Linux IO 概念(1)

待续.................

https://mp.weixin.qq.com/s?\_\_biz=MzI4NTEzMjc5Mw==&mid=2650554694&idx=1&sn=b923effe8a7feed34f2d6637c4041df9&chksm=f3f833d0c48fbac69c0118c20bb7f8d983e0e571cf7cbf4efffc925c2324533b4d6ca463ac11#rd

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Linux的文件描述符
(1).文件描述符的定义  文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以表明每个被进程打开的文件。程序刚刚启动时,第一个打开的文件是0,第二个是1,以此类推。也可以理解为文件的身份ID。  用户通过操作系统处理信息的过程中,使用的交互设
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
3年前
Linux中的文件描述符与打开文件之间的关系
导读内核(kernel)利用文件描述符(filedescriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。1\.概述在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这