复试 -- 操作系统

一、概述

什么是操作系统?
操作系统(Operating System,简称 OS)是管理和控制计算机硬件与软件资源的计算机程序,任何其他软件都必须在操作系统的支持下才能运行。

操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。

操作系统的功能包括管理计算机系统的硬件、软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,提供了各种形式的用户界面,使用户有一个好的工作环境,为其它软件的开发提供必要的服务和相应的接口。

基本特征

  1. 并发

并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。

并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。

操作系统通过引入进程和线程,使得程序能够并发运行。

  1. 共享

共享是指系统中的资源可以被多个并发进程共同使用。

有两种共享方式:互斥共享和同时共享。

互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需要用同步机制来实现对临界资源的访问。

  1. 虚拟

虚拟技术把一个物理实体转换为多个逻辑实体。

主要有两种虚拟技术:时分复用技术和空分复用技术。

多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一小个时间片并快速切换。

虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。

  1. 异步

异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。

基本功能

  1. 进程管理

进程控制、进程同步、进程通信、死锁处理、处理机调度等。

  1. 内存管理

内存分配、地址映射、内存保护与共享、虚拟内存等。

  1. 文件管理

文件存储空间的管理、目录管理、文件读写管理和保护等。

  1. 设备管理

完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。

主要包括缓冲管理、设备分配、设备处理、虛拟设备等。

系统调用

如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。


简述操作系统中系统调用过程:
系统调用提供了用户程序和操作系统之间的接口,应用程序通过系统调用实现其余 OS 的通信,并取得它的服务。系统调用不仅可供所有的应用程序使用,而且也可供 OS 本身的其它部分,如命令处理程序。
系统调用的处理步骤(三步):

  • 首先,将处理机状态由用户态转为系统态;然后由硬件和内核程序进行系统调用的一般性处理,即首先保护被中断进程的 CPU 环境,将处理机状态字 PSW、程序计数器 PC、系统调用号、用户栈指针以及通用寄存器内容等压入堆栈;再然后将用户定义的参数传送到指定的地址保存起来。
  • 其次,分析系统调用类型,转入相应的系统调用处理子程序。(通过查找系统调用入口表,找到相应处理子程序的入口地址转而去执行它。)
  • 最后,在系统调用处理子程序执行完后,应恢复被中断的或设置新进程的 CPU 现场,然后返回被中断进程或新进程,继续往下执行。

系统调用与库函数:

库函数一般可以概括的分为两类:一类是随着操作系统的功能,另一类是由第三方提供。

随着系统提供的这些库函数把系统调用进行封装或者组合,可以实现更多的功能。

第三方的库,其实和系统库一样,它是利用系统提供的API接口来实现功能。库函数,它把部分系统调用包装起来,一方面把系统调用抽象了,一方面方便了用户级的调用。

系统调用和库函数在执行的效果上很相似,但是系统调用运行在内核状态,而库函数由用户调用,运行在用户态。

大内核和微内核

  1. 大内核

大内核是将操作系统功能作为一个紧密结合的整体放到内核。

由于各模块共享信息,因此有很高的性能。

  1. 微内核

由于操作系统不断复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。

在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。

因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。


什么是微内核:

什么是微内核操作系统到现在没有一致公认的定义,但是可以从四个方面对微内核操作系统进行描述:

① 足够小的内核:在微内核操作系统中,内核是指精心设计的,能实现现代 OS 最基本核心功能的部分,并非是一个完整的 OS,而只是 OS 中最基本的部分。
② 基于 C/S 模式:将操作系统中最基本的部分放入内核中,而把操作系统的绝大部分功能都放于微内核外面的一组服务器中实现。
③ 应用“极致与策略分离”原理:在传统 OS 中,讲极致放在 OS 的内核的较低层,把策略放在内核的较高层中。而在微内核 OS 中,通常把机制放在 OS 的微内核中,这样才有可能将内核做得很小。
④ 采用面向对象技术。

