四级网络工程师笔记-操作系统(中)

  • 前言:
  • 系列博文
  • 第四章 并发与同步
    • 1. 进程同步与进程互斥
    • 2. 进程互斥解决方法
    • 3. 资源共享 3 个层次
    • 4. 相互感知度划分:
    • 5. 临界资源的访问过程
    • 6. 进程同步机制准则
    • 7. 进程互斥的硬件方法
    • 8. 硬件方法优缺点
    • 9. 信号量
    • 10. PV 操作
    • 11. PV 处理过程
    • 12. 前趋关系
    • 13. 管程
    • 14. 解决进程通信 3 类方案
  • 第五章 内存管理
    • 1. 存储体系构成
    • 2. 存储保护
    • 3. 静态重定位
    • 4. 动态重定位
    • 5. 分区存储管理
    • 6. 空闲分区的分配策略
    • 7. 分区的回收 4 种可能
    • 8. 覆盖技术
    • 9. 交换技术
    • 10. 页式存储管理
    • 11. 存储空间的分配与回收
    • 12. 页式存储管理的地址转换
    • 13. 页表
    • 14. 快表
    • 15. 虚拟存储器
    • 16. 页表增加项
    • 17. 缺页中断
    • 18. 页面调度 3 个策略
    • 19. “抖动” 现象
    • 20. 先进先出页面置换算法(First-In First-Out,FIFO)
    • 21. 最近最少使用页面置换算法(Least Recently Used,LRU)
    • 22. 举例说明页面置换算法
    • 23. 贝莱迪异常
    • 24. 缺页中断率
    • 25. 虚拟存储管理的性能问题
    • 26. 段式存储管理
    • 27. 页表项内容
    • 28. 页式分配的优点
    • 29. 请求分页的外存
    • 30. 内存管理方案
    • 31. 管理空闲内存方法
    • 32. 程序局部性
    • 33. 移动技术
    • 34. 链接
    • 35. 页式存储管理

前言:

作者在CSDN博客上开通了[网络工程师]专栏,目的在于激励自己坚持学习。由于是初次进行博客创作、经验不足、可能比较粗糙,如有错漏之处希望大家能够指正、也欢迎大家一起交流学习。

如需查看完整学习博文(笔记)请点击 [网络工程师] 进行查看

系列博文

1、四级网络工程师和四级信息安全工程师考试须知与学习方法

2、四级网络工程师笔记-操作系统(上)

3、四级网络工程师笔记-操作系统(中)

4、四级网络工程师笔记-操作系统(下)

5、四级网络工程师笔记-计算机网络(上)

6、四级网络工程师笔记-计算机网络(中)

7、四级网络工程师笔记-计算机网络(下)

第四章 并发与同步

1. 进程同步与进程互斥

⚫ 进程同步:指多个进程中发生的事件存在某种时序关系,必须协同动作,相互配合,以共同完成一个任务。

⚫ 进程互斥: 指由于共享资源所要求的排他性,进程间要相互竞争,以使用这些互斥资源。

2. 进程互斥解决方法

进程互斥的解决有两种做法:一是由竞争各方平等协商;二是引入进程管理者,由管理者来协调竞争各方对互斥资源的使用。

3. 资源共享 3 个层次

⚫ 互斥( MutualExclusion):保证资源的互斥使用是指多个进程不能同时使用同一个资源,这是正确使用资源的最基本要求;

⚫ 死锁( Deadlock):避免死锁是指避免多个进程互不相让,避免出现都得不到足够资源的情况,从而保证系统功能的正常运行;

⚫ 饥饿( Starvation):避免饥饿是指避免某些进程一直得不到资源或得到资源的概率很小,从而保障系统内资源使用的公平性。

4. 相互感知度划分:

相互感知的程度 交互关系 一个进程对其他进程的影响 潜在的控制问题
相互不感知(完全不了解其他进程的存在) 竞争(Competition) 一个进程的操作对其他进程的结果无影响 互斥、死锁、饥饿
间接感知(双方都与第 3方交互,如共享资源) 通过共享进行协 一个进程的结果依赖于从 其他进程获得的信息 互斥、死锁、饥饿
直接感知(双方直接交互,如通信) 通过通信进行协作 一个进程的结果依赖于从其他进程获得的信息 死锁、饥饿

5. 临界资源的访问过程

● 进入区( Entry Section):为了进入临界区使用临界资源,在进入区要检查可否进入临界区;如果可以进入临界区,通常设置相应的“ 正在访问临界区” 标志, 以阻止其他进程同时进入临界区。

● 临界区(Critical Section): 进程中访问临界资源的一段代码。

● 退出区(Exitt Section): 将“ 正在访问临界区” 标志清除。

● 剩余区(Remainder Section): 代码中的其余部分。

6. 进程同步机制准则

⚫ 空闲则入:任何同步机制都必须保证任何时刻最多只有一个进程位于临界区。当有进程位于临界区时,任何其他进程均不能进入临界区。

⚫ 忙则等待:当已有进程处于其临界区时,后到达的进程只能在进入区等待。

⚫ 有限等待:为了避免死锁等现象的出现,等待进入临界区的进程不能无限期地“ 死等”。

⚫ 让权等待:因在进入区等待而不能进入临界区的进程,应释放处理机,转换到阻塞状态,以使得其他进程有机会得到处理机的使用权。

7. 进程互斥的硬件方法

目前,在平等协商时通常利用某些硬件指令来实现进程互斥。硬件方法的主要思路是用一条指令完成读和写两个操作,因而保证读操作与写操作不被打断。依据所采用的指令的不同,硬件方法分成 TS 指令和 Swap 指令两种。

⚫ TS(Test-and-Set)指令

TS 指令的功能是读出指定标志后把该标志设置为 TRUE。TS 指令的功能可描述成下面的函数。

Boolean TS (Boolean * lock) {Boolean old;old=*lock;lock=TRUE; return old;}

