[Professor麦]一文了解设备管理

操作系统专栏第四篇,终于肝完了,这篇文章也只是个人笔记而已,仅供参考,因为对操作系统的理解还不是那么透彻,此资料仅限于本人用来期末考试,更多深入原理性的东西还有待挖掘!!请多多指教

设备管理

IO硬件原理

  1. IO设备,可以分为块设备和字符设备块设备就是把信息存储在固定大小的块中,每个块有自己的地址(硬盘)。字符设备不可寻址)就是以字符为单位,以字符为单位发送或接受一个字符流(打印机、鼠标)(通常我们c语言里的printf和scanf操作的都是字符流)

  2. IO设备一般分为机械和电子。电子部分称为设备控制器(相当于代理,屏蔽了各个设备之间的差异),它的任务就是把串行的位流转换成字节快,并进行必要的错误校验。每个控制寄存器被分配唯一的一个内存地址,并且不会有内存被分配这一地址。这就叫内存映射IO(一般是用来做数据缓冲区)

IO软件原理

  1. IO软件的目标。

    1. 设备独立性(最重要),我们能够编写访问任何设备的应用程序,而不用事先指定特定的设备
    2. 统一命名,就是可以把一个盘挂载在某个目录下,使所有的文件能通过相同的方式(路径名)进行寻址
    3. 错误处理,要有重试机制
    4. 同步和异步传输img
    5. 缓冲,每个设备读取到一个数据包的时候,都不会知道改包应该放到哪个位置,只有把包拆解了才会知道,此外,有些设备还有实时约束,所以我们会预先放置到输出缓冲区中
    6. 共享设备和独享设备问题,容易发生死锁。
  2. 实现目标(与下面的)

    1. 让CPU做全部工作,程序控制IO未命名文件

      上面这种方式,效率是非常低的,如果要输出的信息很大,cpu就会一直被占用,做不了其他事情。

    2. 中断驱动IO,这个就是在上面的基础上进行改进,上面是用cpu主动轮询,这次是等待,用一个通俗的例子:cpu主动轮询就是比如你去银行想取钱,要进行排队(等待设备完成IO操作),这个人(cpu)在排队过程中是不能干任何事情的,只能干等。然后,中断IO就是,在排队过程中,这个人可以随便干事情,到他取钱了就会通知他过来取钱,但是取钱的数量有限,如果要取的钱的数量大的话还要再排队继续取,所以仍然消耗大量CPU时间,因此速度较低

    3. DMA控制器(DMAC)是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储器与每个具有DMA能力的外设连接起来的控制器。 值得注意的是,通常只有数据流量较大(KBps或者更高)的外设才需要支持DMA能力,这些应用方面典型的例子包括视频、音频和网络接口。DMA方式,在一定程度上提升了IO速度,把CPU从低效地IO操作中解脱出来,提高了CPU的利用率,从而提高了整个系统的效率。

      允许设备在 CPU 不参与的情况下,能够自行完成对内存的读写

内存映射IO

内存映射的 I/O是在 CPU 与其连接的外围设备之间交换数据和指令的一种方式,这种方式是处理器和 IO 设备共享同一内存位置的内存,即处理器和 IO 设备使用内存地址进行映射。

I/O 层次结构

img

  1. 用户层I/O软件:实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作。一般而言,大部分的I/O软件都在操作系统内部,但仍有一小部分在用户层,包括与用户程序链接在一起的库函数,以及完全运行于内核之外的一些程序。用户层软件必须通过一组系统调用来获取操作系统服务。

  2. 设备独立性软件:用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护、以友设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间。

    设备独立性也称设备无关性,使得应用程序独立于具体使用的物理设备。为了实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用

    使用逻辑设备名的好处是:

    • 增加设备分配的灵活性;
    • 易于实现I/O重定向,所谓I/O重定向,是指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。

    为了实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。总的来说,设备独立性软件的主要功能可分以为以下两个方面:

    • 执行所有设备的公有操作。包括:对设备的分配与回收;将逻辑设备名映射为物理设备名;对设备进行保护,禁止用户直接访问设备;缓冲管理;差错控制;提供独立于设备的大小统一的逻辑块,屏蔽设备之间信息交换单位大小和传输速率的差异。
    • 向用户层(或文件层)提供统一接口。无论何种设备,它们向用户所提供的接口应该是相同的。例如,对各种设备的读/写操作,在应用程序中都统一使用read/write命令等。
    1. 设备驱动程序:与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动 I/O设备工作的驱动程序。

    通常,每一类设备配置一个设备驱动程序,它是I/O进程与设备控制器之间的通信程序,常以进程形式存在。设备驱动程序向上层用户程序提供一组标准接口,设备具体的差别被设备驱动程序所封装,用于接收上层软件发来的抽象I/O要求,如read和write命令,转换为具体要求后,发送给设备控制器,控制I/O设备工作;它也将由设备控制器发来的信号传送给上层软件。从而为I/O内核子系统隐藏设备控制器之间的差异

  3. 中断处理程序,中断处理过程(不管是软中断还是硬中断)都是一样的

    中断处理层的主要任务有:进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态和修改进程状态等。由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,故应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。

    主要流程如下:

    1. 保护被中断进程的CPU环境
    2. 转入相应的设备处理程序
    3. 中断处理
    4. 恢复被中断进程的现场