优点:
① 提高了系统的可扩展性
② 增强系统的可靠性
③ 可移植性
④ 提供了对分布式系统的支持
⑤ 融入了面向对象技术

中断分类

  1. 外中断

由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。

  1. 异常

由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。

  1. 陷入

在用户程序中使用系统调用。

硬中断和软中断是什么?区别是什么?
软中断:
1、编程异常通常叫做软中断
2、软中断是通讯进程之间用来模拟硬中断的一种信号通讯方式。
3、中断源发中断请求或软中断信号后,CPU 或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能
4、软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。
硬中断:
1、硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无外部施加中断请求信号,因此中断的发生不是随机的而是由程序安排好的。
2、硬中断的中断号是由中断控制器提供的;软中断的中断号由指令直接给出,无需使用中断控制器。
3、硬中断是可屏蔽的,软中断不可屏蔽。
区别:
1、软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的
2、软中断是由程序调用发生的,而硬中断是由外设引发的
3、硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间。

二、进程管理

进程与线程

  1. 进程

进程是资源分配的基本单位。

进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。

  1. 线程

线程是独立调度的基本单位。

一个进程中可以有多个线程,它们共享进程资源。

QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。


  1. 区别

进程和线程的区别:

Ⅰ 拥有资源

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

Ⅱ 调度

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

Ⅲ 系统开销

由于创建或撤销进程时,系统都要为之分配或回收资源,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

Ⅳ 通信方面

线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。

进程和程序的区别:
① 进程是动态的,程序是静止的。进程是程序的执行,程序是有序代码的集合。
② 进程是暂时的,程序是永久的。
③ 进程和程序的组成不同:进程包括程序,数据和进程控制块。
④ 进程和程序是密切相关的。通过多次执行,一个程序可以对应多个进程;通过调度关系,一个进程可以包括多个程序。
⑤ 进程可以创建其他进程,但是程序不能形成新的程序。

作业和进程的区别
一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。

作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合。一个作业的完成要经过作业提交、作业收容、作业执行和作业完成 4 个阶段。

其主要区别如下。
(1)作业是用户向计算机提交任务的任务实体。而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中。
(2) 一个作业可由多个进程组成,且必须至少由一个进程组成,反过来则不成立。
(3) 作业的概念主要用在批处理系统中,像 UNIX 这样的分时系统中就没有作业的概念。而进程的概念则用在几乎所有的多道程序系统中进程是操作系统进行资源分配的单位。在 Windows 下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。

进程状态的切换


  • 就绪状态(ready):等待被调度
  • 运行状态(running)
  • 阻塞状态(waiting):等待资源

应该注意以下内容:

  • 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
  • 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。

进程调度算法

不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。

  1. 批处理系统

批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。

1.1 先来先服务 first-come first-serverd(FCFS)

按照请求的顺序进行调度。

有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

1.2 短作业优先 shortest job first(SJF)

按估计运行时间最短的顺序进行调度。

长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

1.3 最短剩余时间优先 shortest remaining time next(SRTN)

按估计剩余时间最短的顺序进行调度。

  1. 交互式系统

交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。

2.1 时间片轮转

将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系:

  • 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
  • 而如果时间片过长,那么实时性就不能得到保证。

2.2 优先级调度

为每个进程分配一个优先级,按优先级进行调度。

为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

2.3 多级反馈队列

一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。

多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。

每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。


  1. 实时系统

实时系统要求一个请求在一个确定时间内得到响应。

分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。

进程同步

  1. 临界区

对临界资源进行访问的那段代码称为临界区。

为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。

// entry section
// critical section;
// exit section
  1. 同步与互斥
  • 同步:多个进程按一定顺序执行;
  • 互斥:多个进程在同一时刻只有一个进程能进入临界区。
  1. 信号量

