操作系统学习笔记
死锁与饥饿
相同点
都是由于竞争资源引起
不同点
1.死锁是由于两个或以上的进程在竞争资源的过程中,二者互相等待永远不会被释放的资源;而饥饿则是等待会被释放但是永远不会分配给自己的资源。
2.死锁是系统循环等待产生的,而饥饿是由于系统调度的策略问题导致(比如在进程调度的短作业优先算法中,长作业可能永远都会被调度,故发生饥饿)。
3.在饥饿的情况下,系统仍然可以继续运行,只是有进程永远得不到执行机会;而在死锁的情况下, 如果不及时处理的话,系统会陷入死锁甚至崩溃。
4.死锁进程至少有两个或以上,饥饿进程则可能只有一个。
处理机调度的时机
在以下情况下,不应切换进程:
1.当前进程(假设为进程A)运行于临界区时,当时间片结束后,调度就会发生,选取就绪队列中的进程(假设为进程B),若进程B刚好与进程A竞争该临界资源,则进程B会阻塞,是无法切换的。进程在操作系统内核程序临界区中是不能调度进程的。内核程序临界区一般是用来访问某种内核数据结构的(如进程的就绪队列)。对于内核程序访问的临界资源如果不尽快释放的话,会影响内核其他功能,因此在访问内核程序临界资源时,不能进行进程调度。
在访问普通的临界资源时,并不存在上述情况。
2.处理机处于处理中断的过程中。
3.某些需要完全屏蔽中断的原子操作过程中。如加锁,解锁,中断现场保护,恢复等。
在以下情况中,应切换进程:
1.发生引起调度的条件且当前进程无法运行下去。(非剥夺调度)
2.中断处理结束或者自陷(trap)处理结束后,返回被中断进程的用户态程序执行现场前,若请求调度标志有效,即可进行调度。(剥夺调度)
临界区
临界区是指每个进程中都有一段代码,这段代码是访问某个临界资源(临界资源是一次仅允许一个进程使用的共享资源)的。
在支持多个进程或线程的系统中,每个进程都有一个临界区,假设这些临界区是访问同一个临界资源的(相关临界区)。
多个进程只有一个能进入自己的临界区,当某一个进程进入自己的临界区时,其余想进入自己临界区的进程是不被允许的,必须等待。
进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
页式存储管理
用户程序要转变为一个可以执行的程序:编译(由编译程序将对源程序进行编译,形成若干目标模块)—>链接(链接程序将目标模块及其库函数连接在一起,形成一个完整的装入模块)—>装入(装入程序将装入模块装入内存)。
链接(形成逻辑地址)
1)静态链接
在程序运行之前进行链接。
2)装入时动态链接
装入内存时链接。
3)运行时动态链接
需要运行时链接。便于修改和更新,便于共享。
装入(形成物理地址)
1)绝对装入
编译后即产生物理地址。
缺点:只能将目标模块装入到指定的位置。只适用于单道程序环境。
2)可重定位装入(静态重定位)
在装入的时候,将逻辑地址转换为物理地址。可以根据内存的具体情况将装入模块装入的内存的适当位置。
缺点:不允许程序运行时在内存中移动位置(装入时所有位置已经确定,如果程序的位置改变,其存储的数据等位置也会改变,如果仍然按照之前的位置访问的话,就会出错)。
3)动态运行时装入(动态重定位)
在执行时才将逻辑地址转换为物理地址(一开始装入内存时所有地址仍是逻辑地址)。
适用于绝对装入的存储管理方案:单用户连续分配
适用于静态重定位的存储管理方案:固定分区(作业装入后其位置不再移动,动态分区、分页、分段在装入后程序的位置可能会改变)。
适用于动态重定位的存储管理方案:页式存储、段式存储、段页式存储。
地址变换
每个进程都有一个页表,且页表常驻内存。在进程的PCB中存放着自己的页表的内存始址和页表长度。系统中有一个寄存器:页表寄存器(PTR),其中存放当前执行进程的页表始址和页表长度。当进程被调度时,将这两个数据放入寄存器中。
逻辑地址转换为物理地址的过程:取逻辑地址的页号与页表寄存器的长度进行比较,如果页号大于或等于页表长度(页号从0开始),则发出地址越界中断。如小于,则将页表始址与页号和页表项长度的乘积相加,得到该表项在页表的位置,于是可从中得到该页的物理块号(第一次访存),将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中,与物理块号拼接,得到物理地址,然后访问该地址获得数据(第二次访存)。
多级页表
在分页管理中,由于每个进程都需要页表来管理其页面,有时候如果页面大小比起进程的大小来说太小的话,那么一个进程会被分为很多很多的页面,导致需要管理这些页面的页表也会很大,而页表一般是需要连续存放的,这就违背了分页存储的离散存储这一特点;系统调入进程将进程的页表调入内存,但实际上,进程的执行并不需要所有的页,而进程的庞大的页表中很多页表项都是不需要的。引入多级页表后,将每一部分页表映射到上一级页表,系统只需要将一部分页表调入内存即可。
在二级页表中,每个一级页表中的页表项对应一个二级页表,二级页表中的一个页表项对应内存空间中的一个物理块。
顶级页表(一级页表)只能有一页。
各级页表的大小是不能超过一个页面的大小的。也就是说,当某个页