2.1.4 操作系统

1、操作系统概述

       操作系统是现代计算机中最为重要和最基础的系统软件。它一方面管理计算机各种硬件资源,另一方面又为各种其他系统软件和应用软件提供支持和运行环境,同时又提供人机接口,方便用户使用。操作系统在计算机系统中的位置如下图所示:

                          

                                                    图2.1.16 操作系统在计算机系统中的位置

(1)操作系统的作用

操作系统的作用可以从三个方面来分别阐述:

从资源管理的角度

操作系统作为资源管理器,全面管理计算机系统中的软硬件资源。主要包括处理器管理、存储器管理、设备管理和文件管理等;

从系统分层、扩充机器的角度

操作系统是一个虚拟机,在硬件的基础上,可以扩充硬件功能,比如可以提供超过物理内存的存储空间,使机器功能更强大,使用更方便;

从服务用户的角度

为用户提供简单易用的人机接口,比如windows的图形用户界面;

表2.1.18

(2)操作系统的特性

操作系统的基本特性主要体现在以下四个方面:

并发性

是指虽然在某一个时刻只能运行一个程序,但操作系统将程序分成更小的进程,以进程为单位,使多个程序间隔运行。在宏观上感觉像是多个程序在同时运行;

共享性

是指系统中的资源可供多个并发运行的程序共同使用;

虚拟技术

虚拟是指通过某种技术把一个物理实体变成若干个逻辑上的对应物。操作系统使用的虚拟技术主要是时分复用技术和空分复用技术;

异步性

是指程序以人们不可预知的速度向前推进。即程序在多次运行时,每次运行的速度或顺序不一样,但却获得同样的结果。操作系统允许程序的异步运行;

表2.1.19

补充】什么是时分复用技术和空分复用技术?

  • 时分复用,从字面上讲就是分时间复用,指当多个程序需要使用同一个资源时,每个程序都按照一定的顺序依次使用。从时间上看每个程序都是单独使用的,但只要每个程序使用的时间足够短,从宏观上看, 就相当于多个程序在同时使用;
  • 空分复用,从字面上讲就是分空间复用,指当多个程序需要使用同一个资源时,每个程序都同时使用资源的不同部分。比如,内存的使用,多个程序可以同时使用内存,但每个程序只是使用了内存的一部分存储空间;

(3)操作系统的发展

操作系统经过了如下的发展历程:

手工操作

(无操作系统)

计算机的电子管时代,用户既是程序员、又是操作员。编程语言为机器语言。输入/输出设备是纸带或卡片;

单道批处理

将若干个作业分类编成作业执行序列,每个批作业由专门的程序监督自动依次处理。可使用汇编语言开发;

多道批处理

在管理程序的控制下,同时运行几个相互独立的程序,使它们相互穿插的运行,共享CPU和其他硬件资源;

分时操作系统

多个用户可以同时的使用同一台计算机系统,但实质是每个用户分时轮流使用CPU资源,宏观上看是在同时使用;分时操作系统的特性:交互性、及时性、独立性、同时性;

实时操作系统

主要用于过程控制、事务处理等有实时要求的领域,具有实时反馈、快速反应能力和高可靠性等特点;

网络操作系统

在操作系统的功能上提供网络通信和网络服务功能;

分布式操作系统

在计算机网络的基础上形成多台处理机,每台处理机只负责指定的一部分操作系统的功能;

表2.1.20

(4)常用操作系统介绍

目前市面上比较常用或者常见的操作系统主要有以下几种:

DOS

(Disk Operating System),磁盘操作系统,1979年由微软公司为IBM个人电脑开发的单用户单任务操作系统,其从1981年开始便占据操作系统的统治地位,直到1995年微软发布windows95后,才退出历史舞台。

Windows

微软公司于1983年开始研发,最初的研发目标是在DOS的基础上提供一个多任务的图形用户界面,后续版本逐渐发展为主要为个人电脑和服务器用户设计的操作系统,是目前使用最为广泛的操作系统,最新版本为windows 11。

NUIX

诞生于1969年左右,是一个强大的多用户、多任务操作系统。前期主要用于科研与教学,后期稳定后开始发布商业版本。目前主要用于服务器端。

Linux

