基础概念

文件描述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. Elasticsearch6.2.1安装elasticsearch-sq插件

    参考 https://github.com/NLPchina/elasticsearch-sql 1.下载插件 wget https://github.com/NLPchina/elasticsear ...

  2. Windows下启动、重启、停止nginx

    在Windows下操作nginx,需要打开cmd 进入到nginx的安装目录下 1.启动nginx: start nginx 或 nginx.exe 2.停止nginx(stop是快速停止nginx, ...

  3. VLOOKUP使用方法

    VLOOKUP函数是常用的一个内容查找函数,用于通过某一条件查询数据源中需要的内容.语法:=VLOOKUP(查询值,数据源,显示序列,匹配参数)1)查询值:匹配的key值2)数据源:查找范围,1)起点 ...

  4. phpspreadsheet 中文文档(六)读写文件+读取文件

    2019年10月11日14:05:58 读写文件 从体系结构您已经知道,使用基本PhpSpreadsheet类无法对持久性存储进行读写.为此,PhpSpreadsheet提供读者和作家,这是实现\Ph ...

  5. Windows多网卡路由设置

    需要经常切换网络以满足不同的工作需求: 一会上生产线, 一会上测试机, 一会还要上外网查资料... 经常切来切去比较麻烦,可以尝试Windows的路由表 route ADD 64.0.0.0 MASK ...

  6. Retrofit 二次封装实践

    首先感谢这位大神的博客:https://blog.csdn.net/u014569233/article/details/67639522,在他的基础上根据自己项目进行了修改最后成为现在项目使用的样子 ...

  7. 【Codeforces627E】Orchestra(双指针_链表)

    题目 Codeforces627E 翻译 好久没做英语阅读了,来爽一爽吧 ~ 描述 保罗是管弦乐队的成员.弦乐组安排在一个 \(r\times c\) 的矩形方格区域中,其中有 \(n\) 个中提琴手 ...

  8. springboot底层原理简述

    1.maven 子父依赖关系,快速整合第三方框架 2.无配置文件 省略了web.xml,spring.xml,springmvc.xml.mybatis.xml. spring3.0以上提供注解,sp ...

  9. 修改kvm宿主机主机名后

    修改了宿主机的主机名后, libvirtd错误日志如下 virNetSocketReadWire: : End of file while reading data: Input/output err ...

  10. 【转帖】Linux命令行操作json神器jq

    Linux命令行操作json神器jq https://www.cnblogs.com/chenqionghe/p/11736942.html jq类似一个awk或grep一样的神器,可以方便地在命令行 ...