本文主要是介绍操作系统课程总结(进程的描述与控制,处理机调度与死锁),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[1]操作系统引论
OS的目标
方便、有效、可扩充、开放
OS的作用
提供接口、资源管理、扩充(抽象)
OS发展过程
①没有操作系统的计算机,从人工操作方式->脱机输入输出
②单道批处理系统:自动性、顺序性、单道性
③多道批处理系统:多道性、无序性、调度性、并发性、成批性。追求吞吐量。
④分时系统:交互性、并发性、独立性、及时性。追求快速响应。
⑤实时系统:实时性、高可靠性、并发性、独立性。追求非常高的可靠性、时效性。
OS四大特性
并发、共享、虚拟、异步
OS五大功能
①处理机管理:进程控制、进程同步、进程通信、调度
②存储器管理:内存分配、内存保护、地址映射、内存扩充
③设备管理:缓冲管理、设备分配、设备处理
④文件管理:文件存储空间的管理、目录管理、文件读写管理和保护
⑤提供接口:用户接口(联机、脱机、图形)、程序接口(系统调用)
OS体系结构
①传统结构:无结构->模块化->分层式
②现代结构:微内核
微内核结构的优点
①提高系统可扩展性
②增强系统可靠性
③可移植性强
④提供了对分布式系统的支持
⑤融入了面向对象技术
[2]进程的描述与控制
进程概念
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。进程由程序段、数据段、PCB组成。
进程三种基本状态
PCB中的信息
①进程标识符
②处理机状态
③进程调度信息
④进程控制信息
PCB的组织方式
线性方式、链接方式、索引方式
一些原语
创建creat、终止exit、阻塞block、唤醒wakeup、挂起suspend、激活active。
核心态和用户态
①系统态:能执行一切指令(包括特权指令),访问所有寄存器和存储器,也称为管态。
②用户态:具有较低特权,也称为目态。
进程的终止
正常结束、异常结束、外界干预
同步机制应遵循的原则(进入临界区的约定)
空闲让进、忙则等待、有限等待、让权等待。
记录型信号量
每个信号量对象中有一个整数成员变量和一个等待队列。
P(wait)操作:整数变量减1以表示需要1个资源,如果减完后这个量小于0,说明没有拿到,自我阻塞(调用block)到等待队列去。
V(signal)操作:整数变量加1以表示释放1个资源,如果释放完后这个量小于等于0,说明队列中有进程在等,唤醒(调用wakeup)队列中的一个进程。
管程
代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程,所组成的管理程序,共同构成的一个操作系统的资源管理模块。
生产者-消费者问题
semaphore mutex=1;//互斥信号量:保护缓冲区
semaphore empty=n;//空缓冲区空间数目
semaphore full=0;//满缓冲区空间数目
生产者进程:
do{P(empty);P(mutex);//生产V(mutex);V(full);
}while(true);
消费者进程:
do{P(full);P(mutex);//消费V(mutex);V(empty);
}while(true);
哲学家进餐问题
semaphore cp[5]={1,1,1,1,1};//五根筷子
哲学家i执行的程序,五个哲学家并发:
do{P(cp[i]);//右边筷子P(cp[(i+1)%5]);//左边筷子//进餐V(cp[i]);//右边筷子V(cp[(i+1)%5]);//左边筷子//思考
}while(true);
读者-写者问题
从读者进程去考虑:只要有一个读者在读,就不允许写者去写;而没有读者在读时,还需要确保没有写者在写,才能读。
因此可以设定一个”读者数目”的信号量,一个”确保没有写者在写”的信号量。
int readcount;//读者数目
semaphore wmutex=1;//读写竞争以了解对方是否在做
对于readcount,因为可能有多个读者进程,需要用互斥信号量夹起来保护:
semaphore rmutex=1;
从写者进程去考虑:只要没有读者在读,就可以去写了。
这只需要竞争那个”没有写者在写”的信号量。
读者进程:
do{P(rmutex);if(0==readcount)//如果没有读者在读P(wmutex);//那么写者才有可能在写,要确保写者完readcount++;//记录读者数量+1V(rmutex);//读P(rmutex);readcount--;//读完后,记录读者数量-1if(0==readcount)//如果此时已经没有读者在读了V(wmutex);//唤醒一个正在等待的写者V(rmutex);
}while(true);
写者进程:
do{P(wmutex);//确保没有读者在读/写者在写//写V(wmutex);//唤醒一个正在等待的写者/读者
}while(true);
线程
引入线程,使进程作为拥有资源的基本单位,而线程作为独立调度(运行)的基本单位,减轻之前进程切换的负担。线程控制块:TCB。
线程实现方式
①内核支持线程KST
在内核的支持下运行,创建等都在内核空间实现。但用户进程的线程需要在用户态运行,所以切换时需要从核心态转入用户态,开销比较大。调度以线程为单位执行。
②用户级线程ULT
在用户空间实现,创建等都无需内核的支持。但其调度仍是以进程为单位进行的,共用进程的时间片。(A进程中有1个线程,B进程中有100个线程,则A中线程的运行时间是B中各线程运行时间的100倍)
③组合方式
由ULT和KST的连接方式不同,形成三种模型:多对一模式、一对多模式、多对多模式。
[3]处理机调度与死锁
处理机调度的层次
①高级调度:调度对象是作业(针对内存),后备队列(外存)->就绪队列(内存)。用于多道批处理OS,在分时和实时OS中没有。
②低级调度:调度对象是进程(针对处理机),就绪队列(内存)->执行状态(内存)。即根据调度算法决定就绪队列中哪个进程获得处理机。
③中级调度,调度对象是进程(针对内存),静止(外存)<->活动(内存)。即把那些暂时不能运行的进程调至外存等待,提高内存应用率和系统吞吐量。
一些计算的量
批处理系统中的作业
作业:在批处理系统中以作业为基本单位从外存调入内存。
作业步:若干个相对独立又相互关联的顺序加工步骤,上一个作业步的输出作为下一个作业步的输入。
JCB:作业控制块。
作业三阶段三状态
提交->①收容阶段(后备状态)->②运行阶段(运行状态)->③完成阶段(完成状态)
作业调度算法
①先来先服务(FCFS):普通的队列。
②短作业优先(SJF):相当于最小堆每次取堆顶,效率最高。
③优先级调度(PSA):基于作业的紧迫程度。
④高响应比优先(HRRN):FCFS和SJF的折衷,即既考虑等待时间又考虑运行时间。
分时系统进程调度算法
①轮转法(RR):时间片固定,时间片的选取应略大于一次典型的交互所需的时间。如果时间片内执行完,立即取下一个就绪的进程。如果时间片结束,将其送往就绪队列末尾,并取下一就绪的进程。
使用了时间片,显然是一种可抢占的调度方式——时间片完即刻被抢占。
②优先级调度算法:把处理机分配给就绪队列中优先级最高的进程。
[1]非抢占式优先级调度算法:一旦分配给就绪队列中优先级最高的进程,除非该进程发生某些事件放弃处理机,否则一直执行下去。
[2]抢占式优先级调度算法:每当出现新的就绪进程,就和处理机上的进程优先级比较,若更高则抢占之。显然适合实时性要求较高的系统。
此外优先级还分为静态的和动态的,动态的优先级可以随着进程推进或等待时间增加而改变。
③多队列调度算法:即把一个就绪队列拆成多个,不同类型或性质的进程分配在不同的就绪队列中,各个队列之间也可设置优先级。
④多级反馈队列:该方式集合了前面所述的调度方式的一些优点。越靠上的队列优先级越高,时间片越小;越靠下的队列优先级越低,时间片越大(可能是翻倍),最后一个队列采用RR方式。上级队列出来的进程,在时间片内未能执行完,则进入下一级的队列(对于最后一个队列的进程也就是进入自己队列)。
对每个队列而言,只有上面的队列都为空时才能运行本队列的进程,如果处理机正在运行i队列出来的进程时,有新的进程进入上面的任一队列,都要把该进程放回本队列(i队列)的末尾,转而执行新加入的那个更高优先级队列中的进程。
实时系统进程调度
实时任务有哪些:
HRT:硬实时任务,必须立刻执行。
SRT:软实时任务,有一定容忍度,在一定时间内一定要执行好。
实时系统的要求:
一般采用抢占式调度机制(非抢占适用于对实时性要求不高的系统),对中断要能快速响应,对任务要有快速分派能力,系统处理能力要够强,实时任务也必须提供必要信息(如截止时间)。
非抢占式调度算法:
非抢占式轮转调度、非抢占式优先调度。
抢占式调度算法:
基于时钟中断的(时钟中断发生且不在临界区时抢占)、立即抢占的(只要不在临界区就抢占)。
以上这四种算法实时性依次增高。
两个具体的算法:
①最早截止时间优先(EDF)算法:具有最早deadline的排在队列队首/最小堆堆顶。
②最低松弛度优先(LLF)算法:必须开始的最晚时间越小,越优先。
可见松弛度虽是动态变化的,但对于队列中既存的进程,松弛度优先顺序并不会有改变(因为减掉的”当前时间”始终是一致的)。
优先级倒置和动态优先级继承
优先级倒置是因为低优先级进程用P操作拿到临界区资源后,在V操作释放前就被中间优先级的进程抢占,导致高优先级进程即便抢占了中间优先级进程,也因为无法拿到临界区资源而被自己的P操作阻塞,只能等到中间优先级进程全部执行完(这个过程可能非常长),才能让低优先级进程用V操作释放资源以使高优先级进程执行:
动态优先级继承可以较好的解决这个问题,在高优先级进程P操作发现有低优先级进程在使用而阻塞自己的同时,让这个低优先级进程继承自己的优先级,直到它用V操作退出临界区,这之间就不会有中间优先级的进程来骚扰了:
死锁
两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
引起死锁的原因
①竞争不可抢占性资源(一旦系统把某资源分配给该进程后,就不能将它强行收回)
②竞争可消耗资源(临时资源,在进程运行期间由进程动态地创建和消耗的)
③进程推进顺序不当(进入不安全区后仍然保持各自的资源就会出现死锁)
产生死锁的必要条件
①互斥条件:在一段时间内,某资源只能被一个进程占用。
②请求和保持条件:拿到一部分资源后,对其它资源的申请使自己阻塞,但对已经获得的资源扔保持不放。
③不可抢占条件:进程已经获得的资源在使用完之前不能被抢占。
④循环等待条件:发生死锁时必然存在一个进程等待其它进程占有的资源的循环链。
预防死锁
在四个必要条件中,互斥条件是非共享设备必须的,不能破坏,还应加以保持。
①破坏”请求和保持”条件:可以一次性拿完需要的全部资源,或者运行中逐步释放已经用完的资源。
②破坏”不可抢占”条件:进程获得了一部分资源,而剩下的资源获取不了,则已占有的资源也可被抢占掉。
②破坏”循环等待”条件:对所有资源排序编号,申请资源时按序号递增的顺序申请。
避免死锁的银行家算法
如果进程提出申请,如进程P1提出申请,要1,2,2的资源,先看一下这个请求向量Request=(1,2,2)不超过它实际需要的资源数Need[1]=(1,2,2),而且不超过系统中实际的可用量(3,3,2),那么就尝试把资源分配给它,然后执行安全性算法:
工作向量Work表示系统可提供给进程继续运行所需的各类资源数目,把(1,2,2)分配给P1后,发现P1可以执行完成,所以Work工作向量的变化是:
也就是说每当有一个进程完成,工作向量就加上这个进程已占有的资源数,发现最终所有需要这三种资源的进程都能执行完,也就是存在一个安全序列{P1,P3,P4,P2,P0},所以刚刚把来自P1的需求分配给它以后,系统是处于安全状态的。
死锁的检测和解除
要检测死锁需要在系统中保存有关资源的请求和分配信息,并提供能检测死锁的算法。如果在资源分配图中经过简化能消去所有的边,使所有进程结点成为孤立的结点,则当前没有产生死锁。
解除死锁,可以让死锁进程从其它死锁进程中抢占资源,以解除死锁状态;或者终止系统中的一个或多个死锁进程,以打破循环等待条件。
这篇关于操作系统课程总结(进程的描述与控制,处理机调度与死锁)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!