计算机操作系统第五章 存储器管理

文章目录

5.1存储器的层次结构

5.1.1 多层结构的存储器

5.2程序的装入和链接

(1)基本概念:

(2)程序装入的方式

(2)链接的方式

5.3连续分配存储管理方式(分区技术)

静态分区:

(1)单一连续分区

(2)固定分区

动态分区:

(1)动态分区分配

(2)动态可重定位分区分配

(3)伙伴系统

5.4覆盖与对换

5.5分页存储的管理方式

5.5.1分页存储的基本方式

5.5.2地址变换机构

5.5.3有效访问时间

5.5.4多级页表

5.5.4反置页表(Inverted page tables)

5.6分段储存

5.6.1分段存储管理方式的引入

5.6.2分段系统的基本原理

5.1存储器的层次结构

5.1.1 多层结构的存储器

存储层次至少应具有3层:最高为CPU寄存器,中间层为主存储器,最低层为辅助存储器(简称辅存)

寄存器和主存储器又被称为可执行存储器。 

5.2程序的装入和链接

  • 编译:由编译程序将源程序编译成为若干个目标模块
  • 链接:由链接程序将目标模块的相应库函数链接装入模块
  • 装入:由装入程序装入模块到内存

(1)基本概念:

  • 逻辑地址:相对地址首地址为0
  • 物理地址:内存中存储单元的地址可以直接寻址
  • 地址映射:保证COU执行指令时可以正常的访问内存,需要将逻辑地址转换成为物理地址,这个过程称为映射

(2)程序装入的方式

绝对装入:在编译的时候就想到了程序在内存的位置,已经制定了位置,只适用于单道环境年代久远

重定位:装入时候根据程序的装入地址通过映射转换称为绝对地址(在装入的时候进行地址的转换)

重定位又可以分为:

  • 静态重定位:一次性实现从逻辑地址到物理地址的转换,一般在装入的时候由软件完成
  • 动态重定位:在程序运行的过程中需要访问数据的时候在进行地址的变换,由硬件和软件共同实现。
  • 动态运行时装入方式:前两种的程序加入内存之后就不能再改变, 思想时再运行的时候再进行重定位,保证每个程序再内存中的地址时可变的。

(2)链接的方式

静态链接

在程序运行之前就把程序的所需资源链接为以一个模块

需要解决的问题:相对地址的修改

外部调用符号的修改:CALL 改变成为JSR

装入时动态链接

  • 装入时候动态链接方式是把一组目标模块在装入内存时边装入边链接
  • 可以使目标模块分开存放,方便修改和更新
  • 便于实现对目标模块的共享
  • 存在的问题: 会导致一些不会运行的模块一并装入比如错误处理模块

运行时动态链接

在运行的时候链接

5.3连续分配存储管理方式(分区技术)

连续分配的方式(分区技术):指为一个用户程序分配一片连续的内存空间。

静态分区:

(1)单一连续分区

  1. 把内存分为两个区域:用户区和系统区
  2. 适用于单用户,单任务的OS中
  3. 管理简单,空间浪费大
  4. 早期的时候使用

(2)固定分区

  1. 最早使用的一种可以运行多道程序的存储管理方法
  2. 把用户区分为若干个区,区的大小可以自定义,但是在运行时不可以改变,每个区分配给一个用户程序

运行过程:

  1. 当某个程序需要装入内存中时候,通常将分区的大小进行排队,由内存分配程序检索表,找到一个大小合适且没有分配的分区
  2. 运行执行后修改分区的状态释放资源
  3. 会造成内存分区资源的浪费

动态分区:

(1)动态分区分配

特点:管理简单,只需要少量的软件和硬件支持,便于用户的了解和使用,主存的利用率有所提高。

但是会形成很多的外部碎片。

管理: 空闲分区表

空闲分区链:前后指针和状态位

内存分配的过程:

  • 事先规定size是不再切割的剩余分区大小
  • 设请求分区的大小分区大小u.size分区的大小是m.size
  • 若m.size - u.size< size ,将整个分区分配给请求者
  • 否则,从该分区请求的大小划分出一块内存空间分配出去,余下的仍留在空闲链/表中。

内存回收的过程:

  • 会收区上临界一个空闲分区,首地址位空闲分区首地址,大小是两者之和

分配的算法:

  • 基于顺序搜索的分配方法
  1. First Fit首次适应算法
  • 把空闲分区按照地址递增排序
  • 在表首开始查找开始顺序查找分配给第一个适应的程序
  • 优先利用低址部分

