基础概念

文件描述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

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

阻塞IO

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

非阻塞IO

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

IO多路复用

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

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

Linux IO 概念(1)的更多相关文章

  1. Linux IO 概念(2)【转】

    转自:https://www.cnblogs.com/qq289736032/p/9188455.html 在上一篇IO底层的概念中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从l ...

  2. Linux IO 概念(2)

    在上一篇IO底层的概念中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从linux一切皆文件的设计哲学,介绍了文件描述符,从进程的运行内存分配,进程的切换,介绍了进程的阻塞,以及引出 ...

  3. 【知乎网】Linux IO 多路复用 是什么意思?

    提问一: Linux IO多路复用有 epoll, poll, select,知道epoll性能比其他几者要好.也在网上查了一下这几者的区别,表示没有弄明白. IO多路复用是什么意思,在实际的应用中是 ...

  4. Linux IO模型和网络编程模型

    术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...

  5. linux io的cfq代码理解

    内核版本: 3.10内核. CFQ,即Completely Fair Queueing绝对公平调度器,原理是基于时间片的角度去保证公平,其实如果一台设备既有单队列,又有多队列,既有快速的NVME,又有 ...

  6. I/O模型之二:Linux IO模式及 select、poll、epoll详解

    目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...

  7. Linux磁盘概念及其管理工具fdisk

    Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区  作者:chawan [字体:大 中 小]   引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...

  8. 文档-linux io模式及select,poll,epoll

    文档-Linux IO模式详解 1. 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 1.1 用户空间与内核空间 现在操作 ...

  9. 深入剖析Linux IO原理和几种零拷贝机制的实现

    深入剖析Linux IO原理和几种零拷贝机制的实现 来源 https://zhuanlan.zhihu.com/p/83398714 零壹技术栈      公众号[零壹技术栈] 前言 零拷贝(Zero ...

随机推荐

  1. Angular8开发拼多多WebApp_汇总贴

    https://coding.imooc.com/class/336.html?mc_marking=b9f5e475d0cb8922d899d416f5b4433f&mc_channel=s ...

  2. Vue打包发布到Tomcat后,刷新报错404解决方法

    在应用下面加 WEB-INF 建 web.xml 内容如下 <?xml version="1.0" encoding="ISO-8859-1"?> ...

  3. 第一次使用markdown

    一级标题 二级标题 三家标题 四级标题 五级标题 六级标题 用两个空格来换行 斜体字 斜体字 加粗字体 加粗字体 斜体加粗字体 斜体加粗字体 无序列表用*或者+或者-: 第一箱 第二项 第三项 第四项 ...

  4. Android存储及getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()区别:

    存储介绍: Android系统分为内部存储和外部存储,内部存储是手机系统自带的存储,一般空间都比较小,外部存储一般是SD卡的存储,空间一般都比较大,但不一定可用或者剩余空间可能不足.一般我们存储内容都 ...

  5. 打包工具Gradle

    Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言 ...

  6. Unity3D 使用SQLite

    使用Unity操作SQLite,需要用到三个库文件,分别是Mono.Data.Sqlite.dll和System.Data.dll和Sqlite3.dll,前两个库文件可以在unity中找到,具体步骤 ...

  7. ajax处理csrf的三种方式

    方式一: $.post({ url: '/get_result/', data: { value0: $('#v1').val(), value1: $('#v2').val(), csrfmiddl ...

  8. activiti学习2:示例工程activiti-explorer.war的使用

    目录 activiti学习2:示例工程activiti-explorer.war的使用 一.搭建开发环境 二.运行示例工程 三.示例工程功能演示 1. 创建流程图 2. 部署流程图 3. 启动流程 4 ...

  9. 腾讯物联网操作系统正式开源,最小体积仅1.8 KB

    9月18日,腾讯宣布将开源自主研发的轻量级物联网实时操作系统TencentOS tiny.相比市场上其它系统,腾讯TencentOS tiny在资源占用.设备成本.功耗管理以及安全稳定等层面极具竞争力 ...

  10. kafka 如何保证数据不丢失

    一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数据不丢失,在面试中也会问到相关的问题.但凡遇到这种问题,是指3个方面的数据不丢失,即:producer consumer 端数据不丢失  b ...