操作系统复习大纲1. 设备无关性(独立性)
设备独立性是指操作系统把所有外部设备统一当作文件来看待,只要安装它们的驱动程序,任何用户都可以像使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。
2. 进程与程序的区别
①进程是程序的一次执行,属于动态概念,而程序是一组有序的指令,是一种静态概念。但进程离开了程序也就失去了存在的意义。
②一个进程可以执行一个或几个程序。反之,同一程序可能由几个进程同时执行。 ③程序可作为软件资源长期保留,而进程是程序的一次执行过程,是暂时的。进程具有生命期。
④进程具有并发性,能与其它进程并发运行。而程序不具备这种特征。
⑤进程是一个独立的运行单位,也是系统进行资源分配和调度的一个独立单位。因此,进程具有独立性,但有时进程间又具有相互制约性。 3. 局部性原理、抖动。
①时间局部性:如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。(程序循环、堆栈等是产生时间局部性的原因)
②空间局部性:在最近的将来将用到的信息很可能与现状正在使用的信息在空间地址上是临近的。
4. 抖动的处理(抖动的原因)。
抖动:在虚存中,页面在内存与外存之间的频繁调度,以至于调度页面所需时间比进程实际运行的时间还多(在页面置换中,刚被淘汰出的页马上又要用到,如此反复),此时系统效率急剧下降,甚至导致系统崩溃,这种现象叫做抖动。
抖动的原因:①页架数过少,频繁造成缺页中断;②页面置换算法的不合理,不合理的算法可能将不久要用到的页面淘汰出去;③程序结构,滥用转移指令。 5. 死锁的必要条件。
(1) 资源独占性:资源被各进程互斥使用,即一个资源每次只能被一个进程所占用; (2)
资源不可抢夺性:一个资源被一个进程占用后,除非该进程用完自行释放,不能被别的进程强行抢占;
(3)
资源的部分分配:一个进程占有了一些分配给他的资源后,仍要求占用其他的资源。
(4)
循环等待资源:系统中若干进程之间对资源使用形成了一种循环等待的状况,即第一个进程占用了第二个进程所需资源,第二个占用第三个的,最后一个又占用第一个的。
6. 分页式、分段式,两者的主要区别。段页式,为何要分页分段?
为何要分页:分页管理是解决碎片问题的一种有效办法,它允许程序的存储空间是不连续的,用户程序的地址空间被划分为若干个固定大小的区域。
分页存储管理:将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面。 为何要分段:满足用户程序员(1)方便编程,(2)信息共享,(3)信息保护,(4)动态增长,(5)动态链接的需要。P136 分段存储管理:将程序分成若干逻辑段,并对这些段分别分配存储空间。 两者的主要区别:
(1)
页是信息的物理单位,分页是为了便于系统管理,而段是信息的,逻辑单位,分段是为了满足用户的需要。
(2)
分页式存储管理的作业地址空间是一维的,而分段式存储管理作业地址空间是二维的。
(3)
页的长度由系统确定,是等长的,而段的长度由具有相对完整意义的信息长度确定,是不固定的。
为何有段页式:分页存储管理能有效提高内存的利用率,分段存储管理能很好地满足用户的需要,段页式存储管理则是分页和分段两种存储管理方式的结合,它同时具备了两者的优点。
段页式存储管理:先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。 7. 进程与线程的关系。
线程是进程的一个组成部分,没各进程创建时通常只有一个线程,需要时可创建其它线程;进程的多线程都在进程的地址空间活动;资源是分给进程的,不是分给线程的,线程执行中需要资源时,可从进程资源中划分;处理机调度的基本单位是线程,线程之间竞争处理机,真正在CPU运行的是线程,线程在执行时需要同步。
线程:进程 1:1 n:1 1:n n:n 描述
每个线程的执行就是一个进程
每个进程定义一个地址空间并动态拥有资源
一个线程可以在多个进程间转移,同一进程可产生多个线程并运行 包含1:n和n:1的性质
8. 什么是死锁、饥饿。死锁与饿死的区别。
死锁:由于进程间相互竞争系统资源或通信而引起的一种阻塞现象。
饥饿:当等待时间给进程推进和响应带来明显影响时,称为进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称进程饿死。 死锁与饿死的区别:
(1)
从进程状态看,死锁进程都出于等待状态,忙是等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死。
(2)
死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,其等待时限没有上界。
(3)
死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,却不能检测是否有进程饿死。
(4)
死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。饥饿和饿死与资源分配策略有关,因而防止饥饿与饿死可以从公平性考虑,确保所有进程不被忽略。
9. 安全性检测算法(已知流程图,写代码)。
数据结构:
Available: array[1..m]of integer; //系统可用资源 Claim: array[1..n,1..m]of integer; //进程最大需求 Allocation: array[1..n,1..m]of integer; //当前分配 Need: array[1..n,1..m]of integer; //尚需资源 Request: array[1..n,1..m]of integer; //当前请求
int Work[m]; 工作变量, 记录可用资源. int Finish[n]; 工作变量, 记录进程是否可进行完. 1. Work = Available;Finish = false; 2. 寻找满足如下条件的i: (1 Finish[i]==false;(2 Need[i]≤Work[i]; 如果不存在