中断的分类是根据程序的来源来分的

  1. 软中断,通过指令触发的

  2. 硬中断,通过中断控制器触发的

  3. 硬件设备:I/O设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开:电子部件称为设备控制器(或适配器),在个人计算机中,通常是一块插入主板扩充槽的印刷电路板;机械部件则是设备本身。

    设备控制器通过寄存器与CPU通信,在某些计算机上,这些寄存器占用内存地址的一部分,称为内存映像I/O;另一些计算机则釆用I/O专用地址,寄存器独立编址。操作系统通过向控制器寄存器写命令字来执行I/O功能。控制器收到一条命令后,CPU可以转向进行其他工作,而让设备控制器自行完成具体的I/O操作。当命令执行完毕后,控制器发出一个中断信号,操作系统重新获得CPU的控制权并检查执行结果,此时,CPU仍旧是从控制器寄存器中读取信息来获得执行结果和设备的状态信息。

    设备控制器的主要功能为:

  • 接收和识别CPU或通道发来的命令,如磁盘控制器能接收读、写、查找等命令。
  • 实现数据交换,包括设备和控制器之间的数据传输;通过数据总线或通道,控制器和主存之间的数据传输。
  • 发现和记录设备及自身的状态信息,供CPU处理使用。
  • 设备地址识别。

重温中断

硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主)

img

再谈设备驱动程序

设备控制器的主要主责是控制一个或多个 I/O 设备,以实现 I/O 设备和计算机之间的数据交换。而设备驱动程序用驱动程序屏蔽设备控制器之间的差异

这个驱动程序就相当于是一个操作系统里面的一个代理商,负责提供统一的接口给操作系统来处理各种设备,而设备之间的差异我们是看不见的,全部封装在驱动程序中,设备控制器不属于操作系统的一部,但是设备驱动程序属于操作系统的一部分

对于块设备里说,块设备类型非常多,而 Linux 操作系统里面一切是文件。我们也不想文件系统以下,就直接对接各种各样的块设备驱动程序,所以,我们在中间加了一层通用块层,将与块设备相关的通用逻辑放在这一层,维护与设备无关的块的大小,然后通用块层下面对接各种各样的驱动程序。

设备分配与回收

设备分配是指根据用户的I/O请求分配所需的设备。分配的总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁。从设备的特性来看,釆用下述三种使用方式的设备分别称为独占设备、共享设备和虚拟设备三类。

  1. 独占式使用设备。指在申请设备时,如果设备空闲,就将其独占,不再允许其他进程申请使用,一直等到该设备被释放才允许其他进程申请使用。例如,打印机,在使用它打印时,只能独占式使用,否则在同一张纸上交替打印不同任务的内容,无法正常阅读。

  2. 分时式共享使用设备。独占式使用设备时,设备利用率很低,当设备没有独占使用的要求时,可以通过分时共享使用,提高利用率。例如,对磁盘设备的I/O操作,各进程的每次I/O操作请求可以通过分时来交替进行

  3. SPOOLing方式使用外部设备。SPOOLing技术是在批处理操作系统时代引入的,即假脱机I/O技术。这种技术用于对设备的操作,实质上就是对I/O操作进行批处理

    设备分配的策略

    1. 设备分配方式:设备分配方式有静态分配和动态分配两种。

      静态分配主要用于对独占设备的分配,它在用户作业开始执行前,由系统一次性分配该作业所要求的全部设备、控制器(和通道)。一旦分配后,这些设备、控制器(和通道)就一直为该作业所占用,直到该作业被撤销。静态分配方式不会出现死锁,但设备的使用效率低。因此,静态分配方式弁不符合分配的总原则

      动态分配是在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按照事先规定的策略给进程分配所需要的设备、I/O控制器,一旦用完之后,便立即释放。动态分配方式有利于提高设备的利用率,但如果分配算法使用不当,则有可能造成进程死锁。

    2. 设备分配算法:常用的动态设备分配算法有先请求先分配、优先级高者优先等。

      对于独占设备,既可以釆用动态分配方式也可以静态分配方式,往往釆用静态分配方式,即在作业执行前,将作业所要用的这一类设备分配给它。共享设备可被多个进程所共享,一般釆用动态分配方式,但在每个I/O传输的单位时间内只被一个进程所占有,通常釆用先请求先分配和优先级高者先分的分配算法。

