IO软件的设计目标:
(1)高效率:改善设备效率,尤其是磁盘I/O操作的效率
(2)通用性:用统一的标准来管理所有设备
IO软件的设计思路: 把软件组织成层次结构,低层软件用来屏蔽硬件细节,高层软件向用户提供简洁、友善的界面
IO软件设计中主要考虑的问题:
(1)设备无关性:编写访问文件的程序与具体设备无关
(2)出错处理:低层软件能处理的错误不让高层软件感知
(3)同步/异步传输:支持阻塞和中断驱动两种工作方式
(4)缓冲技术:建立数据缓冲区,提高吞吐率
I/O软件的层次结构:
  • I/O中断处理程序
位于操作系统底层,与硬件设备密切相关,与系统其余部分尽可能少地发生联系
进程请求I/O操作时,通常被挂起,直到数据传输结束后并产生I/O中断时,操作系统接管CPU后转向中断处理程序
当设备向CPU提出中断请求时,CPU响应请求并转入中断处理程序
功能:检查设备状态寄存器内容,判断产生中断的原因,根据I/O操作的完成情况进行相应的处理
  1. 如果数据传输有错,向上层软件报告设备的出错信息,实施重新执行
  2. 如果正常结束,唤醒等待传输的进程,使其转换为就绪态
  3. 如果有等待传输的I/O命令,通知相关软件启动下一个I/O请求
  • 设备驱动程序
包括与设备密切相关的所有代码,从独立于设备的软件中接收并执行I/O请求
把用户提交的逻辑I/O请求转化为物理I/O操作的启动和执行;监督设备是否正确执行,管理数据缓冲区,进行必要的纠错处理
功能:
  1. 设备初始化:在系统初次启动或设备传输数据时,预置设备和控制器以及通道状态
  2. 执行设备驱动例程:负责启动设备,进行数据传输;对于具有通道方式,还负责生成通道指令和通道程序,启动通道工作
  3. 调用和执行中断处理程序:负责处理设备和控制器及通道所发出的各种中断
设备驱动程序分为:
(1)整体驱动程序直接向操作系统提供接口和控制硬件。适用于功能简单的驱动程序,效率较高,但较难迁移
(2)分层驱动程序将驱动程序分成多层,放在栈中,系统接到I/O请求时先调用栈顶的驱动程序,栈顶的驱动程序可以直接处理请求或向下调用更低层的驱动程序,直至请求被处理,适用于功能复杂、重用性要求较高的驱动程序,结构清晰且便于移植,但会增加一部分系统开销。
外设种类繁多、其控制接口不一,导致不同外设的设备驱动程序千差万别, 因而设备驱动程序与设备相关每个设备驱动程序只处理一种设备,或者一类紧密相关的设备。每个外设或每类外设都有一个设备控制器,其中包含各种I/O端口。 CPU通过执行设备驱动程序中的I/O指令访问各种I/O端口。设备所采用的I/O控制方式不同,驱动程序的实现方式也不同:
  1. 程序直接控制:驱动程序完成用户程序的I/O请求后才结束。这种情况下,用户进程在I/O过程中不会被阻塞,内核空间的I/O软件一直代表用户进程在内核态进行I/O处理 。
  2. 中断控制:驱动程序启动第一次I/O操作后,将调出其他进程执行,而当前用户进程被阻塞。在CPU执行其他进程的同时,外设进行I/O操作,此时, CPU和外设并行工作。外设完成I/O时,向CPU发中断请求,然后CPU调出相应中断服务程序执行。在中断服务程序中再次启动I/O操作。
  3. DMA控制:驱动程序对DMA控制器初始化后,便发送“启动DMA传送” 命令,外设开始进行I/O操作并在外设和主存间传送数据。同时CPU执行处理器调度程序,转其他进程执行,当前用户进程被阻塞。DMA控制器完成所有I/O任务后,向CPU发送一个“DMA完成”中断请求信号。
  • 独立于设备的I/O软件
执行适用于所有设备的常用I/O功能,功能包括:
(1)设备驱动程序统一接口:
操作系统为所有外设的设备驱动程序规定一个统一接口,这样,新设备的驱动程序只要按统一接口规范来编制,就可在不修改操作系统的情况下,添加新设备驱动程序并使用新的外设进行I/O。
所有设备都抽象成文件,设备名和文件名在形式上没有差别,设备和文件具有统一的接口,不同设备名和文件名被映射到对应设备驱动程序。
(2)设备命名:通过路径名寻址设备
(3)设备保护:检查用户是否有权访问所申请设备
(4)提供与设备无关的数据单位:字符数量,块尺寸
例如,为了为所有的块设备、字符设备提供一个统一的抽象视图,以隐藏不同块设备、字符设备之间的差异,与设备无关的I/O软件为所有块设备、字符设备设置统一的逻辑块大小。这样,高层I/O软件就只需处理简化的抽象设备,从而在高层软件中简化了数据定位等处理 。
(5)缓冲技术:传输速率、时间约束,不能直接送达目的地。每个设备的I/O都需使用内核缓冲区,因而缓冲区的申请和管理等处理是所有设备公共的,可包含在与设备无关的I/O软件部分
(6)设备分配和状态跟踪:分配不同类型的设备
(7)错误处理和报告:
I/O操作在内核态执行时所发生的错误信息,都通过与设备无关的I/O软件返回给用户进程,也即:错误处理框架与设备无关。
直接返回编程等错误,无需设备驱动程序处理,如请求了不可能的I/O操作、写信息到一个输入设备或从一个输出设备读信息、指定了一个无效缓冲区地址或者参数、指定了不存在的设备等。
有些错误由设备驱动程序检测出来并处理,若驱动程序无法处理,则将错误信息返回给设备无关I/O软件,再由设备无关I/O软件返回给用户进程,如写一个已被破坏的磁盘扇区、打印机缺纸、读一个已关闭的设备等。
(8)打开和关闭文件:
对设备或文件进行打开或关闭等I/O函数所对应的系统调用,并不涉及具体的I/O操作,只要直接对主存中的一些数据结构进行修改即可 ,这部分工作也由设备无关软件来处理。
  • 用户空间的I/O软件