诞生于1991年,是一个类UNIX的开源操作系统,自问世以来,得到了广大软件爱好者、组织和公司的支持,发展迅速,目前有多个发行版本,在服务器端有着广泛的应用。

下面从操作系统作为资源管理者的角度,着重介绍操作系统的进程管理、内存管理、文件管理和设备管理等内容。

2、进程管理

       前面提到过,操作系统的一个基本特性就是并发性,而这个并发性实质上是指程序的并发执行。在介绍程序的并发执行前,我们先介绍程序的另一种执行方式:顺序执行。

  • 顺序执行

        我们通常可以把一个程序看成由若干个程序段组成,在各程序段之间,需要按照某种先后顺序依次执行,即仅当前一程序段执行完毕后,才能执行后续的程序段。这种按照先后顺序执行的方式,我们就称为顺序执行。

    顺序执行有以下特点:

  • 顺序性,即程序执行有先后顺序;
  • 封闭性,程序是在封闭环境中执行的,一旦程序开始执行,其独占全机资源。不受其他程序的影响,执行结果不受外界因素影响;
  • 可再现性,只要程序的初始条件和运行环境相同,都将获得相同的执行结果;

        顺序执行为程序开发人员的检测和错误排查带来了很大的方便,但是由于其运行时独占全机资源,系统资源的利用率非常低。为此,程序运行需要采用更加高效的方式:并发运行。

  • 并发执行

       是指每个程序都由若干个在逻辑上相互独立的程序段组成,每个程序的程序段可以相互间隔交替运行,即不用等一个程序运行完毕,另一个程序的程序段便已开始运行。从宏观上可以看成是多个程序同时在运行。

并发执行有以下特点:

  • 间断性,程序并不是连续运行至结束的,而是中间有间断,有可能被别的程序的运行而打断。即程序之间是相互制约的。
  • 失去封闭性,多个程序共享系统的资源,这些资源的状态由多个程序来改变,使程序的运行失去了封闭性。
  • 不可再现性,由于失去了封闭性,也导致程序的运行结果不再具有可现性。失去封闭性,导致程序的运行环境发生了变化,而每次运行的环境都不一样,其结果也很难保证一致;

为了实现程序的并发执行,在操作系统中引入了进程的概念。

(1)进程的概念

       进程可以理解为程序的某个逻辑上相互独立的程序段的一次执行过程。进程不是静态的,而是一个动态的过程。它是系统进行资源分配和调度的一个独立单位。进程的特征如下:

  • 结构特征,进程实体由程序段、相关的数据段和PCB(进程控制块)构成。其中PCB指明了进程的相关基础信息,比如进程名、进程状态、优先级、资源占用情况等。
  • 动态性,进程的实质是进程实体的一次执行过程,因此动态性是进程的最基本特征。进程实体是有一定的生命周期的,它可以被创建,也可以被撤销。
  • 并发性,程序的并发性实质上就是进程的并发性。进程可以在一段时间内同时运行。
  • 独立性,是指进程是一个能独立运行、独立分配资源和独立接受调度的基本单位。
  • 异步性,是指进程按各自独立的、不可预知的速度向前推进。和其他进程的运行关联不大,没有相关的同步性。

(2)进程的状态

        由于进程执行时具有间断性,所以运行中的进程会有就绪状态、执行状态和阻塞状态三种基本状态,再加上进程开始时的创建状态和结束时的终止状态,进程总共有五种状态,具体描述如下:

创建状态

创建一个进程,首先为进程创建PCB,其次把该进程转入就绪状态并插入就绪队列中。而创建状态就是指创建过程尚未完成,进程还不能被调度运行。

就绪状态

是指进程已经分配到除CPU外的所有资源,只要再获得CPU,便可立即执行。系统中处于就绪状态的进程可能有多个,一般会把它们排成一个队列,称为就绪队列。

执行状态

又称运行状态,是指进程已获得CPU,正在处于执行过程中。单CPU系统,有且只有一个执行状态的进程。但多CPU系统中,可以存着多个执行状态的进程。

阻塞状态

是指正在执行的进程由于发生了某事件而暂时无法继续执行时,便放弃CPU而处于暂停的状态。

终止状态

