一、I/O的基本知识

1.1 为何要有I/O

  前面阐述了操作系统具有进程管理、内存管理、外存管理三大核心功能,但是计算机归根是为人类服务的,这就要求计算机必须提供某种机制使得人们可以向计算机发出命令或操纵计算机。也就是说计算机与人之间必须存在某种沟通的机制,这种沟通的机制就是计算机的输入输出机制。输入输出的存在才使得计算机的存在有了意义,就像一个人,如果没有输入输出,那么就不能与外部世界打交道。

  (1)输入提供的是一个“人→计算机”的通道,即人或外部世界通过输入向计算机发出命令或提供数据。

  (2)输出提供的是一个“计算机→人”的通道,计算机通过这个通道向人祸外部世界输出自己的计算机结果。

1.2 I/O管理要达到的目的

  简单来说,I/O就是提供一个人际交互的通道,使得人和计算机能够进行沟通。具体来说,I/O的目的有以下两点:

  (1)屏蔽输入输出设备的差异:提供一个统一的界面来屏蔽输入输出设备的差异

  (2)在不同设计之间进行数据表示的转换:数据能够在不同设备之间相互转换而无需用户操心

二、I/O的硬件和软件

2.1 I/O的硬件

  所有的I/O设备均可以分为两个大类:块设备字符设备。块设备是以数据块为单位存储和传输数据的输入输出设备,如磁盘、光盘、U盘等;而字符设备则是将数据按照字符为单位来存放和传输的设备,如鼠标、键盘、打印机等等。

  (1)I/O设备的差异性

  I/O设备由于种类不同、制造商不同、技术标准不同,其特性可以有巨大的不同。因此,屏蔽这些巨大的不同,使得不同的设备相互共存并不是一件容易的事情。

  (2)设备控制器

  I/O设备本身并不是一个不可分割的整体,而是由不同的部件构成。一般来说,一个I/O设备至少可以分为两部分:机械部分和电子部分。机械部分是设备的物理硬件部分,而电子部分则是设备的控制器。控制器可以处理多个设备,或者说多个同类的设备可以共用一个控制器,如下图所示:

2.2 I/O的软件

  除了有了I/O的硬件是不够的,毕竟,对于用户来说,直接对硬件进行操作十分困难。我们知道,操作系统的角色是魔术师和管理者,魔术是将不同I/O设备的差异屏蔽,使它们看上去似乎是一样的东西,都具有令人赏心悦目的界面;而管理则是对这些设备进行管理,该独享的独享,该共用的共用,需要缓冲的缓冲,并对设备进行实际的驱动(发出读写命令)。

  具体来说,I/O软件的目标如下:

  (1)设备独立:程序对I/O设备的访问不依赖于设备的物理特征,且在I/O程序的编写时无须事先指定I/O设备。

  (2)统一命名:设备或文件的命名不依赖于具体的计算机,这样使用名字将使程序可以在任何机器上运行;

  (3)错误处理:对输入输出过程中产生的数据错误进行侦测与纠正,而且纠错应该在最靠近硬件的层面上进行;

  (4)数据传输:实际操控数据在主机和外设之间的传递;

  (5)缓冲:为数据传输提供一个临时存放地,然后在方便时将数据拷贝到最后目的地。

  (6)共用与独享:将设备尽量变为共享,以增大资源利用率和降低死锁发生的概率。例如,将磁盘、打印机变为共享。

三、I/O软件的分层

  为了完成一个繁琐的工作,人们通常将其分为更小的任务来处理。在I/O软件上自然也不会例外。I/O软件通常按照I/O功能进行分层,每一层有提供独特的功能,并与相邻的层面设计有标准界面。一般来说,I/O软件都有以下几层:

  (1)用户层I/O软件

  (2)设备独立的操作系统软件

  (3)设备驱动程序

  (4)中断服务程序

3.1 中断服务程序

  由于大多数I/O均为中断驱动,中断驱动服务程序就称为绝大部分I/O软件的不可分割的部分。中断服务程序由于直接与硬件相关,因此针对不同的I/O硬件,中断响应的处理方式也不尽相同。因此,中断服务程序是I/O软件系统分层里面的最底层。

3.2 设备驱动程序

  设备驱动程序顾名思义就是直接驱动I/O设备进行输入或输出操作的软件。它属于与设备控制器直接联系的I/O软件部分,与具体的I/O设备直接相关,并针对每个特定的I/O设备进行优化。

3.3 设备独立的操作系统软件

  设备驱动程序并不直接从用户处接收I/O请求,而是通过操作系统软件获得的。操作系统在设计时之所以有这层软件是因为I/O软件的一部分与设备有关,一部分与设备无关。而如果与设备无关,就可以将这部分共用起来,放置在设备驱动程序之上,为用户提供一个统一的I/O界面。