缓冲管理

块设备才有的缓冲区,因为块设备数据较大,所以写的时候需要一个缓冲区先存好数据,存满了,才会去写入这个设备(硬盘),而字符设备,就是你想什么时候要,他才会给你,没有缓冲区,类试于鼠标,当你要用鼠标的时候才会给你操作。

作用:

  1. 实现记录的成组与分解操作,协调了记录的逻辑记录的大小与物理块大小不一致问题。(因为当逻辑文件转换成物理文件时是通过主存储器来实现的,块是主存储器与存储设备进行信息交换的物理单位)

  2. 缓解处理器与外围设备之间速度不匹配的矛盾,提高了文件信息的传送速度

https://blog.csdn.net/zhoukun1008/article/details/44999447 参考博文(专门讲缓冲的的)

  1. 单缓冲

在设备管理部分,存在的主要矛盾是高速的CPU和低速I/O设备之间速度不匹配的问题。 对于这种问题,处理的方法一般是增加缓冲。 类似的,在计算机网络通信中,高速发送设备和低速接收设备之间为了防止数据的丢失,也会增加缓冲区

  • 缓和CPU和I/O设备速度不匹配的矛盾;
  • 减少对CPU的中断频率,放宽对中断响应时间的限制;
  • 提高CPU和I/O设备之间的并行性。
  1. 双缓冲(好像socket通信的发送和接受缓冲区)

双缓冲,也成缓冲对换在IO设备和CPU之间设置了两个缓冲区,使得它们能够交替访问不同的缓冲区,从而提高数据处理的效率。在输入与输出的速度基本匹配时可得到较好的效果,否则,由于缓冲区太少,不能缓解IO设备和CPU之间的速度压力。双缓冲退化为单缓冲。 存在问题:当速度不匹配时效果退化到单缓冲机制的程度 。解决办法:增加缓冲个数,按照循环链的方式组织缓冲区

  1. 循环缓冲 ,当输入、输出的速度基本相匹配时,可使用双缓冲,但若两者的速度相差甚远时,双缓冲的效果就不太理想,因此可有多缓冲。典型的即生产者和消费者问题
  2. 缓冲池,操作系统在主存储器中设置一组缓冲区

用文件系统接口屏蔽驱动程序的差异

linux来举例:所有设备都在/dev/ 文件夹下面创建一个特殊的设备文件

1

可以在/dev下使用ls -l来查看设备的信息,第一个字符c代表字符设备,b代表块设备,很明显我们的分区是b开头的,是用硬盘来分区的,所以是块设备,然后第5列的数字代表主设备编号,主设备号定位设备驱动程序(同一个编号代表同一个设备),第6列是次设备号,作为参数传给启动程序

lsmod命令就能查看加载过的内核模块(在linux中,安装驱动程序就是加载内核模块)

在 /sys 路径下有下列的文件夹:

  • /sys/devices 是内核对系统中所有设备的分层次的表示;
  • /sys/dev 目录下一个 char 文件夹,一个 block 文件夹,分别维护一个按字符设备和块设备的主次号码 (major:minor) 链接到真实的设备 (/sys/devices 下) 的符号链接文件;
  • /sys/block 是系统中当前所有的块设备;
  • /sys/module 有系统中所有模块的信息。

CPU 如何同控制器的寄存器和数据缓冲区进行通信呢

  1. 程序直接控制方式 ,用轮询的方式不断请求该设备的标志位,直到设备的标志位不等于0(证明设备已经准备好数据给cpu读取)就去处理程序

    1. 优点:没有上下文切换,实现简单
    2. 缺点:浪费大量cpu资源,CPU与外设只能串行工作。

    image-20200711221703431

  2. 中断控制方式 ,当设备已经把数据准备好了,就会产生中断信号给中断处理器,然后通知cpu可以处理该程序了

    1. 优点:提高了系统的利用率,外设和cpu可以并行工作

    2. 缺点:如果当前系统是单核系统,那就不建议用这种方式进行,但和系统用这种方式就是一种伪并发,会产生大量的上下文切换,还不如用第一种方式

      如果是字符设备也不建议用,也会产生中断次数过多的问题,因为字符设备没有缓冲区,数据会一字节一字节发过来,很有可能出现数据丢失的现象

    image-20200711221916584

  3. DMA控制方式 ,这种方式就是为了解决中断过多的问题,这个DMA相当于一个再cpu和磁盘之间的一个代理,里面有一个地址寄存器负责把内存的地址存储起来,里面还有一个控制寄存器负责去处理cpu的指令,例如:cpu向DMA控制器下指令(存在控制寄存器),说它想读取多少数据,放在内存的某个地方(存在地址寄存器)就可以了。接下来 DMA 控制器会发指令给磁盘控制器,读取磁盘上的数据到指定的内存位置,传输完毕之后,DMA 控制器发中断通知 CPU 指令完成,CPU 就可以直接用内存里面现成的数据了。还记得咱们讲内存的时候,有个 DMA 区域,就是这个作用。DMA

  4. 通道控制方式,有专门的通道命令,但命令单一 ,没有内存(这个就像是消息队列中间件里面的通道、网络编程的socketchannel等等),有单通路和多通路,多通路更加灵活,增强了可靠性,某通道、控制器坏,也不会影响数据交换