利用 TS 指令实现的进程互斥算法是,每个临界资源设置一个公共布尔变量 lock,表示资源的两种状态: TRUE 表示正被占用, FALSE 表示空闲, 初值为 FALSE。在进入区利用 TS 进行检查和修改标志 lock。有进程在临界区时,重复检查,直到其他进程退出时检查通过。所有要访问临界资源的进程的进入区和退出区代码是相同的。

TS 指令实现互斥的算法是:

① 测试锁变量的值,如为 1,则重复执行本命令,不断重复测试变量的值;

② 如为 0,则立即将锁变量测值置为 1,进入临界区;

③ 测试并设置指令是一条完整的指令,而在一条指令的执行中间是不会被中断的,保证了锁的测试和关闭的连续性;

④ 退出临界区时,将锁变量测试值设为 0。2)Swap 指令(或 Exchange 指令)

Swap 指令的功能是交换两个字( 字节) 的内容。可用下面的函数描述 Swap 指令的功能。

Void SWAP(int*a, int*b){Int temp;temp=*a; *a=* b;*b =temp;}

利用 Swap 指令实现的进程互斥算法是, 每个临界资源设置一个公共布尔变量 lock,初值为 FALSE;每个进程设置一个私有布尔变量 key,用于与 lock 间的信息交换在进入区利用 Swap 指令交换 lock 与 key 的内容,然后检查 key 的状态;有进程在临界区时, 重复交换和检查过程, 直到其他进程退出时检查通过。

8. 硬件方法优缺点

使用硬件方法实现进程互斥,

  1. 优点有以下几个方面:

⚫ 使用范围广:硬件方法适用于任意数目的进程,在单处理器和多处理器环境中完全相同;

⚫ 简单:硬件方法的标志设置简单、含义明确,容易验证其正确性;

⚫ 支持多个临界区:在一个进程内有多个临界区时,只需为每个临界区设立一个布尔变量;

  1. 其缺点有:

⚫ 进程在等待进入临界区时,要耗费处理机时间,不能实现“让权等待”;

⚫ 由于进入临界区的进程是从等待进程中随机选择的,有的进程可能一直选不上,从而导致“饥饿”。

9. 信号量

信号量是由操作系统提供的管理公有资源的有效手段。信号量代表可用资源实体的数量。属于低级通信方法

⚫ empty 信号量表明的是空闲资源数目;

⚫ full 信号量表明的是满的资源数目;

⚫ mutex 信号量用于实现互斥访问。

10. PV 操作

  1. PV 操作由P 操作原语和V 操作原语组成(原语是不可中断的过程)对信号量进行操作。

⚫ P(S):将信号量 S 的值减 1,即 S=S-1;如果 S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

⚫ V(S):将信号量 S 的值加 1,即 S=S+1;如果 S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

2) 优点:

P、V 原语的执行, 不受进程调度和执行的打断, 从而很好地解决了原语操作的整体性。

3) 缺点:

⚫ 一个信号量只能置一次初值,以后只能对之进行 P 操作或 V 操作。信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。

⚫ 核心操作 P-V 分散在各用户程序的代码中,不易控制和管理;一旦错误,后果严重,且不易发现和纠正。

11. PV 处理过程

依据对临界区访问过程的分析,信号量机制中 P 原语相当于进入区操作, V 原语相当于退出区操作。下面来分析操作系统对这两个原语操作的处理过程。

⚫ P 原语所执行的操作可用下面函数 wait(s)来描述。wait(s)

{

​ – s.count;//表示申请一个资源If (s.count <0)//表示没有空闲资源

​ {

​ 调用进程进入等待队列 s.queue; 阻塞调用进程;

​ }

}

⚫ V 原语所执行的操作可用下面函数 signal(s)来描述。

signal(s)

{

++s.count; //表示释放一个资源if(s.count<=0)//表示有进程处于阻塞状态

​ {

​ 从等待队列 s.queue 中取出头一个进程 P;

​ 进程 P 进入就绪队列;

​ }

}

⚫ 利用操作系统提供的信号量机制,可实现临界资源的互斥访问。

⚫ 在使用信号量进行共享资源访问控制时,必须成对使用 P 和 V 原语。

⚫ 遗漏 P 原语则不能保证互斥访问,遗漏 V 原语则不能在使用临界资源之后将其释放给其他等待的进程。

⚫ P、V 原语的使用不能次序错误、重复或遗漏。

12. 前趋关系

利用操作系统提供的信号量机制可实现进程间的同步,即所谓的前趋关系。

13. 管程

⚫ 一个管程是一个由过程、变量及数据结构等组成的集合,它们组成一个特殊的模块或软件包。

⚫ 进程可在任何需要的时候调用管程中的过程,但它们不能在管程之外声明的过程中直接访问管程内的数据结构。

⚫ 一个管程由 4 个部门组成:管程名称,共享数据的说明,对数据进行操作的一组过程和对共享数据赋初值的语句。

⚫ 管程能保障共享资源的互斥执行。

⚫ 为了保证管程共享变量的数据完整性,规定管程互斥进入;

⚫ 进程间同步关系:一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作, 这组操作能同步进程和改变管程中的数据。

⚫ 任意时刻管程中只能有一个活跃进程, 这一特性使管程能有效地完成互斥。

14. 解决进程通信 3 类方案

解决进程之间的大量信息通信的问题有 3 类方案:共享内存、消息机制以及通过共享文件进行通信,即管道通信。

1) 共享内存

在相互通信的进程之间设有一个公共内存区,一组进程向该公共内存中写,另一组进程从公共内存中读,通过这种方式实现两组进程间的信息交换。

2) 消息机制

进程在运行过程中,可能需要与其他的进程进行信息交换,于是进程通过某种手段发出自己的消息或接收其他进程发来的消息。

⚫ 消息缓冲区通信机制

① 消息缓冲区,这是一个由消息长度、消息正文、发送者、消息队列指针组成的数据结构。

② 消息队列首指针 m_q,一般保存在 PCB 中。

