操作系统知识复习 2011.05.02
多道程序设计(multiprogramming): 宏观并行,微观串行
多重处理(multiprocessing): 宏观并行,微观并行
并发:若干事件在同一个时间间隔内发生(参考RR轮转法)
进程:进程是程序的执行过程,是独立分配资源的基本单位
进程控制块PCB(process control block):包含进程的描述信息,控制信息,资源信息
上下文(context):一种属性的有序列,为驻留在环境内的对象定义环境。对象的激活过程中创建上下文,对象被配置,多个对象可在同一个上下文内。
进程上下文:进程在执行过程中顺序关联的静态描述
上文:已经执行过 的 进程指令和数据在寄存器和堆栈的内容称
正文:正在执行 ……
下文:待执行 ……
进程上下文的提出 为了 进程上下文切换,就是在进程并发的时候,进程切换前后要保存和恢复该进程的状态,如保存恢复寄存器状态。
进程互斥:
临界区:不允许并发的进程同时对其进行操作的程序区域。(书本上是说不允许进程交叉执行)
互斥准则:①公平竞争 ②有空让进 ③唯一进入 ④有限等待
互斥加锁法:缺点,不能保证准则③,在key发生变化前,多个进程拿到进入权限
信号量和p,v原语:(注意:在p,v原语执行期间不允许中断的发生)
信号量:semaphore['semə,fo]:缩写sem
当sem>=0,sem为可供并发进程使用的实体数
当sem<0,sem为正在等待的进程数
p原语:①sem减一 ②若sem-1 >= 0,p原语返回,进程继续执行 ③若sem-1 < 0,进程进入等待队列,最后转进进程调度
v原语:①sem加一 ②若sem+1 > 0,v原语返回,进程继续执行 ③若sem-1 <= 0,在等待队列中唤醒一个等待进程,再返回原进程继续执行或进行进程调度
进程同步:想想打印进程和打印机共同使用一个缓冲区的情况,打印进程要等待缓冲区空时候才会计算要打印的东西,计算后缓冲区满,打印机要缓冲区满时候才会开始打印,打印后缓冲区空。
进程死锁条件:①互斥条件 ②不剥夺条件 ③部分分配 ④环路条件
解决死锁:①一次性分配 ②资源顺序分配 ③先释放,后申请
线程:在进程的一部分,是CPU调度的一个基本单位,减少调度切换时间,提高效率
线程和其他在同一个进程的线程共享进程的资源,进程拥有一个完整的虚拟地址空间。
线程分类:用户级线程(user-level threads)调度算法和过程全部由程序员自己决定,只进行线程上下文切换而不进行处理机切换,由于用户级线程的上下文切换和内核无关,所以进程的状态是阻塞或等待,线程状态可能还是执行的。
内核级线程(kernel-level threads)由系统内核管理,程序员可以通过系统调用和APC来对其操作,它们会被调度到一个处理机上并发进行,在执行状态时候不会出现阻塞或等待状态。
进程调度:①记录系统中所有进程的执行情况 ②选择占有处理机的进程
③进行进程上下文切换
调度算法:
FCFS先来先服务法
RR轮转法,平均分配时间片
OPT优先级调度法
SRR(selfish round robin)线性优先级调度策略
SJF最短作业优先法
SRTF抢占法(只要比当前剩余时间短则抢占)
HRN最高相应比优先法(响应比R=(W+T)/T,其中W是等待时间,T是执行时间)
其中FCFS不利于短作业,SJF处理个数多,可有的作业等待时间过长,HRN在两者之间。
存储管理
存储器由内存(primary storage)和外存(secondary storage)组成。
虚拟存储器(Virtual Memory or Virtual Store):进程中目标代码、数据等的虚拟地址组成的虚拟空间。
地址重定位、地址映射:将逻辑的地址转换为实际的物理地址。
静态地址重定位(static address relocation):程序自行之前就做好地址的映射工作,优点:不需要硬件支持,缺点:无法实现虚拟存储器,必须占用连续的内存空间,程序和数据难以共享。
动态地址重定位(dynamic[dai'næmik] address relocation):在程序执行过程中计算实际的物理地址(实际地址=基址+偏移),要一对硬件寄存器支持,实现虚拟存储器的基础,可以对内存进行非连续分配,有利于程序段的共享。
内存信息保护:①上下界保护法:设定上下界,产生访问地址越界中断
②保护键法:分配保护键作为开关来保护存储块,产生访问地址出错中断
分区存储管理:
优点:多个进程对内存的共享,有利于多道程序设计,硬件支持小,算法简单
缺点:效率不高,碎片影响利用率,进程大小受分区控制,分区之间无法信息共享
①固定分区法:一次分区,分区结束后整个执行过程分区将不会发生改变,缺点:浪费
②动态分区法:按照作业调度次序分区,3种方法
a 最先适应法(first fit algorithm),尽可能地用了低地址,速度快,开销小
b 最佳适应法(best fit algorithm),由小到大排序,找刚合适的,会留碎片
c 最坏适应法(worst fit algorithm),由大到小排序,找最大的,尽量不留碎片
覆盖技术:在同一个进程中进行
把不需要同时执行的程序段放在共享的内存区中,要程序员写出覆盖结构。下面为程序的调用关系例如A(20K)调用B(50K)或C(30K),就选B和C之间最大的大小做覆盖区大小,则占用大小为20+50=70K
交换技术:在不同进程中进行
就是把在等待状态的进程的数据一部分换出内存交换区(swap out),让外存的要使用的数据换入内存交换区(swap in)。只是由操作系统自己完成的。
页式存储管理:
优点:有效解决碎片为题,提供内外存统一管理的虚拟实现方式,主存利用率高,扩大主存
缺点:要硬件支持,增加系统开销如缺页中断处理,消除了碎片,进程最后一页没利用
把进程的虚拟内存空间划分为长度相等的页(page)
把内存空间按页的大小划分为帧(page frame)
上图:页长为1K,拥有1024页的控件地址结构
静态页式管理:在进程开始执行前,把进程的程序段和数据全部装入内存的各个页面中
组成:a 页表(page mapping table):页号 和 页面号
b 硬件地址变换机构
地址变换:2次寻址
例如:(页号,页面号)={(0,2), (1,3), (2, 8)},每个页面长度为1K,指令MOV [2500],4 的虚地址为100,整个寻址过程为
①由虚地址为100 ——》 第0页,第100个单元 ——》页面号为2,则2*1K+100 = 2148
在物理地址2148找到了这条指令
②2500/1K = 2 余 452 ——》 所在的页号为2,第452个单元 ——》 页面号为8,则1K*8+452 = 8644
物理地址8644 就是[2500] 的地址,就是说把4这个数据放到8644物理地址上
优点:解决了分区管理的碎片问题 缺点:进程大小受内存可用页面数的限制
展望:高速联想存储器
动态页式管理:只装入反复执行和调用的工作区部分,请求页式管理和预调入页式管理
通过加上一个中断处理(终端位)来确认该页是否在外存中,和加上一个外存副本起始始址,再加上一个改变位,如果在调入内存的数据没有改变,那么就不用回调跟新外存副本了。
(页号,页面号,中断位,外存始址,改变位)
如果页面之间的调出调入非常频繁,产生抖动(thrashing)现象
缺页中断:硬件变换机构发现页面不在内存中,发出的中断。
置换算法:
①随机淘汰算法,在根本无法预测页面访问频率时候,随机换出在内存中的页面
②FIFO:先换进,先换出,Belady现象:分配的页面数目增多,反而去也中断率增加
因为没有考虑程序执行的动态特征
③RR轮转法:按时间换出
FIFO和RR的内存利用率不高,因为可能有的页面虽然存在时间长了,但是会访问频繁。
④LRU(last recently used)最近最久未使用,难以实现,巨大系统开销
⑤LFU(last frequently used)最不经常使用,要淘汰时候,淘汰上次淘汰到现在使用计数最小的页面,每次计数器清零。
⑥NUR(no used recently)最近没使用,要淘汰时候,淘汰上次淘汰到现在最近没有被使用的页面,通过标志确定,每次都清标志
⑦OPT(optional replacement algorithm)理想淘汰算法,无法实现,进程往往是无法预测的
存储保护:①地址越界保护 ②页表控制内存操作保护
段式管理:
优点:每次交换的是一段有意义的信息,段长动态增长,具有对立逻辑的段可共享
缺点:硬件支持,高系统开销,碎片管理比页式差,段长度收内存可用区限制,可能抖动
由于分区式管理和页式管理时,进程地址空间都是线性的,所以要在编译链接的时候,把程序中的各个区域按现行空间排列起来,所以不同进程之间共享公用子程序和数据困难。
按过程(函数)分段,每段有自己的名字。
其实段式管理和动态页式管理差不多,就是段长可以变化,动态增长的,每个段对应一个模块module。
段页式管理:
段式管理方便,可共享,页式管理可以很好的克服碎片,提高存储器利用率。两者结合,虽然会带来很大的开销,但是贵在值得。
(段号,页号,页內对应地址)
通过段号找到段表,通过段表找到对应的页表,再在页表中找到页面号码,算出物理地址
共三个阶段查找。
Windows 内存管理机制:
①x86体系的处理器,页大小一般为4KB,预留机制让程序尽量得到连续虚拟地址空间
②一个进程对共享内存进行修改,为了不对共享数据产生影响,都是先把要修改的地方拷贝一份,然后这个进程再对拷贝的那一份修改,而且拷贝的那一份成了这个进程的私有页面。
这就是“拷贝后写入”的共享内存机制,同一块物理地址在不同进程空间中映射。
③堆管理,内存申请是以页(4KB)为单位的。如果要申请的内存较小时候,可以使用堆管理器管理,对于win32系统,堆管理器的内存分配 粒度可以小到8字节,每个进程都有一个进程堆,进程创建时候缺省分配1MB的进程堆空间,系统视情况动态增加进程堆空间。
④系统内存池,一些内核服务和驱动常驻内存,所以有一个不分页的内存池为服务分配内存而且还不会调到外存去,驱动例外,要通过内核模式来访问这些空间。