实用指南:软件设计师——04 操作系统
1 操作系统概述
1.1 操作系统的基本概念
操作系统定义:能有效地组织和管理系统中的各种软、硬件资源,合理地组织计算机系统工作流程,控制程序的执行,并且向用户献出一个良好的工作环境和友好的接口;
操作系统的两大作用
- 通过资源管理提高计算机系统的效率;
- 改善人机界面向用户提供友好的工作环境;
操作系统特征和作用
- 特征:并发性、共享性、虚拟性、不确定性;
- 功能:进程管理、文件管理、存储管理、设备管理和作业管理;
并发:
- 从宏观角度来看,并发是指在同一时间段内,多个任务似乎同时在执行,多个任务在CPU上迅速切换执行,给用户一种同时进行的错觉;
- 例如,在电脑上一边听音乐,一边浏览网页,音乐播放程序和浏览器程序看似同时运行, 但实际上在单核CPU中,是CPU在这两个应用之间快速切换,轮流执行它们的指令;
并行:
- 在同一时刻,真正有多个任务同时在执行,需多个处理器或多核CPU的支持;就是并行强调的
- 实实在在的同时执行多个任务,大大提高了任务处理的效率。就是比如,在拥有多核CPU的服务器中,不同的核心可以同时处理不同的任务,像一个核心处理数据库查询任务,另一个核心处理文档读写任务, 这
1.2 操作系统分类及特点
- 操作系统有批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统、微型计算机操作系统和嵌入式操作系统等类型;
- 批处理操作系统:像IBM的OS/360 。在早期计算机资源昂贵时,用户将一批作业提交给计算机,系统会自动依次处理这些作业,无需用户干预,提高了计算机的运用效率 。比如,多个用户提交的计算任务,系统会按照一定顺序逐个处理,减少了人工执行切换任务的时间。但用户无法实时与作业交互,若作业中出现问题,也不能及时处理;
- 分时操作系统:UNIX 是典型代表。它将CPU的时间划分成多个时间片,轮流分配给多个用户作业利用,使得每个用户都感觉自己独占计算机。例如,多个用户同时登录服务器,每个用户都能高效地执行命令、编辑档案等操作,环境会快捷切换,让用户察觉不到其他用户的存在。这种系统交互性强,用户行及时得到响应;
- 实时操作系统:VRTX操作系统常用于工业控制、航空航天等领域 。它能在规定的时间内对外部事件做出响应,具有高可靠性和实时性。比如在汽车的电子控制系统中,实时操作系统要能迅速处理传感器传来的信号,如刹车信号、油门信号等,及时控制相应的部件,保障行车安全;
- 网络操作系统:Windows NT Server 。它主要用于管理网络中的资源,供应网络通信、资源共享、网络管理等功能。像在企业局域网中,通过网络操作系统,员工可能共享打印机、文件服务器上的资料等资源,还能实现不同计算机之间的通信和协作;
- 分布式操作系统通过:Apache Hadoop 。它将多个分散的计算机节点组成一个系统,这些节点能够分布在不同地理位置。用户采用时就像使用一台计算机一样,系统会自动分配任务到各个节点进行处理,提高了系统的处理能力和可靠性。比如在大数据处理中,分布式操作系统允许将海量数据分散到多个节点存储和计算,加快数据处理速度;
- 微型计算机操作系统:我们常见的Windows操作系统(如Windows 10)和macOS 。它们主导用于个人计算机,为用户献出图形化的操作界面,方便用户进行各种日常操作,如办公、娱乐、上网冲浪等。同时,它们还能管理计算机硬件资源,运行各类应用程序;
- 嵌入式操作系统:Linux嵌入式操作系统,广泛应用于智能家电、智能家居设备、车载电子设备等。例如智能电视中,嵌入式操作系统可能管理电视的硬件资源,让用户能够流畅地观看视频、安装应用程序等;在车载导航设备中,它可以实现地图导航、多媒体播放等功能,对硬件设备的控制精准且高效 。
2 进程管理
2.1 基本概念
2.1.1 程序与进程
- 进程由程序、素材和进程控制块(PCB)组成;
- 进程是资源分配和独立运行的基本单位;
- 特征:具有动态性、并发性、共享性、独立性、结构性、制约性;
- 进程与程序的区别:
- 进程是动态的,程序是静态的,进程是程序在素材集上的一次执行;
- 进程具有并发性,程序没有;
- 进程是资源分配的基本单位,程序不是;
- 进程与程序不是一一对应的,一个进程通常对应一个程序,而一个脚本允许对应零个或多个进程;
2.1.2 进程的状态及其转换
三态模型:含有运行态、就绪态和阻塞态
五态模型:包含运行态、就绪态、阻塞态、新建态和终止态
2.2 进程的控制
- 进程控制是由操作系统内核(Kernel)中的原语来实现的;
- 由若干条机器指令组成的,就是原语(Primitive)用于完成特定功能的程序段,并且原语在执行的时候不能被分割,具有原子性,要么全部执行,要么全部不执行。
2.3 进程间的通信
- 多个并发进程存在资源共享和相互合作的情况,所以进程之间需要进行通信。
2.3.1 同步和互斥
同步:是合作进程间的直接制约难题,指体系中需要相互合作、协同工作的进程之间的通信。例如进程A向缓冲区送数据,进程B从缓冲区取数据,二者需协同,体现同步关系;
互斥:是申请临界资源进程间的间接制约问题。架构中多个进程因争夺临界资源(每次只能给一个进程运用的资源,如打印机)而互斥执行。比如进程A占用临界资源时,进程B需等待,体现互斥关系;
2.3.2 信号量机制
实用搭建进程同步和互斥的工具就是信号量(Semaphore)机制,有两类信号量:
公用信号量(互斥信号量):对临界资源采用互斥访问,初值为1或资源的个数;
私有信号量(同步信号量):对共享资源访问控制,初值为0或某个正整数;
信号量SSS的物理意义:若S≥0S \geq 0S≥0,表示可用的资源数;若S≤0S \leq 0S≤0,其绝对值表示阻塞队列中等待该资源的进程数;
PPP、VVV操作:均为原子处理,是实现同步和互斥的常用途径;
- PPP操作:表示申请一个资源,即S=S−1S = S - 1S=S−1。若S≥0S \geq 0S≥0,则执行PPP操作的进程继续执行;若S<0S < 0S<0,则执行PPP操作的进程进入阻塞状态;
- VVV操作:表示释放一个资源,即S=S+1S = S + 1S=S+1。若S>0S > 0S>0,则执行VVV操作的进程继续执行;若S≤0S \leq 0S≤0,则唤醒一个进程,并将其插入就绪队列,然后执行VVV处理的进程继续执行;
利用PVPVPV执行构建进程的互斥:令信号量mutexmutexmutex的初值为111,当进入临界区时执行PPP操作,退出临界区时执行VVV操作。代码段为:
P(mutex) 临界区 V(mutex)
利用PVPVPV操作实现进程的同步:以“一个生产者和一个消费者,缓冲区可存放nnn件产品”的典型同步问题为例
设置333个信号量SSS、S1S_1S1和S2S_2S2;
- SSS是互斥信号量,初值为111(基于缓冲区是临界资源);
- S1S_1S1表示是否可能将产品放入缓冲区,初值为nnn(即缓冲区的容量);
- S2S_2S2表示缓冲区是否有产品,初值为000(即缓冲区初始无产品);
生产者流程:
- 生产一个产品
- P(S1)P(S_1)P(S1),即 S1=n−1S_1=n-1S1=n−1,表示生产者申请运用缓冲区中的一个位置
- P(S)P(S)P(S),表示生产者要使用缓冲区
- 产品送缓冲区
- V(S)V(S)V(S),表示生产者已经使用完缓冲区
- V(S2)V(S_2)V(S2),即 S2=0+1=1S_2=0+1=1S2=0+1=1,表示缓冲区中有一个产品
消费者流程:
- P(S2)P(S_2)P(S2),即 S2=1−1=0S_2=1-1=0S2=1−1=0,表示消费者申请取走缓冲区中的一个产品
- P(S)P(S)P(S),表示消费者要使用缓冲区
- 从缓冲区取一个产品
- V(S)V(S)V(S),表示消费者已经使用完缓冲区
- V(S1)V(S_1)V(S1),即 S1=n+1S_1=n+1S1=n+1,表示消费者释放缓冲区中的一个位置
- 消费
练习:假设框架有n(n ≥ 5)个进程共享资源R且资源R的可用数为5。若采用PV操作,则相应的信号量S的取值范围应为()。
- A. -1~n - 1
- B. -5~5
- C. -(n - 1)~1
- D. -(n - 5)~5
D
2.3.3 前驱图
前趋图的作用是表示任务之间的顺序关系以及并行执行关系;
例:
- 任务P2P2P2、P3P3P3可以并行执行,但必须要等P2P2P2、P3P3P3都执行完后,才能执行P4P4P4;
通过这样的关系,能够确定任务间的并行关系以及任务间的先后顺序。
2.4 管程
- 在传统操作系统里,多个进程或线程同时访问共享资源,容易引发内容不一致、竞态条件、死锁等问题。为避免这些问题,必须引入同步机制来协调并发访问。
- 管程(Monitor)是操作系统中的一种同步机制,其引入目的是处理多线程或多进程环境下的并发控制问题;
- 管程提供了高级的同步原语,它把共享资源以及对资源的操作封装在一个单元内,同时提供了对这个单元的访问控制机制;
- 和信号量机制相比,使用管程编写程序更加简单、轻松。
2.5 进程调度
- 指就是进程调度方式当有更高优先级的进程到来时如何分配CPU,分为可剥夺和不可剥夺两种:
可剥夺:当有更高优先级的进程到来时,强行将正在运行进程的CPU分配给高优先级的进程;
不可剥夺:当有更高优先级的进程到来时,必须等待正在运行的进程释放占用的CPU,然后将CPU分配给高优先级的进程;
2.5.1 三级调度
- 在某些操作系统中,一个作业从提交到完成需要经历高、中、低三级调度:
高级调度(作业调度):决定哪个后备作业行调入主系统做好运行的准备;
中级调度(对换调度):决定交换区中的哪个就绪进程允许调入内存;
低级调度(进程调度):决定内存中的哪个就绪进程可以占用CPU。低级调度是操作系统中最活跃、最重要的调度程序。
2.5.2 调度算法
- 先来先服务(FCFS):按先后次序分配CPU。有利于长作业,不利于短作业;有利于CPU繁忙型作业,不利于I/O繁忙型作业;
- 时间片轮转:分配给每个进程时间片,轮流占用CPU。通过时间片轮转提高进程并发性和响应时间特性,从而提高资源利用率;
- 优先级调度:环境选择优先级大的进程占用CPU;
- 多级反馈调度:时间片轮转和优先级调度结合而成
- 设置多个就绪队列111、222、3⋯n3\cdots n3⋯n,每个队列分别赋予不同的优先级,队列111最高,队列nnn最低,分配不同的时间片长度;
- 新进程先进入队列111的末尾,执行时按FCFS原则执行队列111中的进程;
- 若在规定时间片长度内未能执行完某个进程,则将其转入队列222的末尾,依次类推。
2.6 死锁
2.6.1 死锁及其产生的必要条件
死锁定义:两个以上的进程因相互争夺对方占用的资源而陷入无限等待的现象;
死锁产生的4个必要条件
互斥(资源互斥):资源具有排他性,即一个资源在同一时间只能被一个进程使用;
请求保持(进程占有资源并等待其他资源):进程已经占有了部分资源,又去请求其他进程已占有的资源,并且在请求过程中保持自己已占有的资源不释放;
不可剥夺(体系不能剥夺进程资源):进程已占有的资源,在未使用完之前,不能被体系强制剥夺,只能由进程自己释放;
环路(进程资源图是一个环路):存在一种进程资源的循环等待链,链中的每个进程都在等待下一个进程所占有的资源;
P1 和 P2 是进程,R1 和 R2 是资源,其中的小圆圈个数表示资源个数;
上图表示 P1 请求 R1 中的资源,但是 R1 中的资源被分配给了 P2;P2 请求 R2 中的资源,但是 R2 中的资源被分配给了 P1;
分配优先!
2.6.2 进程资源图
进程资源图用来表示进程和资源之间的分配和请求关系;
- PPP代表进程,RRR代表资源,RRR方框中的圆就表示该类资源的数量;
- 分配的优先级大于申请。读图时先看分配,再看申请;
阻塞节点与非阻塞节点
- 阻塞节点:某进程请求资源得不到满足时,该进程即为阻塞节点。如上图(a)中P1P1P1、P2P2P2都是阻塞节点,所以该图不许可化简,是死锁的;
- 非阻塞节点:某进程请求的资源能够满足时,该进程即为非阻塞节点。如上图(b)中P2P2P2是阻塞节点,P1P1P1、P3P3P3非死锁的;就是是非阻塞节点,该图可以化简,
图的化简/死锁判断:当一个进程资源图中所有进程都是阻塞节点时,该图不可化简,即陷入死锁状态;
进程资源图化简的手段:
- 先看架构还剩多少资源没分配,再看有哪些进程是非阻塞的;
- 然后将非阻塞的进程的所有边都去掉,形成一个孤立的点,再把系统分配给这个进程的资源回收回来,这样环境剩余的空闲资源便多了起来;
- 然后再看剩下的进程有哪些是非阻塞的,把它们逐个变成孤立的点。最后,所有的资源和进程都变成孤立的点,即完成图的化简;
以图(b)为例
步骤1:寻找并化简第一个非阻塞节点,找到P1
- 执行P1:假设P1获得所需资源并执行完毕
- 回收资源:P1释放其所有已占用资源(1个R1和1个R2)
- 更新环境状态:
- 空闲资源:R1=2个,R2=3个
- 已分配资源:全部为0
- 此时,P1已完成,从图中移除
步骤2:寻找并化简第二个非阻塞节点,找到P2
- 执行P2:假设P2获得所需资源并执行完毕
- 回收资源:P2释放其所有已占用资源(1个R2和新获得的1个R2,共2个R2)
- 更新环境状态:
- 空闲资源:R1=2个,R2=3个
- 已分配资源:全部为0
- 此时,P2已完成,从图中移除
步骤3:寻找并化简最后一个非阻塞节点,找到P3
- 检查P3:P3请求1个R1,系统空闲R1有2个,请求可满足,所以P3是非阻塞节点
- 执行P3:假设P3获得所需资源并执行完毕
- 回收资源:P3释放其所有已占用资源(1个R1)
- 更新体系状态:
- 空闲资源:R1=2个,R2=3个
- 已分配资源:全部为0
- 此时,P3已达成,从图中移除
2.6.3 死锁的处理逻辑
死锁预防:采用特定策略限制并发进程对资源的请求,破坏死锁产生的4个必要条件(互斥、请求保持、不可剥夺、环路),让系统在任何时刻都不满足死锁产生的必要条件,从而预防死锁发生;
死锁避免:提前计算出不会产生死锁的资源分配方法,著名的死锁避免算法是银行家算法;
死锁检测:允许死锁产生,但系统会定时运行死锁检测程序,判断平台是否发生死锁,若检测到死锁,就设法解除;
死锁解除:是死锁发生后的解除技巧,比如资源剥夺法、撤销进程法等;
死锁资源的计算:系统内有nnn个进程,每个进程都需要RRR个资源,那么发生死锁的最大资源数为n∗(R−1)n*(R - 1)n∗(R−1),不发生死锁的最小资源数为n∗(R−1)+1n*(R - 1)+1n∗(R−1)+1;
假设一个系统中有3 个进程(n = 3),它们都在竞争同一种资源(比如打印机),每个进程都需要2 个这种资源才能顺利完成任务(R = 2);
发生死锁的最大资源数
- 公式:n∗(R−1)n * (R - 1)n∗(R−1)
- 代入计算:3∗(2−1)=3∗1=33 * (2 - 1) = 3 * 1 = 33∗(2−1)=3∗1=3,即当体系中此种资源的总数等于或小于 3 个时,就有可能发生死锁
- 死锁场景:
- 假设架构恰好有 3 个资源
- 操作系统可能把这 3 个资源分别分配给 3 个进程,每个进程获得 1 个资源
- 此时,每个进程都已经占用了 1 个资源,但都还需要 1 个才能完成
- 它们会互相等待对方释放手中的资源,但谁也完成不了任务,谁也不会释放资源
- 这就形成了一个僵局,即死锁
- 状态:P1(1/2), P2(1/2), P3(1/2),架构剩余资源 = 0
不发生死锁的最小资源数
- 公式:n∗(R−1)+1n * (R - 1) + 1n∗(R−1)+1
- 代入计算:3∗(2−1)+1=3+1=43 * (2 - 1) + 1 = 3 + 1 = 43∗(2−1)+1=3+1=4,即当系统中这种资源的总数至少为 4 个时,无论如何分配,系统都不会发生死锁
- 安全场景:
- 假设环境有 4 个资源
- 无论操作系统如何分配(例如 P1=1, P2=1, P3=2),必然会有至少一个进程能获得它所得的全部资源(在这个例子里是 P3,它获得了 2 个资源)
- 这个幸运的进程(P3)就能顺利执行搞定
- 当 P3 完成后,它会释放自己占用的 2 个资源
- 此时系统剩余的资源就足够让其他等待的进程(P1 和 P2)获得它们所需的资源并依次完成
- 这样,死锁就被避免了
2.6.4 练习
假设体系中有三类互斥资源R1R_1R1、R2R_2R2、R3R_3R3,可用资源数分别为8、7和4。在T0T_0T0时刻环境中有P1P_1P1、P2P_2P2、P3P_3P3、P4P_4P4、P5P_5P5这5个进程,这些进程对资源的最大需求量和已分配资源数如下表所示:
若有如下4个执行序列,那么进程按什么序列执行,系统状态是安全的;
- ①P1→P2→P4→P5→P3P_1→P_2→P_4→P_5→P_3P1→P2→P4→P5→P3
- ②P2→P1→P4→P5→P3P_2→P_1→P_4→P_5→P_3P2→P1→P4→P5→P3
- ③P4→P2→P1→P5→P3P_4→P_2→P_1→P_5→P_3P4→P2→P1→P5→P3
- ④P4→P2→P5→P1→P3P_4→P_2→P_5→P_1→P_3P4→P2→P5→P1→P3
D
2.7 线程
- 线程是进程中的一个实体,是可独立分配和调度的基本单位;
- 线程是调度的最小单位,进程是拥有资源的最小单位;
- 线程可以共享进程的公共数据、全局变量、代码及一些进程级的资源(如打开的档案和信号)等,但不能共享线程独有的资源,如线程的栈指针、寄存器等标识数据;
- 一个进程内的线程在其他进程不可见。
3 存储管理
3.1 基本概念
存储器的结构:从上到下,存储器速度从快到慢、容量从小到大、成本从高到低
地址重定位
逻辑地址(虚拟地址):由操作系统分配给程序采用的虚拟地址,是程序中固定的;就是利用的地址,并非实际存在的地址。定义变量时,变量的地址通常是逻辑地址,在工具编译时,变量的虚拟内存地址
物理地址(实际地址):实际存在于计算机系统中的地址,是存储器的绝对地址,范围从00000H~FFFFFH,是CPU访问存储器时由地址总线发出的地址。逻辑地址需通过地址映射得到物理地址,且映射的物理内存地址是随机的;
地址重定位的过程:将逻辑地址变换成主存物理地址的过程,分为静态重定位和动态重定位
- 静态重定位:程序装入主存时就完成了逻辑地址到物理地址的变换;
- 动态重定位:边运行程序边进行地址变换;
上图展示了逻辑地址通过地址重定位(内存映射机制)转换为物理地址的示例,如逻辑地址0X0021FF70经地址重定位后变为物理地址0X01EE6E78。
3.2 存储管理方案
存储管理的主要目的:解决多个用户采用主存的障碍;
分区存储管理:将主存的用户区划分为若干区域,每个区域分配给一个用户作业使用,且限定作业只能在自己的区域中运行。按划分方式不同,可分为:
固定分区:静态分区方式,把主存划分为若干固定分区,将作业装配进去。由于分区固定,可能与作业大小不同,会产生碎片,造成空间浪费;
可变分区:动态分区方式,主存空间的分区在作业装入时划分,分区大小与作业大小相同。其请求与释放算法有:
最佳适应算法:系统中有nnn个空白分区时,用户申请空间,从这nnn个空白分区中找最接近用户需求的分区,可能产生许多无用的小分区(外碎片);
假设有三个空白分区:1k、2k、4k,现在来了个1.8k的作业,那么该作业会被分配到2k的分区中;
最差适应算法:系统总是将用户作业装入最大的空白分区;
1.8k的作业会被分配到4k的分区中;
首次适应算法:系统从主存的低地址开始选择能装入作业的空白分区;
循环首次适应算法:每次分配都从刚分配的空白分区开始寻找能满足用户要求的空白分区;
假设现在给当前作业分配的是2k,那么对于下一个作业,就从2k开始往下寻找合适的空白分区;
可重定位分区:可解决碎片问题,移动所有已分配好的分区,使之成为连续区域,在用户请求空间得不到满足或某个作业执行完毕时进行;
比如将1k、2k、4k这三个已分配的分散的分区合并成为连续区域,那么这三个分区之间的碎片也可能合并成一个大的区域,供作业利用;
分区保护:目的是防止未经核准的用户访问分区。
3.3 分页存储管理
分区管理方案存在用户程序必须装入连续地址空间的问题,若无法满足连续空间需求,需进行分区靠拢处理,这会耗费系统时间。为解决该问题,引入分页存储管理方案;
纯分页存储管理
将进程的地址空间划分成若干个大小相等的区域,称为页;相应地,将主存划分成与页相同的若干个物理块,称为块;
在为进程分配主存时,将进程中若干页分别装入多个不相邻的块中;
分页地址结构:地址结构分为页号和页内地址两部分;
页号部分的位数决定了最多能有多少个页。上图页号占31−12+1=2031 - 12 + 1 = 2031−12+1=20位,那么根据二进制数的计数规则,nnn位二进制数能表示的不同数值个数是2n2^{n}2n个。所以202020位的页号最多允许表示2202^{20}220个不同的页号,即平台最多能划分出2202^{20}220个页;
页内地址部分的位数决定了一页的大小。上图页内地址部分有121212位,那么一页的大小就是212=40962^{12}=4096212=4096字节(因为2102^{10}210字节是1KB1KB1KB,所以2122^{12}212字节就是4KB4KB4KB)。也就是说,每个页的大小是4KB4KB4KB,页内地址用来表示页内的具体偏移量,范围是000到409540954095(对应121212位二进制数的取值范围);
例:
- 已知逻辑地址由页号和页内地址组成,假设某进程产生的一个逻辑地址为0x000512340x000512340x00051234,并且该系统一页大小为4KB4KB4KB;
- 由于一页大小是4KB4KB4KB ,用 121212位二进制数就能表示页内的所有偏移位置 。将逻辑地址0x000512340x000512340x00051234转化为二进制表示是000000000000010100010010001101000000 0000 0000 0101 0001 0010 0011 010000000000000001010001001000110100 。取低 121212位(即页内地址部分 )为00010010001101000001 0010 0011 01000001001000110100,转化为十进制是466046604660;高几位(页号部分 )这里是00000000000001010000 0000 0000 01010000000000000101 ,十进制是 555 ;
- 页内地址 466046604660 表示在第 555页内,从页的起始位置(偏移量为000处 )开始,向后偏移466046604660个字节的位置,就是该逻辑地址所指向的在页内的具体位置;
- 通过凭借页表能够查到第555页对应的物理块号,假设是888。将物理块号888 与页内地址 466046604660结合,就可以得到真正指向主存中数据存放位置的物理地址,从而让 CPU 正确访问到对应的数据;
快表:将页表中经常使用的页号等对应关系存放在Cache中,称为快表。其作用是加快地址变换速度,快速得到真正的物理地址;
页表是分页存储管理中用于记录逻辑地址的页号与主存中物理块号对应关系的表格,能实现逻辑地址到物理地址的映射,以便CPU正确访问主存中的信息;
逻辑地址与物理地址的映射(分页存储管理)
逻辑地址结构:由页号和页内地址组成;
地址变换过程:进行地址变换时,页内地址保持不变,通过页号在页面变换表(简称页表)中查找对应的物理块号,然后将物理块号与页内地址组合,得到物理地址;
具体过程参考上例。
3.4 分段存储管理
分段存储管理的基本操作:将进程空间划分成若干个段,每段有段号和段内地址,且每段是一组完整的逻辑信息;
分段地址结构:地址结构分为段号和段内地址两部分;
分页与分段的区别:
- 分页是根据物理空间划分,每页大小相同;
- 分段是根据逻辑空间划分,每段是一个完整的功能,便于共享,但大小不同;
划分依据
- 根据物理空间划分(分页):分页是将主存物理空间和进程的地址空间,按照固定大小的单位(页和物理块 )进行划分。比如常见的页大小设置为 4KB、8KB 等,划分时不考虑程序的逻辑结构,只从物理存储和地址空间的管理角度出发,把地址空间机械地分割成等长的区域;
- 根据逻辑空间划分(分段):分段是依据程序自身的逻辑结构来划分。例如,一个程序可能由代码段(存放程序指令)、数据段(存放全局变量等数据 )、堆栈段(用于函数调用和局部变量存储)等组成,每一段代表了程序中一个相对独立的逻辑功能模块,段的大小根据实际逻辑模块的大小而定,不固定;
大小特性
- 根据物理空间划分(分页)固定相等的。这样便于内存分配和管理,地址转换机制相对简单统一 。但对于程序来说,可能会导致一个逻辑上完整的模块被拆分到多个页中,出现页内碎片(一个页被使用部分小于页大小 ,剩余空间无法利用);就是:页的大小
- 根据逻辑空间划分(分段):段的大小不固定,完全取决于对应的逻辑模块的实际大小。比如代码段可能较大,而一些小型的辅助素材段可能较小。这种方式能很好地反映程序的逻辑结构,不过在内存分配时,可能会因为段大小差异较大,导致内存空间分配不够紧凑,产生外部碎片(内存中存在一些小的空闲区域,由于大小不够无法满足大段的分配需求);
目的和作用
- 根据物理空间划分(分页):主要目的是提高内存的利用率和管理效率。通过将内存划分成固定大小的块,可以更方便地进行内存分配和回收,实现虚拟内存等作用,使多个进程能够更高效地共享物理内存。;
- 根据逻辑空间划分(分段):更侧重于满足脚本在逻辑上的模块化需求,方便代码的编写、调试、维护和共享。例如,不同的程序可以共享代码段,程序员在编程时也可以按照逻辑特性自然地组织程序结构,同时便于实现对不同段的访问控制(如代码段只读,数据段可读写);
地址转换
- 根据物理空间划分(分页):地址转换过程主要是凭借页表,将逻辑地址中的页号转换为物理块号,再结合页内地址得到物理地址,相对较为简单直接;
- 根据逻辑空间划分(分段):地址转换时,需要先通过段表找到段的起始地址,再将段内地址与起始地址相加得到物理地址。由于段大小不固定,段表中除了记录段号和段起始地址外,还可能需要记录段的长度等信息,以确保访问的合法性,地址转换过程相对复杂一些。
3.5 段页式存储管理
步骤:先将整个主存划分成若干个大小相等的存储块,再将用户程序按程序的逻辑关系分为若干个段,最后将每个段划分成若干个页。这种管理方式既具有分页环境能有效提高主存利用率的优点,又具有分段框架能很好满足用户需求的长处;
段页式地址结构:地址结构分为段号、段内页号和页内地址三部分;
段号 段内页号 业内地址 段页式存储的优缺点
- 优点:空间浪费小、存储共享容易、存储保护容易、能动态连接;
- 缺点:由于管理软件的增加,复杂性和开销也随之增加,需要的硬件以及占用的内存也有所增加,使得执行速度大大下降;
练习:
D
3.6 虚拟存储管理
在之前的存储管理方案中,必须为每个作业分配足够空间来装入全部信息,若主存空间不满足作业要求,作业就无法装入主存执行;
如果一个作业只部分装入主存便可开始启动运行,其余部分暂时留在磁盘上,在需要时再装入主存。从用户角度看,系统所具有的主存容量比实际主存容量大得多,这样的存储器称为虚拟存储器;
脚本的局部性原理:CPU对主存中的指令和数据的访问,在一小段时间内,总是集中在一小块存储空间里;
- 时间局部性:最近被访问过的指令和数据很可能被再次访问;
- 空间局部性:最近访问过的指令和数据往往集中在一小片存储区域中;
页面置换算法
有时候,进程空间分为10个页面,而系统内存只有3个物理块,无法一次性全部分配,就要求先分配一部分进程,再根据算法进行淘汰,这类淘汰算法称为页面置换算法;
缺页:即要执行的页不在物理内存中,需要从外部调入内存的现象。缺页会增加执行时间,缺页次数越多,系统效率越低;
具体页面置换算法:
最佳置换算法:理想化的算法,选择最长时间不再被访问的页面进行置换;
先进先出置换算法:淘汰最先进入主存的页面,即选择在主存中驻留时间最久的页面予以淘汰;
最近最少未使用置换算法:选择最近最少未使用的页面予以淘汰,根据局部性原理,这种方式效率较高;
最近最少未使用的页面,即在一段时间内,被访问次数最少或者距离上一次访问时间最久的页面
最近未用置换算法:优先淘汰最近未访问的,而后淘汰最近未被修改的页面。
4 设备管理
4.1 概述
- 现代计算机系统配备多种设备,如打印机、显示器、绘图仪、扫描仪、键盘和鼠标等,设备存在多种不同分类方式。
4.2 I/O软件
- 设计I/O软件的主要目标是设备独立性和统一命名。I/O软件独立于设备,能提高设备管理软件的设计效率,当输入/输出设备更新时,无需重新编写全部设备驱动程序。
4.3 设备管理采用的相关技术
通道技术:CPU只需向通道发出I/O命令,通道收到命令后从主存取出本次I/O要执行的通道程序并执行,仅当通道完成I/O任务后才向CPU发中断信号。目的是使数据传输独立于CPU,将CPU从繁琐的I/O工作中解脱出来;
DMA技术:即直接内存存取,指材料在主存与设备之间直接成块传送,主存与设备间传送一个内容块的过程不得CPU的任何干涉;
缓冲技术:包括硬件缓冲(硬件寄存器)和软件缓冲(操作系统)。目的是提高外设利用率,尽可能使外设处于繁忙状态。引入缓冲技术的原因有:
- 缓和CPU与I/O设备之间速度不匹配的矛盾;
- 减少对CPU的中断频率,放宽对中断响应时间的限制;
- 提高CPU和I/O设备之间的并行性;
Spooling技术:即假脱机技术,是用一类物理设备模拟另一类物理设备的技术,能使独占利用的设备变成多台虚拟设备;
- 以将打印机模拟为虚拟打印机为例,当某进程要求打印输出时,操作系统在磁盘上的输出井中为其分配一块区域,进程的输出数据高速存入输出井相关区域,而非直接在打印机上输出;
- 输出井上的区域相当于虚拟打印机,各进程打印输出内容暂时存放在输出井中形成输出队列,结果由Spooling的输出程序依次将输出队列中的素材实际打印输出;
- 从用户角度看,似乎独占一台打印机;从系统角度看,同一台打印机可分时为每个用户服务,用户进程获得的是虚拟设备。该技术缓和了CPU与I/O设备之间速度不匹配的矛盾,提高了CPU与I/O设备之间的并行程度;
练习:
B C
单缓冲:
- 第一个磁盘块被输入到缓冲区(花费10us),然后传送到用户区(花费6us);
- 用户区要进行处理的时候,I/O设备就可以将下一个的磁盘块读入到缓冲区,此时I/O设备读入磁盘块到缓冲区的时间和用户区处理上一个磁盘块的时间是重合的(10us > 2us),所以可以忽略用户区处理磁盘块的2us;
- 可是注意终于一个磁盘块在用户区的处理时间是要算上的(花费2us);
- 总时长:(10+6)*10+2 = 162us
双缓冲:
- 第一个磁盘块被输入到缓冲区1(花费10us);
- 重合的(10us > 6us+2us),所以可以忽略这两段时间;就是之后要传送到用户区的时候,I/O设备空闲了,且缓冲区2也是空闲的,此时I/O设备可以将下一个磁盘块输入到缓冲区2,其所花费的时间与上一个磁盘块从缓冲区1传送到用户区 + 用户区处理上一个磁盘块的时间
- 但是注意最后一个磁盘块在传送与用户区的处理时间是要算上的(花费6us+2us);
- 总时长:(10)*10+6+2 = 108us
4.4 磁盘调度
磁盘的结构:磁盘有正反两个盘面一个就是,每个盘有多个同心圆,每个同心圆磁道,每个同心圆又被划分为多个扇区,数据就存放在一个个扇区中;
当进程请求读磁盘时,操作系统先进行移臂调度(找磁道),在进行旋转调度(找扇区);
指磁头移动到磁道所需的时间;就是寻道时间
磁盘调度的目标是使磁盘的平均寻道时间最少;
磁盘调度算法
先来先服务(FCFS):根据进程请求访问磁盘的先后次序进行调度;
最短寻道时间优先(SSTF):属于最短移臂调度算法,要求访问的磁道与当前磁头所在的磁道距离最近,使得每次寻道时间最短,但平均寻道时间不一定最短;
扫描算法(SCAN):也叫电梯调度算法,每次选择距离最近的同一个方向的磁道访问;
例:
假设磁盘上有 1 - 10 号磁道,当前磁头位于 5 号磁道,有进程依次请求访问 3 号、8 号、2 号、9 号磁道;
假设初始扫描方向是从低磁道号向高磁道号扫描,那么扫描顺序为:5 >> 8 >> 9 >> 3 >> 2;
单向扫描调度算法(CSCAN):每次均从头到尾依次扫描访问。
5 材料管理
5.1 文件与文件系统
- 文件的定义:资料(File)是具有符号名的、在逻辑上具有完整意义的一组相关信息项的集合。例如,一个源程序、一个目标程序、编译程序、一批待加工的数据和各种文档等都能够各自组成一个文件;
- 文件的命名:一般包括文件名和扩展名。
5.2 档案的结构和组织
5.2.1 资料的逻辑结构
无结构的流式文件:由一串二进制流或顺序字符流构成的文件,如二进制材料或字符文档;
有结构的记录式文件:由一个以上的记录构成的文件,称为记录式文件,如数据库表;
5.2.2 记录的物理结构
档案的物理结构指文件的内部组织形式,即文件在物理存储设备上的存放方法,包括:
连续结构:逻辑上连续的文件信息(如记录)依次存放在连续编号的物理块上;
链接结构:逻辑上连续的文件信息存放在不连续编号的物理块上;
索引结构:逻辑上连续的文件信息(如记录)存放在不连续的物理块中,框架为每个文件建立一张索引表,索引表记录了档案信息所在的逻辑块号对应的物理块号;
注意要与链接结构区分:链接结构会存储下一个物理块的地址(类似链表);而索引结果是通过索引表整体记录逻辑块号与物理块号的映射关系;
多个物理块的索引表:根据文件大小不同,其索引表占用物理块的个数不同,一般占一个或多个物理块;
假设有一个大记录,文件大小远远超过单个物理块所能容纳的大小
前提条件:框架中物理块大小为4KB4KB4KB(即 4×1024=40964 \times 1024 = 40964×1024=4096字节),每个索引项大小为444字节,用于记录材料信息所在的物理块号;
单个物理块索引表的存储能力:由于每个物理块大小是4KB4KB4KB,每个索引项是444字节,那么一个物理块可以存放的索引项数量为:4096÷4=10244096 \div 4 = 10244096÷4=1024说,一张索引表最多能指向就是个。也就102410241024个物理块来存储文件数据;
大文件的存储情况:假设有一个非常大的文件,要求300030003000个物理块来存储其全部信息。显然,单个物理块组成的索引表(最多指向102410241024个物理块)无法满足需求,此时就要用到多个物理块的索引表:
- 第一张索引表:架构先分配一个物理块作为索引表,这张索引表中的102410241024个索引项,分别指向文件材料存储的前102410241024 个物理块;
- 第二张索引表:接着分配第二个物理块作为索引表,这张索引表中的102410241024个索引项,指向文件数据存储的第102510251025 到第 204820482048 个物理块;
- 第三张索引表:再分配第三个物理块作为索引表,它的前976976976个索引项(因为3000−2048=9523000 - 2048 = 9523000−2048=952),指向文件资料存储的第204920492049 到第 300030003000 个物理块;
索引表的管理
- 为了记录这些索引表的信息,系统会有一个专门的超级索引(或者叫索引的索引 ),它记录了这三张索引表各自所在的物理块号;
- 当要访问该材料中的信息时,环境先读取超级索引,找到各个索引表所在的物理块,然后从相应的索引表中获取文件数据所在的物理块号,最终访问到文件信息;
通过此种多个物理块索引表的方式,即便文件非常大,要求大量物理块存储内容,系统也能够实用地管理和定位文件数据,搭建对大文档的支持;
在UNIX文件系统中采用三级索引结构,其文件索引表项分4种寻址方式:直接寻址、一级间接寻址、二级间接寻址和三级间接寻址。
5.2.3 三级索引文件结构
索引节点地址划分:0 - 9为直接索引,即每个索引节点存放的为数据;10为一级间接索引;11为二级间接索引;
例:假设文件索引节点中有8个地址项i_addr[0]∼i_addr[7]i\_addr[0] \sim i\_addr[7]i_addr[0]∼i_addr[7],每个地址项大小为4字节,其中i_addr[0]∼i_addr[4]i\_addr[0] \sim i\_addr[4]i_addr[0]∼i_addr[4]采用直接地址索引,i_addr[5]i\_addr[5]i_addr[5]和i_addr[6]i\_addr[6]i_addr[6]采用一级间接地址索引,i_addr[7]i\_addr[7]i_addr[7]采用二级间接地址索引,磁盘索引块和磁盘内容块大小均为1KB;
5.3 文件目录
- 文件目录是一种数据结构,用于标识系统中的资料及其物理地址,供检索时使用。
5.3.1 文件控制块(FCB)
文件控制块(FCB)是用来存放控制记录需要的各种信息的数据结构,以实现“按名存取”;
FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。为创建新文件,系统会分配一个FCB并存放在文件目录中,成为目录项。
包含信息:
- 基本信息,如文件名、文件的物理地址、文件的长度和资料块数等;
- 存储控制信息,如文件存取权限等;
- 使用信息,如文件建立时间、修改时间等;
5.3.2 目录结构
- 文件目录结构的组织方式直接影响文件的存取速度,关系到记录的共享性和安全性。常见的目录结构有3种:
一级目录结构:整个系统中只建立一张目录表,每个文档占一个目录项,不允许文件重名;
二级目录结构:
- 早期多用户操作系统采用的两级目录结构,分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User File Directory);
- 主文件目录记录用户名及相应用户文件目录的存放位置,用户文件目录由该用户的文件FCB组成;
- 这种结构允许不同用户的记录重名,也可在目录上实现访问限制,但缺乏灵活性,用户不能对自己的档案进行分类;
多级目录结构:
- 在多道程序设计体系中常采用的目录结构,像一棵倒置的有根树,也称为树形目录结构;
- 从树根向下,每一个结点是一个目录,叶子结点是文件;
- Windows、UNIX、MS - DOS等操作系统均采用多级目录结构;
5.4 存储方法和存储空间的管理
- 常用的空闲空间管理方法有空闲区表、位示图、空闲块链和成组链接法。
5.4.1 空闲区表
将外存空间上的一个连续的未分配区域称为“空闲区”;
操作系统为磁盘外存上的所有空闲区建立一张空闲区表,每个表项对应一个空闲区,空闲区表中涵盖序号、空闲区的第一块号、空闲块的块数和状态等信息;
适用于连续文件结构。
5.4.2 位示图
在外存上建立一张位示图(Bitmap),记录文件存储器的使用情况。每一位对应文件存储器上的一个物理块,000表示空闲,111表示占用;
位示图的大小由磁盘空间的大小(物理块总数)决定。位示图一般用连续的“字”来表示。假设框架字长为323232位,位示图中的每个二进制位对应一个物理块,因此可以用(字号,位号)对应一个物理块;
练习:某文件管理系统在磁盘上建立了位示图,记录磁盘的使用情况。若系统的字长为32位,磁盘上的物理块依次编号为:0、1、2、…,那么4096号物理块的使用情况在位示图的第()个字中描述;若磁盘的容量为200GB,物理块的大小为1MB,那么位示图的大小为()个字。
- A.129
- B.257
- C.513
- D.1025
- A.600
- B.1200
- C.3200
- D.6400
A D
系统的字长为32位,可记录32个物理块,而4096/32=128余0,由于物理块编号从0开始的,所以4096在第129个字中。磁盘有200GB/1MB=204800个物理块,故位示图大小为204800/32=6400个字。
5.4.3 空闲块链
每个空闲物理块中有指向下一个空闲物理块的指针,所有空闲物理块构成一个链表,链表的头指针放在档案存储器的特定位置上(如管理块中);
优势与分配方式:不需要磁盘分配表,节省空间。每次申请空闲物理块只需根据链链表的头指针取出第一个空闲物理块,根据第一个空闲物理块的指针可找到第二个空闲物理块,依此类推;
练习:某文件系统采用链式存储管理方案,磁盘块的大小为1024字节。档案Myfile.doc由5个逻辑记录组成,每个逻辑记录的大小与磁盘块的大小相等,并依次存放在121、75、86、65和114号磁盘块上。若需要存取文件的第5120字节处的信息,应该访问()号磁盘块。
- A.75
- B.85
- C.65
- D.114
D
第5个逻辑记录上的最后一个字节,即在114号磁盘块上。就是根据题意每个逻辑记录的大小与磁盘块大小相等,并依次存放在121、75、86、65和114号磁盘块上。而文件的第5120字节应该在5120/1024=5,也就
5.4.4 成组链接法
系统将空闲块分成若干组,假设每555个空闲块为一组,每组的第一个空闲块登记了下一组空闲块的物理块号(的地址)和空闲块总数;
应用系统:UNIX系统采用该手段。
6 作业管理
6.1 作业与作业控制
作业是系统为完成一个用户的计算任务(或一次事务处理)所做的工作总和。例如,对用户编写的源程序,需要经过编译、连接、装入以及执行等步骤得到结果,这其中的每一个步骤称为作业步;
作业由程序、数据和作业说明书3个部分组成;
作业的状态分为4种:提交、后备、执行和达成。其中,执行就是作业调入系统中执行,与进程执行状态类似。实际上,作业调度是比进程调度更加高级的调度;
作业控制块(JCB):是记录与该作业有关的各种信息的登记表,是作业存在的唯一标志,包括用户名、作业名和状态标志等信息。
6.2 作业调度
作业调度算法
先来先服务算法:按作业到达的先后进行调度;
短作业优先算法:优先调度运行时间最短的作业;
响应比高优先算法:响应比高的作业优先调度;
响应比Rp=作业响应时间作业执行时间=作业等待时间+作业执行时间作业执行时间=1+作业等待时间作业执行时间 响应比R_p=\frac{作业响应时间}{作业执行时间}=\frac{作业等待时间 + 作业执行时间}{作业执行时间}=1 + \frac{作业等待时间}{作业执行时间}响应比Rp=作业执行时间作业响应时间=作业执行时间作业等待时间+作业执行时间=1+作业执行时间作业等待时间优先级调度算法:优先级高的作业优先调度;
均衡调度算法:根据框架的运行情况和作业本身的特性对作业进行分类,作业调度程序从这些不同类别的作业中挑选作业执行;
作业调度算法性能的衡量指标。在一个批量处理为主的体系中,通常用平均周转时间或平均带权周转时间来衡量调度性能的优劣;
作业周转时间=作业响应时间=作业等待时间+作业执行时间作业的带权周转时间=作业响应时间作业执行时间=1+作业等待时间作业执行时间 作业周转时间 = 作业响应时间 = 作业等待时间 + 作业执行时间 \\ 作业的带权周转时间=\frac{作业响应时间}{作业执行时间}=1 + \frac{作业等待时间}{作业执行时间}作业周转时间=作业响应时间=作业等待时间+作业执行时间作业的带权周转时间=作业执行时间作业响应时间=1+作业执行时间作业等待时间- 系统的平均周转时间或平均带权周转时间越小,作业调度算法的性能越好;
练习:作业j1、j2、j3的提交时间和所需运行时间如下表所示。若采用响应比高优先调度算法,则作业调度次序为()。
作业号 提交时间 运行时间(分钟) j1 6:00 30 j2 6:20 20 j3 6:25 6 - A.j1 → j2 → j3
- B.j1 → j3 → j2
- C.j2 → j1 → j3
- D.j2 → j3 → j1
B
架构在6:00时,因为架构输入井中只有作业J1,因此J1先运行。6:30当作业J1运行完毕时,先计算作业J2和J3的响应比,然后令响应比高者运行。作业J2的响应比=1+10/20=1.5。作业J3的响应比=1+5/6≈1.83。按照响应比高者优先算法,优先调度J3。综上分析可知,作业被选中执行的次序应是J1→J3→J2。