③ 互斥信号量 m_mutex,初值为 1, 用于互斥访问消息队列, 在 PCB 中设置。

④ 同步信号量 m_syn,初值为 0, 用于消息计数, 在 PCB 中设置。

为实现消息缓冲通信, 要利用发送消息原语(send)和接收消息原语( receive)。

① 发送消息原语 send(receiver,a)。

发送进程调用 send 原语发送消息,调用参数 receiver 为接收进程名,a 为发送进程存放消息的内存区的首地址。send 原语先申请分配一个消息缓冲区, 将由 a 指定的消息复制到缓冲区, 然后将它挂入接收进程的消息队列,最后唤醒可能因等待消息而等待的接收进程。

send 原语描述如下:

send(R,M){根据 R 找接收进程,如果没找到, 则出错返回; 申请空缓冲区 P(s_b);P(b_mutex); 取空缓冲区; V(b_mutex);把消息从 M 处复制到空缓冲区; P(m_mutex);根据 m _ q,把缓冲区挂到接收进程的消息链链尾; V(m_mutex);V(m_syn);}

其中,s_b 是空缓冲区个数,初值为 n,b_mutex 是空缓冲区的互斥信号量,初值为 1。

② 接收消息原语receive(a)。

接收进程调用 receive 原语接收一条消息,调用参数 a 为接收进程的内存消息区。receive 原语从消息队列中摘下第一个消息缓冲区,并复制到参数 a 所指定的消息区,然后释放该消息缓冲区。若消息队列为空,则阻塞调 用进程。

⚫ 信箱通信

以发送信件以及接收回答信件为进程间通信的基本方式。

好处: 发送方和接收方不必直接建立联系,没有处理时间上的限制。发送方可以在任何时间发信,接收方也可以在任何时间收信。

规则:

① 若发送信件时信箱已满,则发送进程应被置成“ 等信箱” 状态, 直到信箱有空时才被释放。

② 若取信件时信箱中无信,则接收进程应被置成“ 等信件” 状态, 直到有信件时才被释放。

⚫ 管道通信

① 管道通信是连接两个进程之间的一个打开的共享文件, 专用于进程之间进行数据通信。

② 管道通信的基础是文件系统。

③ 在对管道文件进行读写操作的过程中,发送进程和接收进程要实施正确的同步和互斥,以确保通信的正确性。

④ 管道通信具有传送数据量大的优点,但通信速度较慢。

第五章 内存管理

1. 存储体系构成

在计算机系统中层次化的存储体系是由寄存器、高速缓存、内存储器、硬盘存储器、磁带机和光盘存储器等装置构成的。

2. 存储保护

⚫ 存储保护的目的在于为多个程序共享内存提供保障,使在内存中的各程序只能访问其自己的区域,避免各程序间相互干扰。

⚫ 特别是当某一程序发生错误时,不至于影响其他程序的运行,更要防止破坏系统程序。

⚫ 存储保护的内容包括:保护系统程序区不被用户有意或无意的侵犯;不允许用户程序读写不属于自己地址空间的数据,如系统区地址空间、其他用户程序的地址空间。

⚫ 地址越界保护

① 如果进程在运行时所产生的地址超出其地址空间,则发生地址越界。

② 地址越界可能侵犯其他进程的空间,影响其他进程的正常运行;也可能侵犯操作系统空间,导致系统混乱;

③ 发生越界时产生中断,由操作系统进行相应处理。

⚫ 权限保护

① 对于允许多个进程共享的公共区域,每个进程都有自己的访问权限。

② 对属于自己区域的信息,可读可写。

③ 对公共区域中允许共享的信息或获得授权可使用的信息,可读而不可修改。

④ 未获授权使用的信息,不可读、不可写。

⚫ 存储保护一般以硬件保护机制为主,软件为辅;

⚫ 当发生地址越界或非法操作时,由硬件产生中断,进入操作系统处理。

3. 静态重定位

⚫ 在装入一个程序时,把程序中的指令地址和数据地址全部转换成绝对地址。

⚫ 由于地址转换工作是在程序开始执行前集中完成的,所以在程序执行过程中就无须再进行地址转换工作,这种地址转换方式称为“静态重定位”。

4. 动态重定位

⚫ 在装入程序时,不进行地址转换,而是直接把程序装入到分配的内存区域中。

⚫ 在程序执行过程中,每当执行一条指令时都由硬件的地址转换机构将指令中的逻辑地址转换成绝对地址。

⚫ 这种方式的地址转换是在程序执行时动态完成的,故称为“动态重定位”。

5. 分区存储管理

⚫ 分区存储管理是能满足多道程序运行的最简单的存储管理方案。其基本思想是把内存划分成若干个连续区域,称为分区,每个分区装入一个运行程序。

⚫ 分区的方式可以归纳成固定分区和可变分区两类。

1) 固定分区

① 固定分区是指系统先把内存划分成若干个大小固定的分区,一旦划分好,在系统运行期间便不再重新划分。

② 为了满足不同程序的存储要求,各分区的大小可以不同。

③ 由于每一分区的大小是固定的,就对可容纳程序的大小有所限制了。

④ 因此,程序运行时必须提供对内存资源的最大申请量;

⑤ 固定分区方案灵活性差,可接纳程序的大小受到了分区大小的严格限制。

2) 可变分区

① 可变分区是指系统不预先划分固定分区,而是在装入程序时划分内存分区,使为程序分配的分区的大小正好等于该程序的需求量,且分区的个数是可变的。

② 显然,可变分区有较大的灵活性,较之固定分区能获得更好的内存利用率。

③ 在可变分区管理方案中,随着分配和回收次数的增加,必然导致碎片的出现。

④ 解决碎片问题的办法是在适当时刻进行碎片整理,通过移动内存中的程序,把所有空闲碎片合并成一个连续的大空闲区且放在内存的一端,而把所有程序占用区放在内存的另一端,这一技术称为“移动技术”或“紧凑技术”或“紧缩技术”。

6. 空闲分区的分配策略