库函数:一小部分I/O软件不在操作系统中,是与应用程序链接在一起的库函数,甚至完全由运行于用户态的程序组成。系统调用通常由库函数封装后供用户使用,封装函数只是将系统调用所用的参数放在合适位置,然后执行访管指令来陷入内核,再由内核函数实现真正的I/O操作。
SPOOLing软件:在内核外运行的系统I/O软件,采用预输入、缓输出和井管理技术,通过创建守护进程和特殊目录解决独占型设备的空占问题

操作系统-I/O(5)I/O软件的层次结构的更多相关文章

  1. 面试总结之MISC(操作系统,网络,数学,软件开发,测试,工具,系统设计,算法)

    操作系统 解释堆和栈的区别. 分配在堆的内存与分配在堆栈的内存有什么不同 分配在堆的内存要手动去释放 线程与进程的区别 多线程中栈与堆是公有的还是私有的 在多线程环境下,每个线程拥有一个栈和一个程序计 ...

  2. 第七篇——Mobile Apps,软件的曙光。

    作业三: ShrinkWrap (在包装盒子里面的软件,软件在CD/DVD上): Web APP (基于网页的软件): Internal Software (企业或学校或某组织内部的软件): Game ...

  3. 《Linux内核分析》第二周 操作系统是如何工作的?

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK TWO(2 ...

  4. 献给初学者:谈谈如何学习Linux操作系统

    本文出自 “技术成就梦想” 博客,请务必保留此出处http://ixdba.blog.51cto.com/2895551/569329. 为了能把这篇不错的文章分享给大家.所以请允许我暂时用原创的形式 ...

  5. SRS文档 软件需求说明书

    [摘要] 随着信息时代科技的飞速发展,经济全球化已广为人知,英语作为全球最主要的语言之一,受到越来越多的人的喜爱,不仅为了增长知识,也为了能适应社会发展的需求.但是,学英语最重要的事首先是积累词汇,没 ...

  6. C++编写操作系统(1):基于 EFI 的 Bootloader

    很久以前就对操作系统很好奇,用了这么多年Windows,对他的运作机理也不是很清楚,所以一直想自己动手写一个,研究一下操作系统究竟是怎么实现的.后来在网上也找到过一些教程(比如:<自己动手写操作 ...

  7. SQL Server 2005 版本的操作系统兼容性详细列表

    操作系统要求(32 位) 此表显示对于每种 32 位版本的 SQL Server 2005,操作系统是否可以运行其服务器软件. 有关如何在 Windows Server 2008 上安装 SQL Se ...

  8. Linux服务器操作系统

    Linux服务器操作系统 今日大纲 ●    服务器操作系统的系列.Linux的主流产品.虚拟机软件 ●    安装linux ●    linux基本命令 ●    用户管理及权限(多用户) ●   ...

  9. 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)

    一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端   24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器    想体验服务的时候 ...

随机推荐

  1. Spring学习之AOP的实现方式

    Spring学习之AOP的三种实现方式 一.介绍AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能 ...

  2. Python 实现分层聚类算法

    ''' 1.将所有样本都看作各自一类 2.定义类间距离计算公式 3.选择距离最小的一堆元素合并成一个新的类 4.重新计算各类之间的距离并重复上面的步骤 5.直到所有的原始元素划分成指定数量的类 程序要 ...

  3. PHP array_replace() 函数

    实例 使用第二个数组($a2)的值替换第一个数组($a1)的值: <?php$a1=array("red","green");$a2=array(&quo ...

  4. asp.net mvc 模拟百度搜索

    页面代码: <td><span>*</span>车牌号码:</td> <td> <div id="search"& ...

  5. 最新 laravel5.8 连接redis集群

    简介 Redis 是一个开源的,高级键值对存储数据库.由于它包含 字符串 , 哈希 , 列表 , 集合 , 和 有序集合 这些数据类型,所以它通常被称为数据结构服务器. 在使用 Laravel 的 R ...

  6. luogu P2510 [HAOI2008]下落的圆盘

    LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...

  7. 关于c/c++指针,指针的指针

    伪军迷祝:建军节快乐! 当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外.举个例子如: void func(int a, int * p); 当调用func时无论是a还是p其实传 ...

  8. day18.os模块 对系统进行操作

    一.os操作 1.system()在python中执行系统命令 # os.system("ifconfig") # os.system("touch 1.txt" ...

  9. 我的强迫症系列之@Builder和建造者模式

    前言 备受争议的Lombok,有的人喜欢它让代码更整洁,有的人不喜欢它,巴拉巴拉一堆原因.在我看来Lombok唯一的缺点可能就是需要安装插件了,但是对于业务开发的项目来说,它的优点远远超过缺点. 我们 ...

  10. 实验01——java模拟银行ATM系统

    用java写的一个模拟银行系统,比较初级. ATM.java package cn.tedu.yinhang; import java.util.Scanner; /** * @author 赵瑞鑫 ...