当进程运行结束或由于其他原因被操作系统或有权限的其他进程所终结时,进程就会进入终止状态。进入终止状态后,操作系统会删除PCB。

表2.1.21

进程的五种状态在满足某些条件后,是可以相互转化的。其转化关系如下图所示:

                                                 图2.1.17 进程状态转换关系图

就上图的转换关系说明如下:

  • 创建状态的进程在当前系统的内存容量等允许下(创建的进程需要存入主存中)完成创建工作,此时就会自动进入就绪状态;
  • 就绪状态的进程在就绪队列中排队等待,如果根据进程的优先级等因素,被调度选中,则马上分配CPU资源,进入执行状态;
  • 如果执行状态的进程在被分配的CPU时间片用完后,还未运行结束,则进程重新进入就绪状态,等到下一次被调度选中;
  • 如果执行状态的进程需要访问I/0设备,则进程会让出CPU,进行I/0读写操作。从而会使进程进入到阻塞状态。
  • 如果阻塞状态的进程I/0操作完成后,则重新进入就绪状态,等待下一次被调度选中。
  • 执行状态的进程运行结束后,则会释放CPU和其他资源,进入到终止状态。

补充】什么是线程?

       线程,又称为轻型进程,可以理解为是对进程的进一步的分割。一个进程可以包含多个线程。一个进程所包含的多个线程可以并发运行,所以其比进程有更好的并发性。同时引用线程后,进程不再作为能独立运行和独立接受调度的基本单位了,进程只是拥有资源的基本单位,而把线程作为调度和分配CPU的基本单位。但进程所拥有的资源可以被其包含的线程共享。由于线程的切换不会引起资源的变动(只有属于不同进程的线程切换时,才会切换进程并引起资源的变动),所以线程减少了系统开销,进一步提高了系统的吞吐量。

补充】什么是多道程序环境?

       所谓的多道程序环境就是指计算机系统允许同时载入多个程序,这些程序可以相互穿插运行,同处于开始到结束之间的状态,共享计算机系统资源等。简单来说,多道程序环境就是支持程序并发运行的系统环境。与之对应的是单道程序,即只允许载入一个程序,只允许一个程序运行,在该程序结束前,不允许载入其他程序。

(3)进程的调度

       进程调度也称低级调度或短程调度,主要用于决定就绪队列中的哪个进程应该优先获得CPU并使之执行。进程调度可以采用非抢占方式和抢占方式,分别介绍如下:

  • 非抢占式,是指一旦把CPU分配给了某个进程,不管它要运行多长时间,都不允许其他进程抢占已经分配给它的CPU,除非该进程运行完毕或发生了某事件而被阻塞(比如,I/0请求等)。该调度方式实现简单,系统开销小,但不适合要求比较严格的实时系统。
  • 抢占式,允许调度程序根据某种原则去暂停某个正在执行的进程,将已经分配给该进程的CPU重新分配给另一个进程。该调度方式可以防止一个进程占用较长时间的CPU,能满足对响应时间较严格的实时系统,但系统开销比较大。

       进程调度需要采用一定的调度算法(所谓的调度算法,就是CPU分配策略所采用的分配算法)来实现。一般常用的调度算法简单介绍如下:

先来先服务调度算法

最简单的调度算法,从就绪队列中选择一个最先进入该队列的进程。

短进程优先调度算法

从就绪队列中选择一个估计运行时间最短的进程。

高优先级调度算法

从就绪队列中选择一个优先级最高的进程。又分为抢占式优先权算法和非抢占式优先权算法。

基于时间片的轮转调度算法

将就绪队列中的就绪程序按先来先服务的原则进行排队,每次调度时,就把CPU分配给队首的进程,令其执行一个时间片。时间片执行完毕后,依次分配给下一个进程。

表2.1.22

(4)死锁

       操作系统引入进程后,可以利用进程的并发性来提高系统的效率和吞吐量,但也会产生一种异常情况,就是死锁。所谓的死锁就是指多个进程在运行过程中因争夺资源而造成的无限等待的状态。比如,系统中只有一台打印机和一台扫描仪,而此时恰好存在两个进程P1和P2,P1已经占用了打印机,P2已经占用了扫描仪,若P1后续需要使用扫描仪,而因为扫描仪已经被P2占用,则P1会进入阻塞状态。若此时P2需要使用打印机,而因为打印机已被P1占用,P2也会因为资源无法满足而进入阻塞状态。于是P1和P2之间就形成了僵局。两个进程都在等待对方释放出自己所需的资源,但它们又都因不能继续获得自己所需资源而不能继续运行,从而也无法释放出自己已占用的资源,从而进入无限相互等待的死锁状态。