这里介绍操作系统查找和分配空闲区的四种分配算法。

1) 最先适应算法

⚫ 最先适应算法,又称顺序分配算法。在这种分配算法中, 当接到内存申请时, 顺序查找分区说明表,找到第一个满足申请长度的空闲区,将其分割并分配。

l 此算法简单,可以快速做出分配决定。

2) 最优适应算法

l 当接到内存申请时,查找分区说明表,找到第一个能满足申请长度的最小空闲区,将其分割

并分配。

⚫ 此算法最节约空间,因为它尽量不分割大的空闲区;其缺点是可能会形成很多很小的空闲区域,称作碎片。

3) 最坏适应算法

⚫ 当接到内存申请时,查找分区说明表,找到能满足申请要求的最大的空闲区。

⚫ 基本思想:在大空闲区中装入信息后,分割剩下的空闲区相对也很大,还能用于装入其他程序。

⚫ 优点: 可以避免形成碎片;

⚫ 缺点: 分割了大的空闲区后, 如果再遇到较大的程序申请内存时,无法满足要求的可能性较大。

4) 下次适应算法

⚫ 当接到内存申请时,查找分区说明表,从上一次分配的位置开始扫描内存,选择下一个大小足够的可用块。

7. 分区的回收 4 种可能

  1. 回收分区的上邻分区是空闲的,需要将两个空闲区合并成一个更大的空闲区,然后修改空闲区表。

方法如下:

如果空闲区表中第 i 个登记栏中的“起始地址+长度”正好等于S,则表明回收区有一个上邻空闲区。这时要修改第 i 栏登记项的内容:起始地址不变,长度为原长度加上 L,即:度=原长度+L

  1. 回收分区的下邻分区是空闲的,需要将两个空闲区合并成一个更大的空闲区,然后修改空闲区表。

方法如下:

如果 S+L正好等于空闲区表中某个登记的栏目(假定为第i栏)所示分区的起始地址,则表明回收区有一个下邻空闲区。这时只要修改第i栏登记项的内容:

起始地址=S 长度=原长度+L

则第 i 栏指示的空闲区是回收区与下邻空闲区合并后的一个大空闲区。

  1. 回收分区的上邻分区和下邻分区都是空闲的,需要将 3 个空闲区合并成一个更大的空闲区,然后修改空闲区表。

如果 S =第 i 栏起始地址+长度

S+L= k 栏起始地址

则表明回收区既有上邻空闲区,又有下邻空闲区。此时,必须把这 3 个区合并成一个空闲区登记入空闲区表中,只需使用一个登记栏目。具体修改方法如下:

第 i栏起始地址不变;

第 i栏长度为“i 栏中原长度+k栏中长度+L”;

第 k 栏的标志应修改成“空”状态。

于是,第t 栏中登记的空闲区就是合并后的空闲区, 而第 k 栏成为空表目了。

  1. 回收分区的上邻分区和下邻分区都不是空闲的,则直接将空闲分区记录在空闲区表中。

这时,应找一个标志为“空”的登记栏, 把回收区的起始地址和长度登记入表, 且把该栏目中的标志位修改成“未分配”,表示该登记栏中指示了一个空闲区。

8. 覆盖技术

⚫ 覆盖技术是指一个程序的若干程序段或几个程序的某些部分共享某一个存储空间。

⚫ 未执行的程序段先保存在磁盘上,当有关程序段的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段。

⚫ 覆盖技术不需要任何来自操作系统的特殊支持,可以完全由用户实现;

⚫ 覆盖可以从用户级彻底解决内存小装不下程序的问题。

⚫ 覆盖技术利用相互独立的程序段之间在内存空间的相互覆盖,逻辑上扩充了内存空间,从而在某种程度上实现了在小容量内存上运行较大程序的目的。

⚫ 覆盖技术主要用于系统程序的内存管理上。

9. 交换技术

⚫ 交换技术又称对换技术。在分时系统中,用户的进程比内存能容纳的数量要多,这就需要在磁盘上保存那些内存放不下的进程。在需要运行这些进程时,再将它们装入内存。

⚫ 进程从内存移到磁盘并再移回内存称为交换。

⚫ 交换技术是进程在内存与外存之间的动态调度,是由操作系统控制的。

⚫ 系统可以将那些不在运行中的进程或其一部分调出内存,暂时存放在外存上的一个后备存储区(称为盘 交换区 Swapping Area)中,以腾出内存空间给现在需要内存空间的进程,后者可能需要从外存换入内存,以后再将换出的进程调入内存继续执行。

⚫ 交换技术多用于分时系统中。

⚫ 交换技术利用外存来逻辑地扩充内存,它的主要特点是,打破了一个程序一旦进入内存便一直运行到结束的限制。

10. 页式存储管理

⚫ 页式存储器提供编程使用的逻辑地址由两部分组成:页号和页内地址。其格式为:

页号 页内地址

⚫ 页式存储的地址结构确定了内存分块的大小,也就决定了页面的大小。

⚫ 假定地址用 m 个二进制表示, 其中页内地址部分占用 n 个二进制位,那么, 每一个块的长度就是,也就是每一页有 2n 个字节。这时,页号部分占用了 m-n 位,所以,最大的程序可允许有 2 ( m - n ) 个页面。

⚫ 从地址结构来看,逻辑地址是连续的。

11. 存储空间的分配与回收

⚫ 页式存储管理分配内存空间以物理页面为单位;

⚫ 简单的内存分配表可以用一张“位示图”构成。

⚫ 位示图中的每一位与一个内存块对应,每一位的值可以是 0 或 1, 0 表示对应的内存块为空闲, 1 表示已占用。

⚫ 在进行内存分配时,先查看空闲块数是否能满足程序要求。若不能满足,则不进行分配,程序 就不能装入内存;若能满足, 则根据需求从位示图中找出一些为 0 的位, 把这些位置成 1,并从空闲块数中减去本次分配的块数,然后按照找到的位计算出对应的块号。

