一、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. 配置比对脚本(python)

    # -*- coding: utf- -*- from datetime import * import MySQLdb import sys import time import datetime ...

  2. VisualSVN Server的配置和使用方法(转)

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...

  3. resin实现域名访问

    1.修改resin.properties 2.修改hosts文件 3.添加一行记录 配置完后就可以通过test.com访问项目了.

  4. Python 学习第十七天 jQuery

    一,jQuery 知识详解 利用jquery 查找元素,操作元素 1,jquery 引入 <!DOCTYPE html> <html lang="en"> ...

  5. C# 4.0四大新特性代码示例与解读

    摘要:今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性. 之前的文章中,我们曾介绍过C#的历史及C# 4.0新增特性,包括:dynamic. 命名和可选参数.动态导入以及协变和逆变等. ...

  6. 基于Proteus仿真的Arduino学习(2)——LED点阵探究A(LED点阵基础)

    一.前言: 随着LED的普及,以LED点阵为基础的显示设置层出不穷.例如,公交车的线路提示牌.高速公路的信息提示牌,安装在大楼上的广告屏幕等.下面,我们将由简单到复杂地探索各种LED点阵的使用方法,同 ...

  7. Codeforces CF#628 Education 8 D. Magic Numbers

    D. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  8. Shader实例:溶解效果(Dissolve)

    效果: 图左:一道金光闪过,瞬间灰飞烟灭 图右:燃烧效果,先过渡到黄色,然后渐渐过渡到黑色,最后消失殆尽. 这是游戏中常见的效果,各位可以想想自己玩过的游戏. 手头正在玩的,梦三国手游,死亡的时候就是 ...

  9. CSS 是程序员的画笔

    在未来的所有界面.皮肤,都将使用CSS来表现.包括网页.应用.甚至现实物体的包装等等. 因为CSS实践的理念十分优秀:抽离.分类.统一. CSS将是程序员的画笔. 刚做出来的程序基本都是一个样子.产品 ...

  10. 关于PHP语言

    ------php语言与JavaScript的使用 方法是相似 <script type="text/javascript"> </script>--js与 ...