一 操作系统
- 操作系统定义:计算机系统中有效组织和管理计算机硬件和软件资源,合理对各类作业进行调度,方便用户使用的程序的集合
- 操作系统主要目标:①方便性,②有效性,③可扩充性,④开放性
- 操作系统作用:①作为用户与计算机硬件系统之间的接口,②作为计算机系统资源的管理者,③实现对计算机资源的抽象
- 推动操作系统发展的主要动力:解决矛盾,满足用户需要,顺应科技发展形式
- 操作系统的基本特性:①并发,②共享,③虚拟,④异步
- 并发性与并行性的区别:并发性是指在同一时间间隔内发生,并行性是指在同一时刻发生
- 并发性和共享性是OS中的最基本特征
- 衡量模块独立性。最好遵循:低耦合高内聚准则
二 单道批处理系统
- 单道批处理系统特点:①自动性,②单道性,③顺序性
三 多道批处理系统
- 多道批处理系统特点:①调度性,②多道性,③无序性
- 多道批程序设计标志着操作系统的形成标志
- 多道批处理系统
优点:①资源利用率高,②系统吞吐量大
缺点:①平均周转时间长,②无交互能力
四 分时系统
- 分时系统:在一台主机上连接了多个配有显示器和键盘的终端并由此组成的系统,该系允许多个用户同时通过自己的终端,以交互方式使用计算机,共享资源
- 分时系统的引入:满足用户对人--机交互的需求
- 分时系统特点:①多路性,②独立性,③及时性,④交互性
五 实时系统
- 实时系统:系统可以及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致的运行
- 实时系统比起分时系统,除了交互性,其他都比分时系统要更强
六 进程
- 程序顺序执行特征:①顺序性,②封闭性,③可再现性
- 程序并发执行特征:①间断性,②失去封闭性,③不可再现性
- 进程:进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
- 三种基本状态:①就绪状态,②执行状态,③阻塞状态
- 进程由创建而产生,由调度而执行,由撤销而消亡;
- 进程的5种基本状态:
- 引入挂起状态的原因:①终端用户的需要,②父进程的请求,③负荷调度的需要,④操作系统的需要
- 进程控制块(PCB):进程存在的唯一标识
- 进程同步机制:并不是是同时进行,而是让进程按一定的规则或者顺序来共享系统资源
- 同步机制遵循的规则:①空闲让进,②忙则等待,③有限等待(避免陷入“死等”状态),④让权等待(避免陷入“忙等”状态)
- 同步也是一种互斥现象,只是将进程按一定的顺序来进行,并不是同时进行
七 经典同步问题:
①互斥信号量用于实现对临界区的互斥访问,限制只有一个线程或进程可以进入临界区;而资源信号量用于限制并发访问某种资源的数量。
②互斥信号量通常只有两个状态(可用或不可用),而资源信号量可以有多个状态(根据资源的数量进行动态调整)。
一 生产者与消费者问题
将问题分成两个进程:①生产者进程,②消费者进程
通常而言:
①在每一个进程都得对互斥资源进行P,V操作,也就是说对互斥资源的P,V操作必须得在同一个进程成对出现;
②对资源信号量的P,V也得成对出现,但确是在不同的进程中成对出现
代码示例:
int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void proceducer() {
do {
producer an item nextp;
wait(empty);
wait(mutex);
buffer[in] = nextp;
in = (in + 1) % n;
signal(mutex);
signal(full);
} while (TRUE);
}
void consumer() {
do {
wait(full);
wait(mutex);
nextc = buffer[out];
out = (out + 1) % n;
signal(mutex);
signal(empty);
consumer the item in nextc;
......
} while (TRUE);
void main() {
cobegin
proceducer();consumer();
coend
}
值得注意的是:每个进程的P操作顺序不能颠倒,应执行对资源信号量的P操作,然后再来执行对互斥信号的P操作,否则会引发死锁
二 哲学家问题
解决方法:
①只允许有四位哲学家同时去拿左边的筷子
②仅当哲学家的左右两只筷子均可用时,才允许他拿起筷子进餐
③规定奇数号先拿左边的筷子,然后再去拿右边的筷子;而偶数号哲学家则相反
使用AND信号量解决哲学家进餐问题
semaphore chopstick chopstick[5] = {1, 1, 1, 1, 1};
do {
...
// think
... Sswait(chopstick[(i + 1) % 5], chopstick[i]);
..
// eat
... Ssignal(chopstick[(i + 1) % 5], chopstick[i]);
} while[TRUE];
三 读者-写者问题
允许同时读,但不允许同时写以及读,写。
解决方法:
可以有多个互斥信号量,这里设置两个互斥资源:①wmutex ②rmutex
为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。另外,再设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行Wait(Wmutex)操作。若wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。同理,仅当Reader 进程在执行了Readcount 减1操作后其值为0时,才须执行 signal(Wmutex)操作,以便让 Writer 进程写操作。又因为Readcount是一个可被多个Reader进程访问的临界资源,因此,也应该为它设置一个互斥信号量rmutex。
semaphore rmutex = 1, wmutex = 1;
int readcount = 0;
void reader() {
do {
wait(rmutex);
if (readcount == 0)
wait(wmutex);
readcount++;
signal(rmutex);
........
perform read operation;
........
wait(rmutex);
readcount--;
if (readcount == 0)
signal(wmutex);
signal(rmutex);
} while (TRUE);
void writer() {
do {
wait(wmutex);
perform write operation;
signal(wmutex);
} while (TRUE);
void main() {
cobegin reader();
writer();
coend
八 线程
- 引入线程的目的:为了减少程序在并发执行时所付出的时空开销
2.
3.
4.线程控制块:TCB
九 处理机调度
- 处理机调度层次
- 高级调度:又称为长程调度或者作业调度,调度对象为作业,功能是根据某种算法,决定将外存上处于后备队列的哪几个作业调入内存,为它们创建进程,并将他们放入就绪队列中去
- 低级调度:又称为短程调度或者进程调度,调度对象是进程,功能是根据某种算法,决定就绪队列中的哪个进程获得处理机
- 中级调度:又称为内存调度,目的:提高内存利用率以及系统吞吐量
- 处理机调度算法目标
- 处理机调度算法目标: (1)资源利用率
- 公平性
- 平衡性
- 策略强制执行
- 批处理系统目标:(1)平均周转时间短
- 面向系统:(1)系统吞吐量高
- 处理机利用率高
- 各类资源的合理利用
- 分时系统目标:(1)响应时间快
- 均衡性
- 实时系统目标:(1)截止时间的保证
(2)可预测性
十 作业调度
- 作业控制块:JCB
- 作业调度的主要任务:
①接纳多少作业:取决于多道程序度,即允许多少个作业同时在内存中同时进行,
②接纳哪些作业,取决于所采用的调度算法
一、先来先服务(FCFS)
该算法有利于长作业进行,只按作业到达的先后次序来进行调度
二、短作业优先(SJF)
以作业的长短来计算优先级,作业越短,优先级越高(值得注意的是计算的是已经到达的作业)
缺点:
①对长作业非常不利,长作业的周转时间会明显增长。并且该算法完全忽视作业的等待时间,将出现饥饿现象
②人--机交互无法实现
③未考虑作业的紧迫程度,不能保证紧迫性作业得到及时处理
- 优先级调度(PSA)
根据作业的紧迫程度来对各类作业赋予优先级
- 高响应比优先调度(HRRN)
为每个作业引入一个动态优先级:
等待时间+要求服务时间
优点权= ----------------------------------
要求服务时间
十一 进程调度
一、轮转调度算法(RR)(公平性)
- 让就绪队列的每个进程每次仅运行一个时间片。如果就绪队列有n个进程,那么每个进程每次大约都可获得1/n个处理机时间。
- 一个时间片内,没运行完的进程回到队尾
- 该调度算法保证了所有进程在一个确定的时间段内,都能够获得一次CPU的执行。
二、优先级调度算法
三、多队列调度算法
- .该算法将进程就绪队列拆分成若干个,不同的就绪队列可以采用不同的调度算法,一个就绪队列得进程可以设置不同的优先级,不同就绪队列本身也可以设置不同的优先级(但注意的是:没有明确的说明第一个队列的优先级最高,后面的次之)
四、多级反馈队列
- 设置多个就绪队列:设置多个就绪队列,并为每个队列进行优先级赋值,第一个队列的优先级最高,在优先级愈高的队列,其时间片就愈小。例如第二个队列的时间片要比第一队列的时间片长一倍(时间片长,整倍的增加)
- 每个队列使用FCFS算法:新进程进入内存后,首先是将它放在第一队列的末尾,如果该进程在第一个时间片内未完成,它将会被转入到第二队列的的末尾进行等待
- 按队列的优先级来进行调度:调度程序首先调度最高优先级队列中的进程进行执行,例如仅当第一队列空闲时才调度第二队列中的进程执行。如果处理机正在执行第i队列,但在这时又有新进程进入优先级更高的队列时,得立即将正在执行的进程放置在i队列的末尾,把处理机分配给新的高优先级队列。(抢占式调度)
五、基于公平性原则的调度算法
- 保证调度算法
- 公平分享调度算法
十二 实时调度
一、实现实时调度的四个基本条件
- 提供必要的信息
- 系统处理能力强:每个处理时间都要小于周期时间
- 采用抢占式调度机制
- 具有快速切换机制
二、实时调度算法的分类
- 非抢占式调度算法
- 抢占式调度算法:
遵守原则:①优先级原则,②短作业优先,③时间片原则
三、最早截止时间优先(EDF)
- 根据任务的截止时间确定任务的优先级,该算法既可用于抢占式(截止时间越早,越先执行)也可用于非抢占式调度方式中
四、最低松弛度优先LLF(抢占式调度方式)
- 首先任务松弛度越低就代表着任务越紧急
- 松弛度计算:必须完成时间-其本身的运行时间-当前时间
五、优先级倒置
1.现象:低优先级任务在高优先级任务之前完成
2.形成原因:临界资源竞争和任务调度算法的设计不恰当
3.解决方法:
①占有临界资源的任务,它的处理机不可以被抢占
②建立动态优先级继承,当一个低优先级的任务占用临时资源的时候,正巧这时一个需要临界资源的高优先级任务到达,而处理机这时被一个比低优先级高一级的任务占用,此时这个低优先级任务将会继承高优先级的优先级,使得这个临界资源得以释放,并且完成低优先级任务。
十三 死锁
- 产生原因:
①竞争不可抢占资源,②竞争可消耗资源,③进程推进顺序不当
二、一些基本概念:
- 可重用性资源:可供用户重复多次使用的资源(资源中的单元数目固定)
性质:
- 每一个可重用性资源的单元只能分配给一个进程使用,不允许多个进程共享
- 可消耗性资源:又称为临界资源(资源中的单元数目可以在运行期间可以变化)
三、死锁定义:一组进程的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件
四、 产生死锁的四个必要条件:
(1)互斥条件
(2)请求和保持条件
(3)不可抢占条件
(4)循环等待条件
五、 处理死锁的方法
(1)预防死锁
(2)避免死锁(最为重要)
(3)检测死锁
(4)解除死锁
六、预防死锁
(1)破坏“请求和保持”条件:当一个进程在请求资源时,他将不能持有不可抢占资源。
1)遵循两种不同协议:
①所有进程在开始执行之前,必须一次性申请其在整个运行期间过程中所需要的资源
②允许进程只获得初期所需的资源就可以运行。在运行期间在逐步释放已分配、且已用完的全部资源
(2)破坏“不可抢占”条件:当一个已经保持了某些不可抢占资源的进程,提出新的资源请求而得不到满足时,它必须释放已经保持的所有资源。
(3)破坏“循环等待”条件:对系统所有资源类型进行线性排序,并赋予不同的序号,并且规定每个进程按序号递增的顺序来请求资源。
- 避免死锁
- 系统状态:安全状态、不安全状态
- 避免死锁的实质:是系统不进入不安全状态
7.1银行家算法
- 包含的数据结构:
- 可利用资源向量Available
- 最大需求矩阵Max
- 分配矩阵Allocation
- 需求矩阵Need
Need[i.j] = Max[i,j] - Allocation[i,j]:表示进程i还需要Rj类资源才能够完成任务
- 算法步骤:
- 满足Request[i,j]<Need[i,j]
- 满足Request[i,j]<Available[j]
- 系统试探将资源分配给进程,并修改一下数据:
Available[j] = Available[j] - Request[i,j];
Allocation[i,j] = Allocation[i,j] + Request[i,j];
Need[i,j] = Need[i,j] - Request[i,j];
- 系统执行安全性算法,检查资源分配之后系统是否处于一个安全状态。
7.2 安全性算法
(1)设置两个向量:①工作向量Work,它表示系统可提供给进程继续所需的资源数目,在执行安全性算法之前,Work = Available;②Finish:它表示系统是否有足够的资源分配给进程,开始时Finish[i] = false;有足够资源分配时,Finish[i] = true;
- 从进程集合中找到一个能满足以下条件的进程:
①Finish[i] = false;
②Need[i,j]<=Work[j];
若找到则执行步骤(3),否则,执行步骤(4).
- 当进程P获得资源后可顺利执行,直至完成,并释放分配给它的资源,故需要执行:
Work[j] = Work[j] + Allocation[i,j];
Finish[ i] = true;
Go to step2;
- 如果所有的进行都满足Finish[i] = true,则代表系统处于安全状态。
- 死锁的检测与解除
8.1死锁的检测
- 资源分配图:
- 死锁定理
- 简化步骤:
①找一个既不阻塞又非独立的结点
②去除这个结点的请求边与分配边,使之成为一个孤立的结点
③如果所有进程结点都成为孤立结点,则代表着该图可完全简化;否则则称为不可完全简化
- 死锁定理:当且仅当S状态的资源分配图不可完全简化
8.2死锁的解除
- 抢占资源:从一个或多个进程中抢占足够数量的资源,分配给死锁进程
- 终止(或撤销)进程:终止(或撤销)系统中一个或多个死锁进程
十四 存储器管理
14.1存储器的层次结构
1.存储器的多层结构:
最高层:CPU寄存器,中间:主存,最底层:辅存(辅存中的数据必须复制到主存中才能被使用)
- 可执行存储器:寄存器和主存储器
- 主存储器:简称内存或者主存,用于保存进程运行时的程序和数据
寄存器:具有与CPU相同的速度,故对寄存器的访问速度最快
- 高速缓存:介于寄存器和存储器之间的存储器,主要用于备份主存中常用的数据,以减少处理机对主存储器的访问次数
- 磁盘缓存:缓和对磁盘I/O速度和对主存的访问速度之间的差异
- 局部性原理:
①时间局部性:程序中的一条指令被执行,那么一段时间之后这条指令可能会被再次执行。如果某条数据被访问,则不久之后该数据可能会被再次访问②空间局部性:一旦程序访问了某个存储单元,则不久之后其附近的存储单元也将被访问
14.2程序的装入和链接
- 用户程序要在系统中执行,必须先将它装入内存,然后再将其转变成一个可以执行的程序
步骤:编译——------------>链接——------------->装入
- 程序的装入:
- 绝对装入方式(只适用于单道程序):首先得知道程序在内存中的位置,然后在编译时就将装入模块的绝对地址改成所知道的那个地址
- 可重定位装入方式(静态可重定位):可以根据内存的具体情况将装入模块装入到内存的适当位置
(值得注意的是:采用可重定位装入方式,会使装入模块中的所有逻辑地址与实际装入内存后的物理地址不同)
重定位:在装入时对目标程序中指令和数据地址的修改过程
- 动态运行时的装入方式:装入内存中的所有地址都是一开始装入模块中的逻辑地址,程序运行时的真正地址:逻辑地址+重定位寄存器地址
- 程序的链接(形成一个装入模块)
- 静态链接方式:形成的装入模块在之后不在拆开
- 装入时动态链接:在装入内存时,边装边链接的装入方式
- 运行时动态链接:对某些模块的链接推迟到程序执行时才进行
14.3连续分配存储管理方式
(内碎片:固定分配中分配出去(能指出分配给的是哪个进程)却不能够被利用的内存空间
外碎片:动态分区分配中分配出去(不属于任何进程),但由于太小无法分配给新进程的空闲分区区域,指的是内存块与内存块之间无法利用的空闲空间)
使用紧凑可以解决碎片问题
- 单一连续分配(只能用于单用户、单任务的操作系统):存储器管理方式将内存分为系统区和用户区,系统区仅用于OS使用,用户区仅装有一道用户程序
- 固定分区分配(容易产生内碎片):将内存的用户空间划分为若干个固定大小的分区
(1)划分分区的方法:
①分区大小相等:缺乏灵活性,程序太小时会造成内存浪费,程序太大时,一个分区又不足以装入该程序
②分区大小不等:根据用户的需求来划分
- 动态分区分配(会产生外碎片):又称为可变分区分配,它是根据进程的实际需要,动态的为之分配内存空间
- 分区分配操作中的分配内存两种情况
- 回收内存的四种情况
- 基于顺序搜索的动态分区分配算法
(1)首次适应算法(FF):要求空闲分区链以地址递增的次序链接
①优点:由于倾向于优先利用低址部分的空闲分区,所以保留了高址部分的大空闲区,为以后大作业分配大的内存空间创造了条件
②缺点:由于一直划分低址部分,留下了很多外碎片
(2)循环首次适应算法(NF):在为进程分配内存空间时,不再是从链首开始寻找,而是从上次找到的空闲分区的下一个空闲分区开始查找
①优点:使得内存中的空闲分区分布更加均匀
②缺点:会缺乏大的空闲分区
(3)最佳适应算法(BF):要求把所有空闲分区按‘从小到大’的顺序来形成一条空闲分区链
①优点:避免‘大材小用’的现象
②缺点:由于每次分配之后所切割的剩余部分都是最小的,所以容易产生外碎片
(4)最坏适应算法(WF):它在为进程分配内存时总是挑选最大的空闲分区,然后从中分割一部分来为进程使用,所以它要求空闲分区以从大到小的方式来形成一条空闲分区链
①优点:使得剩余的空闲区不至于太小,不容易产生外碎片
②缺点:存储器中缺乏大的空闲分区
- 基于索引搜索的动态分区分配算法
- 快速适应算法(以空间换取时间):又称为分类搜索法,将空闲分区根据其容量大小来进行分类,对于每一类具有"相同容量"的所有空闲分区,单独设立一个空闲分区链,系统中存在着多个空闲分区链
算法步骤:①根据进程长度,在索引表中找到可以容纳它的最小空闲分区链表,②从链表中取下一块进行分配,切对空闲分区分配时不对其进行分割,所以它不会产生内存碎片。
①优点:不会产生内存碎片,查找效率高
②缺点:由于一个一个空闲分区只属于一个进程,这或多或少会有一些浪费,这是典型的以空间换取时间的做法
- 伙伴系统:该算法规定无论是已分配分区或空闲分区,其大小均为2的k次幂。
算法步骤:如果需要为进程分配长度为n的存储空间,首先得计算一个i值,使得2^(i-1)<n<=2^i,若找到则将该空闲分区分配给进程。若没有找到则将2^(i+1)分为相等的两个分区,这两个分区则称为伙伴,一个用于分配,一个加入到大小为2^(i)的空闲空闲分区链表中。若没有找到2^(i+1),则找2^(i+2),重复上述操作。
特点:一次分配可能要进行多次分割,一次回收也可能要进行多次合并。
时间性能,比快速适应算法差。空间性能,比快速适应算法强。
- 哈希算法
- 动态可重定位分区分配
- 紧凑:将内存中的所有作业进行移动,使它们全部相邻接,这样原本那些外碎片就得以拼接成一个大分区
- 动态重定位:配合装入时的动态运行时的装入方式,一开始保留在装入模块里面的是相对地址也就是逻辑地址,而在程序执行时 真正访问的内存地址是相对地址与重定位寄存器中的地址相加所得到的实际地址
(3) 动态重定位分区分配算法:与动态分区分配算法基本相同,但在该算法中增加了"紧凑"的功能
14.4对换
- 对换的概念:所谓对换是指把内存中暂时不能运行的进程或者暂时不用的程序和数据换出到外存上,一边腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据换入内存
- 对换的作用:改善内存利用率的基本措施,可以直接提高处理机的利用率喝系统吞吐量
- 对换的类型(根据每次对换时所对换的数量来进行分类):①整体对换、②页面(分段)对换
- 对换空间的管理:在具有对换功能的OS中,通常将磁盘空间分为文件区和对换区两部分
①文件区:采用离散分配方式
②对换区:采用连续分配方式
- 进程的换出与换入
- 进程的换出:
①选择换出的进程:选择处于阻塞状态或睡眠状态的进程,然后在里面选择优先级最低的进程,并且考虑进程在内存中的驻留时间
②进程换出过程:在对进程换出时,只能换出非共享的程和数据段
(2) 进程的换入:对换进程将定时的执行换入操作,在PCB中选择处于"就绪"状态但已换出的进程,并在其中选择换出到磁盘时间最久的进程
- 一般来讲对换程序不会一直运行下去,只会在进程运行时经常发生缺页且显现出内存紧张的情况下,才会启动对换程序。而在所有进程的缺页率都以明显减少,且系统吞吐量已下降时,则可暂停运行对换程序
14.5分页存储管理方式(离散分配方式)
- 分页存储管理方式:以页为基本单位,将用户程序的地址空间分为若干个固定大小的区域
- 分段存储管理方式:以段为基本单位,将用户程序的地址空间分为若干个大小不同的段
- 段页式存储管理方式:将分页和分段两种存储方式结合起来
4.分页存储管理的基本方法
- 页内碎片:由于进程的最后一页经常装不满一块,而形成了不可利用的碎片
- 页面大小应选择适中,且页面大小应是2的幂,通常为1KB~8KB
- 地址结构(考察填空题)
- 页表:系统为每个进程所建立的页面映像表,并且通过查找该表,即可找到每页在内存中的物理块号
- 页表项是页表的基本组成单位,并且页表项中记录了相应页在内存中的物理块号
- 页表作用:实现从页号到物理块号的地址映射
- 地址变换机构
①基本任务:实现从逻辑地址到物理地址的变换
②通过方法:借助页表来完成的
- 基本的地址变换机构:页表大多驻留在内存中,并且只设置一个页表寄存器PTR,在其中存放页表在内存的始址和页表的长度。并且进程要访问某个逻辑地址的数据时,是以页号为索引去索引页表,如果页号小于页表长度,则将页表始址与(页号和页表项长度的乘积)相加,以此来得到该表项在页表中的位置,并从中得到该页的物理块号。
- 具有快表的地址变换机构:
①"快表"的引入:一般来讲CPU每存取一个数据时,都需要访问两次内存。第一次访问处于内存中的页表以此来获取指定页的物理块号;第二次访问是根据所得到的物理块号来获得数据(或者写入数据)。
②快表(TLB):具有并行查寻能力的特殊高速缓存寄存器,只将少数、经常访问的页表项。若快表中存在着需要访问的页号以及所对应的页表项,则在获取数据(或写入数据)时,只需要访问内存一次。
- 访问内存的有效时间(EAT)
- 定义:从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,假设一次访问内存的时间为t
- 基本地址变换EAT = 2t
- 引入快表的地址变换EAT = α * β + [(1-α) * β + (1-α) * t] + t (α为命中率,β为查找快表所需要的时间,t为访问一次内存所需要的时间)
- 反置页表
- 反置页表的引用:减少页表占用的内存空间,一般页表的页表项是按页号来进行排序的,内容为所对应的物理块号;而反置页表是按照物理块号来进行排序,并且内容为页号和其所隶属进程的标识符。
14.5 分段存储管理方式
1.分段存储管理方式好处:①方便编程,②信息共享,③信息保护,④动态增长,⑤动态链接
2.段表:为每个逻辑段可以从物理内存中找到所对应的位置,当中的段表项记录着该段在内存中的起始位置和段的长度
14.6分段与分页的主要区别
- 页是信息的物理单位,分页仅仅是系统管理上的需要,对用户是不可见的;而段是信息的逻辑单位,分段的目的在于更好的满足用户的需要
- 页的大小且是由系统决定,而段的长度是不确定的
- 分页的用户程序地址空间是一维的,而在分段系统中,用户程序的地址空间是二维的
14.7段页式存储管理方式
- 好处:既具有分段系统的便于实现、分段可共享、易于保护、可动态链接;又具有分页系统那样,很好的解决了内存的外部碎片问题
- 原理:将用户程序分成若干个段,再将每个段分成若干个页;而段表中的存储的是页表始址和页表长度,利用段表以及页表来进行用户地址空间到物理(内存)空间的映射。
十五 虚拟存储器
- 定义:指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统
- 特征: ①多次性(虚拟存储器最重要的特征):指的是一个作业中的程序和数据无需跟传统存储器一样,运行时一次性装入内存,它可以分多次装入内存
②对换性:相对于传统存储器的常驻性,它允许作业的运行过程中对作业进行换进、换出。
③虚拟性(虚拟存储器所表现出来的最重要特征):指可以从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。值得说明的是:虚拟性是以多次性和对换性为基础的
- 虚拟存储器的实现方法(都是建立在离散分配存储管理方式的基础之上)
- 分页请求系统:在分页系统的基础上增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统
- 请求分段系统:在分段系统的基础上,增加请求调段及分段置换功能后所形成的段式虚拟存储系统
- 请求分页存储管理方式
- 请求页表机制:主要的数据结构是请求页表,
- 缺页中断机构:每当所要访问的页面不在内存中时,便会产生缺页中断。而缺页中断是一种特殊的中断:①在指令执行期间产生和处理中断信号
②一条指令在执行期间可能产生多次缺页中断
- 请求分页中的内存分配(随着为每个进程分配的物理块数目的减少,缺页率将会上升)
- 固定分配局部置换(自给自足):进程运行时发现缺页时,需要再分配给进程中选择一页进行换出,然后再调入一页,以此来保证分配给该进程的内存空间不变
- 可变分配全局置换(使用OS中空闲的物理块进行分配):进程运行期间发生缺页时,从OS中的空闲物理块中选择一个进行调入
- 可变分配局部置换:当进程发生缺页时,允许从内存中选择一页换出,如果频繁发生缺页中断,则分配若干个物理块
- 先进先出(FIFO):会发生"抖动"现象,所谓抖动是指同时运行的进程太多,由此分配给每个进程的物理块太少,不能满足正常运行的基本要求,频繁发生缺页现象