现代操作系统(中)

第三章 内存管理

概述

内存(RAM)是计算机中一种需要认真管理的重要资源。

经过多年探索,人们提出了分层存储器体系(memory hierarchy)的概念,即在这个体系中,计算机有若干兆(MB)快速、昂贵且易失性的高速缓存(cache),数千兆(GB)速度与价格适中且同样易失性的内存,以及几兆兆(TB)低速、廉价、非易失性的磁盘存储,另外还有诸如DVD和USB等可移动存储装置。操作系统的工作是将这个存储体系抽象为一个有用的模型并管理这个抽象模型。

操作系统中管理分层存储器体系的部分称为存储管理器。它的任务是有效地管理内存,即记录哪些内存是正在使用的,哪些内存是空闲的;在进程需要时为其分配内存,在进程使用完后释放内存。

地址空间和交换技术

  1. 地址空间

在最初系统中没有对内存的抽象,直接使用物理地址进行存储,这种方法会带来严重的问题:如果用户程序可以寻址内存的每个字节,它们就可以容易地破坏操作系统,从而使操作系统停止运行。想要同时运行多个程序很困难,因为使用物理地址很容易将数据覆盖。

要保证多个应用程序同时存在于内存并且不互相影响,要解决两个问题:保护和重定位。一个很好的解决方法是创造一个内存抽象:地址空间。地址空间为程序创造了一种抽象的内存,地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(在特殊情况下想要共享除外)。

2. 内存超载

当所有要执行的进程所需要的内存大于计算机的物理内存时,就不能把所有进程一直保存在内存中。这种情况叫做内存超载。要想解决这种问题,有两种方法。

交换技术:即把一个进程完整调入内存,使该进程运行一段时间,然后把它存回磁盘。空闲进程主要存储在磁盘上,就不会占用内存。

虚拟内存:可以使程序在只有一部分被调入内存的情况下运行。

虚拟内存

一个进程是和其他进程共享CPU和主存的,但是主存的空间是有限的,当同时运行多个进程时,就会使内存不够用。这个时候,我们就引入了虚拟内存的概念,它是一种对主存的抽象的计算机内存管理技术。
虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分割成多个块,每个块称作一页或页面,每一页又连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存才能运行程序。当程序引用到一部分在物理内存的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。
虚拟内存机制的优缺点:
优点:可以弥补物理内存大小的不足;一定程度的提高反映速度;减少对物理内存的读取从而保护内存延长内存使用寿命;可在较小的可用内存中执行较大的用户程序;可在内存中容纳更多程序并发执行;不必影响编程时的程序结构(与覆盖技术比较)

缺点:占用一定的物理硬盘空间;加大了对硬盘的读写;设置不得当会影响整机稳定性与速度

虚拟内存和物理内存

  1. 用户编制程序时使用的地址称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间

    计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间

  2. 物理内存:在应用中,真实存在的,插在主板内存槽上的内存条的容量的大小。从本质上来说,物理内存是代码和数据在其中运行的窗口。

    虚拟内存:使程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

    若计算机运行程序或操作所需的随机存储器(RAM)不足时,则Windows会用虚拟存储器进行补偿,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是PAGEFILE.SYS这个页面文件。它将计算机的RAM和硬盘上的临时空间组合。将数据移入分页文件可释放RAM,以便完成工作。

    若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。

内存的分页机制

实际上存储在物理内存上(磁盘上),运行时一页一页读取

基本思想:用户程序的地址空间(虚拟地址空间)被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
逻辑地址:系统将程序的逻辑空间按照同样大小也划分成若干页面,称为逻辑页面也称为页。程序的各个逻辑页面从0开始依次编号,称作逻辑页号或相对页号。每个页面内从0开始编址,称为页内地址。程序中的逻辑地址由两部分组成:页号P和页内位移量W。
若给定一个逻辑地址为A,页面大小为L,则页号P=INT[A/L],页内地址W=A MOD L

