选择题
进程的属性是:共享、动态、制约。
操作系统的主要特性的是:并发、共享、异步。
属于合理的进程活动范围是:处于进程上下文,内核栈。
属于进程上下文的是:用户级上下文,系统级上下文,寄存器上下文。
属于页面装入和清除策略的是:请页式调度,预调式调度,请页式清除。
属于特权指令的是:控制中断屏蔽位,设置时钟,启动 IO 设备。
提出信号量工具的科学家是 Dijkstra;
实现进程互斥一般采用的信号量是公有信号量。
判断题
对的有:
设备独立性是指用户不指定特定设备,只需指定逻辑设备。
进程互斥关系是一种特殊的进程同步关系。
错的有:
虚拟文件系统 VFS 是一种存在于硬盘中的特殊文件系统。
模式切换后内部不会在进程的上下文中进程操作。
环路是系统发生死锁的充要条件。
操作系统中引入线程的目的是为了改善资源使用率和提高系统效率。不准确
线程是系统资源分配和保护的独立单位。进程
信号量表示物理资源的实体,是一个与队列有关的布尔变量。用于表示可用资源的数量或者同步状态,且信号量通常与等待队列关联。是二进制电信号
霍尔方法要求 signal 操作是过程体的最后一个操作。并不是最后一个操作
进程可以忽略所有接收到的信号。SIGKILL 和 SIGSTOP 是不可忽略、阻塞或捕捉的,它用于强制终止或停止进程。
简答题(占比 50%)
操作系统
它是管理系统资源、控制程序执行,改善人机界面,提供各种服务,合理组织计算机工作流程和为用户有效使用提供良好运行环境的一种系统软件。
管资源、改界面、控程序、提服务、合理组织工作流程、为用户提环境的系统软件。
三种资源管理技术
虚拟化,抽象与复用。
资源虚拟化:解决物理内存不足的问题,提高服务的水平和能力。
资源抽象:降低处理系统的复杂性,使用资源更加快速。通过创建软件来屏蔽硬件资源和接口细节,简化对硬件资源的操作,它包括,窗口、进程、文件、虚拟机。
资源复用:解决物理资源数量不足,它有时空复用,时分复用又分为:时分独占式和时分共享式。
系统调用的作用
它是一种中介角色,把用户与硬件隔离开来,应用程序通过系统调用才能请求系统服务和使用系统资源。
内核可基于权限和规则对资源访问进行控制以保证系统的安全性。系统调用封装资源抽象,提供一致性接口,避免用户使用资源时可能发生的错误。
库函数与系统调用的联系和差别
在应用程序使用的角度来看,没有差别但从实现角度来看,两者有重大的区别。
库函数的好处是对用户屏蔽系统调用,隐藏访管指令细节,在改动内核时不影响应用程序的正确性。
库函数在用户态运行,属于应用程序,系统调用在核心态运行,属系统程序,用户可以替换库函数,但是通常不能替换系统调用。
机制与策略分离
提供及实现确定的功能(机制),将机制作为系统可信软件来实现。
如何使用这些功能(策略),在不可信的环境中定义策略。
设计原则是:机制由 OS 实现,放在底层并且集中在少数模块。策略留给用户实现,放在高层并且散部在多处。
内核的基本属性
内核是由中断驱动的,部分程序在屏蔽中断状态下执行,是不可抢占的,可以使用特权指令。
I/O 控制方式
轮询、中断、通道、DMA 方式。
按照 I/O 控制器功能的强弱以及和 CPU 间联系方式,对 I/O 设备的控制方式进行分类。
主要差别在于:中央处理器和外围设备并行工作的方式和程度不同。
I/O 软件组织成四个层次
设备驱动程序,与设备无关的操作系统 I/O 软件,I/O 中断处理程序,用户层 I/O 软件。
文件相关类型
支持不同类型文件:
目录文件,普通文件,特别文件:块设备文件、字符设备文件、管道文件、套接字文件
文件的保护属性
Linux 把用户分为:文件主、同组用户、其他用户三类。
定义存取权限:可读 r、可写 w、可执行 x
文件的保护属性共有10位:-rwxrwxrwx
文件目录
文件目录:包含目录项,用于描述子目录和文件 FCB。
目录文件:全部由文件目录项组成的文件。它至少包含两个目录项:当前目录项和父目录项,永远不会为空。
文件的逻辑结构和它的形式
结构分为两种格式:流式文件,记录式文件。
文件组织指文件中信息配置和构造方式,应该从文件的逻辑结构和组织以及文件的物理结构和组织两方面考虑。从用户观点出发、研究用户信息组织方式,这是用户能观察到并且可以处理的数据集合。
文件系统的磁盘结构组成
超级块:占用 1# 号块
索引节点区:2 # ~ k+ 1 # 块
数据区:K + 2 # ~ n # 为数据块
// 文件的创建
fd = create(filenamep, mode);
int fd, mode;
char *filenamep;
// 文件的打开
fd = open(filenamep, mode);
int fd, mode;
char *filenamep;
// 读文件
nr = read(fd, buf, count);
int nr,fd,count;
char buf[];
// 写文件
nw = write(fd, buf, count);
int fd,count, wu;
char buf[];
系统调用的形式为:
buf 是信息传送的源地址,即把 buf 所指向的用户主存区中的信息,写入到文件中。
count 为要写入的字节数
// 文件的静态共享
系统调用形式为:
char* oldnamep, *newnamep;
link(oldnamep, newnamep);
虚拟文件系统 VFS
VFS 是一种基于主存的,支持多种具体文件系统类型的运行环境。
功能有:建立设备与文件系统的联系,记录安装的文件系统类型,实现面对文件的通用操作,涉及特定文件系统的操作时映射到具体文件系统中去。
分区
固定分区存储管理
它的基本思想是:主存空间被划分成数目固定不变且大小不等的分区,每个分区只能装入一个作业。它的排队策略是单多队列。
它的核心数据结构是:主存分配表(分区的占用标识,起始地址和长度等)。
可变分区存储管理
它是按作业的实际大小来划分分区,且分区个数也是随机的,划分的时间、大小、位置都是动态的,以实现多个作业对主存的共享。
可变分区:主存分配表(已分配\未分配区表)
空闲区开头单元存放本空闲区长度及下个空闲区起始地址,把所有空闲区都链接起来,设置第一块空闲区地址指针,指向第一块空闲区地址。
和分页有关的
分页及其基本原理
允许程序存放到若干不相邻的空闲块中,即可免除移动信息工具,又可消除动态分区中的 "碎片" 问题。
页面与页框:逻辑地址空间 被操作系统划分成的固定大小的块 ,物理内存(RAM) 被划分成的与页面大小完全相同 的固定大小的块,它是物理内存的存储单元。
分页与分段的区别
分段是信息的逻辑单位,由源程序的逻辑结构所决定,用户可见。分页是信息的物理单位,与源程序的逻辑结构无关,用户不可见。
段长可根据用户需要来规定,段起始地址可从任何主存地址开始。页长由系统确定,页面只能以页大小的整倍数地址开始。
分段方式中,源程序经连结装配后地址仍然保持二维码结构。分页方式中,源程序经连结装配后地址变成了一堆结构。
页面固定分配策略的基本思路
进程保持页框数固定不变;
进程创建时,根据进程类型和程序员的要求决定页框数,只要有一个缺页中断产生,进程就会有一页被替换。
可变页面分配策略的基本思想
进程分得的页框数可变。
进程执行的某阶段缺页率较高,说明目前局部性较差,系统可多分些页框以降低缺页率,反之说明进程目前的局部性较好。
页式虚拟存储系统的优缺点
优点:作业的程序和数据可按页分散存放在主存中,有效解决了碎片问题,减少了移动开销。它既有利于改进主存利用率,又有利于多道程序运行。
缺点:要有硬件支持,要进行缺页中断处理,机器成本增加,系统开销增大。
影响缺页中断率因素
页面大小,页面替换算法,页框数,程序特性。
局部替换和全局替换两种页面替换策略
全局页面替换算法:作用范围是整个系统,可以在进程运行期间动态地分配页框。
局部页面替换算法:局限于本进程,它实际上需要为每个进程分配固定的页框。
进程
进程的定义
是一个既能用来共享资源,又能描述程序并发执行过程的系统基本单位。它是一种支持程序执行的系统机制。
它是可并发执行的程序再某个数据集合上的一次计算活动,也是操作系统进行资源分配和保护的基本单位。
进程映像的定义和构成
进程数据块、程序块、控制块、核心栈、映像(某时刻进程的内容及其状态的集合)
进程控制块
它包含三类信息:标识信息,现场信息,控制信息。
它是操作系统用于记录和刻划进程状态及有关信息的数据结构。也是操作系统掌握进程的唯一资料结构,它包括进程执行时的情况,以及进程让出处理器后所处的状态、断点等信息。
进程切换
它是让处于运行态的进程中断执行,让出处理器,然后做一次上下文切换(保存老进程状态而装入被保护了的新进程的状态),以便新进程运行。
多线程环境中进程的定义
它是操作系统中除处理器外进行资源分配和保护的基本单位。
它有独立的虚拟地址空间,容纳进程映像,并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程。
多线程环境中的线程概念
它是操作系统进程中能够独立执行的实体,是处理器调度和分派的基本单位。
是进程地组成部分,每个进程内允许包含多个并发执行的实体,这就是多线程。
并发多线程程序设计的优点
并行程序高,节省了主存空间。快速线程的切换,减少系统管理开销。线程之间通信易于实现。
调度程序
的主要任务
调度和分派。
调度实现调度策略:确定就绪进程/线程竞争使用处理器的次序的裁决原则,即进程/线程 何时应放弃 CPU 和选择哪个来执行。
分派实现调度机制:确定如何时分复用 CPU,处理上下文交换细节,完成进程/线程和 CPU 的绑定和放弃的实际工作。
临界区调度原则的口诀
互斥使用、有空让进,忙则等待、有限等待,择一而入、算法可行。
一次至多一个进程能够进入临界区内执行;如果已有线程在临界区,其他试图进入的进程应该等待。
进入临界区内的进程应在有限时间内退出,以便让等待进程中的一个进入。
虚拟存储
虚拟存储器
在具有层次结构存储器的计算机系统中,采用自动实现部分装入和部分对换功能,为用户提供一个比物理主容量大得多的,可寻址的一种 "主存储器",可以解决程序全部装入与多道程序并发运行之间的矛盾。
程序局部性原理
它又可分为时间局部性和空间局部性。
它是指在一个较短时间内的执行过程中,所执行的指令地址或操作数地址都局限于一定的存储区域中。
send 与 receive 操作
同步与异步 send
-
同步 send 时,会返回一个错误码到发送方,发送方依赖错误码来工作。
-
异步 send 时,发送方可持续发送消息,而不期望任何返回码,系统可使用像 UNIX 中的信号机制来告诉发送方发送消息失败。
-
如果发送进程试图向一个不存在的进程发送消息,操作系统将不知道用哪个信箱来缓存消息。
阻塞与非阻塞 receive
-
阻塞 receive:如果信箱中没有消息,接收进程会被挂起。如果信箱中有消息,则会立即获得一个消息并且返回。
-
非阻塞 receive: 操作查询信箱后,立即返还控制给调用进程,如果信箱中有消息就返回消息,如果没有消息则返回标志码,它允许进程轮询信箱。
死锁
什么是死锁
在一个进程集中的每个进程都在等待只能由该进程集中的其他一个进程才能引发的事件。
形成死锁的四个必要条件
环路,互斥,不剥削,占用与等待。
环路:存在一组循环等待资源的进程。
互斥:进程资源使用是互斥的。
占用与等待:申请新资源时不释放已占用资源。
不剥夺:一个进程不能抢夺其他进程占用的资源。
用户杀死进程
输入中断组合键 ctrl + c
然后终端驱动程序接受收到输入字符,并调用信号系统
信号系统发送 SIGINT 信号给 shell
shell 再把它发送给进程
进程收到 SIGINT 信号,然后撤销
伙伴系统
两个伙伴的大小必须相同,物理地址必须连续,它通过对大块的物理主存对半划分而获得。
处理器状态
-
Intel x86 的处理器状态有四种,支持 4 个保护级别,0 最高。
-
处于用户态时,只能执行非特权指令。处理器处于管理状态时,程序可以执行所有指令,使用所有资源,还能改变处理器状态。
中断
概念
它是指程序执行过程中,遇到急需处理的事件时,暂时中止 CPU 上现行程序的运行,转去执行相应的事件处理程序,待处理完成后再返回原程序被中断处或调度其他程序执行的过程。
根据事件的性质和激活的手段,分为哪两种中断。
自愿性中断事件:是正在运行的程序所期待的事件。
强迫性中断事件:它不是正在运行的程序所期待的,而是由于某种事故或外部请求信息所引起的,分为:程序性,输入输出,机器故障和外部中断。
顺序程序设计特点
4个特点
程序环境的封闭性,执行结果的确定性,程序执行的顺序性,计算过程的可再现性。
程序并发运行过程可能出现的与时间有关的错误
结果不唯一,永远等待。
对于一组交往的并发进程,执行的相对速度无法相互控制,各种与时间有关的错误就可能出现。
画图题
进程的状态和转换