信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。

  • down : 如果信号量大于 0 ,执行 -1 操作;如果信号量等于 0,进程睡眠,等待信号量大于 0;
  • up :对信号量执行 +1 操作,唤醒睡眠的进程让其完成 down 操作。

down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。

如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。

typedef int semaphore;
semaphore mutex = 1;
void P1() {
    down(&mutex);
    // 临界区
    up(&mutex);
}

void P2() {
    down(&mutex);
    // 临界区
    up(&mutex);
}

操作系统中的信号量:

信号量分类:
① 整型信号量:所谓整型信号量就是一个用于表示资源个数的整型量
② 记录型信号量(资源信号量):就是用一个结构体实现,里面包含了表示资源个数的整型量和一个等待
队列。
信号量的应用:
① 实现进程同步
② 实现进程互斥

整型变量 s 表示系统中某类资源的数目,当其值大于 0 时,表示系统中当前可用资源的数目;当其值小于 0 时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。

  1. 管程

什么是管程:

管程可以看作一个软件模块,它是将共享变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发控制。

管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否者其它进程永远不能使用管程。

进程通信

进程同步与进程通信很容易混淆,它们的区别在于:

  • 进程同步:控制多个进程按一定顺序执行;
  • 进程通信:进程间传输信息。

进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。

  1. 管道

它具有以下限制:

  • 只支持半双工通信(单向交替传输);
  • 只能在父子进程中使用。

  1. 共享存储

允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。

需要使用信号量用来同步对共享存储的访问。

多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外 XSI 共享内存不是使用文件,而是使用使用内存的匿名段。

  1. 套接字

与其它通信机制不同的是,它可用于不同机器间的进程通信。

三、死锁

死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

死锁原因:
① 系统资源不足
② 进程推进顺序不当

必要条件

  • 互斥:进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。
  • 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
  • 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
  • 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

处理方法

主要有以下四种方法:

  • 鸵鸟策略
  • 死锁检测与死锁恢复
  • 死锁预防
  • 死锁避免

鸵鸟策略

把头埋在沙子里,假装根本没发生问题。

因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。

当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。

大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。

死锁检测与死锁恢复

不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。

死锁恢复:

  • 利用抢占恢复
  • 通过杀死进程恢复

死锁预防

在程序运行之前预防发生死锁。

  1. 破坏互斥条件

例如假脱机打印机技术允许若干个进程同时输出,唯一真正请求物理打印机的进程是打印机守护进程。

  1. 破坏占有和等待条件

一种实现方式是规定所有进程在开始执行前请求所需要的全部资源。

  1. 破坏不可抢占条件

  2. 破坏环路等待

给资源统一编号,进程只能按编号顺序来请求资源。

死锁避免

在程序运行时避免发生死锁。

  1. 安全状态

定义:如果没有死锁发生,并且即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每一个进程运行完毕,则称该状态是安全的。

安全状态的检测与死锁的检测类似,因为安全状态必须要求不能发生死锁。

  1. 银行家算法

在每次进行资源分配时,它首先检查系统是否有足够的资源满足要求,如果有,则先试行分配,并对分配后的新状态进行安全性检查。如果新状态安全,则正式分配上述资
源,否则拒绝分配上述资源。这样就保证系统始终处于安全状态,从而避免死锁现象的发生。

什么是饥饿?与死锁有什么差别?

等待时间给进程推进和响应带来明显影响时成为进程饥饿。
饥饿并不代表系统一点死锁,但至少有一个程序的执行被无限期地推迟。
差别:
① 进入饥饿的进程可以只有一个,但是死锁必须大于等于两个;
② 出于饥饿状态的进程可以是一个就绪进程,但是死锁状态的进程必定是阻塞进程。

四、内存管理

虚拟内存

虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。

虚拟存储器,以及相关算法:

基于局部性原理,应用程序在运行之前,仅将那些当前要运行的少数页面或段先装入内存便可运行,其余部分暂时留在盘上。