页表:分页系统中,允许将进程的每一页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面对应的物理块,系统为每个进程建立一张页表,用于记录进程逻辑页面与内存物理页面之间的对应关系。页表的作用是实现从页号到物理块号的地址映射,地址空间有多少页,该页表里就登记多少行,且按逻辑页的顺序排列
缺页中断:进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。
分页和分段的区别
段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的。
段的大小不固定,有它所完成的功能决定;页大大小固定,由系统决定
段向用户提供二维地址空间;页向用户提供的是一维地址空间
段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。
页面置换算法
程序运行过程中,有时要访问的页面不在内存中,而需要将其调入内存。但是内存已经无空闲空间存储页面,为保证程序正常运行,系统必须从内存中调出一页程序或数据送到磁盘对换区,此时需要一定的算法来决定到底需要调出那个页面。通常将这种算法称为“页面置换算法”。

1. 最佳置换算法(OPT)(理想置换算法)

实现原理:每次选择未来长时间不被访问的或者以后永不使用的页面进行淘汰。从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。即被淘汰页面是以后永不使用或最长时间内不再访问的页面。

优点:最佳置换算法可以保证获得最低的缺页率

缺点:最佳置换算法是一种理想化算法,具有较好的性能,但是实际上无法实现(无法预知一个进程中的若干页面哪一个最长时间不被访问)

2. 最近未使用算法(NRU)

实现原理:为使操作系统能够收集有用的统计信息,在大部分具有虚拟内存的计算机中,系统为每一页面设置了两个状态位。当页面被访问(读或写)时设置访问位R位;当页面(即修改页面)被写入时设置修改位M位。用R位和M位来构造一个简单的页面置换算法:当启动一个进程时,它的所有页面的两个位都由操作系统设置成0,R位被定期地(比如在每次时钟中断时)清零,以区别最近没有被访问的页面和被访问的页面。

当发生缺页中断时,操作系统检查所有的页面并根据它们当前的R位和M位的值,把它们分为4类:

第0类:没有被访问,没有被修改 00

第1类:没有被访问,已被修改 01

第2类:已被访问,没有被修改 10

第3类:已被访问,已被修改 11

NRU算法随机地从类编号最小的非空类中挑选一个页面淘汰之。这个算法隐含的意思是,在最近一个时钟滴答中(典型的时间是大约20ms)淘汰一个没有被访问的已修改页面要比淘汰一个被频繁使用的“干净”页面好。

优点:易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了

3. 先进先出置换算法(FIFO)

实现原理:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。 即优先淘汰最早进入内存的页面。

优点:先进先出算法实现简单,是最直观的一个算法

缺点:先进先出的性能最差,因为与通常页面的使用规则不符合,所以实际应用少

4. 第二次页面置换算法

实现原理:FIFO算法可能会把经常使用的页面置换出去,为避免该问题,对该算法做一个简单的修改:检查最老页面的R位。如果R位是0,那么这个页面既老又没有被使用,可以立刻置换掉;如果是1,就将R位清0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续搜索。

5. 时钟页面置换算法

实现原理:尽管第二次机会算法是一个比较合理的算法,但它经常要在链表中移动页面,既降低了效率又不是很有必要。一个更好的办法是把所有的页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面。当发生缺页中断时,算法首先检查表针指向的页面,如果它的R位是0就淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;如果R位是1就清除R位并把表针前移一个位置,重复这个过程直到找到了一个R位为0的页面为止。

6. 最近最少未使用置换算法(LRU)

实现原理:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。即淘汰最近最长时间未访问过的页面。

内存的分段机制

段式管理的基本思想是:把程序按内容或过程(函数)关系分成段,每个段有自己的名字(编号)。

在程序员眼中的程序是分为很多段的,每一段都有不同的特点。适用于不同的领域。每一段都是从该段的地址0开始的。就是说主程序存放的地方地址应该是从零开始的,变量存放的地方地址也应该是从零开始的,其他区域也是如此。用户程序里面每个区域都有其自己的特点,比如主程序这部分应该是只读的,变量所在的区域是可写的,函数库应该是可以可以链接也可以不链接的,栈应该只能单向增加。如果是将整个程序都放在一块的话这些要求肯定不能保证。因此程序应该是要分段保存的,并且这些段都有自己的特点。

既然是分段的,那么是怎么定义地址的呢?还是基址+偏移。只不过这里的基址不再是这个程序的起始位置了,而是这一段程序的起始地址。这个基址放在段表里面
CPU每执行一条牵涉到地址的指令都会查一下PCB里面这个进程段表,从而确定物理地址。这个表其实就是LDT表,有一个专门存放该表地址的寄存器LDTR寄存器。到目前为止内存已经可以使用起来了。因为地址已经设定好了。