死锁状态一旦形成,在没有外力的情况下,则无法消除。因此,需要我们进行干预,目前处理死锁的基本方法分为以下两种:

  • 预防或避免死锁,就是通过设置某些运行时的限制条件,来破坏产生死锁的必要条件或在资源动态分配的过程中,防止系统进入不安全状态,从而预防死锁的发生;
  • 检测与解除死锁,在系统中设置检测模块,及时检测出死锁的发生,同时处理死锁,将进程从死锁状态中解脱出来。目前常用的解除死锁的方法如下:

剥夺资源

从其他进程中强制剥夺足够的资源给予死锁进程。

撤销进程

撤销死锁中的部分或全部进程,以便获得足够的可用资源。

表2.1.23

3、内存管理

       存储器管理是操作系统的重要功能之一,而存储器管理中 ,最核心的就是内存的管理。计算机内存管理主要包括四个方面:内存地址映射、内存分配与回收、内存共享与保护、内存扩充。

(1)内存地址映射

        在计算机中运行程序时,会存在两种地址,一种是逻辑地址(也称虚拟地址),一种是绝对地址(也称物理地址)。程序员在编程时,一般是不知道程序运行时,操作系统会将该程序存储在内存中的什么位置,所以都是假定在一个相对的地址空间中进行编程,同时默认程序的首地址为0。 比如,程序中有一个指令是[将数值‘789’存入到地址为2500的存储空间中],该地址‘2500’就是一个逻辑地址,它是相对程序的首地址0而言的。但程序运行时,是会将程序存入内存的,假设操作系统将该段程序存入了以5000地址为开头的一段内存空间。那么2500的逻辑地址的实际内存地址就是7500(5000+2500)了,此时7500就是物理地址。

所谓的物理地址就是指在内存中的实际地址。而将逻辑地址转换或映射为物理地址的过程,就称为地址重定位。

地址重定位的方式分为静态地址重定位和动态地址重定位。

静态重定位

程序执行之前就完成了重定位,它是在程序装入内存时,根据将要装入的内存起始位置,直接修改程序中的有关地址,将其转换为物理地址。比如上面的例子中,一个指令是[将数值‘789’存入到地址为2500的存储空间中],在将程序装入内存时,系统会将这个指令直接修改为[将数值‘789’存入到地址7500的存储空间中]。(假设程序的存储地址是以5000开头)。这种重定位的特点:

  • 程序重定位之后不能在内存中移动了;
  • 为程序分配的存储空间必须是连续的;

动态重定位

在程序执行过程中进行地址重定位,更准确的说是在CPU每次访问程序中的地址时,才进行地址转换。还是上面的例子,一个指令是[将数值‘789’存入到地址为2500的存储空间],在程序装入内存时,该指令不做修改,只有当执行到该指令时,才会将存入的地址转换为7500.(假设程序的存储地址是以5000开头)。动态重定位通常需要硬件‘重定位寄存器’支持,重定位寄存器用来保存分配给程序的存储空间的开头地址,比如5000,然后在重新执行时,通过重定位寄存器+逻辑地址,来计算得出实际地址进行转换。

这种重定位的特点:程序的不同模块可以装入不连续的内存空间中,只要每个模块都有自己对应的重定位寄存器即可。

表2.1.24

(2)内存分配与回收

       内存的分配与回收就是指操作系统在将程序装入内存时,如何为其分配内存空间及程序运行完毕后如何回收已分配的内存空间。

目前常用的存储管理方式列举如下:

<1>连续分配方式

是指为一个程序分配一个连续的内存空间。具体又可进一步分为以下四种:

连续分配方式

概念理解

备注

单一连续分配

把内存分为系统区和用户区,系统区用于存储操作系统,而用户区用于存储用户程序,这种方式只能用于单用户、单任务的操作系统。