2.循环首次适应算法

  • 从上次找到的空闲分区的下一个开始查找
  • 使得存储空间利用更加的充足,但是也会制造出碎片

3.最佳适应算法:(Best Fit)

  • 空闲分区按照大小进行递增的排列,然后再进行内存分配的时候,顺序查找,第一个可以装下程序的内存就是最佳的分区(其他的比他大的部分都会造成浪费)
  • 注意空闲内存的表需要一直进行排序
  • 缺点:切下来的碎片是最小的,产生进程的碎片,会造成链首部碎片的堆积

4.最坏适应算法(Worst Fit)摆烂算法

  • 空闲分区表按照由大到小进行排序,查找时候从表首开始查找
  • 总是挑选出最大空间,可以使得剩下来的分区不至于太小,产生的碎片几乎最小,对中小作业有利

【例题】内存按照地址递增的顺序排列 15k, 28k, 10k,226k, 110k,分配给10k,15k,102k, 26k, 180k

基于索引的动态分区分配方法

  1. 快速适应算法(Quick Fit)
  • 将空闲分区的容量大小进行分类
  • 不支持切割
  • 优点是查找效率高,缺点是产生内部碎
  • 伙伴系统(Buddy System)

2.哈希算法

  • 哈希函数也叫做散列函数,是把任意长度的输入通过散列算法,变成固定长度的输出,该输出就是散列值
  • 哈希既是一个查找技术也是一个存储技术,可以利用哈希函数建立关键字到存储空间的映射
  • 哈希函数是一种单项密码体制,,则他是一个从文明文到密码文的不可逆映射,只有加密过程没有解密过程
  • 哈希函数可用于文件的校验和数字签名
  • 哈希函数的构造:不同的关键字可能得到相同的哈希值就会产生冲突

(2)动态可重定位分区分配

紧凑技术(Compaction)

  • 通过移动作业把多个分散的小分区拼接成为一个大分片区的方法叫做紧凑
  • 目标: 消除外部碎片
  • 紧凑的时机:找不到足够大的空闲分区且总容量分区容量可以满足作业的要求
  • 动态重定位:作业再内存中的位置发生了变化,这就必须对其地址加以修改或者变换

(3)伙伴系统

  • 规定,无论是已经分配的分区还是二的整数次幂
  • 申请的时候找到一个最佳适应的分区
  • 如果是50k申请但是又没有64k的空白分区了,但是有128k的块分割成为两个伙伴,一个分配,一个放在表里
  • 回收的时候,碰到伙伴就合并,大小相等但是不是伙伴也不合并

系统的碎片

  • 内部碎片:
  • 外部碎片:会使连续的空间分割的支离破碎,危害性大

5.4覆盖与对换

5.5分页存储的管理方式

5.5.1分页存储的基本方式

页表: 连接页号与块号

页面大小:

  • 如果页面比较小:
  1. 会减小业内碎片和总的内存碎片,有利于存储提高利用率
  2. 页表长度增加,占用内存大
  • 如果页面比较大:
  1. 页内碎片大,页表长度小

基本分页存储的管理方式

  1. 在调度作业运行时候,一次性把所有页面一次调入内存,但是逻辑上连续的各个页表对应的内存块可以不连续分配。
  2. 内存的块和块之间不连续

5.5.2地址变换机构

地址变换机构:

  • 将用户的逻辑地址映射到物理地址中
  • 地址变换依靠页表来执行,页表常驻内存
  • 为了提高地址的变换速度,系统中设有页表寄存器(PTR)
  • 每个进程对应一个页表,其信息放在PCB中,执行的时候将其嵌入PTR中
  • 在单处理机时,只需要一个页表寄存器

流程:

  1. 分页地址变换机构自动地将有效地址分为页号和业内地址
  2. 将页号与页表长度进行比较,如果页号大于或者等于页表长度,产生越界中断
  3. 逻辑地址中页内地址和物理地址中块内地址时一样的, 逻辑地址的页号通过页表找出块号

例子: 已知页面大小1024,十进制的逻辑地址1011,2148,5012转换成相应的物理地址:

P = 1011/ 2024 = 0

W = 1011mod 1024 = 1011

A = 1011

查表第0页在第2块,所以物理地址为 M = 1024* 2 +1011 - 3059

[例子2]: 共有32个页面,每页1kB,内存16KB, 0,1,2,3页对应物理块号 5 ,10,4,7 , 0A5C对应的物理地址。

0A5C = 00010 1001011100, 页号是5位, 页内地址是10位