内存分区

1. 固定分区

操作系统初始化的时候将内存等分为n个分区,大小一样。但是程序运行的时候内存的需求有大有小,如果采用这种方式势必会造成很大的浪费。

2. 可变分区

可变分区的基本思想是建立已分配分区表和空闲分区表,已分配分区表中记录了已经使用了的内存有哪些,注明了这一段内存是哪个程序使用了,起始地址和长度是多少。空闲分区表记录了内存中的空闲区域,包括起始地址和长度。这时候如果有段内存请求,根据请求的内存大小以及空闲分区表上面空闲分区的大小来给这个请求分配内存,同时更新这两张表;如果有进程运行完了也同样更新这两张表。这样做的好处是:可以给需要大内存的程序分配大块内存,给需要小内存的程序分配小内存,提高内存利用率。

3. 可变分区的三种适配方式

比如有一个请求需要40K内存,空闲分区表里面有很多个大于40K的内存区域,应该选择哪一个分配呢?

首次适配:顾名思义,就是将第一个符合该请求的内存分配出去。这样的好处是:快

下次适配:分配时,从上次扫描结束处继续查找,从第一个满足要求的空闲去中分配

最佳适配:把所有的空闲内存块都看一遍,将最接近40K并且大于40K的内存分配给它。这样的好处是可以可以提高内存的使用率

最差适配:把所有的空闲内存块都看一遍,将最大块的内存分配给它,并且该内存块一定大于40K。这样的好处是剩下的内存块都比较均匀

缓冲区溢出

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害有以下两点:
程序崩溃,导致拒绝额服务;跳转并且执行一段恶意代码
3. 造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入。

第四章 文件系统

文件系统

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。

文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

在计算机中,文件系统是命名文件及放置文件的逻辑存储和恢复的系统。

1. 文件系统种类

ext2:早期Linux中常用的文件系统

ext3:ext2的升级版,带日志功能

RAMFS:内存文件系统,速度很快

iso9660:光盘或光盘镜像

NFS:网络文件系统,由SUN发明,主要用于远程文件共享

MS-DOS:MS-DOS文件系统

FAT:Windows XP 操作系统采用的文件系统

NTFS:Windows NT/XP 操作系统采用的文件系统

  1. 各种文件系统支持的最大硬盘容量

NTFS格式(windows的分区,Linux也能用):支持最大分区为2TB,最大文件为2TB

FAT32格式(windows的分区,Linux也能用):支持最大分区为128GB,最大文件为4GB

Ext2格式:最大分区大小为4TB,最大文件大小为1TB

Ext3格式:最大分区大小为16TB,最大文件大小为2TB

EXT4格式:最大分区大小为1EB,最大文件大小为16TB

文件

文件是创建进程的信息逻辑单元。一个磁盘一般包含有几千甚至几百万个文件,每个文件是独立于其他文件的,唯一不同的是文件是对磁盘的建模,而非对RAM的建模。

进程可以读取已经存在的文件,并在需要时建立新的文件。存储在文件的信息必须是持久的,不会因为进程的创建和终止而受到影响。

1. 文件命名

UNIX文件系统区分大小写字母,DOS文件系统不区分大小写字母。

2. 文件构造方式

字节序列:一种无结构的字节序列,事实上操作系统不知道也不关心文件内容是什么,操作系统所见到的就是字节,其文件内容的任何含义只在用户程序解释。UNIX和Windows都采用这种方法。

记录序列:文件是具有固定长度的序列,每个记录都有其内部结构。把文件作为记录序列的中心思想是:读操作返回一个记录,而写操作重写或追加一个记录。

树:文件在这种结构中由一棵树构成,每个记录不必具有相同的长度,记录的固定位置上有一个键字段。这棵树按照键字段进行排序,从而可以对特定键进行快速查找。

3. 文件结构分类

文件的逻辑结构主要有:(1)连续结构 (2)多重结构 (3)转置结构 (4)顺序结构

文件的物理存储主要有:(1)顺序结构 (2)链接结构 (3)索引结构

文件的目录结构主要有:(1)一级目录结构 (2)二级目录结构 (3)树形结构 (4)无环图

4. 文件访问

顺序访问:进程在这些系统中可从头按顺序读取文件的全部字节或记录,但不能跳过某一些内容,也不能不按顺序读取。顺序访问文件是可以返回到起点的,需要时可多次读取该文件。