SPOOLing

http://c.biancheng.net/cpp/html/2636.html 推荐文章

参考资料:

  1. C语言中文网
  2. 《现代操作系统》
  3. 公众号:程序员cxuan 强烈推荐此公众号,我大部分内容都出自那里

个人唠叨

​ 嗯,又到了个人唠叨时间了,操作系统专栏应该是结束了的,等后面再学深一点再来继续总结吧,或者有时间的话,我在这几天也会出一个操作系统总结,看情况吧!!!昨晚去球场打完球之后,看到高考后的朋友在问我“咦,又见到你了,这么快放假了吗?”好吧,我根本就没上学,哈哈哈哈!那这篇个人唠叨,是时候谈谈我的大二下学期。

我的大二下

​ 之前写过一篇 <疫情期间我做了什么,主要是写了具体我学了什么技术>,这篇主要是大二下学期的总结吧!

​ 还记得在2019年的年末,写了一篇2019年总结篇,里面谈到了超哥,嗯,也是我的启蒙老师,还记得他跟我说过“你现在大一,怎么搞都行,等你上大二了一定要选择好你的方向”,没错,大二确实是一个过渡期,我们要好好利用这段时间来试错,不过现在大二已经过完了,幸运的是,我也找到了自己的方向。

​ 整个大二下,都是疫情中度过,本来以为自己需要很长的时间才能把在学校的学习状态调整过来,没想到,居然不用调整,从寒假回家开始,我玩了两天之后,就开启了学霸模式,因为之前的假期是给自己玩了一个星期才开始学习,结果一个星期后,根本就没有去学习,只会继续玩,所以这次寒假,我没有像往常那样继续玩一个星期,因为我知道时间不多了,大二快结束了,方向还没有选好!很幸运,在学校的状态的一直维持下来,甚至直到现在,我的状态可以说依然非常棒!不过每个月总有那么一两天是没心机学习的!

​ 整个大二下,首先是要感谢爸妈,他们没给我很多的干扰,周末爸妈休息,都会做好饭给我吃,周一到周五呢,晚上我打完球回来也是,爸爸都会煮好饭的,而且平时也不会打扰我,这也是我在这个学期能保持这种状态的原因之一吧!

​ 其次,应该是大一在学校形成的习惯导致我,在家面对诱惑的情况下也能继续学习,虽然大一我并没有好好学习技术,但是,我一有时间都会跑去图书馆学习,导致我的自律性也因此而不断增强,嘻嘻,也是非常感谢上大学以后,一直不断拼命的自己!!!

聊聊大三的计划

首先,是要准备面试,大三上的课应该会比较多,有机会的话尽量参加秋招,在寒假能找到实习,这个实习还是尽量大中厂,小厂就算面试过了也不会考虑。嗯,上面说的只是理想情况,毕竟我连最基本的算法也还没开始刷,等肝完这一系列框架源码之后,就会开始刷算法,应该会在下下星期开始,具体怎么准备面试,还是后期再规划,重点内容之前都学过一遍,只不过现在是再学一遍重点。

隔天出一篇原创文章,这一个目标也是包含在准备面试模块的,因为之前学习的时候有做笔记,只不过笔记比较零碎,接下来打算整理成文章来给自己复习用!

​ 暂时只想到这两个大方向,具体细节还是要自己一步一步落实,首先保证这个暑假实施起来,加油加油!!!!

的算法也还没开始刷,等肝完这一系列框架源码之后,就会开始刷算法,应该会在下下星期开始,具体怎么准备面试,还是后期再规划,重点内容之前都学过一遍,只不过现在是再学一遍重点。

隔天出一篇原创文章,这一个目标也是包含在准备面试模块的,因为之前学习的时候有做笔记,只不过笔记比较零碎,接下来打算整理成文章来给自己复习用!

​ 暂时只想到这两个大方向,具体细节还是要自己一步一步落实,首先保证这个暑假实施起来,加油加油!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值