}
signal(s){ //释放资源 s=s+1; }
整型信号量的互斥:初始变量为1 整型信号量的协调:初始变量为0
总结:1)整型信号量的值只能由wait和signal操作改变
2) 3) 4) 5)
wait和signal的操作都是原子操作,即在这两个操作中对信号量的访问是不能被中断的
原子操作可以通过关中断来实现
整型信号量机制的实例:linux中的自旋锁SpinLock
不同的资源对应不同的信号量,并不是系统中所有资源都用同一个信号量标识
二、 记录型信号量机制: 代码:
Type semaphore = record Value : integer; //资源数量 L : list of process; Procedure wait(s)
Var s : semaphore; Begin
s.value = s.value-1; //申请资源
if s.value <0 then block(s.L) //此时资源无,自我阻塞进入阻塞队列 end
procedure signal(s)
var s:semaphore; begin
s.value=s.value +1;
//释放一个资源
if s.value <=0 then wakeup(s.L); //释放后发现还有阻塞,则唤醒阻塞中
//阻塞队列
的进程
end
记录型信号量的优点是不存在「忙等」,采取了「让权等待」的策略 三、 AND型信号量的机制
基本思想是将进程在整个运行过程中所需要的所有资源一次性的全部分配给进程,待进程使用完之后再一起释放。只要还有一个资源不能分配给该进程,其他所有可能为之分配的资源也不分配给它。
管程:管程是描述共享资源的数据结构和在数据结构上的共享资源的管理程序的集合
进程通信:进程之间的高级通信机制分为:共享存储器系统、消息传递系统、管道通信系统。
线程:在操作系统中,进程是进行资源分配和独立执行的基本单位,为了进一步提高程序的并发性,减少系统开销,在操作系统中引入了线程的概念。 线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程在运行中存在间断性,也有就绪、执行、阻塞三种形态。
第三章:进程调度与死锁
进程调度的功能是按照某种策略或算法从就绪态进程中为当前空闲的cpu选择在其上运行的新进程。
选择调度方式和算法的若干准则: 1)
周转时间短 周转时间是指从作业被提交给系统开始,到作业完成为止 系统的平均周转时间T等于N各作业的周转时间之和除以n T=(t1+t2+t3+…+tn)/n
作业的周转时间T与系统为它提供的服务时间TS之比为W,W=T/TS,被称为带权周转时间,那么n个作业的平均带权周转时间为: T=(t1/ts1+t2/ts2+…+tn/tsn)/n
服务时间Ts是一个作业在CPU上执行的总时间 2) 响应时间快
响应时间是指从用户提交一个请求开始直至系统首次产生
截止时间是指某个任务必须开始执行的最迟时间,或必
响应的时间为止的一段时间 3)截止时间的保证 须完成的最迟时间 4) 系统吞吐量高 5)处理机利用率好 ? 调度算法:
1) 先来先服务(FCFS)从就绪列的队首选择最先到达就绪队列的进程,FCFS适合长进程,不利于短进程,适合CPU繁忙性进程,不适合IO繁忙性进程。
2) 3) 4)
短进程优先调度算法(SPF)短进程优先算法能有效降低进程的平均等待时间,提高系统的吞吐量
优先调度算法(PSL) 类型:非抢占式优先权调度算法、抢占式优先权调度算法;优先权的类型:静态优先权和动态优先权 时间片轮转调度算法(RR)
时间片大小的确定考虑的因素:
1系统对响应时间的要求,响应时间越短,时间片取值应该越小。 ○
2就绪队列中进程的数目 ○
3系统的处理能力 ○
5) 多级队列调度 不同的队列优先权不同,调度算法也可能不同。 6) 多级反馈队列调度 队列优先权越高,时间片越短,时间片通常成倍增长 实时系统中的调度:
基本条件:1)提供必要的调度信息2)系统处理能力强3)采用抢占式调度机制4)具有快速切换机制
常用的调度算法:1)最早截至时间优先(EDF) 2)最低松弛度优先(LLF) 多处理器调度:
多处理器系统的类型:紧密耦合、松弛耦合、对称处理器系统、非对称处理器系统
进程调度方式:1)自调度2)成组调度3)专用处理器分配
自调度:采用自调度的系统中有一个公共的就绪队列,任何一个空闲的处理器都可以从该就绪队列中选择一个进程或者一个线程运行。在多处理器环境下,FCFS是较好的自调度算法
自调度优点:1)易移植 2)有利于提高CPU的利用率 缺点:1)瓶颈问题 2)低效性 3)程序切换频繁
? 死锁:死锁是由多个进程竞争共享资源而引起的进程不能向前推进的僵死状
态
产生死锁的原因:竞争死锁资源且分配资源的顺序不当
产生死锁的必要条件:1)互斥2)请求保持3)不剥夺4)环路等待 S为死锁的充分条件是:当且仅当S状态的资源分配图是不可完全简化的 处理死锁的方法:预防死锁、避免死锁、检测并解除死锁和忽略死锁
死锁的避免:资源分配的状态分为安全状态和不安全状态,不安全状态不一定产生死锁,但是系统进入安全状态以后,就可以避免死锁的产生,所以避免死锁的实质在于使系统处于安全状态。
银行家算法:
基本思想:一个进程提出资源请求后,系统进行资源的试分配。然后检测此次分配是否处于安全状态,若安全则按分配方案分配资源,否则不分配资源。 试分配过程: available[] 可用数量 max[] 最大数量
allocation[] 已分配的资源数 need[] 还需要某资源的数量 1, 1) 2) 3)
先进行试分配 request i <= need i request i <= available i available = available –request i allocation = allocation + request i need i = need i – request i 然后安全检测 wrok[] = available finish[] = false
1当need I <= work时,work = work +allocation I finish [] =true ○
2若对于所有的finish[] =true都成里,则说明处于安全状态 ○
满足上述条件进行试分配
第四章:内存管理
内存管理的目标:1)实现内存分配、内存回收等操作 2)提高内存利用率和内存的访问速度(即充分利用现有的内存资源,为应用程序提供方便的内存使用方式和一个快速、安全且充分大的存储器) 程序的链接和装入:
链接要解决的问题是将编译后的目标模块装配成一个可执行程序,分为静态链接和动态链接。
1) 静态链接:在程序运行前,用链接程序将目标模块链接成一个完整的装入模块,任务:一时对逻辑地址进行修改,二是变换外部调用符号 优点:运行速度较快 缺点:可执行文件较大,占用空间大,系统开销大,程序开发不够灵活,修改一个模块会导致整个程序重新链接
2) 动态链接:可将某些目标模块的链接推迟到这些模块中的函数要被调用时再进行。优点:节省内存和外存空间,方便程序开发。缺点:增加了运行的时间开销,使程序运行时的速度变慢。
程序装入:
装入方式:绝对装入方式、可重定位装入(静态装入方式)和动态运行时装入方式
绝对装入方式:编译程序已知程序在内存中的位置,编译时产生物理地址的目标代码,装入程序按照装入模块的物理地址将程序和数据装入内存
可重定位装入方式:编译时不知道程序在内存中的位置,那么编译时就必须生成可重定位的代码,其中的地址都是逻辑地址,在程序装入内存时,再把逻辑地址映射为物理地址。程序装入时对目标程序中的指令和数据地址修改的过程称为重定位。
静态装入方式的特点:1)编译程序使目标模块的地址从0开始 2)程序装入时,装入程序根据内存的使用情况将装入模块装入到内存的某个位置,并对模块进行重定位。物理地址=有效逻辑地址+程序在内存中的起始地址
动态运行时装入:当一个进程在被换出之前的内存地址与后来被从外存调入时所在的内存位置不同,这时,地址映射延迟到进程执行时再进行 ? 连续分配的存储管理方式:
类型:1)单一连续区分配方式2)固定分区分配方式 3)动态分区分配方式 单一连续区分配方式:适用于单用户单任务系统,内存分为系统区和用户区 固定分区分配方式:将用户内存空间分配成若干固定大小的区域,每一个区域运行一道用户程序;分区的数量是固定的,大小也是固定的
每个分区大小相等的分配方式缺点是内存利用率比较低,主要用于一个计算机去控制多个相同对象的场合,如冶炼炉 分区大小不等:可以更好的利用内存
分区结构:分区编号,分区大小,分区起始地址,分区状态 在一些实时系统中,固定分区的分配方式还是简单而有效的。 动态分区分配方式:用户分区的数量和大小都是动态变化的