随机访问文件:当用磁盘来存储文件时,可以不按顺序地读取文件中的字节或记录,或者按照关键字而不是位置来访问记录,能够以任何次序读取其中字节或记录

有两种方法可以指示从何处开始读取文件。一种是每次read操作都给出开始读文件的位置。另一种是用一个特殊的seek操作设置当前位置,在seek操作后,从这个当前位置顺序地开始读文件。UNIX和Windows使用的是后一种方法。

5. 文件属性

在这里插入图片描述

6. 文件操作

使用文件的目的是存储信息并方便以后的检索。对于存储和检索,不同系统提供了不同的操作。以下是与文件有关的最常用的一些系统调用:

Create:创建不包含任何数据的文件。该调用的目的是表明文件即将建立,并设置文件的一些属性。

Delete:当不再需要某个文件时,必须删除该文件以释放磁盘空间。任何文件系统总有一个系统调用用来删除文件。

Open:在使用文件之前,必须先打开文件。open调用的目的是:把文件属性和磁盘地址表装人内存,便于后续调用的快速访问。

Close:访问结束后,不再需要文件属性和磁盘地址,这时应该关闭文件以释放内部表空间。很多系统限制进程打开文件的个数,以鼓励用户关闭不再使用的文件。磁盘以块为单位写人,关闭文件时,写人该文件的最后一块,即使这个块还没有满。

Read:在文件中读取数据。一般地,读取的数据来自文件的当前位置。调用者必须指明需要读取多少数据,并且提供存放这些数据的缓冲区。

Write:向文件写数据,写操作一般也是从文件当前位置开始。如果当前位置是文件末尾,文件长度增加。如果当前位置在文件中间,则现有数据被覆盖,并且永远丢失。

Append:此调用是write的限制形式,它只能在文件末尾添加数据。若系统只提供最小系统调用集合,则通常没有append。很多系统对同一操作提供了多种实现方法,这些系统中有时有append调用。

Seek:对于随机访问文件,要指定从何处开始获取数据,通常的方法是用seek系统调用把当前位置指针指向文件中特定位置。seek调用结束后,就可以从该位置开始读写数据了。

get attributes:进程运行常需要读取文件属性。例如,UNIX中make程序通常用于管理由多个源文件组成的软件开发项目。在调用make时,它会检查全部源文件和目标文件的修改时间,实现最小编译,使得全部文件都为最新版本。为达到此目的,需要查找文件的某一些属性,即修改时间。

set attributes:某些属性是可由用户设置的,甚至是在文件创建之后,实现该功能的是set attributes系统调用。保护模式信息是一个典型的例子,大多数标志也属于此类属性。

Rename:用户常常要改变已有文件的名字,rename系统调用用于这一目的。严格地说,rename系统调用不是必需的,因为先把文件复制到一个新文件中,然后删除原来的文件,就可以达到同样的目的。

目录

文件系统通常提供目录或文件夹用于记录文件的位置,在很多系统中目录本身也是文件。

1. 一级目录系统

目录系统的最简单形式是在一个目录中包含所有的文件。这有时称为根目录,但是由于只有一个目录,所以其名称并不重要。在早期的个人计算机中,这种系统很普遍,部分原因是因为只有一个用户。有趣的是,世界第一台超级计算机CDC 6600对于所有的文件也只有一个目录,尽管该机器同时被许多用户使用。这样决策毫无疑问是为了简化软件设计。

2. 层次目录系统

层次结构(即一个目录树)。通过这种方式,可以用很多目录把文件以自然的方式分组。

3. 路径名

用目录树组织文件系统时,需要有某种方法指明文件名。常用的方法有两种。第一种是,每个文件都赋予一个绝对路径名,它由从根目录到文件的路径组成。

另一种指定文件名的方法是使用相对路径名。它常和工作目录一起使用。用户可以指定一个目录作为当前工作目录。这时,所有的不从根目录开始的路径名都是相对于工作目录的。

4. 目录操作

不同系统中管理目录的系统调用的差别比管理文件的系统调用的差别大。为了了解这些系统调用有哪些及它们怎样工作,下面给出一个例子(取自 UNIX)。

Create:创建目录。除了目录项“.”和“…”外,目录内容为空。目录项“.”和“…”是系统自动放在目录中的。