页号是2, 对应4号块, 块内地址 1001011100

所以物理地址: 0100 1001011100

具有块表的地址变换机构

目的:提高地址变换的速度

块表: Cache,存放的是部分或者全部页表中的内容

如果块表命中,那么访问一次高速缓存访问一次内存

根据局部性原理: 如果一个页上次访问了,那么其数据会存放在块表中

5.5.3有效访问时间

给定从指定的逻辑地址,经过地址变换,到内存中找到对应的物理地址单元,并且取出数据所用的时间

基本地址变换机制:

EAT = 2 TM

具有块表的变换机制:

EAT = PTLB(TTLB + TM ) + (1- PTLB)(TTLB + 2Tm)

例子: 如果对内存的一次存取100ns,若有快表,快表的时间是20ns, 平均命中率85%

(20+ 100) 0.85 + 220* 0.15 =135 ns

如果没有快表平均有效访问时间位200ns

5.5.4多级页表

  • 若逻辑地址很大,则划分的页非常多,占用的空间就很大,实现较为困难
  • 解决方法
  • 1.动态调入页表 :将一部分页表调入内存 2.多级页表

两级页表

多分出一级就会多访问一次内存

第一次:访问外部页表

第二次:访问内部页表

第三次:访问物理地址

优点: 可以保证页表的长度不很大

缺点: 会多访问一次内存

5.5.4反置页表(Inverted page tables)

一般的页表是通过页号找块号,反置页表也是页号找块号但是排序方式是排列块号

所以现在页号的大小是确定的。

好处:

缺点:检索方式是字符串匹配,检索效率低

页的共享

各进程把需要共享的数据指向内存中的同一个块

页的保护

地址越界保护

5.6分段储存

5.6.1分段存储管理方式的引入

目的:

  1. 方便编程:
  2. 信息共享: 共享是以逻辑单位为基础的,页是存储信息的物理单位,段却是信息的逻辑单位

先是在逻辑角度将信息分割,然后根据逻辑的分割,进行物理的分割

分页就是先将物理地址进行分页,然后逻辑页大小必须跟物理页大小相同

3.动态增长:在实际应用中一些应用会持续增长内存大小

4.动态链接:

5.6.2分段系统的基本原理

  • 逻辑地址由段号和段内地址组成, 逻辑段地址一定时二维的
  • 在为作业分配内存时以段位单位,分配一段连续的物理地址空间,段间不必要连续
  • 32
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
通用动态分区分配存储器管理系统是一个操作系统的重要组成部分,其主要作用是管理计算机的内存资源,有效地分配和回收内存空间,以满足系统的运行需求。以下是一个简单的通用动态分区分配存储器管理系统的设计: 1. 内存分区管理 系统需要维护一个内存分区表,记录可用和已分配的内存分区的信息。每个内存分区表项包括以下信息: - 分区大小 - 起始地址 - 是否已分配 系统需要实现内存分区的分配和回收操作。分配操作根据分配请求的大小,从可用分区中选择合适的分区进行分配。回收操作将已分配的分区释放,并将该分区标记为可用。 2. 内存分配算法 系统需要实现不同的内存分配算法,以满足不同的应用场景需求。常见的内存分配算法包括: - 首次适应算法:按照分区起始地址从低到高的顺序查找,找到第一个符合大小要求的空闲分区进行分配。 - 最佳适应算法:按照分区大小从小到大的顺序查找,找到最小的符合大小要求的空闲分区进行分配。 - 最坏适应算法:按照分区大小从大到小的顺序查找,找到最大的符合大小要求的空闲分区进行分配。 3. 内存碎片整理 随着内存的不断分配和回收,可能会产生很多小的空闲分区,导致内存碎片化。系统需要实现内存碎片整理算法,将多个小的空闲分区合并成一个大的空闲分区,以充分利用内存资源。 4. 进程内存管理 对于每个进程,系统需要维护其内存使用情况,包括已分配的内存大小和起始地址。当进程需要更多内存时,系统需要为其分配新的内存分区,当进程不需要某些内存时,系统需要回收这些内存分区。 5. 内存保护 系统需要实现内存保护机制,防止一个进程越界访问另一个进程的内存空间,或者访问操作系统的内存空间。系统可以通过硬件机制(如MMU)或软件机制(如地址转换和访问权限控制)来实现内存保护。 以上是一个简单的通用动态分区分配存储器管理系统的设计。实现这个系统需要考虑各种不同的情况和应用场景,需要仔细设计和测试,确保其稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值