第一章
- 怎样改善空间局部性和时间局部性?
- 对于
空间局部性
而言:更大的Cache块,将数据预取到块中 - 对于
时间局部性
而言:Cache中保留最近访问的代码和数据
- 有代码段:
for(int i = 0;i<10;i++){
for(int j = 0;j<10;j++){
a[i] = a[i]*j;
}
}
(a)举例说明代码中的空间局部性
答:执行第一条指令后执行第二条指令,访问数组a[];
(b)举例说明代码中的时间局部性
答:循环体被频繁执行,a[i]在内层循环被访问了10次
- 什么是中断?
答:中断:其他模块
(I/O,存储器)中断处理器
正常处理过程的机制
4.多处理中断的方式是什么?
答:①顺序处理:正在处理一个中断时,禁止中断
,顺序处理各个中断②中断嵌套:定义中断优先级,允许高优先级打断低优先级中断的过程
- 什么是高速缓存(
Cache
)?
答:高速缓存是比主存小而快的存储器,用来协调处理器和主存
之间访问速度的差异,作为最近访问的内存数据的缓冲区
第二章
-
操作系统在计算机系统中位于__(硬件和用户之间)___
-
计算机开机后,OS被加载到__(RAM)__中**(RAM是内存,如果是软件,都需要被加载到内存中运行)**
-
OS不应该管理下列哪种资源__(D)__
A. CPU B.内存 C.外存 D.源程序
-
操作系统不是操作环境(√)(注:操作系统分为操作环境和操作内核,属于概念混淆)
-
OS的主要性能指标有吞吐率和资源利用率 。
-
如果一个OS具有很强的交互性,可
同时供多个用户使用
,但时间响应不太及时,则属于分时操作系统; -
如果OS在用户提交作业后,不提供交互能力,它所追求的是计算机资源的高利用率,大吞吐率和作业流程的
自动化,则属于批处理操作系统。 -
什么是操作系统的内核?
答:内核是操作系统最常用
、最重要的核心代码部分
,它存在于主存中并在特权模式下运行,响应进程调度
、内存管理
和设备中断
.
- 什么是多道程序设计
答:多道程序设计是在计算机内存中同时存放两个或者多个程序
,交错处理
每个进程,当一个进程执行时需要等待I/O,处理器可以切换到另一个程序
第三章
- 引入进程,由于实现了并发执行和资源共享,可 带来提高资源利用率和吞吐率的(两个主要OS性能指标)好处,但却增加了系统的时间和空间开销。
- 一个多任务双核处理机系统,其操作系统是UNIX,PCB表的规模是
100
行,则:
- 最多有2个进程处于运行态。(双核处理机)
- 最多有98个进程处于就绪态。(
最多存在100个已经加载了资源的进程,如果进程没有阻塞等情况,应该上CPU上运行,因此是100-2个
) - 最多有100个进程处于阻塞态
- 设某UNIX中每个用户创建进程数最大为50个,现有一用户执行某程序,该程序执行一死循环,循环创建新子进程。则当该进程创建了___49___个子进程后将不能再创建,该进程处于阻塞状态。
解析:首先用户创建进程调用的是fork()
类函数来处于阻塞态,父进程+子进程=50个进程
,因此是49个进程之后就不能再创建了
-
假设
有些进程处于就绪态
,有些处于就绪挂起态
,而且至少
有一个就绪挂起态进程的优先级高于所有就绪态进程,有两种极端策略:①总是调度处于就绪态的进程,以减少交换②总是调度优先级最高的进程,会导致不必要的交换。请给出一种均衡考虑优先级和交换性能的中间策略
一种折中的方案是:
将就绪挂起进程降低1-2个优先级,如果它仍然高于所有就绪进程的最高优先级,那么就将它换入内存执行
。 -
下列选项中,不可能在用户态下发生的是©
A.系统调用 B.外部中断 C.进程切换 D.缺页
解析:A:系统调用可以在用户执行用户程序代码时发出,请求操作系统服务,如fork()
等
B:外部中断也可以在用户执行时发生,比如设备断点,外部设备请求I/O
C:进程切换是在进程调度中发生的
,而进程调度的发生场景是在内核中进行的,因此是在系统态下执行的
D:用户在访问内存/虚拟内存时,通常会发生缺页,此时发生场景是在用户态下
- 可以在用户态下执行处理的指令是(D)
A.关中断 B.输入/输出 C.系统调用 D.从内存中取数
解析:输入
、输出
、系统调用
和中断处理
均属于OS内核
-
发生模式切换可以不改变当前运行态进程的状态(√)
-
进程创建时,不需要为该进程做的是(D)
A.填写进程PCB表
B.分配内存
C.将其插入就绪队列
D.分配CPU
8.___一定会引起进程切换的是(B)
A.一个进程创建后,进入就绪状态
B.一个进程从运行状态变为就绪状态
C.一个进程从阻塞状态变为就绪状态
D.以上答案都不对
解析:关键是看CPU执行的对象是否发生了变换
A:进程创建后本身就会进入就绪态或者就绪挂起态,未涉及CPU,不选
B:进程由运行态(在CPU上运行)变为了就绪态(处于就绪队列,让出CPU),CPU执行对象发生了变化,选B
C:进程从阻塞状态(处于阻塞队列)变为了就绪态(处于就绪队列),CPU执行对象未发生变化,发生了中程调度而已
- 下面运行的C程序结果是什么?
#include <stdio.h>
#include <sys/types.h> /* pid_t类型,实际上是int类型*/
#include <unistd.h> /* 调用fork */
void main()
{
pid_t pid;
printf("ONE\n");
pid=fork();
printf("TWO\n");
}
/*经典fork()问题,输出结果如下:*/
One
Two
Two
- 有如下C程序,假设fork函数运行成功,程序可能的输出是什么?
void main()
{
int pid;
pid=fork();
printf("%d \n", pid);
}
/*fork()执行一次,但返回两次*/
/*向父进程返回子进程的PID*/
/*向子进程返回0*/
/*注意并发,通常有多个执行顺序*/
一共执行两次printf("%d\n",pid)
父进程输出:pidOfParent
子进程输出0
输出答案为
0
pidOfParent
或
pidOfParent
0
- 对于图3.6中的进程模型,请简单定义每个状态。
答:运行态
:该进程正在执行
就绪态
:进程做好了准备,只要有机会就可以开始运行
阻塞态
:进程在某些事件发生前不能执行,如I/O操作完成
新建态
:刚刚创建的进程,操作系统还没有把它加入到可执行的进程组中。
退出态
:操作系统从可执行进程组中释放出的进程,或是因为它自身停止了,或者是因为某种原因而被取消
- 模式切换和进程切换有什么区别?
答:模式切换
:可以不改变当前正处于运行态的进程的状态。
进程切换
:一个正在执行的进程被中断,操作系统指定另一个进程为运行态,进程切换需要保存更多的状态信息
第四章
- 哪些资源通常被一个进程中的所有线程共享?
- 地址空间
- 文件资源
- 执行特权
- 列出用户级线程相对于内核级线程的三个优点
- 由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核模式的特权,因此,进程不需要为了线程管理而切换到内核模式,这
节省了在两种模式间的切换(用户模式到内核模式,从内核模式返回用户模式)开销
调用可以是应用程序所专用的
,一个应用程序可能倾向于简单的轮询调度算法,而另一个应用程序可能倾向于优先级的调度算法,调度算法可以去适应应用程序,而不会扰乱系统底层的操作系统调度器用户级线程可以在任何操作系统中运行
,不需要对底层内核进行修改以支持用户级线程,不需要对底层内核进行修改以支持用户级线程,线程库是一组供所有应用程序共享的应用级软件包
- 列出用户级线程相对于内核级线程的两个缺点
- 在典型操作系统中,许多系统调用都会引起阻塞,因此,当用户级线程执行一个系统调用时,不仅这个线程会被阻塞,进程中所有的线程都会被阻塞
- 在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理器技术,内核一次只把一个进程分配给一个处理器,因此一次进程中只能有一个线程可以执行
第五章
- 写出信号量定义,semWait和semSignal原语,以及用信号量实现互斥
semWait(semaphore s){
s.count--;
if(s.count<0){//一定要注意,由于是先自减再判断,当s.count == 0时,代表原本为1的资源被获取了,不用阻塞
将当前进程插入阻塞队列;
阻塞当前进程
}
}
semSignal(semaphore s){
s.count++;
if(s.count<=0){//由于是先自增再判断,当s.count == -1时,自增后s.count == 0,此时被占用的资源被释放出一个
从s.queue队列中移出进程P;
将进程P插入就绪队列;
}
}
//用信号量实现互斥
void func(){
semWait(s);
/*执行临界区代码*/
semSignal(s);
/*else*/
}
2.阅览室有100个座位;没有座位时读者在阅览室外等待;进入时在登记本上登记,离开时去掉登记项;登记本互斥使用。用信号量描述读 者行为。
/*描述读者行为*/
//需求1:没有座位时读者在阅览室外等待
//需求2:要求登记本的使用是互斥的
semaphore seat = 100;
semaphore mutex = 1;
void reader(){
semWait(seat);//等待位置
semWait(mutex);
在登记本上登记;
semSignal(mutex);
进入阅览室阅读;
semWait(mutex);
在登记本上去掉登记;
离开阅览室;
semSignal(mutex);
semSignal(seat);//释放位置
}
- 独木桥问题:东、西向车过独木桥。桥上无车时允许一方汽车过桥,待全部过完后才允许另一方汽车过桥。
semaphore pass = 1;//互斥访问桥,只有一辆车的时候才能过桥
//由于是只有一方过完之后,另一方才能开始对桥进行操作,因此类似于读者写者问题
//开始过桥的第一个车对pass加锁,过完桥的最后一个车对pass解锁
int east = 0;
semaphore x = 1;
int west = 0;
semaphore y = 1;
void p1(){//东车
semWait(x);
/*互斥访问全局变量east*/
east++;
if(east == 1){//第一个过桥的对pass请求使用,若请求成功则加锁,否则等待
semWait(pass);
}
semSignal(x);
过桥;
semWait(x);
east--;
if(east == 0){
semSignal(pass);
}
semSignal(x);
}
void p2(){//西车
semWait(y);
west++;
if(west == 1){
semWait(pass);
}
semSignal(y);
过桥;
semWait(y);
west++;
if(west == 0){
semSignal(pass);
}
semSignal(y);
}
- 下列属于临界资源的是(B) 。
A.磁盘存储介质 B. 全局的公共队列
C. 局部变量 D. 可重入的代码(指的是可同时被多个进程执行的纯代码)
5. 一个正在访问临界资源的进程由于申请等待I/O操作而被中断时,它 (D)。
A. 可以允许其它进程进入该进程的相关临界区
B. 不允许其它进程进入任何临界区
C. 不允许其它进程抢占处理器
D. 可以允许其它进程抢占处理器,但不能进入相关临界区
- 设有三个进程:进程get读数并送到buf1,进程copy复制buf1到buf2,进程put打印buf2中的数据。用信号量实现get、copy、put的同步。
char* buf1;
char* buf2;
semphore fullBuf1 = 0;
semphore emptyBuf1 = 1;
semphore fullBuf2 = 0;
semphore emptyBuf2 = 1;
void get(){
/*等待空的buf1*/
semWait(emptyBuf1);
std::cin>>buf1;
semSignal(fullBuf1);
}
void copy(){
//等待满的buf1和空的buf2
semWait(fullBuf1);
semWait(emptyBuf2);
copyOnWrite(buf1,buf2);
semSignal(emptyBuf1);
semSignal(fullBuf2);
}
void put(){
semWait(fullBuf2);
std::cout<<buf2;
semSignal(emptyBuf2);
}
- 设有两个机器人拣黑、白棋子。P1拣白子,P2拣黑子,交替拣,互斥拣。 用信号量实现P1、P2的同步
/*实现同步*/
semaphore w = 1, b=0;/*先捡起来白子*/
void robotWhite(){
semWait(w);
/*do something*/
semSignal(b);
}
void robotBlack(){
semWait(b);
/*do something*/
semSignal(w);
}
- 桌上有一空盘,允许放一只水果。爸爸可向盘中放桔子, 也可放苹果。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用。 试用信号量实现爸爸、儿子、女儿三个并发进程的同步。
semphore apple = 0,orange = 0,empty = 1;
void father(){
/*等待空盘*/
semWait(empty);
int id = randomNumber();
if(id == 1){
semSignal(apple);
}else{
semSignal(orange);
}
}
void daugther(){
semWait(apple);
semSingal(empty);
}
void son(){
semWait(orange);
semSignal(empty);
}
第六章
- 为什么死锁不会涉及虚拟内存或磁盘?
答:因为虚拟内存和磁盘都是由OS来统一管理的,属于可剥夺资源,由不得进程霸占
2. 一次性分配所有资源的方法破坏的是死锁四个必要条件中的(B)
A.互斥 B.占用且等待 C.不可抢占 D.循环等待
3.某银行的电子转账系统的业务流程是:先对转出方和转入方的账户进行加锁,然后转账,最后对转出方和转入方的账户进行解锁。不采取措施时是否会死锁?
答:会死锁,比如说两个账户同时给对方转账时。当同时转账时,系统中的两个进程就会同时需要对甲账户加锁,乙账户加锁,最坏的情况就是进程1已经对甲账户加锁,将要对乙账户加锁的时候,进程2对乙账户加锁了,此时进程1不满足转账条件,阻塞而且等待,进程2也不满足转账条件,阻塞而且等待。死锁。
- 产生死锁的四个条件是什么?
- 互斥(
每次只有一个进程可使用某个资源
) - 占有且等待(
进程申请新资源时继续占有已分配的资源
) - 非抢占(
不可强行剥夺进程已占用的资源
) - 循环等待(
存在进程间等待资源的循环链
)
- 死锁避免,检测和预防之间的区别是什么?
答:死锁预防
:通过间接地限制三种死锁必要条件的至少一个或是直接地限制循环等待的发生来避免死锁的出现。
死锁避免
:允许可能的必要条件发生,但是采取措施确保不会出现死锁的情况,
死锁检测
:允许资源的自由分配,采取周期性的检测措施来发现并处理可能的死锁情况
第七章
- 动态分区方案,设内存中保留一个空闲块列表,问最佳适配、首次适配、下次适配、最差适配的平均查找长度是多少?
答:设空闲块列表中有n个分区
,
最佳适配:最差情况下将会查找所有的n个分区
(链表结构是按照大小排列的),最好情况下查找1个分区
就最佳匹配,平均查找长度(n+1)/2
首次适配:最差情况下将会从链表头部开始查找所有的n个分区
,最好情况下链表头就可以分配,平均查找长度(n+1)/2
下次适配:最差情况下将会从链表头部(按照地址)开始查找所有的n个分区
,最好情况下表头就可以分配,平均查找长度(n+1)/2
最差适配:最好和最坏情况都只是查找一次
- 设有一大小为2^k、起始地址为x的块,buddyk(x)是其伙伴的地址,写出buddyk(x)的通用表达式。
解:当块为左伙伴时,其右伙伴的地址为x+2^k
当块为右伙伴时,其左伙伴的地址为x-2^k
//求解buddyk(x)
if(x%2^(k+1) ==0){
//x是左伙伴
buddyk(x) = x+2^2k;
}else if (x%2^(k+1) == 2^k){
//x是右伙伴
buddyk(x) = x-2^k;
}
- 采用固定分区管理的最大缺点是©
A.不利于内存保护 B.分配算法复杂
C.内存利用率不高 D.碎片太多
- 可变分区的地址转换公式是(B)
A.物理地址=限长寄存器值+逻辑地址
B.物理地址=基址寄存器值+逻辑地址
C.物理地址=界限寄存器值+逻辑地址
D.物理地址=帧号*帧长+页内地址(分页)
-
4B长的帧号能表达多大内存?
解:
帧长:4KB/帧
帧号长度:4B=32bit
,所以能表达出(2^32)
个地址
地址空间大小:内存地址个数*每个地址所代表的内存大小
内存大小=2^32*4KB = 2^32*4*2^10B=2^44B = 16TB
- 每页长1KB,页表如下。逻辑地址1500,3500所对应的物理地址是多少?
页号 | 帧号 |
---|---|
0 | 5 |
1 | 4 |
2 | 9 |
解:由1500/1KB=1500/1024=1,页号=1=>帧号=1
由1500%1024 = 476,对应页内偏移位=476
1500所对应的内存地址 = 4*1024+476 =4572
由3500/1KB=3500/1024=3>2越界
-
页式内存管理系统。内存大小为232B,页大小为210B,逻辑地址空间包含216页。页式内存管理系统。内存大小为2^{32}B,页大小为2^{10}B,逻辑地址空间包含2^{16}页。页式内存管理系统。内存大小为232B,页大小为210B,逻辑地址空间包含216页。
a.逻辑地址有多少位?
由逻辑地址包含216页,而页大小有210B,即210B/页,216页∗210B/帧=226B,有26位由逻辑地址包含2^{16}页,而页大小有2^{10}B,即2^{10}B/页,2^{16}页*2^{10}B/帧= 2^{26}B,有26位由逻辑地址包含216页,而页大小有210B,即210B/页,216页∗210B/帧=226B,有26位
b.一个页框有多少个字节?
页框的大小与页的大小一样,均为210B页框的大小与页的大小一样,均为2^{10}B页框的大小与页的大小一样,均为210B
c.物理地址中有多少位是页框号
要求有多少位是页框号,就需要知道有多少个页框,因为内存大小为232B,而页大小是210B,因此页的数量为232210=222个页,因此有22位为页框号要求有多少位是页框号,就需要知道有多少个页框,因为内存大小为2^{32}B,而页大小是2^{10}B,因此页的数量为\frac{2^{32}}{2^{10}} = 2^{22}个页,因此有22位为页框号要求有多少位是页框号,就需要知道有多少个页框,因为内存大小为232B,而页大小是210B,因此页的数量为210232=222个页,因此有22位为页框号
d.页表中最多有多少页表项
页表是用来存储页,那么有多少个页,就有多少个页表项,则页表项有216个页表是用来存储页,那么有多少个页,就有多少个页表项,则页表项有2^{16}个页表是用来存储页,那么有多少个页,就有多少个页表项,则页表项有216个
e.设每个页表项包含一位"有效位",则每个页表项有多少位?
由页表中的页框号需要22位,加上一位有效位,则有23位由页表中的页框号需要22位,加上一位有效位,则有23位由页表中的页框号需要22位,加上一位有效位,则有23位
- 解这道题的关键是将页框和页区分开来,
页框(内存被划分为大小相等的物理块,指代的是物理地址)
,页(进程的逻辑地址空间被划分为同同样大小的逻辑块,指代的是逻辑地址)
,页表(用来记录进程中每个页存放在哪一个帧)。
- 在段式管理中,越界保护是通过
段表寄存器
中存放段表长度
和段表中某段的段长
实现 - 某段的段基址B,段长L,合法的逻辑地址A是
(0<=A<L)
,合法的物理地址R是(B<=R<B+L)
- 对内存的访问是以(B)为单位
A.页或者段 B.字或字节 C.用户的逻辑地址 D.进程
- 为什么需要重定位进程的能力?
答:通常情况下,并不能事先知道在某个程序执行期间会有哪个程序驻留在主存中。此外还希望通过提供一个巨大的就绪进程池,能够把活动进程换入和换出主存,以便使得处理器的利用率最大化,在这两种情况下,进程在主存中的确切位置是不可预知的。
- 页和页框之间有什么区别?
答:在分页系统中,进程和磁盘上存储的数据被分成了大小固定相等的小块,叫做页,而主存被分成了同样大小
的小块,叫做页框,一页恰好可以被装入一页框中。
第八章
-
就绪挂起态和阻塞挂起态进程的换入/换出内存和虚拟内存的换入/换出内存有什么区别?
答:
就绪挂起态和阻塞挂起进程的换入/换出:
进程的所有内存驻留页/段全部被换出/换入,解除挂起时,所有以前的驻留页/段再全部重新读入内存,且CPU不会调度就绪挂起态的进程。虚拟内存
:运行态进程发生缺页/缺段,此时发生缺页中断(故障)
,此时将它的部分页/段换入和换出内存 -
多级页表的优点是(D)
A.加快地址变换速度 B.减少缺页中断次数 C.减少页表所占字节数 D.减少页表所占的连续内存空间
- 假设采用页式存储,48位逻辑地址,页面尺寸4KB, 页表项大小为8B,则应采用页内偏移(
12
)位,(4
)级页表。
解:48位逻辑地址,逻辑地址空间2^48
,4KB/页
,页表项大小为8B
则:由逻辑地址=页号+页内偏移
求解页内偏移:212,因此页内偏移有12位求解页内偏移:2^{12},因此页内偏移有12位求解页内偏移:212,因此页内偏移有12位
一个页(逻辑)能存储212/23=29,那么9位就是一级页表,根据236/29=4,所以是4级页表一个页(逻辑)能存储2^{12}/2^{3}=2^{9},那么9位就是一级页表,根据2^{36}/2^{9}=4,所以是4级页表一个页(逻辑)能存储212/23=29,那么9位就是一级页表,根据236/29=4,所以是4级页表
- 不考虑缺页中断且忽略TLB并行匹配查找时间。 设
访问内存的时间为100 ns
,访问快表TLB的时间为 20 ns
。如果TLB命中率为90%,则将逻辑地址转换成物理地址并访问内存数据所需的有效访问时间是:
解:0.9∗(20+100)+0.1∗(100+20+100)=130ns0.9*(20+100)+0.1*(100+20+100)=130ns0.9∗(20+100)+0.1∗(100+20+100)=130ns
注解:0.9*(20+100)中的是20是访问块表得到内存页帧号,100是根据页帧号去访问内存
100+20(访问TLB+访问内存得到帧号),100(根据帧号得到数据)
- 考虑一个进程的页访问序列, 工作集为M个页框,最初都是空的。页访问串 的长度为P,包含N个不同的页号。对任何一种 页面置换算法:
解:缺页中断次数的下限(最少次数)是多少? N
缺页中断次数的上限(最多次数)是多少? P
- 一个分页虚拟存储系统,测得CPU和磁盘利用率如下。问每种情况下存在的问题和可采取的措施。
-
CPU 3%,磁盘 97%:
此时利用率非常高,证明在进行高强度的I/O,而CPU利用率很低,证明进入了抖动的状态,策略:暂停部分运行进程
-
CPU 87%,磁盘 3%:
此时CPU利用率较高,但磁盘利用率不高,可以继续增加进程数以提高资源利用率
-
CPU 13%,磁盘 3%:
CPU和磁盘利用率很低,可增加进程数以提高系统并发度
-
CPU 93%,磁盘 49%:
此时系统即将发生抖动,不可再增加进程。
- 解释什么是抖动
答:虚拟内存结构的现象,在这个过程中处理器大部分时间都用于交换块,而不是执行指令
- 转移检测缓冲区TLB的目的是什么?
答:TLB是一个包含最近经常使用过的页表项的高速缓冲存储器
,它的目的是为了减少从磁盘中恢复一个页表项所需的时间
- 驻留集和工作集有什么区别?
答:一个进程的驻留集
:指的是当前在主存中的这个进程的页
一个进程的工作集
:指这个进程最近被使用过的页
- 设程序运行在请求页式系统,页(帧)大小1KB,每个整 数占4B,则数组的每4行占一页,每个数组需16页。 设系统为该进程分配4帧,其中1帧放代码,3帧放数组数据(1个数组占1帧,每次放4行/帧)。
int A[64][64],B[64][64],C[64][64],i,j;
for(j=0;j<64;j++){
for(i=0;i<64;i++){
C[i][j] = A[i][j] + B[i][j];
}
}
(a)缺页中断的频率(次数)?
每访问4个元素缺一次页,每个数组缺(64*64)/4=1024
3个数共缺1024*3=3072次
(b)如何修改这个程序以减少缺页中断频率?
将i,j互换,修改代码为:
for(i=0;i<64;i++){
for(j=0;j<64;j++){
C[i][j] = A[i][j] + B[i][j];
}
}
©修改后的程序的缺页中断频率是多少?
每访问4行元素缺1次页,每个数组缺 64/4=16次。
3个数组共缺48次。
第九章
- I/O密集型进程和CPU密集型进程,谁的CPU调度优先级应该更高?
答:I/O密集型进程:该进程需要进行大量的I/O,可能需要大量的CPU调度,CPU密集型进程:需要占用大量的CPU时间片,当一个CPU密集型进程获得高优先级时,其他许多低优先级的进程可能导致饥饿,而当一个I/O密集型进程获得高优先级时,由于其绝大多数时间都处于I/O,CPU可以轮换,此时,其他许多低优先级的进程有机会可以获得CPU资源,不容易导致饥饿。因此I/O密集型进程的CPU调度优先级应该更高
- 时间片轮转法,设时间片长度q =100ms, 每次上下文切换时间需要 5ms,则用于上下文切换的开销比例是多少?
5/(100+5)=4.8%
- 简要描述三种类型的处理器调度。
答:长程调度
:决定加入到待执行的进程池中
中程调度
:决定加入到部分或全部在主存中的进程集合
短程调度
:决定哪一个可用进程将被处理器处理
- 抢占式和非抢占式调度有什么区别?
答:非抢占式调度
:在这种情况下,一旦进程处于运行态,它就不断执行直到终止,或者为等待I/O或请求某些操作系统服务而阻塞自己。
抢占式调度
:当前正在运行的进程可能被操作系统中断,并转移到就绪态。是否抢占当前进程的决策可能发生在一个新进程到达时,或者在一个中断发生后把一个阻塞的进程设置为就绪态时,或者基于周期性的时间中断
第十章与第十一章
-
有4个实时周期性事件,周期分别为50、100、300、250ms, 处理时间分别是35、20、10和 x ms,则任务可调度时,x值最大多少?
解:
对于周期性任务,任何调度算法都有下面的式子成立:
C1T1+C2T2+...+CnTn<=1\frac{C_1}{T_1}+\frac{C_2}{T_2}+...+\frac{C_n}{T_n}<=1T1C1+T2C2+...+TnCn<=1
才可能处理所有负载
那么:35/50+20/100+300/10+x/250<=1
解得x<=16.67ms
- 列出并简单定义执行I/O的三种技术。
- 可编程I/O:处理器代表进程给I/O模块发给一个I/O命令,该进程进入忙等待,等待操作的完成,然后才可以继续执行
- 中断驱动I/O:处理器代表进程向I/O模块发送一个I/O命令,然后继续执行后续指令,当I/O模块完成工作后,处理器被该模块中断,如果当进程不需要等待I/O完成,则后续指令可以仍是该进程中的指令,否则,该进程在这个中断上被挂起,处理器执行其他工作。
- 直接存储器访问(DMA):一个DMA模块控制主存和I/O模块之间的数据交换,为传送一块数据,处理器给DMA模块发送请求,只有整个数据块传送完成后,处理器才能被中断。
- 如果磁盘中每扇区为512字节,且每磁道96个扇区, 每盘面110个磁道,计算:存储300000条120B长的逻辑记录需要多少磁盘空间(扇区、磁道和面)?忽略文件头记录和磁道索引,并假设记录不能跨越两个扇区。
- 每个扇区只能容纳4个记录:120B*4=480B
- 所需扇区数=
300000/4 = 75000
- 所需磁道数=
75000/96 = 782
- 所需要盘面数=
782/110 = 7.1=8
- 假设磁盘每磁道96个扇区,旋转速度为360r/m。 处理器使用中断驱动I/O方式从磁盘中读取一个扇区,每个字节中断一次。如果处理每个中断需要 2.5μs,则处理器花费在处理I/O上的时间占多少百分比(忽略寻道时间)?
答: 每转=60/360=166.7ms
,读取一个扇区所需时间= 166.7ms/96=1736us
,每扇区512字节
,每字节中断一次,每扇区512次中断,处理器中断总时间2.5*512=1280us
,百分比1280/1736=74%
- 磁盘每磁道96个扇区,旋转速度为360r/m。采用 DMA方式读取磁盘,假设每个扇区中断一次。如 果处理每个中断需要2.5μs,则处理器花费在处理I/O上的时间占多少百分比(忽略寻道时间)?
读取一个扇区所需时间=60秒÷360转/分÷96扇区/磁道=1736μs
采用DMA,每扇区需一次中断,处理时间=2.5us
处理器花费在处理I/O上的时间百分比=2.5/1736=0.14%
故DMA方式使得CPU对I/O的干预更少。
第十二章
- 用户删除某文件时,OS不可能执行的操作是(A)
A.删除此文件所在的目录
B.删除与此文件关联的目录项
C.删除与此文件对应的文件控制块
D.释放与此文件关联的内存缓冲区
- 一个文件被打开时,OS首先要做的是(B)
A.将文件内容读到内存
B.将文件控制块读到内存
C.修改文件控制块中的读写权限
D.将文件的数据缓冲区首指针返回给用户进程
- 如果磁盘块长4KB(即索引块和数据块均长4KB),每个盘块指针4B,则采用基于单个盘块的索引分配时,允许的文件最大尺寸是多少?
一个索引块可保存 4KB/4B=1K个指针,每个指针指向
一个数据块,文件最大尺寸:4KB×1K= 4MB
- 基于大小可变的分区的索引分配,假设索引块中“长度” 域占1B、2B,文件最大尺寸分别是多少?
“长度”域为1B时,索引块只有 4096B/5B=819个指针,
一个指针指向一个连续盘块区,每区最多 28-1=255个盘块,
每盘块4KB,故文件最大尺寸=819×255×4KB=815.8MB。
“长度”域为2B时,索引块只有 4096B/6B=682个指针,
每个连续盘块区最多216-1≈64K个盘块,每盘块4KB,
故文件最大尺寸≈682×64K×4KB=170.5GB。
- 设一个文件由100个磁盘块组成,则对于连续文件、 链接文件和索引文件,当在文件中间增加一块(原50#块 后面)和删除一块(删掉51#块)时需要的磁盘I/O次数是多少?设头指针和索引表已在内存。(设块号从1开始计数)
连续分配 | 链接分配 | 索引分配 | |
---|---|---|---|
在中部增加块 | 50次读后块+1次写新块+50次写后块=101次 | 50次读前块+1次前块修改+1次写前块=52次 | 1写新块 |
在中部删除块 | 后49块读入内存再写回磁盘=49*2=98次 | 50读前块+1读欲删块得下块号+1写前块=52次 | 0 |
- 列出并简单定义三种文件分配方法。
- 连续分配是指在创建文件时,给文件分配一组连续的块。
- 链式分配基于单个的块,链中的每一块都包含指向下一块的指针。
- 索引分配:每个文件在文件分配表中有一个一级索引,分配给该文件的每个分区在索引中都有一个表项。