用户区任一时点只存储一个程序。

固定分区分配

将内存用户区划分为若干个固定大小的区域,每一个区域装入一个程序。由于每个程序独占一个区域,若该程序较小时,会存在区域内空间浪费的情况。

可运行多道程序

动态分区分配

又称可变分区分配,是指不提前划分用户区,而是根据程序的实际情况,在程序装入时,动态的划分一块连续空间。每次划分的区域大小则各不相同。

涉及回收的问题

可重定位分区分配

在动态分区分配方式下,内存用户区会不停的分配与回收,此时会形成大小不一,不相连续的空间,如果某一个程序比较大,比用户区中的所有未分配的连续空间都大时,则无法为其分配空间。此时可采用拼接技术,将内存中的所有程序进行移动,使原本分散的小区域拼接成大的区域,以便分配给大的程序。

在动态分区分配的基础上,增加拼接技术,且需要重定位寄存器的支持

表2.1.25

关于存储空间的回收:

  • 对于单一连续分配和固定分区分配,等到程序运行完毕后,则分配的整个区域回收;
  • 对于动态分配和可重定位分区分配,等到程序运行时,需要回收分配的区域。若待回收的区域前后相连的区域为尚未分配的空闲区域,则操作系统会将相邻的空闲区域合并成一个区域;

       连续分配方式的特点:连续分配方式实现简单,但是容易产生碎片,浪费内存空间。虽然可以通过‘拼接’技术,将若干小的碎片拼接成较大的空间,但需要为此付出很多额外的工作。

<2>分页式存储管理

       将一个进程的逻辑地址空间划分成若干个大小相等的空间片,称为页面或页;对应的,把内存空间划分成与页面相同大小的若干个存储块,称为(物理)块;在为进程分配内存时,以块为单位将进程中的若干页装入到多个不相邻的物理块中,而这就是所谓的分页式存储。

       分页式存储管理的特点:可以有效避免碎片的问题,提高内容利用率。同时由于对整个物理块进行分配与回收,所以内存分配与回收算法也比较简单,但由于需要动态地址转换,需增加相应的地址寄存器硬件。

<3>分段式存储管理

        将一个进程的逻辑地址空间按照逻辑关系划分为若干段,每个段都定义了一组逻辑信息;在为进程分配内存时,以段为单位,为每一个段分配一个连续的存储空间,而这就是所谓的分段式存储。由于段的大小不一,所以分配的不相邻的若干个连续存储空间也是大小不一的。比如一个进程可以划分为主程序段Main、子程序段X和数据段D等,每个段都会有自己的名字,且每个段都从0开始编址。所以可以通过段名+段内地址组成某一指令的逻辑地址。一般情况下,编译程序在编译源程序时,会根据源程序的情况自动划分成若干段,而操作系统将程序载入内存时,会根据编译程序划分的段分别载入内存。

       分段式存储的一个突出的优点就是容易实现程序段的共享,即多个程序可以很容易共享一个程序段。 

<4>段页式存储管理

       段页式存储就是将分段和分页相结合而形成的一种存储管理方式,即先将进程分成若干个段,再把每个段分成若干个页,每个段都有段名,段大小不一,段内分页时,都是从0开始,为每个页赋予一个页号,页面的大小是固定的,和物理块对应。在段页式存储中,其地址由段名(段号)、段内页号和页内地址三部分组成。

(3)内存共享与保护

       内存共享,就是多个进程共享某一内存空间,实现数据共享或交互。比如分段式存储管理中,多个进程就易于实现程序段的共享。

       内存保护,就是在为某一进程分配存储空间后,保证访问该进程时,其访问的物理地址在该存储空间范围内。对于连续分配方式而言,会设置上下限寄存器,存放分配给该进程的地址空间的上限和下限,在访问该进程时,会对访问地址进行比较,如果在该上下界限内,则是正常的,如果超出该上下界限,则是访问越界,产生越界中断信号。对于分页或分段式管理方式而言,则会设置页表/段表寄存器,用于存放页表/段表地址和页表/段表长度,每次访问时,也会比较地址是否越界。

