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. 使用Openresty构建认证网关

    [入门]使用Openresty构建认证网关 lwhile关注 0.5092017.10.07 16:00:03字数 1,330阅读 4,112 在单体应用中, 我们可以通过 cookie + sess ...

  2. python xpath的基本用法

    XPath是一种在XML文档中查找信息的语言,使用路径表达式在XML文档中进行导航.学习XPath需要对XML和HTML有基本的了解. 在XPath中,有七种类型的节点:文档(根)节点.元素.属性.文 ...

  3. Spring boot 基础整理(一)

    环境准备 (1)JDK 环境必须是 1.8 及以上(2)后面要使用到 Maven 管理工具 3.2.5 及以上版本,所以会先介绍 Maven 的安装与配置(3)开发工具建议使用 IDEA,也可以 My ...

  4. 路径总和(leetcode 113)

    题目描述如下所示: 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径.(https://leetcode-cn.com/problems/path-sum-ii/) ...

  5. Python字符串内建函数_下

    Python字符串内建函数: 1.join(str) : 使用调用的字符串对 str 进行分割,返回值为字符串类型 # join(str) : # 使用调用的字符串对 str 进行分割. strs = ...

  6. Django学习路14_获取数据库中用户名字并展示,获取指定条数

    在 views.py 中添加 获取函数 注:此时获取的是全部用户的信息 def get_users(request): users = User.objects.all() context = { ' ...

  7. Upload 上传 el-upload 上传配置请求头为Content-Type: "multipart/form-data"

    api接口处添加属性 (标红处) // 校验台账 export const checkEquiment = (data) => { return axios({ url: '/job/equip ...

  8. Python os.stat_float_times() 方法

    概述 os.stat_float_times() 方法用于决定stat_result是否以float对象显示时间戳.高佣联盟 www.cgewang.com 语法 stat_float_times() ...

  9. PHP zip_close() 函数

    定义和用法 The zip_close() 函数关闭由 zip_open() 函数打开的 zip 档案.高佣联盟 www.cgewang.com 语法 zip_close(zip) 参数 描述 zip ...

  10. spring中IOC入口与加载步骤

    ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring-context.xml&q ...