操作系统知识点整理
操作系统(OS; Operating System)
操作系统指控制和管理计算机系统的硬件和软件资源,并合理组织和调度计算机的作业和资源分配的程序的集合,是最基本的系统软件。操作系统的主要目标为实现方便性、有效性、可扩充性和开放性。
操作系统实现对计算机资源的抽象,提供用户与计算机硬件系统间的接口,其内核具有的两大功能如下:资源管理功能和支撑功能。资源管理功能指管理处理机、存储器、文件、设备等计算机系统资源;支撑功能的内容如下。
- 中断(Interrupt):中断分为由外部设备引起的外中断,和来自CPU内部的内中断,又称陷入(Trap),中断处理程序需要保存被中断进程的CPU环境并转入相应的设备处理程序,还需要恢复CPU现场,且这两个过程必须关中断;
- 时钟(Clock):内核中有大量的函数都是基于时间驱动的;
- 原语(Primitive):原语即由若干指令组成,用于完成一定功能的原子操作。
操作系统的主要功能如下:进程管理;存储器管理;I/O管理;文件管理。
操作系统的基本特性如下。
- 并发(Concurrence):多个事件在同一时间间隔内发生,对有限物理资源的强制性使用,进程的引入实现并发执行,极大提高资源利用率,增加系统吞吐量;
- 共享(Sharing):系统中的资源可供内存中多个并发执行的进程共同使用,又称资源复用,共享的方式有互斥共享方式(临界资源等)和同时访问方式(磁盘设备、磁盘文件等);
- 虚拟(Virtual):通过某种技术将一物理实体变为若干逻辑对应物,利用设备为某个用户服务的空闲转去服务其他用户,以提高资源利用率,如时分复用技术(虚拟处理机、虚拟设备等)和空分复用技术(虚拟磁盘、虚拟存储器等);
- 异步(Asynchronism):进程推进的速度不可预知。
其中并发和共享互为条件,二者都是操作系统的最基本特性。
操作系统的两种处理机状态如下。
- 内核态(Kernel Mode):运行操作系统程序,操作硬件,能访问所有的内存空间和对象,其所占有的处理器是不允许被抢占的;
- 用户态(User Mode):运行用户程序,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的。
通常,用户态切换至内核态的途径有系统调用、异常和中断等;内核态切换至用户态可通过设置程序状态字(PSW; Program Status Word)的方式。
未配置操作系统的计算机采用人工操作的方式对计算机进行操作,用户独占计算机,且CPU等待人工操作,计算机资源利用率严重降低,即所谓人机矛盾。后来引入脱机输入/输出(Off-Line I/O)方式,即程序和数据的输入/输出是在脱离主机的情况下进行的,减少了CPU的等待时间,且提高了I/O速度。
操作系统的发展历程可分为批处理系统、分时系统、实时系统、网络和分布式系统等。
图形用户界面(GUI; Graphical User Interface)可使用户基于各种输入设备操控图形对象,而每种图形对象都对应一种计算机任务、指令或现实世界对象等。现在的计算机大部分都具有图形用户界面。
批处理系统(Batch Processing System)
批处理系统可分为如下两类。
- 单道批处理系统(Simple Batch Processing System):解决人机矛盾和CPU与I/O设备速度不匹配的矛盾,但系统资源得不到充分的利用;
- 多道批处理系统(Multiprogramming Batch Processing System):资源利用率高,系统吞吐量大,但平均周转时间长且无交互能力。
分时系统(Time-Sharing System)
分时系统使多个用户通过各自终端以共享使用一台计算机。分时系统实现的关键问题如下:及时接收,措施如在系统中设置多路卡,用缓冲区暂存命令;及时处理,措施如作业直接进入内存,分短时间片轮转运行。
实时系统(Real-Time System)
实时系统可及时响应外部事件,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。实时系统的进程调度,通常抢占式优先级高者优先。
实时任务可分为如下两类:允许失误的软实时系统(Soft Real-Time System);较为严格的硬实时系统(Hard Real-Time System)。
进程管理(Process Management)
多任务处理操作系统的必要功能。
进程(Process)
进程即系统进行资源分配和调度的独立单位。进程的特征如下:进程具有动态性,即进程的实质是进程实体的执行过程,有别于程序的静态性;进程具有并发性,即多个进程实体同存于内存中,且能在一段时间内同时运行;此外进程还具有独立性和异步性。
进程的基本状态如下。
- 新生(New);
- 就绪(Ready):分配到除CPU外的所有必要资源;
- 执行(Running):已获得CPU,正在运行;
- 阻塞(Blocked):又称等待(Waiting),即等待某一事件而无法执行;
- 终结(Terminated)。
进程控制块(PCB; Process Control Block)描述一个进程及其与其他进程和系统资源的关系,是用于刻画一个进程在各个时期所处状态的数据结构。进程控制块是进程存在于系统的唯一标识。
进程控制块记载的内容如下:进程标识符,即由创建者提供的外部标识符和整数的内部标识符;处理机状态,包括通用寄存器(用于在中断时保存现场)、程序计数器、程序状态字和用户栈指令等;进程调度信息;进程控制信息。
进程实体包含进程控制块,程序段和数据段。
进程控制是进程管理中最基本的功能,一般由操作系统内核中的原语实现。
临界资源(Critical Resources)又称独占资源,指一段时间内只允许一个进程访问的资源,如某些物理设备(打印机、磁带机等),以及栈、变量等。临界区(Critical Section)则是访问临界资源的代码片段。
中断屏蔽(Interrupt Mask)或称关中断,是当一个进程正在使用临界资源时,防止其他进程再进入临界区访问的最简单方法。中断屏蔽的缺点如下:易被滥用;长时间中断屏蔽将影响效率;不适用于多处理机系统下对临界资源的互斥访问。
进程间通信(IPC; Inter-Process Communication)即至少两个进程间传送数据或信号的一些技术或方法。为协调进程间的相互制约关系,引入进程同步(Process Synchronization)的概念,即令并发执行的进程按一定规则共享系统资源,使程序执行具有可再现性。
主要的IPC方法如下:文件(File);信号量(Semaphore);管道(Pipe);管程(Monitor);共享存储器系统(Shared-Memory System);消息传递系统(Message Passing System)。其中,信号量机制由戴克斯特拉提出,是卓尔有效的进程同步工具,包括如下部分。
- P(Proberen):P原语表示「尝试」,即申请资源;
- V(Verhogen):V原语表示「升高」,即释放资源。
互斥锁(Mutex)是防止同时访问共享资源的程序对象,用于实现对临界资源的独占式处理,是特殊的二值型信号量。可见互斥是同步的特殊情况。
管程机制中,使用条件变量(Conditional Variable)以区别不同的等待原因。令x
为条件变量的记号,则x.wait()
的形式将调用此原语的进程阻塞于x
条件队列,而x.signal()
即唤醒x
中的队首进程。
经典的IPC问题及其基于信号量的解答如下。
生产者-消费者问题(Producer-Consumer Problem):又称有限缓冲问题(Bounded-Buffer Problem),描述共享固定大小缓冲区的两个进程在实际运行时的情况,注意下述解答的头两行
P()
语句不能颠倒位置,否则可能引起死锁;1
Semaphore empty = N, full = 0, mutex = 1;
1
2
3
4
5P(empty);
P(mutex);
// 放入缓冲区
V(mutex);
V(full);1
2
3
4
5P(full);
P(mutex);
// 从缓冲区取出
V(mutex);
V(empty);读者-写者问题(Reader-Writer Problem):描述多个进程尝试访问同一个共享资源的情况,下述是「读者优先」的解答,此外,独木桥问题是读者-写者问题的衍生,可转换为两类读者的问题;
1
2Semaphore mutex = 1, c_mutex = 1;
int counter = 0;1
2
3
4
5
6
7
8
9P(c_mutex);
if(counter == 0) P(mutex);
counter++;
V(c_mutex);
// 读数据对象
P(c_mutex);
counter--;
if(counter == 0) V(mutex);
V(c_mutex);1
2
3P(mutex);
// 写数据对象
V(mutex);睡眠理发师问题(Sleeping Barber Problem):由戴克斯特拉提出,其解决的关键是互斥锁。
1
2
3
Semaphore mutex = 1, customer = 0, barber = 0;
int waiting = 0;1
2
3
4
5
6
7
8
9P(mutex);
if(waiting < N) { // 有椅子
waiting++;
V(customer);
V(mutex);
P(barber); // 理发师是否空闲
} else {
V(mutex);
}1
2
3
4
5P(customer); // 是否有顾客
P(mutex);
waiting--;
V(barber);
V(mutex);
线程(Thread)
线程是调度的最小单位,会被频繁地调度和切换。引入线程旨在减少程序并发执行时所付出的时空开销,使得并发粒度更细,并发性更好。
C++11的线程可见此处。
线程的实现方式如下。
- 内核支持线程(KST; Kernel Supported Thread):又称内核线程,是轻量级进程(LWP; Light Weight Process);
- 用户级线程(ULT; User Level Thread):又称用户线程,用户进程中的一个实体,内核意识不到用户线程的存在。
用户线程与内核线程的组合方式,即多线程模型(Multithreading Model)的实现方式如下。
- 多对一模型(Many-to-One Model):将用户线程映射到一个内核线程,若一个线程在访问内核时阻塞,则整个进程都会阻塞;
- 一对一模型(One-to-One Model):将每一个用户线程映射到一个内核线程,并发功能更好,但创建一个用户线程就要创建一个相应的内核线程,开销大;
- 多对多模型(Many-to-Many Model):将许多用户线程映射到同样数量或更少数量的内核线程,若一个线程阻塞,内核可调度至另一线程执行。
调度(Scheduling)
调度即分配所需资源的方法,进行调度工作的程序称调度器(Scheduler)。
批处理系统环境中,进程又称为作业(Job),一个比程序更广泛的概念,包含程序、数据和作业说明书;分时系统环境中,进程又称为任务(Task)。批处理系统环境是以作业为基本单位由辅存调入内存的。
处理机调度的层次即调度器的类型如下。
- 高级调度(High Level Scheduling):又称长程调度或作业调度,决定辅存中的哪些作业调入内存,主要用于多道批处理系统,而分时、实时系统中不设置;
- 低级调度(Low Level Scheduling):又称短程调度或进程调度,决定就绪队列中的哪个进程获得处理机,是最基本的一种调度,操作系统必须配置;
- 中级调度(Intermediate Scheduling):又称内存调度,将暂时不运行的进程挂起以提高内存利用率。
处理机调度算法的共同目标如下:资源利用率;公平性,即避免「饥饿」现象;平衡性,即使处理机和各种外设能经常忙碌;策略强制执行。
实时调度(Real Time Scheduling)使用的方法有最早截止时间优先(EDF; Earliest Deadline First)和最低松弛度优先(LLF; Least Laxity First)等。其中松弛度(Laxity)是任务紧急的程度,定义如下。
松弛度
周转时间(TAT; Turn-Around Time)指从作业提交至作业完成的时间间隔。平均周转时间(ATT; Average Turn-Around Time)常用于评估处理机调度算法的性能优劣。
死锁(Deadlock)
两个或两个以上的进程因竞争彼此资源而造成的阻塞现象,一组死锁的进程中,每一进程都在等待只有其他进程才能引发的事件。竞争不可抢占资源或可消耗资源、进程推进顺序不当等,都是产生死锁的原因。
预防死锁需要破坏死锁的四个必要条件之一,内容如下。
- 互斥(Mutual Exclusion):该条件无法破坏;
- 保持和请求(Hold and Wait):当一个进程在请求资源时,不能持有不可抢占的资源;
- 不可抢占(No Preemption):当一个进程提出新的资源请求不能满足时,必须释放已持有的所有资源;
- 循环等待(Circular Wait):对所有类型资源线性排序,规定每个进程必须按序号顺序请求资源。
对于破坏保持和请求的条件,有如下两种协议:一次申请运行所需的全部资源,但会使资源严重浪费,且进程经常发生「饥饿」现象;允许一个进程只获取运行初期所需的资源,便能够开始运行,是对第一种协议的改进。
对于破坏不可抢占的条件,可规定当提出新的资源请求不能满足时,必须释放已保持的所有资源。
对于破坏循环等待的条件,可对所有类型资源线性排序,规定每个进程必须按序号顺序请求资源。
银行家算法(Banker's Algorithm)是避免死锁的著名算法,由戴克斯特拉提出。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在银行家算法中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。
安全状态(Safe State)指系统能按某种推进顺序,为每个进程分配资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利完成。银行家算法在资源分配前进行判断,若分配不会使系统处于不安全状态,才进行资源分配。
检测死锁利用死锁定理,即一组进程为死锁的充分条件是,当且仅当该组进程的资源分配图不可完全化简,即不能使所有进程结点都孤立。解除死锁的方式有剥夺资源和撤销资源分配的进程等。
存储器管理(Memory Management)
对计算机内存资源的分配和使用的技术,其功能如下:内存空间的分配与回收;逻辑地址到物理地址的转换;内存空间的扩充,即虚拟内存的应用;存储保护,即防止内存地址越界。
程序的执行需要经过编译、链接和装入等步骤。其中装入(Loading)即将模块置于主存。程序的装入可分为如下几种方式。
- 绝对装入(Absolute Loading):编译后即产生物理地址;
- 可重定位装入(Relocation Loading):即静态重定位,地址变换在装入时一次完成;
- 动态运行时装入(Dynamic Run-Time Loading):即动态重定位,增设重定位寄存器,使地址变换在程序真正执行时才进行。
程序的链接可分为如下几种方式。
- 静态链接(Static Linking):事先链接且不再拆开;
- 装入时动态链接(Load-Time Dynamic Linking):装入时链接;
- 运行时动态链接(Run-Time Dynamic Linking):将某些模块的链接推迟至程序执行时。
离散分配方式有分页存储管理、分段存储管理和段页式存储管理(先分段再分页,各取所长)。
页(Page)
页是进程逻辑地址空间,块(Block)与之大小相同,但是内存物理地址空间。页内碎片即进程最后一页装不满一块形成的不可利用的碎片。
页表(Page Table)是一种数据结构,实现「页号-物理块号」的地址映射,转换进行的场所成为地址变换机构。系统为每一进程建立一个页表,页表的长度和首地址存于PCB中。占用CPU的进程,其页表必须驻于内存。
有效访问时间(EAT; Efficient Access Time)指从发出访问请求至取出数据的时间,计算式如下。
其中,
为一次内存访问所需的时间。
快表(TLB; Translation Lookaside Buffer)又称页表缓存或转译后备缓存,是CPU的一种缓存,用于改进逻辑地址到物理地址的转译速度。引入快表后,有效访问时间的计算式如下。
其中:
为一次内存访问所需的时间; 为查找快表的时间; 为命中率。
页的总结如下:页数是信息的物理单位,分页是系统管理的需要;页的大小固定且由系统决定;分页的作业地址空间是一维的,只需一个记忆符即可表示一个地址;分页有内部碎片,无外部碎片;分页不易实现共享和动态链接。
段(Segment)
段是作业按逻辑关系的划分。段可有数据段(DS; Data Segment)和代码段(CS; Code Segment)等。
段的总结如下:段是信息的逻辑单位,分段是用户的需要;段的长度不固定且取决于程序;分段的作业地址空间是二维的,需要给出段名和段内地址;分段有外部碎片,无内部碎片;分段容易实现共享和动态链接。
虚拟内存(Virtual Memory)
虚拟内存只适用于离散分配技术,属于高速缓存技术,基于局部性原理。装入时,只需装入一部分就可以启动;执行时,当访问的信息不在内存,则由操作系统将其调入内存,将暂时不用的程序和数据换出至外存,即对换(Swapping)。对换根据执行的基本单位不同可有如下类型:进程;页;段。
文件区占磁盘空间的大部分,访问频率低,采用离散分配方式;而对换区占磁盘空间的小部分,操作频率高,采用连续分配方式。
虚拟内存的三大特征为多次行、对换性和虚拟性。多次性是最重要的特征,多次性和对换性建立于离散分配的基础上,多次性和虚拟性则以对换性为基础。
抖动(Thrashing)指从内存中换出某页,又请求换入改页。预防抖动的方式如下:采用局部置换策略;将工作集(在时间间隔内进程要访问的页面的集合)算法融入处理机调度;利用
I/O管理(I/O Management)
I/O设备的控制方式如下。
- 轮询(Polling);
- 中断(Interrupt);
- 直接存储器访问(DMA; Direct Memory Access)方式:设备和内存间的数据通路可使成块地传送数据而无需处理机的干预,提高了CPU利用率;
- I/O通道(I/O Channel):又称I/O地址(I/O Address),是I/O专用的特殊处理机,具有执行I/O指令的能力,该方式是DMA方式的发展,可进一步减少处理机的干预。
设备无关性(Device Independence)将逻辑设备名映射至物理设备名,通过逻辑设备表(LUT; Logical Unit Table)实现。
假脱机技术(SPOOLing; Simultaneous Peripheral Operating Online)是指在联机情况下实现的同时外围操作,将独占设备改为共享设备,可提高I/O速度,实现虚拟设备功能。
文件管理(File Management)
操作系统引入文件管理的目的是实现对文件的「按名存取」。
文件(File)是由创建者定义的,具有文件名的一组有逻辑意义信息的相关元素的集合。文件控制块(FCB; File Control Block)是用于描述和控制文件的数据结构,是文件存在的标识,包括文件基本信息、存取控制信息和使用信息等。
文件目录(File Directory)即文件控制块的有序集合,是文件名与辅存空间中物理地址的对应关系。打开文件的操作即将指定的文件目录内容复制到主存的活动文件表。
计算机存储文件之前,首先需要将存储介质格式化(Formatting),以将盘片划分为轨道,进一步将轨道分为扇区,或称为簇。文件的不同部分分散在不相邻的簇中,通常会导致驱动器性能下降,碎片整理(Defragment)重新排列磁盘的文件以使它们存储在相邻的簇中,进而使驱动器恢复最佳性能。