(4)内存扩充

       就是指在不实际增加物理内存的前提上,如何载入或运行更多的进程。一般情况下,要想运行一个进程,需要把这个进程的所有内容都载入内存中。但大多数情况下,一个进程在运行时,并不是一直在运行进程的所有内容,而只是进程的一部分在运行,一部分在等待。如果我们只把运行的部分装入内存,不运行的部分暂时不装入,等到需要运行时在装入,同时运行的那部分在结束后会调出内存并置换成需要运行的部分,那么在某一时刻,我们就可以装入或运行更多的进程。

       内存扩充经常使用的是虚拟存储器技术。而所谓的虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。虚拟存储器的实现方法包括请求页式存储管理、请求段式存储管理和请求段页式存储管理(其本质就是在页式、段式、段页式存储管理的基础上增加了请求调入和置换的功能)。

       虚拟存储器的逻辑容量由内存容量和外存容量之和决定,但其仍然受CPU寻址范围的限制,所以虚拟存储器(或虚拟内存)的实际最大容量是内外存容量之和、CPU寻址范围的两者最小值。

4、目录和文件系统

       在操作系统中,一般会把计算机上保存的数据、程序、甚至各种外设(比如,在linux操作系统中就把打印机、键盘、鼠标等设备看成文件进行管理)都看成是一种文件,并为用户提供文件的存取、共享和保护等功能,即方便了用户的使用,也保证了系统的安全。

(1)文件的概念

       文件是指具有文件名的若干个具有完整逻辑意义的相关元素的集合。在操作系统中,一个安装程序包、一个word文档、一个excel表格等都是以文件的形式存在的。

       一个文件必须有一个文件名,一般而言,它通常有两部分组成,文件名和扩展名,前者由用户定义,用于识别文件,后者用于区分文件类型,由程序默认,两者一般用“.”隔开。

文件具有自己的属性,一般包含:

  • 文件类型,指明该文件所属的类型;
  • 文件长度,指明文件的当前长度或大小;
  • 文件的物理地址,指明该文件存储在哪个外部设备上及在该设备上的具体位置;
  • 文件的建立时间,一般是指文件的创建日期或最后修改日期;

       为了管理计算机上的文件,操作系统提供了一个统一的文件管理功能,包含文件的命名规则、新建、修改、删除、保存、物理存储等等内容。这个文件管理功能也被称为文件系统。目前常见的文件系统有以下几种:

  • FAT16,DOS操作系统和初期Windows系统均支持FAT16;
  • FAT32,从Windows98开始,流行使用FAT32文件系统;
  • NTFS, 从Windows 2000开始,支持的一种文件系统;
  • EXT2/4, Linux操作系统下使用的文件系统;

(2)文件的类型

       操作系统为了方便管理和控制文件,一般会将文件分成若干种类型。根据不同的分类标准,可以有多种分类方法,最常用的文件分类方法如下:

按用途分类

系统文件

一般指由系统软件构成的文件。

用户文件

一般指由用户的源代码、目标文件、执行性文件或数据等构成的文件。

库文件

一般指由标准子例程及常用的例程构成的文件。

按文件中数据的形式分类

源文件

一般指由源程序和数据构成的文件。

目标文件

一般指把源程序经过编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件,通常其后缀为.obj。

可执行文件

一般指把编译后所产生的目标代码在经过链接程序链接后所形成的文件。

按存储控制属性分类

只执行文件

一般指只允许被授权的用户调用执行的文件,该文件既不允许读,也不允许写。

只读文件

一般指只允许被授权的用户读的文件,但不允许写。

读写文件

一般指允许文件创建者和被授权的用户读或写的文件。

按组织形式和处理方式分类

普通文件

除特殊文件和目录文件外的都是普通文件。

目录文件

用来管理和实现文件系统功能的系统文件,一般通过目录文件可以对其他文件进行检索。

特殊文件

指系统中的各类I/O设备。为了便于管理,有些操作系统会将所有的I/O设备也当成文件进行统一管理。

表2.1.26

(3)文件的结构

       文件的结构一般是指文件由什么构成的,以及文件是如何存储在外存上的。基于此,文件的结构,可以分成逻辑结构和物理结构。