⚫ 当找到一个为 0 的位后, 根据它所在的字号、位号, 按如下公式就可计算出对应的块号:

块号=字号 ×字长+位号

l 把程序装入到这些内存块中,并为该程序建立页表。

12. 页式存储管理的地址转换

⚫ 为实现页式存储管理,系统要提供页表起始地址寄存器和页表长度寄存器以及要高速缓冲存储器的支持。

⚫ 页表指出该程序逻辑地址中的页号与所占用的内存块号之间的对应关系;

⚫ 页表的长度由程序拥有的页面数而定;

⚫ 页表是硬件进行地址转换的依据,每执行一条指令时按逻辑地址中的页号查页表。若页表中无 此页号,则产生一个“地址错”的程序性中断事件。若页表中有此页号, 则可得到对应的内存块号, 按计算公式可转换成访问的内存的物理地址。

l 物理地址的计算公式为:

物理地址=内存块号 ×块长+页内地址

l 根据二进制乘法运算的性质,一个二进制数乘以 2n 结果实际上是将该数左移 n 位。所以,实际上是把内存块号作为绝对地址的高位地址,而页内地址作为它的低地址部分。

13. 页表

1) 多级页表

⚫ 当系统支持 32 位的逻辑地址空间时, 若页面大小为 4KB, 则页表将包含 1M 个表项。假设每个表项由 4 字节组成, 那么仅仅是为了存储页表就要为每个进程分配 4MB 的物理地址空间。假设用户地址空间为 2GB, 页面大小为 4KB,则一个进程最多可以有 219 页。若用 4 字节表示一页的物理页号, 则页表本身就占用 2MB, 即需要 512 个页面存放。

l 存放页表的页面为页表页。一般来说,页表页可以不连续存放,因此需要对页表页的地址进行索引。

l 在大多数操作系统中采用二级页表,即由页表页和页目录一起构成进程页表。第一级表示页目录,保存页表页的地址;第二级表示页表页,保存物理页面号(即内存块号)。

⚫ 在 Windows 操作系统中, 页目录被称为页目录项( Page Directory Entry,PDE), 页表被称为页表项( Page Table Entry, PTE)。

2) 散列页表

当地址空间大于 32 位时, 一种常见的方法是使用以页号为散列值的散列页表。其中每个表项都包含一个链表,该链表中元素的散列值都指向同一个位置。

这样,散列页表中的每个表项都包含3 个字段:(a)虚拟页号,(b)所映射的页框号,(c)指向链表中下一个元素的指针。

3) 反置页表

⚫ 在反置页表中,每个物理页框对应一个表项,每个表项包含与该页框相对应的虚拟页面地址以及拥有该页面进程的信息。

⚫ 因此,整个系统中只存在一个页表,并且每个页框对应其中一个表项。

⚫ 由于一方面系统中只有一个页表,而另一方面系统中又存在着多个映射着物理内存的地址空

间,因此需要在反置页表中存放地址空间标志符。这样就保证了一个特定进程的逻辑页面可以映射到相应的物理页框上。

14. 快表

⚫ 为了提高存取速度,在地址映射机制中增加一个小容量的联想寄存器(相联存储器), 它由高速缓冲存储器组成。

⚫ 利用高速缓冲存储器存放当前访问最频繁的少数活动页面的页号,这个高速缓冲器被称为“快表”, 也称为转换检测缓冲器(Translation Lookaside Buffer, TLB)。

⚫ 快表只存放当前进程最活跃的少数几页,随着进程的推进,快表的内容动态进行更新。

⚫ 更新原理:当某一用户程序需要存取数据时,根据该数据所在的逻辑页号在快表中找出对应的内存块号,然后拼接页内地址,以形成物理地址;如果在快表中没有相应的逻辑页号,则地址映射仍然通过内存中的页表进行; 在得到内存块号后需将该块号填到快表的空闲单元中;若快表中没有空闲单元,则根据置换算法置换某一行,再填入新得到的页号和块号。

⚫ 查找快表和查找内存页表是并行进行的**,一**旦发现快表中有与所查页号一致的逻辑页号就停止查找内存页表,而直接利用快表中的逻辑页号。

⚫ 例: 假定访问内存的时间为 200ns,访问高速缓冲存储器的时间为 40ns, 高速缓冲存储器为 16 个单元时,查快表的命中率为 90%。于是, 按逻辑地址转换成绝对地址进行存取的平均访问时间为:

(200+4 0 ) × 9 0 % +(200+200)×10%=256(ns)

不使用快表需两次访问内存的时间为 200×2=400ns。可见使用快表与不使用快表相比,访问时间下降了 36%。

15. 虚拟存储器

⚫ 实现虚拟存储器需要以下的硬件支持:

① 系统有容量足够大的外存。

② 系统有一定容量的内存。

③ 最主要的是,硬件提供实现虚-实地址映射的机制。

④ 缺页中断处理程序

⑤ 页表

⚫ 在一个虚拟存储系统中,决定虚拟存储空间最大容量的要素是计算机系统地址位宽。

⚫ 虚拟存储技术是动态的扩充内存容量。

⚫ 虚拟存储器的工作原理如下:

① 当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;

② 当要执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作;

③ 当没有足够的内存空间时,系统自动选择部分内存空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其他进程使用。

16. 页表增加项

在使用虚拟页式存储管理时需要在页表中增加以下的表项: 页号——页面的编号。

l 有效位——又称驻留位、存在位或中断位,表示该页是在内存还是在外存。

l 页框号——页面在内存中时所对应的内存块号。

l 访问位——又称引用位或参考位,表示该页在内存期间是否被访问过。

⚫ 修改位——表示该页在内存中是否被修改过。

⚫ 保护位——是否能读/写/执行。

⚫ 禁止缓存位——采用内存映射 I/O 的机器中需要的位。

其中,访问位和修改位可以用来决定置换哪个页面,具体由页面置换算法决定。

17. 缺页中断

⚫ 若在页表中发现所要访问的页面不在内存,则产生缺页中断。

