1.填空题
- 操作系统为用户提供两种类型的使用接口,它们是命令 接口和系统调用接口。
- 当程序顺序执行时,具有特性:顺序性,封闭__ 性和可再现性。
- 死锁产生的四个必要条件是:互斥、不剥夺条件__,循环等待 和请求保持。
- 用户级线程的上下文切换时间要__小于__核心级线程上下文切换时间。
- SPOOLING系统在磁盘上专门开辟__输入井__和__输出井__区域用于存放作业信息。
- 常用的内存信息保护方法中,上下界保护法是一种__硬件__保护方法。
- 段页式管理中,虚拟地址由三部分组成:段号,页号___和__页内偏移_。
- 解决“抖动”问题的主要方法有:扩大工作集__和_选择不同淘汰算法_。
- 进程是__系统资源分配__的基本单位。
- 按组织形式分,文件系统可分为:普通文件,目录文件___和_特殊文件__。
- 祖先进程在撤消子进程时,要审查该子进程是否有自己的子孙进程。(yes)
-
把逻辑地址转变为内存物理地址的过程称作( 重定位)。
简答题
1.什么是系统调用?系统调用与一般用户程序,库函数和实用程序又有什么区别?
系统调用是操作系统提供给编程人员的唯一接口。编程人员利用系统调用在源程序级动态请求和释放系统资源,调用系统中已有的系统功能来完成那些与机器硬件部分相关的工作以及控制程序的执行速度等。
与一般用户程序,库函数和实用程序的主要区别是:系统调用程序在核心态运行,调用它们需要一个类似硬件中断处理的中断处理机制提供系统服务。
2 . 简述进程调度与作业调度的不同之处。
(1)作业调度是宏观调度,它决定了哪一个作业能进入主存。进程调度是微观调度,它决定各作业中的哪一个进程占有中央处理机。(2分)
(2)作业调度是选符合条件的收容态作业装入内存。进程调度是从就绪态进程中选一个占用处理机。(2分)
进程调度中“可抢占”和“非抢占”两种方式,哪一种系统的开销更大?为什么?
答 可抢占式会引起系统的开销更大。(2分)
可抢占式调度是严格保证任何时刻,让具有最高优先数(权)的进程占有处理机运行,因此增加了处理机的调度,引起为退出处理机的进程保留现场,为占有处理机的进程恢复现场等时间(和空间)开销增大。(2分)
3.简述分区存储管理的主要优缺点。
优点:(1)实现了多个作业或进程对内存的共享,有助于多道程序设计,提高系统的资源利用率。(2)该方法要求的硬件支持少,管理算法简单,实现容易。(2分)
缺点:(1)内存利用率不高,存储器中可能含有从未使用的信息和碎小空闲区。(2)作业或进程的大小受分区大小控制。(3)难以实现各分区间的信息共享。
作业调度和进程调度的区别是什么???
- 作业是用户角度,由用户提交,以用户任务为单位
2.进程是操作系统出发的,由系统生成,是操作系统资源分配和独立运行的基本单位
需要记录的公式
响应比 R = (等待时间+ 执行时间)/执行时间
需要记录的结论
时间片轮转调度算法在实际中也是按照先来先服务顺序使用时间片的,时间片过大,我们认为他转变为先来先服务算法了
![](/qrcode.jpg)
.多级反馈队列调度机制
设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先。第一个队列的优先级最高,第二个次之,其余队列的优先级逐个降低。该算法为不同列中的进程所赋予的执行时间片的大小也各不相同,在优先级愈高的队列中,其时间片愈小。
每个队列都采用FCFS算法。当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。否则,即它在一个时间片结束时尚未完成,调度程序将其转入第二队列的末尾等待调度;如果它在第二队列中运行个时间片后仍未完成, 再依次将它放入第三队列…依此类推。当进程最后被降到第n队列后,在第n队列中便采取按RR方式运行。
按队列优先级调度。调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行;仅当第1到(i-1)所有队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到第i队列的末尾,而把处理机分配给新到的高优先级进程。
PCB设计
设计结构体PCB,其中包括进程的标识符,到达时间,服务时间,完成时间,周转时间和带权周转时间。利用动态数组将所有进程存储起来。
struct PCB
{
int ID; //标识符
int ComeTime; //到达时间
int ServerTime; //服务时间
int FinishTime; //完成时间
int TurnoverTime; //周转时间
double WeightedTurnoverTime; //带权周转时间
};
多级反馈队列算法的意义
多级反馈队列结合了 先来先服务 和 时间片轮转算法的优点,
一开始使用时间片轮转,然后逐渐退化为先来先服务,这样短作业使用时间片轮转,效率高,长作业会逐渐改进为先来先服务,这样就兼具两种调度算法的优点。。。
进程同步
硬件实现方法
- 关中断(屏蔽系统的中断指令,这样就不会切换别的进程,但是也很危险,因为降低了效率,而且系统可能因此终止)
- testAndSet, 这个 和 java 的 cas 算法是两个不同的概念,testandset 是硬件实现方法
- 信号量,PV 操作 【使用两个原语】
- 记录型信号量,前面那个 只用一个 int 表示资源占用情况,这个还维护一个链表,记录请求资源的进程
typedef struct {
int value;
proccess *L;
}semaphore
void wait(semaphore s) {
s.value -- ;
if (s.value<0) {
//如果 value<0 表明资源分配完了,要注释这个进程,放弃处理机
add (s.L,proccess_of this);
block(s.L);
}
}
void signal(semaphore s) {
s.value ++;
if (s.value<=0) {
//若value<=0,还有进程在等待该资源被阻塞,唤醒第一个等待的进程
proccess p = remove(s.L);
//从等待队列移除一个 进程,然后唤醒
wakeup(p);
}
}
我们把 wait 和 signal 简称为 PV 操作,P减,V 加
经典例题: 生产消费者模式
- 老爸放苹果,女儿吃苹果,妈妈放橘子,儿子吃橘子,只有一个盘子【容量为1】,问如何模拟这个程序
semaphore plate=1,apple=0,orange=0;
void dad() {
while(true) {
P(plate);
apple_count++;
V(apple);
}
}
void mom() {
while(true) {
P(plate);
orange_count++;
V(orange);
}
}
void son() {
while(true) {
P(orange);
orange_count--;
V(plate);
eat_orange();
}
}
void daughter() {
while(1) {
P(apple),apple_count--,V(plate);
eat_apple();
}
}
- 读写者问题,共享文件 IO 读写 如何保证安全
int io_read_count=0;
semaphore var_mutex=1, file_mutex=1;
//分别保护 read_count 变量 和 文件的读写互斥访问
write() {
while(1) {
P(file_mutex),io_write(),V(file_mutex);
}
}
read() {
while(1) {
P(var_mutex);
if(io_read_count==0) P(file_mutex);
io_read_count++;
V(var_mutex);
read_file();
P(var_mutex);
io_read_count--;
//记得让写进程通过
if(io_read_count==0) V(file_mutex);
V(var_mutex);
}
}
- 哲学家吃饭
5个哲学家,每个人都要两个筷子才能吃饭
semaphore chopstic[5]={
1,1,1,1,1};
semaphore mutex=1;
void pi() {
do {
P(mutex);
P(chopstic[i]);
P(chopstic[(i+1)%5];
eat();
V(chopstic[1]);
V(chopstic[(i+1)%5];
think();
}while(1);
}
总结几种方法:
- 临界区互斥; 原则: 1. 空闲让进、忙则等待、有限等待、让权等待
基本方法:
2. 软件实现: 单标志,双标志先检查,后检查,皮特森算法
3. 硬件实现: 1.中断屏蔽,硬件指令
4. 信号量
文字题【死锁】
死锁的避免和预防
死锁避免和死锁预防的区别在于,死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁.死锁避免是在系统运行过程中注意避免死锁的最终发生.
简单的来说: 死锁预防是破坏了 4个必要条件 之一【互斥,不可剥夺,请求保持,循环等待】
死锁的避免 则是即便出现了 4个必要条件,通过一定的算法,让程序不死锁
去破坏产生死锁的四个必要条件的一个或多个条件,来预防发生死锁。易实现,被广泛使用,但由于所施加的限制条件往往太严格,因而可能导致系统资源利用率和吞吐量降低。
而不需事先采取各种限制措施去破坏产生死锁的四个必要条件。这种方法施加的限制条件较弱,但在实现上有一定的难度。
简记: 预防的语意 大于 避免
所以并发性来看, 避免 > 预防
应用题:
设系统有这几种解决死锁的方法;
- 银行家算法
- 检测死锁,是否死锁进程资源
- 资源预先分配
从并发性的角度去分析这几种方法
答: 银行家算法是避免死锁, 资源预先分配是预防死锁,死锁检测是出了事 之后再解决
所以 从并发性的角度排序: 死锁检测 > 资源银行家算法 > 资源预分配
界地址保护
每个进程都有自己独立的进程空间,若一个进程在运行时所产生的地址在地址空间之外,则发生地址越界,因此需要进行界地址保护,即当程序要访问某个内存单元的时候,由硬件检查是否允许,如果允许,则执行,否则发生越界中断
段页式存储管理原理
- 每个进程一张段表,然后每个段一张页表。
- 页表是4KB大小,放入一个物理页面中
最佳适配算法: 每次作业分配内存空间时候,总能找到满足空间大小需要的最小空闲分区给作业,可以产生最小的内存空闲分区。
-
段式分配中,cpu 取一次数据,需要访问两次内存 【1. 通过段表获得物理地址再访问内存】
-
段页式存储管理中,CPU取数据访问内存3次 【1.找段表,2.找页表. 3. 取数据】
-
如果存储器采用基本分页机制,那么操作系统会为每个进程或任务建立一个页表(这个页表可能是一级的也可能是多级的)。整个操作系统中有多个进程在运行,那么系统就会有多个页表。页表在内存中的存储位置由寄存器CR3给出。
-
如果存储器采用基本分段机制,那么操作系统会为每个进程或任务建立一个段表(一般不用多级),用于记录数据段、代码段等各类段在内存中的具体位置。
-
如果采用段页式结合的机制,那么一般一个进程或任务,操作系统会给其建立一个段表,而段表中的每个段又会对应一个页表,也就是说,段页式机制的每个进程有一个段表,有多个页表。
什么是内存碎片
1. 外部碎片,2.内部碎片
内部碎片是已经被分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片
外部碎片是指还没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块。
名词:缺页中断
什么是缺页中断? 虚拟存储技术将一个作业多次调入内存,实现虚拟内存需要建立在离散分配内存管理方式的基础上。
当用户程序访问部分尚未调入内存中,则产生中断, 中断是一种信号,去通知 CPU 将磁盘数据调入内存
缺页中断机构,如果内存中没有足够的内存空间【没有空闲块】,就需要用淘汰算法,将部分内存也 写到外存
页面置换算法
内存不够,将部分页面存到 磁盘【虚拟内存】
进程运行期间,如果页面不在内存中需要 将其调入 内存,但是 内存空间不够,需要将内存中某些 占用内存的页写到 磁盘上 【送入磁盘的对换区】
- 最佳置换算法 (optimal)
这种算法不可能实现,不然后面的算法没有意义了。 - fifo (先换入内存的,先出去)
- lru (倒过来写是 url, least recent use,最近最少使用)
- clock时钟置换算法
clock算法 接近 lru, 没什么不用 lru 呢? lru 性能接近opt 但是实现困难,要实现的话,开销比较大
注意原理:
lru 算法基于局部性原理 调出最近最长时间没被使用的
clock 算法 又 叫 nru 算法,调出最近没被使用的页数据
导致 LRU 算法实现起来耗费高的原因是 需要对所有的页进行排序
belady 现象:
在分页式虚拟存储器管理中,发生缺页时的置换算法采用FIFO(先进先出)算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
抖动
刚刚换入外存的,又立刻换入内存,然后反复循环,反复的 IO 降低了系统效率
怎么解决? 这种 java 的 ArrayList 也有相关的问题
比如 数组满了,就申请 1.5倍的空间,然后复制过去
那什么时候缩小容量呢?
虚拟内存的使用场景
虚拟内存只能用于非连续分配技术
有3中实现方式: 请求分页存储管理,请求分段存储管理,请求段页式存储管理
专业名词:请求分页存储管理
请求分页存储管理和 分页存储管理的区别: 前者不需要一次性将作业调入内存,而是使用了虚拟技术
IO
一个文件 对应一个 FCB, 而一个文件目录项 就是一个 FCB
文件目录是 FCB 的集合,一个目录既有子目录,也有数据文件,目录文件中存放的是子目录和数据文件的信息
文件表。。
系统有一个 open count,以记录多少进程打开了该文件。每个关闭操作使 close 让 count 递减,当打开计算器为0的时候,文件不再被使用,系统回收分配给该文件的内存空间等资源。
若文件被修改过,则将文件写回外存,并将系统打开文件表中相应条目删除,最后释放文件控制块 (File control block ,FCB)