3.4 用户层I/O软件

  设备驱动程序从设备独立的操作系统软件层接收I/O请求,而设备独立的操作系统软件则从用户或应用软件处接收指令。这时,还差一个发出指令的界面,这个界面就是用户层I/O软件。我们可能大多数都见过在一段C程序中

    count = write(fd, buffer, nbytes)

  这一句命令就是用户层I/O软件的一部分,write是一个由高级语言提供的库函数,用户与这个库函数打交道,而这个库函数在编译之后会变成一系列指令,来完成系统调用过程。

参考资料

邹恒明,《操作系统之哲学原理》,机械工业出版社

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

操作系统核心原理-7.设备管理:I/O原理的更多相关文章

  1. IIS站点工作原理与ASP.NET工作原理

    IIS站点工作原理与ASP.NET工作原理  一.IIS IIS 7.0工作原理图 两种模式: 1.用户模式(User Mode)(运行用户的程序代码.限制在特定的范围内活动.有些操作必须要受到Ker ...

  2. Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)

    Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...

  3. Hibernate缓存原理与策略 Hibernate缓存原理:

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

  4. 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理

    原文链接地址:http://www.cppblog.com/Tim/archive/2012/07/04/181018.html 本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们 ...

  5. 单片微机原理P0:80C51结构原理

    本来我真的不想让51的东西出现在我的博客上的,因为51这种东西真的太low了,学了最多就所谓的垃圾科创利用一下,但是想一下这门课我也要考试,还是写一点东西顺便放博客上吧. 这一系列主要参考<单片 ...

  6. Jmeter 结构、原理介绍 Jmeter结构、原理介绍(1)

    一.Jmeter 简介 1.是基于java语言的开源的应用软件. 2.可以进行接口测试.性能测试.接口及性能的自动化测试. 二.Jmeter体系结构 元件:可以理解为每一个菜单.如THHP请求.响应断 ...

  7. Android 类加载原理 和热修复——深入浅出原理与实现

    一.简述 热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一.在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新 ...

  8. 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理

    本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们知道在一个进程中,所有线程是共享同一个地址空间的.所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线 ...

  9. Mysql 索引原理《一》索引原理与慢查询1

    为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然 ...

随机推荐

  1. Oracle连接与会话

    连接(connection):连接是从客户端到oracle数据库实例的一条物理路径. 会话(session):会话是数据库实例中存在的一个逻辑实体. case1:一个连接可以有多个会话 SQL> ...

  2. NoSql数据库初探-mongoDB环境搭建

    NoSQL数据库一改关系型数据库的缺点,更容易的集成.分布式.无模式.故障恢复等特点,正在一步步餐食关系型数据库的市场,作为一个与时俱进的码农了解一下新技术是必须的,尤其是在读了<NoSql精粹 ...

  3. selenium使用笔记(二)——Tesseract OCR

    在自动化测试过程中我们经常会遇到需要输入验证码的情况,而现在一般以图片验证码居多.通常我们处理这种情况应该用最简单的方式,让开发给个万能验证码或者直接将验证码这个环节跳过.之前在技术交流群里也跟朋友讨 ...

  4. Anaular指令详解

    目录:directive()   restrict   replace   template   templateUrl  scope  transclude   ng-transclude   co ...

  5. Java面向对象之封装

     面向对象的三个特征:封装.继承和多态. Java开发的过程就是找合适的库对象使用,没有对象创建新对象.找对象,建立对象,使用对象并维护对象之间的关系. 类就是对现实生活中事物的描述,而对象就是这类事 ...

  6. IntelliJ IDEA 绝对好用快捷键

    最近根据自己的使用习惯整理了一下在windows下常用的一些快捷键,有些确实非常实用. 常用快捷键  键 作用 备注 Ctrl+F12 显示当前类的所有方法   F2 定位下一个错误位置   Alt ...

  7. 每天一个linux命令--批处理

    简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. 创建批处理脚本wanghy.sh: #!/bin/sh cd /opt/virgo-tomcat-se ...

  8. 2016-2017 ACM-ICPC Asia-Bangkok Regional Contest

    A. WSI Extreme 将人按洗澡时间从大到小排序,那么$ans=\sum_{i=1}^{n}a_i\times\lfloor\frac{i+W-1}{W}\rfloor$. 当$W$比较大时, ...

  9. 在CentOS下利用Python+selenium获取腾讯首页的今日话题。

    1.安装依赖包 yum install wget firefox gcc zlib zlib-devel Xvfb 2.安装setuptools 官网地址:https://pypi.python.or ...

  10. 栈的JS实现

    栈,是一种特殊的线性表,其插入及删除的操作都在线性表的同一端进行.这一端称为栈顶,另一端称为栈底.就类似于餐厅里的一摞盘子,后放的盘子在上方,也会先被人拿走.栈具有"后进先出"的逻 ...