Delete:删除目录。只有空目录可删除。只包含目录项“.”和“…”的目录被认为是空目录,这两个目录项通常不能删除。

Opendir:目录内容可被读取。例如,为列出目录中全部文件,程序必须先打开该目录,然后读其中全部文件的文件名。与打开和读文件相同,在读目录前,必须打开目录。

Closedir:读目录结束后,应关闭目录以释放内部表空间。

Readdir:系统调用readdir返回打开目录的下一个目录项。以前也采用read系统调用来读目录,但这方法有一个缺点:程序员必须了解和处理目录的内部结构。相反,不论采用哪一种目录结构,readdir总是以标准格式返回一个目录项。

Rename:在很多方面目录和文件都相似。文件可换名,目录也可以。

Link:链接技术允许在多个目录中出现同一个文件。这个系统调用指定一个存在的文件和一个路径名,并建立从该文件到路径所指名字的链接。这样,可以在多个目录中出现同一个文件。这种类型的链接增加了该文件的i节点计数器的计数(记录含有该文件的目录项数目),有时称为硬链接。

Unlink:删除目录项。如果被解除连接的文件只出现在一个目录中(通常情况),则将它从文件系统中删除。如果它出现在多个目录中,则只删除指定路径名的连接,依然保留其他路径名的连接。在UNIX中,用于删除文件的系统调用(前面已有论述)实际上就是unlink。

5. 文件系统性能

优化文件系统的性能常见方法有:

高速缓存:最常用的减少磁盘访问次数技术是块高速缓存或者缓冲区高速缓存。高速缓存指的是一系列的块,它们在逻辑上属于磁盘,但实际上基于性能的考虑被保存在内存中。

块提前读:在需要用到块之前,试图提前将其写入高速缓存,从而提高命中率。当然,块提前读策略只适用于实际顺序读取的文件。对随机访问文件,提前读丝毫不起作用。

减少磁盘臂运动:把有可能顺序访问的块放在一起,当然最好是在同一个柱面上,从而减少磁盘臂的移动次数。

第五章 输入/输出

除了提供抽象(例如,进程、地址空间和文件)以外,操作系统还要控制计算机的所有I/O(输入/输出)设备。操作系统必须向设备发送命令,捕捉中断,并处理设备的各种错误。它还应该在设备和系统的其他部分之间提供简单且易于使用的接口。如果有可能,这个接口对于所有设备都应该是相同的,这就是所谓的设备无关性。I/O部分的代码是整个操作系统的重要组成部分。

I/O设备原理

1. I/O设备

I/O设备大致可以分为两类:块设备和字符设备。

块设备把信息存储在固定大小的块中,每个块有自己的地址。通常块的大小在 512 字节至 65536 字节之间。所有传输以一个或多个完整的(连续的)块为单位。块设备的基本特征是每个块都能独立于其他块而读写。硬盘、蓝光光盘和USB盘是最常见的块设备。

另一类I/O设备是字符设备。字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构。字符设备是不可寻址的,也没有任何寻道操作。打印机、网络接口、鼠标(用作指点设备)、以及大多数与磁盘不同的设备都可以看作是字符设备。

2. 设备控制器

I/O设备一般由机械部件和电子部件两部分组成。通常可以将这两部分分开处理,以提供更加模块化和更加通用的设计。电子部件称作设备控制器或适配器,在个人计算机上,它经常以主板上的芯片的形式出现,或者以插入(PCI)扩展槽中的印刷电路板的形式出现。机械部件则是设备本身。

控制器的任务是把串行的位流转换为字节块,并进行必要的错误校正工作。字节块通常首先在控制器内部的一个缓冲区中按位进行组装,然后再对校验和进行校验并证明字节块没有错误后,再将它复制到主存中。

3. 直接存储器存取DMA

直接存储器存取,是一种快速传送数据的机制。数据传递可以从适配卡到内存,从内存到适配卡或从一段内存到另一段内存。DMA技术的重要性在于,利用它进行数据传送时不需要CPU的参与。利用DMA传送数据的另一个好处是,数据直接在源地址和目的地址之间传送,不需要中间媒介。

4. 中断

在计算机科学中,中断指计算机CPU获知某些事,暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后再继续执行之前的程序。整个过程称为中断处理,简称中断,而引起这一过程的事件称为中断事件。中断是计算机实现并发执行的关键,也是操作系统工作的根本。

