操作系统核心原理-7.设备管理:I/O原理
一、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是一个由高级语言提供的库函数,用户与这个库函数打交道,而这个库函数在编译之后会变成一系列指令,来完成系统调用过程。
参考资料
邹恒明,《操作系统之哲学原理》,机械工业出版社
操作系统核心原理-7.设备管理:I/O原理的更多相关文章
- IIS站点工作原理与ASP.NET工作原理
IIS站点工作原理与ASP.NET工作原理 一.IIS IIS 7.0工作原理图 两种模式: 1.用户模式(User Mode)(运行用户的程序代码.限制在特定的范围内活动.有些操作必须要受到Ker ...
- Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)
Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...
- Hibernate缓存原理与策略 Hibernate缓存原理:
Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...
- 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理
原文链接地址:http://www.cppblog.com/Tim/archive/2012/07/04/181018.html 本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们 ...
- 单片微机原理P0:80C51结构原理
本来我真的不想让51的东西出现在我的博客上的,因为51这种东西真的太low了,学了最多就所谓的垃圾科创利用一下,但是想一下这门课我也要考试,还是写一点东西顺便放博客上吧. 这一系列主要参考<单片 ...
- Jmeter 结构、原理介绍 Jmeter结构、原理介绍(1)
一.Jmeter 简介 1.是基于java语言的开源的应用软件. 2.可以进行接口测试.性能测试.接口及性能的自动化测试. 二.Jmeter体系结构 元件:可以理解为每一个菜单.如THHP请求.响应断 ...
- Android 类加载原理 和热修复——深入浅出原理与实现
一.简述 热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一.在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新 ...
- 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理
本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们知道在一个进程中,所有线程是共享同一个地址空间的.所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线 ...
- Mysql 索引原理《一》索引原理与慢查询1
为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然 ...
随机推荐
- 私有无线传感网 PWSN HLINK
私有无线传感网,我把其叫做 Personal Wireless Sensor Network.此种网络最另众人所知的就是ZIGBEE了.由于在用户不同的使用场景中,对传感网络有许多不同的要求,例如:通 ...
- Android 利用ImageView显示图片
Author: Maddock Date: 2015-07-21 因为做算法demo的需要,开发一点安卓的程序. 需求:获取UI中图像中某点的坐标. 参考:http://longshuai2007.b ...
- C#排序算法小结
前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构组成的.但是这不意味着算法对于每个软件设计人员的实际工作都是很重要的 ...
- 【转】http头部详解
原地址:http://www.cnblogs.com/ziwuge/archive/2011/09/27/2193385.html HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么 ...
- 【转】SSL协议、SET协议、HTTPS简介
一.SSL协议简介 SSL是Secure Socket Layer的缩写,中文名为安全套接层协议层.使用该协议后,您提交的所有数据会首先加密后,再提交到网易邮箱,从而可以有效防止黑客盗取您的用户名.密 ...
- Poj2676
经典DFS现在看来nice啊! package SoduKu; import java.io.InputStreamReader; import java.util.Scanner; /* *我用ro ...
- linux系统CentOS7
linux系统CentOS7 到http://mirrors.sohu.com/mysql/下载想要的mysql版本 这里用到的是 mysql-5.6.33-linux-glibc2.5-x86_64 ...
- mysql_connect() php7不支持,php5.5可以,是废弃函数
天用了PHP7,发现和PHP5变化还挺大的,最大的就是MySQL的连接库变了. PHP5中使用mysql_connect()函数进行连接,但实际上,PHP5.5开始,MySQL就不推荐使用了,属于废弃 ...
- 【转】《从入门到精通云服务器》第六讲—OpenStack基础
前五期的<从入门到精通云服务器>受到了广泛好评,收到留言,有很多读者对云计算相关的技术非常感兴趣.应观众要求,我们这期要安利一条纯技术内容.准备好瓜子.花生,随小编一起进入OpenStac ...
- 半吊子学习Swift--天气预报程序-准备工作
MacBookPro买完快半年了,当初想着买个本本学点ios,买完就看了几天的教程[捂脸],最近发现人都要废了,想重新开始学习Swift并将每天的进程通过博客发布来督促自己. 由于文笔不好,接触Swi ...