程序运行时,如果它要访问的页已调入内存,便可继续执行下去;但如果程序要访问
的页或段尚未调入内存(即缺页),此时程序应利用请求调入功能将它们调入内存,以使程序能继续执行下去。如果此时内存已满,无法装入新的页或段,则需要利用页面置换功能,将内存中暂不使用的页面或段调至盘上,腾出空间用于页面调入内存,是程序继续执行下去。

这样,就实现了大的用户程序能在较小的内存空间里运行,也可以在内存中同时装入更多的进程使它们并发运行。从用户角度出发,该系统的内存容量比实际内存容量大很多,故成这样的存储器为虚拟存储器。

页面置换算法

在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。

页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。

页面置换算法的主要目标是使缺页率最低。

  1. 最佳置换

OPT, Optimal replacement algorithm

所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。

是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。

  1. 最近最久未使用

LRU, Least Recently Used

虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。

  1. 最近未使用

NRU, Not Recently Used

每个页面都有两个状态位:访问位R 与 修改位M,当页面被访问时设置页面的 R=1,当页面被修改时设置 M=1。其中 R 位会定时被清零。可以将页面分成以下四类:

  • R=0,M=0
  • R=0,M=1
  • R=1,M=0
  • R=1,M=1

当发生缺页中断时NRU 优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。

  1. 先进先出

FIFO, First In First Out

选择换出的页面是最先进入的页面。

该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。

  1. 第二次机会算法

FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:

当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉;如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索。

  1. 时钟

Clock

第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面连接起来,再使用一个指针指向最老的页面。


分段

虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。

分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。


段页式

程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。

分页与分段的比较

  • 对程序员的透明性:分页透明,但是分段需要程序员显示划分每个段。
  • 地址空间的维度:分页是一维地址空间,分段是二维的。
  • 大小是否可以改变:页的大小不可变,段的大小可以动态改变。
  • 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。

五、设备管理

磁盘结构

  • 盘面(Platter):一个磁盘有多个盘面;
  • 磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道;
  • 扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位,目前主要有 512 bytes 与 4 K 两种大小;
  • 磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写);
  • 制动手臂(Actuator arm):用于在磁道之间移动磁头;
  • 主轴(Spindle):使整个盘面转动。

磁盘调度算法

读写一个磁盘块的时间的影响因素有:

  • 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
  • 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
  • 实际的数据传输时间

其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。

  1. 先来先服务

FCFS, First Come First Served

按照磁盘请求的顺序进行调度。

优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。

  1. 最短寻道时间优先

SSTF, Shortest Seek Time First

优先调度与当前磁头所在磁道距离最近的磁道。

虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两端的磁道请求更容易出现饥饿现象。


  1. 电梯算法

SCAN

电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。

电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。

因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。


  1. 循环扫描算法

CSCAN

规定磁头单向移动,如自里向外移动,当磁头移动到最外的磁道时立即返回到最里磁道,如此循环进行扫描。兼顾较好的寻道性能,防止饥饿现象,同时解决了一个请求等待时间过长的问题。

六、链接

程序的装入方式有哪些?

应用程序从用户编写的源文件到内内存中执行的进程大致分为三个阶段:

  • 经过编译程序将源代码编译为若干个目标模块;
  • 在通过链接程序将编译好的目标模块以及所需的库函数链接到一起,形成完整的装
    入模块;
  • 最后通过装入程序将这些装入模块装入内存并执行。(编译,链接,装入)

装入方式:
① 绝对装入:在编译时就知道程序将要驻留在内存的物理地址,编译程序产生含有物理地址的目标代码,不适合多道程序设计。
② 可重定位装入:根据内存当前情况,将装入模块装入到内存的适当位置,地址变换通常在装入时一次完成,之后不再改变,也称静态重定位。当操作系统为程序分配一个以某地址为起始地址的连续主存区域后,重定位时将程序中指令或操作数的逻辑地址加上这个起始地址就得到了物理地址。
③ 动态运行装入:允许程序运行时在内存中移动位置,把装入模块装入到内存后的所有地址都是相对地址,在程序执行过程中每当访问到相应指令或数据时,才将要访问的程序或数据的相对地址转换为物理地址。动态重定位的实现要依靠硬件地址变换机构。