分类:中断按事件来源分类,可以分为外部中断和内部中断。中断事件来自于CPU外部的被称为外部中断,来自于CPU内部的则为内部中断。

进一步细分,外部中断还可分为可屏蔽中断和不可屏蔽中断两种,而内部中断按事件是否正常来划分可分为软中断和异常两种。

I/O软件原理

1. 在设计I/O软件时一个关键的概念是设备独立性。它的意思是应该能够编写出这样的程序:它可以访问任意I/O设备而无需事先指定设备。

与设备独立性密切相关的是统一命名这一目标。一个文件或一个设备的名字应该是一个简单的字符串或一个整数,它不应依赖于设备。在UNIX系统中,所有存储盘都能以任意方式集成到文件系统层次结构中,因此,用户不必知道哪个名字对应于哪台设备。

2. I/O软件的另一个重要问题是错误处理。一般来说,错误应该尽可能地在接近硬件的层面得到处理。当控制器发现了一个读错误时,如果它能够处理那么就应该自己设法纠正这一错误。如果控制器处理不了,那么设备驱动程序应当予以处理,可能只需重读一次这块数据就正确了。

3. 另一个关键问题是同步和异步传输。大多数物理I/O是异步的CPU启动传输后便转去做其他工作,直到中断发生。

4. I/O软件的另一个问题是缓冲。数据离开一个设备之后通常并不能直接存放到其最终的目的地。为了缓和CPU与I/O设备速度不匹配的矛盾,提高它们之间的并行性,在现代计算机系统中,几乎所有的I/O设备在与CPU交换数据时,都用了缓冲区。

5. 共享设备和独占设备的问题。有些I/O设备(如磁盘)能够同时让多个用户使用。多个用户同时在同一磁盘上打开文件不会引起什么问题。其他设备(如磁带机)则必须由单个用户独占使用,直到该用户使用完,另一个用户才能拥有该磁带机。让两个或更多的用户随机地将交又混杂的数据块写入相同的磁带是注定不能工作的。独占(非共享)设备的引入也带来了各种各样的问题,如死锁。

I/O实现方式
I/O可以采用三种根本上不同的方式来实现:程序控制I/O;中断驱动I/O;DMA的I/O

1. 程序控制I/O

I/O的最简单形式是让CPU做全部工作,这一方法称为程序控制I/O。

例如:打印一个字符串
在这里插入图片描述
首先,数据被复制到内核空间。然后,操作系统进入一个密闭的循环,一次输出一个字符。CPU要不断地查询设备以了解它是否就绪准备接收另一个字符。这一行为经常称为轮询或忙等待。

程序控制I/O十分简单但是有缺点,即直到全部I/O完成之前要占用CPU的全部时间。

3 2. 中断控制I/O

这种允许CPU在等待打印机变为就绪的同时做某些其他事情的方式就是使用中断以进行一次上下文切换并且运行其他进程。

中断驱动I/O的一个明显缺点是中断发生在每个字符上。中断要花费时间,所以这一方法将浪费一定数量的CPU时间。

3. 使用DMA的I/O

思路是让DMA控制器一次给打印机提供一个字符,而不必打扰CPU。本质上,DMA控制器而不是主CPU做全部工作。这一策略需要特殊的硬件(DMA控制器),但是使CPU获得自由从而可以在I/O期间做其他工作。

DMA重大的成功是将中断的次数从打印每个字符一次减少到打印每个缓冲区一次。

I/O软件层

I/O软件通常组织成四个层次。每一层具有一个要执行的定义明确的功能和一个定义明确的与邻近层次的接口。功能与接口随系统的不同而不同。

在这里插入图片描述

1. 中断处理程序

虽然程序控制I/O偶尔是有益的,但是硬件对于大多数I/O而言,中断是令人不愉快的事情并且无法避免。应当将其深深地隐藏在操作系统内部,以便系统的其他部分尽量不与它发生联系。隐藏它们的最好办法是将启动一个I/O操作的驱动程序阻塞起来,直到I/O操作完成并且产生一个中断。

2. 设备驱动程序

每个连接到计算机上的I/O设备都需要某些设备特定的代码来对其进行控制。这样的代码称为设备驱动程序,它一般由设备的制造商编写并随同设备一起交付。因为每一个操作系统都需要自己的驱动程序,所以设备制造商通常要为若干流行的操作系统提供驱动程序。