提交,选中/落选,挂起/解除挂起,出现等待事件/等待事件结束
进程上下文切换和模式切换

发生事件、唤醒、允许上下文切换、中断/中断返回、调度进程,系统调用/中断(隐含模式切换)
地址转换和存储保护

页表基址寄存器、逻辑地址、物理地址、页表、分页存储管理的地址转换、主存。
Linux 文件系统

应用层:用户空间、应用程序。
虚拟层:系统空间、VFS、索引节点缓冲、目录高速缓存。
实现层:MiniX、Ext2、Fat 文件系统,缓冲区缓冲,磁盘驱动器。
管程的结构

等待调用过程的进程队列、入口、局部数据、条件变量、过程/函数1 ---- 过程/函数、初始化代码 、出口
管程等待区:condition c1,wait(c1),condition cn wait(cn)
管程定义和属性
共享性、安全性:变量、互斥性:方法
它是由局部于自己的若干公共变量及其说明和所有访问这些公共变量的过程所组成的软件模块,管程与信号量是等价的,不同的表达方式而已。
信号量分类
按用途分为公有信号量和私有信号量。按其取值分为二元信号量和一般信号量。
二元信号量:仅允许取值为 0 或 1,主要用于进程互斥(mutex)
一般信号量:又称计数信号量,允许取大于 1,主要用于进程同步
公用信号量:初值往往为 1,用于实现进程互斥
私有信号量:仅允许拥有此信号量的进程进行 P 操作,其他进程可进行 V 操作,初始值往往为 0 或者正整数,用于进程同步。
分页虚存地址转换