⚫ 当发生缺页中断时,操作系统必须在内存中选择一个页面将其移出内存,以便为即将调入的页面让出空间。

⚫ 整个缺页处理过程简单阐述如下:

① 根据当前执行指令中的逻辑地址查页表的驻留位,判断该页是否在内存。

② 该页标志为“0”, 形成缺页中断。保留现场。中断装置通过交换 PSW 让操作系统的中断处理程序占用处理器。

③ 操作系统处理缺页中断,寻找一个空闲的页面。

④ 若有空闲页,则把磁盘上读出的信息装入该页面中。

⑤ 修改页表及内存分配表,表示该页已在内存。

⑥ 如果内存中无空闲页,则按某种算法选择一个已在内存的页面,把它暂时调出内存。若在执行中该页面已被修改过,则要把该页信息重新写回到磁盘上,否则不必重新写回磁盘。当一页被暂时调出内存后,让出的内存空间用来存放当前需要使用的页面。页面被调出或装入之后都要对页表及内存分配表作修改。

⑦ 恢复现场,重新执行被中断的指令。当重新执行该指令时,由于要访问的页面已被装入内存, 所以可正常执行下去。

18. 页面调度 3 个策略

虚拟存储器系统通常定义 3 种策略进行页面调度: 调入策略, 置页策略和置换策略。

调入策略

⚫ 虚拟存储器的调入策略决定了什么时候将一个页由外存调入内存之中。

⚫ 在虚拟页式管理中有两种常用调入策略:

① 请求调页( Demand Paging):只调入发生缺页时所需的页面。实现简单, 但易产生较多的缺页中断,容易产生抖动现象。

② 预调页( Prepaging):在发生缺页需要调入某页时, 一次调入该页以及相邻的几个页。

置页策略

当线程产生缺页中断时,内存管理器还必须确定将调入的虚拟页放在物理内存的何处。用于确定最佳位置的一组规则称为“置页策略”。选择页框应使 CPU 内存高速缓存不必要的震荡最小。

置换策略

如果缺页中断发生时物理内存已满,“置换策略” 被用于确定哪个虚页面必须从内存中移出, 为新的页面腾出空位。

⚫ 固定分配局部置换(Fixed Allocation,Local Replacement)。

① 可基于进程的类型,为每一进程分配固定的页数的内存空间,在整个运行期间都不再改变。

② 采用该策略时,如果进程在运行中出现缺页,则只能从该进程的 W 个页面中选出一个换出,然后再调入一页,以保证分配给该进程的内存空间不变。

⚫ 可变分配全局置换(Variable Allocation,Global Replacement)。

① 采用这种策略时,先为系统中的每一进程分配一定数量的物理块,操作系统本身也保持一个空闲物理块队列。

② 当某进程发生缺页时,由系统的空闲物理块队列中取出一物理块分配给该进程。

③ 但当空闲物理块队列中的物理块用完时,操作系统才从内存中选择一块调出。

④ 该块可能是系统中任意一个进程的页。

⚫ 可变分配局部置换(Variable Allocation,Local Replacement)。

① 同样基于进程的类型,为每一进程分配一定数目的内存空间。

② 但当某进程发生缺页时,只允许从该进程的页面中选出一页换出,这样就不影响其他进程的运行。

③ 如果进程在运行的过程中频繁地发生缺页中断,则系统再为该进程分配若干物理块,直到进程的缺页率降低到适当程度为止。

19. “抖动” 现象

如果刚被调出的页面又立即要用,因而又要把它装入,而装入不久又被选中调出,调出不久又被装入,如此反复,使调度非常频繁。这种现象称为“抖动”或称“颠簸”。

20. 先进先出页面置换算法(First-In First-Out,FIFO)

⚫ FIFO 算法简单, 容易实现。

⚫ 把装入内存的那些页面的页号按进入的先后次序排好队列,每次总是调出队首的页,当装入一个新页后,把新页的页号排入队尾。

⚫ 由操作系统维护一个所有当前在内存中的页面的链表,最老的页面在表头,最新的页面在表尾。

⚫ 当发生缺页时,置换表头的页面并把新调入的页面加到表尾。

21. 最近最少使用页面置换算法(Least Recently Used,LRU)

⚫ LRU 页面置换算法: 在缺页发生时, 首先置换掉最长时间未被使用过的页面;

⚫ 最近最少使用页面置换算法总是选择距离现在最长时间内没有被访问过的页面先调出。

⚫ 实现这种算法的一种方法是在页表中为每一页增加一个“计时”标志, 记录该页面自上次被访问以来所经历的时间,每被访问一次都应从“0”开始重新计时。

⚫ 当要装入新页时,检查页表中各页的计时标志,从中选出计时值最大的那一页调出( 即最近一段时间里最长时间没有被使用过的页),并且把各页的计时标志全置成“0”,重新计时。

⚫ 当再一次产生缺页中断时,又可找到最近最久未使用过的页,将其调出。

22. 举例说明页面置换算法

⚫ A:某程序在内存中分配 3 个页面,初始为空,所需页面的走向为 4, 3, 2, 1, 4,3, 5, 4, 3,2,1,5,采用 FIFO 算法,请计算整个缺页次数。

下面用“时间长-页”表示在内存时间最长的页面,“时间中-页”其次,“时间短-页” 表示在内存时间最短的页面。x 表示缺页, √表示不缺页。

页面走向 4 3 2 1 4 3 5 4 3 2 1 5
时间段-页 4 4 2 1 4 3 5 5 5 2 1 1
时间中-页 4 3 2 1 4 3 3 3 5 2 2
时间长-页 4 3 2 1 4 4 4 3 5 5
x x x x x x x x x
1 2 3 4 5 6 7 8 9

① 开始时,内存中 3 个页面初始为空, 故产生第 1 个缺页中断, 需要把页面 4 调入。同样产生第 2

个缺页中断,需要把页面 3 调入。产生第 3 个缺页中断, 需要把页面 2 调入。