<1> 逻辑结构,又称文件组织,指出文件由什么构成,它是从用户的角度,所观察到的文件的组织形式,是用户直接处理的数据及其结构,它独立于文件的物理结构。

       文件的逻辑结构又分为两大类,有结构的和无结构的,其中有结构的文件,一般是指该文件由记录构成,所以又称为记录式文件;无结构的文件,一般是指由字符流构成的文件,其长度以字节为单位,又称为流式文件。

       有结构文件中所指的记录,是一组相关数据项的集合,它包含多个数据项,用来描述某一个特定的实体。根据记录中数据项个数是否相同,又可将记录分为定长记录和不定长记录。

定长记录

指文件中的所有记录长度都是相同的,所有记录中的各数据项都处在记录中的相同位置,具有相同的顺序和长度。

不定长记录

又称变长记录,指文件中的各记录的长度不相同。

表2.1.27

<2> 物理结构,又称存储结构,是指文件存储在外存上的存储组织形式。其一般与外存空间的分配方式有关,分为顺式结构、链接结构和索引结构。

顺序结构

外存空间连续分配,即要求为每一个文件分配一组连续的外存存储空间。

链接结构

外存空间离散分配,即为每个文件分配各不相连的存储空间,每个存储空间又存储了下一个存储空间的地址,这样同属于一个文件的多个离散的存储空间可以链接成一个链表。知道了第一个存储空间的地址,就可以根据下个存储空间地址,依次访问所有的存储空间,从而访问整个文件。

索引结构

外存空间离散分配,为每个文件分配一个索引表,在把分配给该文件的所有不相连的存储空间地址记录到该索引表中。

表2.1.28

(4)目录管理

       在操作系统中,为了用于标识系统中的文件及其物理地址,一般会为文件设置一个用于描述文件和控制文件的数据结构,被称为‘文件控制块(FCB)’。文件和文件控制块一一对应,而文件控制块的有序集合被称为‘文件目录’,即一个文件控制块就是一个文件目录项。通常,一个文件目录也被看成是一个文件,称为目录文件。

       目录结构就是目录文件的组织结构,一般可分为单级目录、二级目录、多级目录等。

<1> 单级目录,就是整个系统只存在一个文件目录,其包含了所有的文件的FCB,当新建一个文件时,需要检索所有的文件FCB中的文件名,保证新文件名是唯一的,然后新增一个FCB。当删除一个文件时,先找到该文件的FCB,从FCB中找到文件的物理地址,收回该文件占用的存储空间,同时删除该FCB。

      单级目录的优点是实现简单,缺点是查找速度慢、不允许重名、不便于实现文件共享等。

<2> 两级目录,就是为每个用户建立一个单独的用户文件目录,其包含该用户所有文件的FCB。同时在系统中建立一个主文件目录MFD(Master File Directory),在主文件目录中,每个用户占用一个目录项,该目录项包含用户名和指向该用户目录文件的指针,如下图所示:

                                                        图2.1.18 两级目录示例

两级目录具有以下的优点:

  • 提高了检索速度;
  • 不同用户可以使用相同的文件名;
  • 不同用户可以使用不同的文件名来访问系统中的一个共享文件;

<3> 多级目录

       多级目录通常是指三级及三级以上的目录结构,也称树型目录结构。有一个主文件目录(也称为根目录),其目录项指向的是下一级的目录文件,而下一级的目录文件中的目录项指向的仍是下下级的目录文件,依次类推,形成多级目录,而只有最低级的目录文件中的目录项记录的才是数据文件。多级目录举例如下:

                                                   图2.1.19 多级目录示例

       多级目录具有查询速度快、层次机构清晰、可以更有效的进行文件的管理和保护等优点,同时在多级目录中,也可以更容易为不同的文件设置不同的存取权限。

目前,大多数常用的操作系统,比如windows、UNIX、Linux等都使用了多级目录结构。

补充】文件路径和当前目录的概念

  • 文件路径

       在多级目录结构(树形目录结构)中,从根目录到任何数据文件,都只有一条唯一的通路。在该通路上,从根目录开始,把全部目录文件名与数据文件名依次用‘/’连接起来,即是该数据文件的路径名。举例如下:

