考题预测及解析
首先声明一点:
- 从长远角度看,前面博客中讲的研究思路更重要
- 从考试角度看,这篇博客就足够了,因为考点几乎是固定的
- 另外,这篇博客写于期中考试前,后面再确定期末考试的考点是否与此一致
重点声明
- 多道程序设计技术,多道程序的优缺点分析;
- 进程状态转移,状态转移的原因(三状态模型);
- 进程同步:PV操作(重点),这里多做几个题目吧;
- 进程通信:论述消息传递和共享内存的区别;
- 线程:论述多进程、多线程的优劣;
- CPU调度算法(大概五分左右),算(带权)周转时间(多种算法);
- 死锁部分(重点):银行家算法、安全状态的判定;
- 程序的装入、链接,仔细对比各种方式的区别;
- 内存管理:空闲内存分配方法,给一个内存映像,写出四种分配方法的结果;
- 内存管理:分页是一定考的;
- 虚拟存储器的思想,以及页面置换算法;
- IO:不考2333;
- 磁盘调度算法;
- 文件系统,计算题;
这些题目和之前博客讲的很多内容都大不相同,这里考的十分具体,大多数都是算法题,当然会有一些理解性的题目。
例题讲解
1.多道程序设计技术
基本思想:将多个程序同时放入内存,使他们共享系统中的资源。
特点:
- 内存中存放了多个程序,而不是一个;
- 宏观上并行,给我们的假象是多个程序同时在执行,其实某一时刻只有一个程序在执行;
- 微观上串行:某一时刻只有一个程序在执行,即多个程序轮流占用CPU,交替执行;
多道程序设计带来的优点:
- 首先解释三个利用率的提高:CPU, IO, Memory,然后是吞吐量;
- 将等待IO的时间拿出来执行其他程序,提高了CPU利用率;
- 可能将多个程序的IO操作集中起来,也提高了IO设备的利用率;
- 内存中装入多道程序轮流执行,提高了内存的利用率;
- 将等待IO的时间利用后,提高了系统的吞吐量,降低了程序运行所需要的费用;
多道程序设计带来的缺点:
- 增加了系统的不确定性,很难确定某一个程序的终止时间;
2.进程同步
先提一个很有意思的问题:解释程序和进程的区别
- 程序保存在磁盘中,是静态的,而进程在内存中,是动态的概念
- 程序保存在磁盘中的形式是文件,如exe文件,而进程在内存中的形式是PCB+代码段+数据段+堆区+栈区
- loader将程序从磁盘中加载到内存中,并分配PCB以及代码段、数据段、堆、栈后进程才可执行,进程有其生命周期,且进程与程序不是一一对应的。
- 进程是系统进行资源分配的基本单位,而程序仅仅是静态的指令代码。
此问题能区分科班出身程序员和培训机构出来的程序员,当然这是建立在对操作系统的理解之上的,如果理解了进程的概念自然能明白这个问题。
关于进程的状态转移:
就绪态–>运行态:
- CPU有空闲、进程处于就绪状态,此时调度算法将就绪队列中的一个进程调度到CPU上运行
运行态–>就绪态:
- 时间片用完,被迫暂停执行
- 也可能因为优先级低被抢占:进程A执行时,某优先级更高的B为就绪态,则进程A会被抢占,强行进入就绪态,优先执行进程B。
- 此时收回CPU资源,再次执行调度程序。
运行态–>阻塞态:
- 该进程请求IO
- 等待某个事件或者请求访问某个临界资源,而该临界资源被其他程序占用
- 此时收回CPU资源,再次执行调度程序
阻塞态–>就绪态:
- 阻塞的原因解除,如:IO结束,某被占用的临界资源被释放
- 将此进程插入到就绪进程队列中,等待再次获得CPU。
练习题:
在一个单处理机的系统中,OS的进程有运行、就绪、阻塞三个基本状态。假如某时刻该系统中有10个进程并发执行,在略去调度程序所占用时间情况下试问:
(1)这时刻系统中处于运行态的进程数最多有几个?最少有几个?
(2)这时刻系统中处于就绪态的进程数最多有几个?最少有几个?
(3)这时刻系统中处于阻塞态的进程数最多有几个?最少有几个?
参考答案:
(1)运行态最多有1个,最少有0个。
(2)就绪态最多有9个,最少有0个。
(3)阻塞态最多有10个,最少有0个。
信号量的PV操作:
信号量的定义:
struct semaphore{
int value;
struct PCB *queue;
}
void wait(semaphore s)
{
s.value-=1;
if(s.value<0)
block(s.queue);//当前进程进入阻塞态,并加入阻塞队列
}
void signal(semaphore s)
{
s.value=s.value+1;
if(s.value>=0)
wakeup(s.queue);//从阻塞队列中唤醒一个进程
}
心烦,学期末大家都在图书馆,搞的图书馆wifi压根不能用,而且还没流量了,想骂人^ - ^,图片也他喵的传不上来,最近这Google Chrome也犯浑,卡的一批…
吃水果问题:
桌上有一空盘,只允许存放一个水果。爸爸专向盘中放橙子,妈妈专向盘中放苹果,女儿专等吃橙子,儿子专等吃苹果。规定当盘空时一次只能放一个水果供吃者自用,请用PV操作实现爸爸、妈妈、女儿、儿子四个并发进程的同步。
semaphore s1=1;//s1表示盘的状态:1为空;0为满。
semaphore s2=s3=0;//s2和s3分别表示橙子和苹果的个数。
father()
{
while(1);
{
P(s1);
放入橙子;
V(s2);
}
}
mother()
{
while(1);
{
P(s1);
放入苹果;
V(s3);
}
}
daughter()
{
while(1);
{
P(s2);
从盘中取出橙子;
V(s1)
}
}
son()
{
while(1);
{
P(s3);
从盘中取出苹果;
V(s1)
}
}
笼子问题:
有一只笼子,每次只能放一只动物,猎手向笼子中放猴子,农民向笼子中放猪,动物园等待买笼中的猴子,饭店等待买笼中的猪,试用PV操作写出他们能同步执行的程序。
semaphore s1=1;//初始状态下,笼子为空。
semaphore s2=s3=0;//初始状态下猴子和猪的个数。
hunter()
{
while(1);
{
P(s1);
放猴子;
V(s2);
}
}
famer()
{
while(1);
{
P(s1);
放猪;
V(s3);
}
}
zoo()
{
while(1);
{
P(s2);
取猴子;
V(s1)
}
}
Restaurant()
{
while(1);
{
P(s3);
取猪;
V(s1)
}
}
关于PV操作:将P操作理解成申请,将V操作理解成通知,那么上述问题非常简单;
3.进程调度相关
周转时间定义:从作业被提交给系统开始,到作业完成为止的这段时间间隔
周转时间=在外存上等待被调入的时间+在就绪队列上等待调度的时间+在CPU上执行的时间+进程等待IO操作完成的时间。
带权周转时间:周转时间/实际服务时间
调度算法有:先来先服务、短作业优先、时间片轮转调度、
看下先来先服务与短作业优先的计算例题:
思路很简单,计算也很简单,这里的短作业优先是非抢占式的。
还有最短剩余时间优先调度,需要每一时刻都计算各个进程的剩余时间
优先级调度算法:给每个进程赋予一个优先级,如果单纯考这个算法的话,会很简单,也就让根据优先级排个序(我们课上约定最小整数对应最大优先级)
对上述算法做改进,衍生出:高响应比优先级调度
- 引入动态优先权=(等待时间+要求服务时间)/(要求服务时间)
- 当然也有抢占式和非抢占式版本,非抢占式版本做题比较简单,抢占式的话,大概率不会考,因为计算变得十分复杂。
多级队列调度算法:
- 笔者手上没有具体题目,如果要考的话,出题也不怎么好处
- 其基本思想是,将就绪队列划分成多个队列,如前台队列、后台队列
- 每一个队列都有独立的调度算法,如前台使用轮转调度,后台使用先到先服务。
多级反馈队列调度算法:
- 也不怎么会考
- 一个进程在多个队列之间移动,使用CPU越多,优先级越低
- 比如划分成Q0, Q1, Q2
- 某个进程在Q0执行一段时间后转移到Q1,再执行一段时间转移到Q2
- 基本思想是这样的
4.进程通信
这里来一个开放性题目,老师说考的概率很大;
论述对比两种进程通信方式:消息传递和共享内存(实现难度、使用难度、适用范围)
- 共享内存实现比较简单,基本思想是在内核开辟一部分空间,让多个进程之间共享该空间。而消息传递的实现比较复杂,需要管理维护消息队列;
- 共享内存的最大缺点:需要程序员自己管理同步和互斥问题,当共享变量变得多起来以后,极易容易出现死锁问题;
- 消息传递:不需要程序员自己管理同步和互斥问题,正因如此,比较适合解决复杂问题;
- 由于消息传递实现机制比较复杂,其不适合频繁使用,如需要进程间传递大量数据,应使用共享内存;
5.线程相关
多进程VS多线程
- 进程由PCB进行管理,线程由TCB进行管理;
- PCB所占空间大于TCB,所以创建进程和进程切换所需要的开销大于线程,这也是引入多线程的原因,而且线程的内存占用也少于进程;
- 进程是计算机分配资源的基本单位,线程是调度的基本单位,即OS会给进程分配资源,线程使用进程的资源,线程接受调度,同时一个进程内可有多个线程;
- 线程之间会相互影响,一个线程崩溃可能会使其他线程也崩溃,但是进程之间是隔离的,不会受此影响;
- 进程需要考虑通信机制,数据共享复杂,而线程共享进程的一些数据,使得数据共享变得十分容易;
- COW技术可使进程创建开销变小;
- 多进程切换时会频繁刷新快表,而多线程则可更好利用快表;
6.死锁相关
银行家算法输入:
- 可利用资源向量Available,Available[j]=k表示Rj有k个资源可用
- 最大需求矩阵Max Max(i,j)=k表示进程i需要Rj的最大数目是k
- 分配矩阵Allocation Allocation(i,j)=k表示进程i当前已经分得Rj类资源的数目为k
- 需求矩阵Need
算法描述:
- Work表示系统当前资源数目 初值 Work=Avaliable
- Finish:进程能否顺序完成 初值Finish[i]=true
- 寻找能满足下述条件的进程i:Finish[i]=true, Need[i,j]
- 如找到则:Finish[i]=true, Work[j]+=Allocation[i,j]
- 一直找下去,如果所有进程均已结束则安全,否则不安全。
也就是说银行家算法其实是用来判断当前状态是否是安全状态的;
建议找个题目做做!
7.程序装入链接
他们的具体含义就不说了,直接看程序装入链接
可能考点:分析静态链接和动态链接的优劣(生成文件大小、模块升级、模块兼容性、运行效率)
- 静态链接生成的可执行文件较大,动态链接产生的可执行文件较小
- 动态链接容易对模块进行升级,不需要重新编译即可完成升级只需要替换文件即可。而静态链接需要重新编译。
- 动态链接虽然容易升级,但是可能会造成版本不兼容,如果采用静态链接方式的话,能借助编译器减缓版本不兼容问题。
- 静态链接启动时间长,动态链接启动时间短。
- 静态链接一次装入即可,运行时动态链接需要在运行时装入,可能影响运行效率。
8.内存管理相关
分页必考,下题容易做错:
已知某分页系统,主存容量为64K,页面大小为1K,对一个4页大的作业,其0、1、2、3页分别被分配到主存的2、4、6、7块中。
- 1.将十进制的逻辑地址1023、2500、3500、4500转换成物理地址
- 首先计算1023对应的物理地址
- 1023对应的页内偏移为1023%1024=1023
- 物理页框2对应的初始地址为:2048
- 2048+1023=3071
- 注意1KB=1024B,这是错点;
- 计算2500对应的物理地址
- 2500对应的页内偏移为2500%1024=452
- 2500/1024=2表示其在2号页里
- 对应物理页框6
- 物理页框6的起始地址:6*1024=6144
- 6144+452=6596
- 其他的就不算了
- 4500/1024=4越界
分段不知道考不考,目前的OS实现都绕开了分段,个人感觉考的可能性不大;
还有一个考点,空闲内存分配算法,具体看内存管理:
9.虚拟存储管理
局部性原理、请求页式存储管理、页面置换算法
为什么称为虚拟存储器?
- 通过仅将部分程序调入内存运行的方式,使一个很大的程序,可以在较小的内存空间上运行。
- 如果每个程序都装入一部分运行的话,还可以使内存同时装入更多的进程并发执行,提高系统吞吐量
- 进程换进换出是操作系统完成的,用户并不知道,所以是从逻辑上对内存容量进行了扩充。而这个感觉是虚拟的,所以称为虚拟存储器。
页面置换算法:
- 最佳置换算法:选择在最长时间内不被访问的页面,仅仅在理论层面研究,因为其选择在未来时间内最长时间不被访问的页面,但是OS没办法预测未来访问顺序鸭。
- 先进先出置换算法:这个还是最简单的思想
- 最近最久未使用置换算法(LRU):计算t值最大的页予以淘汰
- Clock置换算法:设置一个访问位,如被访问则置1,当发生缺页中断时,检查头指针指向的页面,若R=0则换出,否则设置R=0,检查下一页。
10.磁臂调度算法
访问磁道顺序:55,58,39,18,90,160,150,38
当前磁头处于100号磁道上
先来先服务:
- 寻道距离:45+3+19+21+72+70+10+112+20=372
最短寻道时间优先:
- 寻道顺序:90,58,55,39,38,18,150,160
- 寻道距离:10+32+3+16+1+20+132+10=224
电梯调度算法—SCAN
- 沿着某个方向移动,直到该方向没有请求,逆转方向
- 假设先沿着磁道增加的方向移动,访问顺序:150,160,90,58,55,39,38,18
- 移动距离:50+10+70+32+3+16+1+20=202
循环扫描算法—CSCAN
- 只沿一个方向移动,没有逆转的操作
- 访问顺序:150,160,18,38,39,55,58,90
总结:
- 先来先服务:永远是最公平的,但是低效
- 最短寻道时间:高效、但是不公平,容易产生饥饿
- 电梯调度算法:折中的方案
- 循环扫描算法:也是折中的方案,能够降低最坏情况下的时延
11.文件系统
练习1:
一个文件有64M,磁盘每个盘块的大小为1KB,每个盘块号占2B,则这个文件的索引块有几个?需要几级索引?
- 先算该文件需要多少个盘块:64M/1K=64K个盘块
- 一个盘块号占2B,64K个盘块需要占用:64Kx2B=128KB
- 128KB需要的盘块为:128个
- 一级索引不好管理
- 引入二级索引,一个一级盘块可寻址:1KB/2Bx1KB=512KB
- 一个二级索引块可寻址:1KB/2Bx512KB=256MB数据
- 所以需要引入二级索引
练习2:
文件系统采用混合的方式管理存储文件的物理块,设块的大小为512B,每个块号占3B,如果不考虑逻辑块号在物理块中所占的位置,求一级索引、二级索引和三级索引可寻址的文件最大长度。
- 一个块可装512B/3B=170个索引
- 一个一级索引块可寻址:512B/3Bx512B=85KB
- 一个二级索引块可寻址:512B/3Bx85K=14MB
- 一个三级索引块可寻址:512B/3Bx14MB=2.3GB
练习3:
有一磁盘共有10个盘面,每个盘面上有100个磁道,每个磁道有16个扇区,每个扇区512字节。假定文件分配以扇区为单位,若使用位示图来管理磁盘空间,问:
- 磁盘容量的大小是:10x100x16x512B=7.8MB
- 位图所占用的空间是:10x100x16/8=2000B,2000B/512B=3.9, 所以至少需要4个扇区来保存位图
- 若空白文件目录的每个表目占5B,什么时候空白文件目录占用空间大于位图:没弄懂啥意思。
独乐乐不如众乐乐!开心就点个赞叭!
本系列博客目录