② 此时 3 个内存页面全满。在需要页面 1 时,发现页面4 时间最长, 故产生第 4 个缺页中断, 把页面 4 换出,页面1调入。接着又需要页面 4,于是产生第5个缺页中断,把页面 3换出,页面4调入。后面又需要页面3,于是产生第 6个缺页中断,把页面 2换出,页面3调入。接着又需要页面 5,于是产生第7 个缺页中断,把页面1换出,页面5调入。

③ 下面需要页面 4,正好在内存。接着需要页面 3, 也正好在内存。后面需要页面 2,于是产生第 8 个缺页中断,把页面 4 换出,页面2 调入。接着需要页面 1,于是产生第9 个缺页中断, 把页面 3 换出,页面1 调

入。最后需要页面 5,正好在内存。整个操作结束, 共产生缺页中断 9 次。

B:在上述例子中采用 LRU 算法, 请计算整个缺页次数。

同样,用“时间长-页”表示未使用时间最长的页面, “时间中-页”其次,“时间短-页”表示未使用时间最短的页面。

页面走向 4 3 2 1 4 3 5 4 3 2 1 5
时间段-页 4 3 2 1 4 3 5 4 3 2 1 5
时间中-页 4 3 2 1 4 3 5 4 3 2 1
时间长-页 4 3 2 1 4 3 5 4 3 2
x x x x x x x x x x
1 2 3 4 5 6 7 8 9 10

共缺页中断 10 次。

C:在上述例子中采用 OPT 算法, 请计算整个缺页次数。

最长时间以后才会用到的页面,用“时间长-页”表示,“时间中-页”其次,“时间短-页”表示最短时间会用到的页面。

页面走向 4 3 2 1 4 3 5 4 3 2 1 5
时间段-页 4 3 2 1 1 1 5 5 5 2 1 1
时间中-页 4 3 3 3 3 3 3 3 5 5 5
时间长-页 4 4 4 4 4 4 4 4 4 4
x x x x x x x
1 2 3 4 5 6 7

共缺页中断 7 次。

23. 贝莱迪异常

当分配给进程的物理页面数增加时,缺页次数反而增加。这一现象称为贝莱迪异常(BeladyAnomaly) 现象, FIFO 页面置换算法会产生异常现象。

24. 缺页中断率

