操作系统-复习-考题预测及解析-期中考试

考题预测及解析

首先声明一点:

  • 从长远角度看,前面博客中讲的研究思路更重要
  • 从考试角度看,这篇博客就足够了,因为考点几乎是固定的
  • 另外,这篇博客写于期中考试前,后面再确定期末考试的考点是否与此一致

重点声明

  1. 多道程序设计技术,多道程序的优缺点分析;
  2. 进程状态转移,状态转移的原因(三状态模型);
  3. 进程同步:PV操作(重点),这里多做几个题目吧;
  4. 进程通信:论述消息传递和共享内存的区别;
  5. 线程:论述多进程、多线程的优劣;
  6. CPU调度算法(大概五分左右),算(带权)周转时间(多种算法);
  7. 死锁部分(重点):银行家算法、安全状态的判定;
  8. 程序的装入、链接,仔细对比各种方式的区别;
  9. 内存管理:空闲内存分配方法,给一个内存映像,写出四种分配方法的结果;
  10. 内存管理:分页是一定考的;
  11. 虚拟存储器的思想,以及页面置换算法;
  12. IO:不考2333;
  13. 磁盘调度算法;
  14. 文件系统,计算题;

这些题目和之前博客讲的很多内容都大不相同,这里考的十分具体,大多数都是算法题,当然会有一些理解性的题目。

例题讲解

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操作完成的时间。

带权周转时间:周转时间/实际服务时间

调度算法有:先来先服务、短作业优先、时间片轮转调度、

看下先来先服务与短作业优先的计算例题:
操作系统-复习-考题预测及解析-期中考试_第1张图片

思路很简单,计算也很简单,这里的短作业优先是非抢占式的。

还有最短剩余时间优先调度,需要每一时刻都计算各个进程的剩余时间

优先级调度算法:给每个进程赋予一个优先级,如果单纯考这个算法的话,会很简单,也就让根据优先级排个序(我们课上约定最小整数对应最大优先级)

对上述算法做改进,衍生出:高响应比优先级调度

  • 引入动态优先权=(等待时间+要求服务时间)/(要求服务时间)
  • 当然也有抢占式和非抢占式版本,非抢占式版本做题比较简单,抢占式的话,大概率不会考,因为计算变得十分复杂。

多级队列调度算法:

  • 笔者手上没有具体题目,如果要考的话,出题也不怎么好处
  • 其基本思想是,将就绪队列划分成多个队列,如前台队列、后台队列
  • 每一个队列都有独立的调度算法,如前台使用轮转调度,后台使用先到先服务。

多级反馈队列调度算法:

  • 也不怎么会考
  • 一个进程在多个队列之间移动,使用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实现都绕开了分段,个人感觉考的可能性不大;
操作系统-复习-考题预测及解析-期中考试_第2张图片
操作系统-复习-考题预测及解析-期中考试_第3张图片

还有一个考点,空闲内存分配算法,具体看内存管理:

  • 首次适应
  • 循环首次适应
  • 最佳适应
  • 最坏适应

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,什么时候空白文件目录占用空间大于位图:没弄懂啥意思。

独乐乐不如众乐乐!开心就点个赞叭!
本系列博客目录

你可能感兴趣的:(Linux,南航-操作系统-课堂笔记)