在图2.1.17中,文件‘昨日重现’的路径名为‘root/mydocument/music/昨日重现’。

  • 当前目录

       在多级目录结构中,如果要访问一个文件,则需要使用从根目录文件名到数据文件名构成的全路径名,比如,上例中的路径名‘root/mydocument/music/昨日重现’,这是一件相当麻烦的事情。但是,对于一个进程来说,其运行时所需访问的文件大多是局限于某一个范围的,因此我们可以为进程设置一个‘当前目录’,进程所需访问的文件都基于当前目录进行查找。这样,我们就不需要使用全路径名了,而是使用从当前目录文件名到数据文件名构成的路径名。举例说明如下:

       我们有一个播放音乐的软件,假设它的当前目录为‘root/mydocument’,则软件在查找歌曲文件时,就可以从mydocument目录下查找就行了,此时歌曲文件‘昨日重现’的路径为‘music/昨日重现’。

      一般的,我们将从当前目录开始直至数据文件为止所构成的路径名,称为相对路径名,而将从根目录开始直至数据文件为止所构成的路径名称为绝对路径名。比如:

‘root/mydocument/music/昨日重现’为绝对路径名;

‘music/昨日重现’为相对路径名;

5、I/O设备管理

       计算机硬件系统中的一个重要组成部分就是I/O设备,而I/O设备管理的基本任务就是完成用户提出的I/O请求,提高I/O速率以及提高I/0设备的利用率。

(1)I/O软件

       I/O设备的分类及I/O控制方式在上面章节中已经有所涉及,在这里着重讲解I/O软件。

那么,什么是I/O软件,I/O软件的作用又是什么呢?

I/O设备的种类和类型非常多,比如单就硬盘来说,就有许多不同的类型,且不同厂家生产的硬盘的参数及控制命令各不相同,如果我们在程序中使用了A硬盘,则必须使用A硬盘配套的控制命令,如果将程序安装到另一台电脑上,而恰巧另一台电脑安装的是B磁盘,则程序就无法正常运行,因为程序中使用的A硬盘控制命令无法控制B硬盘。此时若要想使程序正常运行,则只有修改程序中的硬盘控制命令了。试想,如果都是这种情况,那程序就不具有通用性了,也无法进行大规模的推广了。为了解决这个问题,人们提出了I/O软件的概念,通过I/O软件屏蔽掉各硬件设备的差异,向程序提供统一的控制命令。

       I/O软件的总体设计目的就是高效性和通用性,高效性是指确保I/0设备与CPU的并发性,以提高资源的利用率;通用性则是指尽可能提供简单抽象、清晰统一的接口,采用统一标准的方法,来管理所有的设备以及所需的I/O操作。

       为达到上述目标,I/O软件被设计成了一种层次结构,低层软件用于实现与具体硬件的相关I/O操作,而高层软件则向用户提供一个规范的接口。每一层都利用其下层软件提供的服务,完成特定的功能后,屏蔽这些功能实现的具体细节并向上层软件提供服务。

I/O软件一般分为4个层次,如下图所示:

                                                                图2.1.20 I/0软件层次

  • 用户层软件,主要是实现与用户交互的接口,用户可直接调用在用户层提供的与I/O设备操作有关的库函数,对设备进行操作。注意,这里所谓的用户,是指应用软件。
  • 设备独立性软件,主要负责实现与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。设备独立性,也称设备无关性,即应用程序应该独立于具体使用的物理设备。为了实现设备独立性,引入了逻辑设备和物理设备的概念。物理设备指具体实物硬件,而逻辑设备是在应用程序中使用的,其不指向具体的物理设备,只有在真正操作设备时,才由独立性软件映射到具体的物理设备。
  • 设备驱动程序,与硬件直接相关,负责实现设备的操作控制,驱动I/O设备工作。不同种类的硬件,不同厂家生成的同种硬件其驱动程序是不一样的。即驱动程序是针对具体设备的。
  • 中断处理程序,主要用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理后,可以再此返回到被中断的进程。

(2)I/O设备的分配与回收

        对于一台具体的计算机系统而言,其安装的I/O设备总是有限的。当有多个进程同时需要操作I/O设备时,就需要进行I/O设备的分配,即优先让哪些进程先使用I/O设备。I/O设备的分配一般会有相应的分配策略或分配算法。当进程使用完I/O设备时,需要及时的进行回收,以便分配给下一个进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值