⚫ 假定一个程序共有 n 页, 系统分配给它的内存块是 w 块( m、n 均为正整数, 因此, 该程序最多有 m 页可同时被装入内存。如果程序执行中访问页面的总次数为 1 其中有 F 次访问的页面尚未装入内存,故产生了 F 次缺页中断。现定义:

f= F/ A

把 f 称为“缺页中断率”。

⚫ 显然,缺页中断率与缺页中断的次数有关。因此,影响缺页中断率的因素如下:

① 分配给程序的内存块数

② 页 面 的 大 小

③ 程 序 编 制 方 法

④ 页 面 置 换 算 法

25. 虚拟存储管理的性能问题

⚫ 引入虚拟存储管理,把内存和外存统一管理,其真正目的,是把那些访问概率非常高的页放入内存,减少内外存交换的次数。

⚫ 在虚存中,页面可能在内存与外存之间频繁地调度,有可能出现抖动或颠簸。

⚫ 颠簸是由于缺页率高而引起的。

⚫ 此外,一般进程在一段时间内集中访问一些页面,称为“活动”页面, 这是与程序的局部性有关的。如果分配给一个进程的内存物理页面数太少,使得该进程所需要的“活动”页面不能全部装入内存, 则进程在运行过程中可能会频繁地发生缺页中断,从而产生颠簸。

⚫ 采用工作集模型,可以解决颠簸问题。

26. 段式存储管理

⚫ 系统将内存空间动态划分为若干个长度不同的区域,每个区域称作一个物理段。每个物理段在内存中有一个起始地址,称作段首址。

⚫ 将物理段中的所有单元从 0 开始依次编址, 称为段内地址。

⚫ 用户程序的逻辑地址由段号和段内地址两部分组成。

⚫ 内存分配时,系统以段为单位进行内存分配,为每一个逻辑段分配一个连续的内存区(物理段)。逻辑上连续的段在内存中不一定连续存放。

⚫ 段式存储管理是为程序的每一个分段分配一个连续的内存空间。

⚫ 空闲区的分配也可以采用首先适应算法、最佳适应算法、最坏适应算法。

⚫ 在进行动态地址转换时,硬件提供段表起始地址寄存器、段表长度寄存器等支持。

27. 页表项内容

在虚拟页式存储管理系统中,每个页表项中必须包含的是:

①有效位:用于指明表项对地址转换是否有效;

②读写位:如果等于 1,表示页面可以被读、写或执行。如果为 0,表示页面只读或可执行;

③访问标志:处理器只负责设置该标志,操作系统可通过定期地复位该标志来统计页面的使用情况;

④修改位:当处理器对一个页面执行写操作时,就会设置对应页表项的 D 标志。处理器并不会修改页目录项中的 D 标志。

28. 页式分配的优点

①由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。

②动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加。这既提高了主存的利用率,又有利于组织多道程序执行。

29. 请求分页的外存

在请求分页的外存(磁盘)分为两部分:

⚫ 用于存放文件的文件区和用于存放对换页面的对换区。

⚫ 由于与进程有关的文件都放在文件区,故凡是未运行的页面都应该从文件区调入。

30. 内存管理方案

要能与虚拟存储技术结合使用的内存管理方案必须具有如下特性:

⚫ 一是使用动态内存地址,内存中的进程要是可以移动的;

⚫ 二是不能要求全部程序加载入内存,进程才能运行的。

31. 管理空闲内存方法

通常用于管理空闲物理内存的方法有:空闲块链表法、位示图法、空闲页面表。

32. 程序局部性

⚫ 程序局部性原理是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域。

⚫ 空间局部性是指一旦程序访问了某个存储单元,其附近的存储单元也将被访问,程序代码执行具有顺序性。

⚫ 时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问, 则不久之后该数据可能再次被访问,也就是说程序中存在大量的循环。

33. 移动技术

移动技术可以集中分散的空闲区,提高内存的利用率,便于作业动态的扩充内存。采用移动技术要注意以下问题:

①移动技术会增加系统的开销;

②移动是有条件的。

在采用移动技术时应该尽可能减少需要移动的作业数和信息量。

在内存中可以将进程从低地址区域移到高地址区域,可以将进程从高地址区域移到低地址区域。

34. 链接

链接是指把所有编译后得到的目标模块连接装配起来,再与函数库相连接成一个整体的过程。

35. 页式存储管理

⚫ 页式存储管理将内存空间划分成等长的若干区域,每个区域的大小一般取 2 的整数幂,称为页框。

⚫ 系统将程序的逻辑空间按照同样大小也划分成若干页面,称为逻辑页面也称为页,大小与页框相同。

⚫ 虚拟页面在物理空间上不要求连续存放。

四级网络工程师笔记-操作系统(中)相关推荐

  1. 四级网络工程师笔记-操作系统(下)

    操作系统-六-八章 前言: 系列博文 第六章 文件管理 1. 文件的定义 2. 文件的分类 3. 文件逻辑结构分类 4. 文件物理结构分类 5. 外存储设备 6. 磁盘计算 7. 文件存取方式 8. ...

  2. 四级网络工程师笔记-操作系统(上)

    四级网络工程师笔记-操作系统(上) 前言: 系列博文 操作系统原理 第一章 操作系统概论 1. 操作系统概述 2. 操作系统特征 3. 操作系统结构设计 4. -般指令和特权指令 5. 研究操作系统的 ...

  3. 操作系统银行家算法计算机四级,【NCRE四级网络工程师】操作系统多选题

    友情提示:此篇文章大约需要阅读 7分钟54秒,不足之处请多指教,感谢您的阅读. 保存在进程控制块中的是 进程标识符 进程当前状态 代码段指针 PCB的内容可以分为调度信息和现场信息两大部分.调度信息供 ...

  4. 计算机等级考试四级 网络工程师 之 操作系统原理1 适合懒人备考哈哈哈

    操作系统 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 第一题 1 操作系统的结构:早期操作系统是无结构的,也有人把它称为 整体系统结构:模块化结构:分层式结构: 微 ...

  5. 非核心版本的计算机上_计算机四级网络工程师知识点笔记(备考指南)

    计算机四级网络工程师是先要通过计算机三级网络技术. (计算机三级网络技术笔记翻公众号历史文章) 计算机四级是考两个科目 操作系统30个选择题10个多选题 计算机网络30个选择题10个多选题 两科各拿3 ...

  6. 2009年9月全国计算机等级考试四级网络工程师试卷_选择题

    2009年9月全国计算机等级考试四级网络工程师试卷_选择题(2)     <?xml:namespace prefix = o ns = "urn:schemas-microsoft- ...

  7. 计算机四级网络工程师

    计算机四级网络工程师 操作系统知识点归纳 第一章 操作系统概论 第二章 操作系统运行机制 第三章 进程线程模型 第四章 并发与同步 第五章 内存管理 第六章 文件管理 第七章 I/O设备管理 第八章 ...

  8. 全国计算机四级网络工程师教程,全国计算机等级考试立体化应试教程——四级网络工程师...

    全国计算机等级考试立体化应试教程--四级网络工程师 语音 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! <全国计算机等级考试立体化应试教程 ...

  9. 计算机四级网络工程师考点总结

    计算机网络多选题 关于局域网结构的描述中,正确的是A.早期局域网中可用总线型拓扑B.早期局域网中存在环形拓扑C.总线型局域网中需要解决介质访问控制问题 关于广域网的描述中,正确的是A.覆盖范围大于城域 ...

  10. 四级网络工程师试题二

    四级网络工程师试题二 (1) 下列选项中,哪一个不是操作系统所具有的功能?(D) A.管理计算机磁盘 B.提供用户操作计算机的界面 C.管理系统动态库 D.编译高级语言编写的程序 [解析]操作系统是管 ...

最新文章

  1. 【数字信号处理】卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )
  2. 利润1000亿元:靠的是游戏,广告和微信,你怕了吗
  3. python计算图解_图解NumPy,看这一篇就够了!
  4. C语言 之 如何清除输入缓冲区所有内容
  5. docker 常用命令(1)
  6. StringBuilder内存碎片对性能的影响
  7. Java案例:几种方式拷贝文件的耗时比较
  8. python游戏设计教程视频_零基础python教程-用Python设计你的第一个小游戏
  9. MySQL Workbench给其他IP用户分配权限
  10. 洛谷 题解 P2117 【小Z的矩阵】
  11. CentOS 6.2配置NIS主/从服务器
  12. 推荐一些socket工具,TCP、UDP调试、抓包工具
  13. 输入法快捷键_关于日语输入法,你需要知道的一切
  14. 漂亮的字体 手写_20种漂亮的草书和手写字体可供下载
  15. 软件资源版权声明与免责声明
  16. java m个苹果n个篮子_m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法...
  17. 【数据库】数据库期末考试复习试题与答案
  18. 长江游艇俱乐部租金问题
  19. 利益相关者软件工程_吸引组织的各个利益相关者的4种方法
  20. iOS原生封装二维码、条形码扫描工具;生成、识别(彩色)二维码、条形码图片

热门文章

  1. Component xxx does not have a method xxx to handle event xxx
  2. JAVA设计模式征服之路-00-设计模式简介
  3. “百度搜索框提示”代码
  4. Module not found: Error: [CaseSensitivePathsPlugin]
  5. Qt 绘制炫彩滚动文本
  6. java.lang.ExceptionInInitializerError异常
  7. python-while-函数
  8. 把EditPlus添加到右键快捷菜单
  9. 爬虫--初体验(获取二级网站)
  10. 修改服务器bi,修改 FineBI 配置参数