3. 与设备无关的I/O软件

基本功能是:执行所有设备公共的I/O功能,并且向用户层软件提供一个统一的接口。

4. 用户空间的I/O软件

尽管大部分I/O软件都在操作系统内部,但是仍然有一小部分在用户空间,包括与用户程序连接在一起的库,甚至完全运行于内核之外的程序。

磁盘

1. 磁盘

磁盘具有读写速度同样快的特点,这使得它们适合作为辅助存储器(用于分页、文件系统等)。

磁盘被组织成柱面,每一个柱面包含若干磁道,磁道数与垂直堆叠的磁头个数相同。磁道又被分成若干扇区,软盘上大约每条磁道有832个扇区,硬盘上每条磁道上扇区的数目可以多达几百个。磁头数大约是116个。

2. 磁盘的分类

(1)IDE磁盘:特点价格低廉,兼容性强,性价比高,数据传输慢,不支持热插拔等等。

(2)SCSI磁盘:传输速率高,读写性能好,运行稳定,可连接多个设备。可支持热插拔,占用CPU低,但是价格相对来说比较贵,一般用于工作站或服务器上。

(3)SATA磁盘:结构简单、支持热插拔

(4)USB

3. 磁盘分区:

易于管理和使用;有利于数据的安全;节约寻找文件的时间

4. 磁盘的格式化

指将分区格式化成不同的文件系统

5. 磁盘臂调度算法

读或者写一个磁盘块需要多长时间。这个时间由以下三个因素决定:

寻道时间(将磁盘臂移动到适当的柱面上所需的时间);旋转延迟(等待适当扇区旋转到磁头下所需的时间);实际数据传输时间

对大多数磁盘而言,寻道时间与另外两个时间相比占主导地位,所以减少平均寻道时间可以充分地改善系统性能。

算法:先来先服务;最短寻道优先;电梯算法

6. 稳定存储器

稳定存储器使用一对完全相同的磁盘,对应的块一同工作以形成一个无差错的块。当不存在错误时在两个驱动器上对应的块是相同的,读取任意一个都可以得到相同的结果。为了达到这一目的,定义了下述三种操作:稳定写;稳定读;崩溃恢复

时钟

时钟又称为定时器,由于各种各样的原因决定了它对于任何多道程序设计系统的操作都是至关重要的。时钟负责维护时间,并且防止一个进程垄断CPU,此外还有其他的功能。

键盘&鼠标

每台通用计算机都配有一个键盘和一个监视器(并且通常还有一只鼠标),使人们可以与之交互。尽管键盘和监视器在技术上是独立的设备,但是它们紧密地一同工作。在大型机上,通常存在许多远程用户,每个用户拥有一个设备,该设备包括一个键盘和一个连在一起的显示器作为一个单位。这些设备在历史上被称为终端。

1. 键盘

I/O端口中的数字是键的编号,称为扫描码,而不是ASCII码。键盘所拥有的键不超过128个,所以只需7个位表示键的编号。当键按下时,第8位设置为0,当键释放时,第8位设置为1。跟踪每个键的状态(按下或弹起)是驱动程序的任务。所以,硬件所做的全部工作是给出键被按下和释放的中断,其他的事情由软件来做。

虽然键盘与监视器在逻辑上是两个独立的设备,但是很多用户已经习惯于看到他们刚刚键入的字符出现在屏幕上。这个过程叫作回显。

2. 鼠标

轨迹球鼠标:鼠标在内部具有一个橡皮球,该橡皮球通过鼠标底部的一个圆洞突出,当鼠标在一个粗糙表面上移动时橡皮球会随着旋转。当橡皮球旋转时,它与放置在相互垂直的滚轴上的两个橡皮滚筒相摩擦。东西方向的运动导致平行于y轴的滚轴旋转,南北方向的运动导致平行于x轴的滚轴旋转。

光学鼠标:在其底部装备有一个或多个发光二极管和光电探测器。现代光学鼠标在其中有图像处理芯片并且获取处于它们下方的连续的低分辨率照片,寻找从图像到图像的变化。

当鼠标在随便哪个方向移动了一个确定的最小距离,或者按钮被按下或释放时,都会有一条消息发送给计算机。

猜你喜欢

转载自blog.csdn.net/fjj2397194209/article/details/131350168