程序的链接方式有哪些?

① 静态链接:在程序运行之前,先把各个目标模块及所需库链接为一个完整的可执行程序,以后不再拆开。
② 装入时动态链接:将应用程序编译后所得到的一组目标模块在装入内存时采用边装入边链接的链接方式。
③ 运行时动态链接:知道程序运行过程中需要一些模块时,才对这些模块进行链接。

七、补充

交换技术,覆盖技术,以及两者的区别。

覆盖技术:把一个大的程序划分为一系列覆盖,每个覆盖是一个相对独立的程序单位,把程序执行时并不要求同时装入内存的覆盖组成一组,成为覆盖段,这个覆盖段分配到同一个存储区域,这个存储区域成为覆盖区,它与覆盖段一一对应。覆盖段的大小由覆盖段中最大的覆盖来确定。(为了解决内存容量太小的问题,打破了必须将一个程序全部信息装入内存后才能运行的限制)
交换技术:把暂时不用的某个程序及数据部分从内存移到外存中去,以便腾出必要的内存空间;或者把指定的程序或数据从外存读到相应的内存中,并将控制权交给他,让其在系统上运行的一种内存扩充技术。处理器的中级调度就是采用交换技术。

区别:
① 与覆盖技术相比,交换技术不要求程序员给出的程序段之间的覆盖结构;
② 交换技术主要在进程和作业之间进行,覆盖技术主要在同一个进程或作业中进行;
③ 覆盖技术只能覆盖于覆盖程序段无关的程序段,交换进程由换出和换入两个过程组成。

内存连续分配管理方式有哪些?
① 单一连续分配(静态分配)
② 固定分区分配(分区大小可以不等,但事先必须确定,运行时不能改变)
③ 动态分区分配

动态分区分配的算法有哪些?
① 首次适应算法 First Fit
② 循环首次适应算法 Next Fit
③ 最佳适应算法 Best Fit
④ 最差适应算法 Worst Fit

什么叫拼接技术?
在分区管理方式下,系统运行一段时间后,内存中会出现相当一部分的碎片,拼接技术是解决碎片问题的方法。
即将存储器中所有已分配分区移动到主存的一端,使本来分散的多个小空闲区连成一个大的空闲区,这种通过移动把多个分散的小分区拼接成一个大分区的方法即为拼接技术。

内部碎片和外部碎片
内部碎片:分配给作业的存储空间中未被利用的部分。
外部碎片:系统中无法利用的小存储块,比如通过动态内存分配技术从空闲内存区上分配内存后剩下的那部分内存块。

常用的存储保护方法
(1)界限寄存器
上下界寄存器方法
基址、限长寄存器方法
(2)存储保护键:给每个存储块分配一个单独的存储键,它相当于一把锁。

什么是页表?有什么作用。
为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页面映射表。
页表由页表项组成,页表项有页号和块号组成,根据页表项就可以找到每个页号对于物理内存中物理块的块号。

参考资料

  • CS-Note https://cyc2018.github.io/CS-Notes/#/README
  • Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014.
  • 汤子瀛, 哲凤屏, 汤小丹. 计算机操作系统[M]. 西安电子科技大学出版社, 2001.
  • Bryant, R. E., & O’Hallaron, D. R. (2004). 深入理解计算机系统.
  • 史蒂文斯. UNIX 环境高级编程 [M]. 人民邮电出版社, 2014.
  • Operating System Notes
  • Operating-System Structures
  • Processes
  • Inter Process Communication Presentation[1]
  • Decoding UCS Invicta – Part 1

猜你喜欢

转载自blog.csdn.net/Ronnyz/article/details/89467896
今日推荐