应用题
算法比较实例
操作系统虚拟内存中的四种典型页替换算法(OPT,LRU,FIFO,Clock)_时钟页面置换算法-CSDN博客

-
OPT: F(1) F(2) F(4) + 3次:未来用的少的被替换
-
LRU: F(3) F(1) F(2) F(4) + 3 次:最近最久没有使用
-
Clock: F(2) F(3) F(1) F(5) F(4) + 3 次 顺序扫描依次减一,如果有重复的加一
-
FIFO: F(1) F(3) F(1) F(5) F(2) F(4) + 3次 先进先出队列
Bernstein 条件

多个生产者/消费者、共享多单元缓冲区
item B[k];
semaphore empty; // 可以使用的空缓冲区数(放入准入)
empty = k;
semaphore full; // 缓冲区内可以使用的产品数(取出准入)
full = 0;
semaphore mutex; // 户次访问缓冲区的信号量(共享 B[])
mutex = 1;
int in = 0;
int out = 0;
cobegin
process producre_i() {
while (true) {
produce();
P(empty);
P(mutex);
append to B[in];
in = (in + 1) % k;
V(mutex);
V(full);
}
}
process consumter_i() {
while(true) {
P(full);
P(mutex);
take() from B[out];
out = (out+1)%k;
V(mutex);
V(empty);
consume();
}
}
coend
int B;
semaphore empty;
semaphore full;
empty = 1;
full = 0;
cobegin
process producer() {
while (true) {
produce();
P(empty);
append() to B;
V(full);
}
}
process consumer() {
while (true) {
P(full);
take() from B;
V(empty);
consume();
}
}
coend;
信号量与 PV 操作
操作系统中,信号量表示物理地址资源的实体,它是一个与队列有关的整形变量。
实现时,信号量是一种记录型数据解构,有两个分量:一个是信号量的值,另一个是信号量队列的队列指针。

除了赋初值之外、信号量仅仅能由同步原语P/V对其操作
用途:封锁临界区、进程同步、维护资源计数。
信号量实现互斥
-
公用信号量
-
Mutex 取值范围:1 ~ -(n-1)
-
适用场合:用于对资源不是特别急的场景,TS 或自旋锁常用来处理立刻要处理的事务。
semaphore mutex;
mutex = 1;
cobegin
process Pi() { // i = 1,...n,
P(mutex);
{临界区};
V(mutex);
}
coend
先来先服务算法、最短作业优先算法、最短剩余时间优化算法

进程按照它们请求CPU的顺序被调度。
28
28 + 9
28 + 9 + 3

算法选择预计执行时间最短的进程优先执行
4
4 + 8
4 + 8 + 9
4 + 8 + 9 + 10

剩下等待时间最短的执行,相同时间两个任务时长进行比较