《操作系统》2018/11/26

chapter 4 存储器管理

1、程序的装入和链接
多道程序环境下,程序运行必须为之先建立进程。
创建进程的第一件事:将程序和数据装入内存。
What’s happen?

1. 程序的装入和链接

	程序进内存的一般过程:
	编译compiler:编译程序:将用户源代码编译成若干个目标模块。
	链接link:链接程序:将形成的一组目标模块,及它们需要的库函数链接在一起,形成一个完整的装入模块。
	装入load:由装入程序将装入模块装入内存,构造PCB,形成进程,开始运行(使用物理地址)。

在这里插入图片描述

1)地址的概念
逻辑地址(相对地址,虚地址)
物理地址(绝对地址,实地址)
地址映射:将用户程序中的逻辑地址转换为运行时由机器直接寻址的内存物理地址的过程。
2)程序装入中的地址处理
	i. 绝对装入(逻辑地址=物理地址)
编译程序生成的“目标代码”就是”装入模块” ,逻辑地址直接从某个地址R处增长,装入模块直接装入内存地址R处。
优点:装入过程简单。不需任何地址变换,程序中的逻辑地址与实际内存物理地址完全相同。
缺点:过于依赖硬件结构, 只适用早期针对硬件直接编程、单道环境下。

在这里插入图片描述
ii. 静态重定位装入
地址映射在程序执行之前进行,重定位后物理地址不再改变。
可由专门设计的重定位装配程序完成(软):装入时根据所定位的内存地址去修改每个逻辑地址,添加相应偏移量,重定位为物理地址。
优点:不需硬件支持,可以装入有限的多道程序
缺点:软件装入一次完成,一个程序通常需要占用连续的内存空间,程序装入内存后不能移动。也不易实现共享。在这里插入图片描述
iii. 动态运行时重定位装入
实际运行中往往会需要程序在内存中的各位置移动,即经常需要重定位到不同的物理地址上。这种运行时移动程序要求地址变换要快速,实现时一般依靠硬件地址变换机构——一个重定位寄存器。
程序装入内存时,可多次重定位到不同位置。且可以不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。
更适用于部分装入在这里插入图片描述
3)不同的程序链接装入方式(使用内存的时机)
静态链接:装入运行前将多个目标模块及所需库函数链接成一个整体,以后不再拆开。
装入时动态链接:装入内存时,边装入边链接的链接方式。
运行时动态链接:对某些目标模块的链接,在执行中需要该目标模块时,才对它进行链接。

2、连续分配方式

    1. 单一连续分配
      内存分为系统区和用户区两部分:
      系统区:仅提供给OS使用,通常放在内存低址部分
      用户区:除系统区以外的全部内存空间,提供给用户使用。
      最简单的一种存储管理方式,只能用于单用户、单任务的操作系统中。
      优点:易于管理。
      缺点:对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存。
    1. 固定分区分配
      把内存分为一些大小相等或不等的分区(partition),每个应用进程占用一个分区。操作系统占用其中一个分区。
      提高:支持多个程序并发执行,适用于多道程序系统和分时系统。最早的多道程序存储管理方式。
      划分为几个分区,便只允许几道作业并发
    1. 动态分区分配
      分区的大小不固定:在装入程序时根据进程实际需要,动态分配内存空间,即——需要多少划分多少。
      空闲分区表项:从1项到n项:内存会从初始的一个大分区不断被划分、回收从而形成内存中的多个分区。
  • 分区分配算法
    动态分区方式,分区多、大小差异各不相同,此时把一个新作业装入内存,更需选择一个合适的分配算法,从空闲分区表/链中选出一合适分区
    首次适应算法FF
    循环首次适应算法
    最佳适应算法
    最差适应算法
    快速适应算法
    1. 动态重定位分区分配
      用户程序在内存中移动,将空闲空间紧凑起来提高空间利用率。但必然需要地址变化,增加“重定位”工作。
    1. 内存空间管理之对换
      当内存空间还是满足不了需求时,引入“对换”思想:把内存中暂时不能运行、或暂时不用的程序和数据调到外存上,以腾出足够的内存;把已具备运行条件的进程和进程所需要的程序和数据,调入内存。
      按对换单位分类:
      整体对换(或进程对换):以整个进程为单位(连续分配)
      页面对换或分段对换:以页或段为单位(离散分配)

3 分页存储管理方式

    1. 页面的概念
      内存划分成多个小单元,每个单元K大小,称(物理)块。作业也按K单位大小划分成片,称为页面。
    1. 页表的概念
      为了找到被离散分配到内存中的作业,记录每个作业各页映射到哪个物理块,形成的页面映射表,简称页表。
      每个作业有自己的页表
      页表的作用:
      页号到物理块号的地址映射
      要找到作业A
      关键是找到页表(PCB)
      根据页表找物理块
    1. 地址的处理
      连续方式下,每条指令用基地址+偏移量即可找到其物理存放的地址。
      规律
      作业相对地址在分页下不同位置的数有一定的意义结构:页号+页内地址(即页内偏移)
      关键的计算是:根据系统页面大小找到不同意义二进制位的分界线。
      从地址中分析出页号后,地址映射只需要把页号改为对应物理块号,偏移不变,即可找到内存中实际位置。
      计算口诀
      页面大小决定偏移量(页内地址)的位数 n;
      作业大小页面数量
      页表长度 a
      页号的位数 m(或总位数-页内位数)
      内存容量决定块数,块数决定编址位数,即页表项位数 b。
    1. 4)地址变换机构
      前面讲解了地址变换的原理,那么谁具体实现地址映射?——地址变换机构。
      围绕页表进行工作,那么页表数据放在哪?
      寄存器。一个进程有n个页,页表就需要记录n项数据,需要n个寄存器。不现实。
      内存。只设置一个页表寄存器PTR(page table register)记录页表在内存中的首地址和页表长度,运行时快速定位页表。
      在这里插入图片描述
    1. 引入快表
      问题:基本分页机制下,一次指令需两次内存访问,处理机速度降低1/2,分页空间效率的提高以如此的速度为代价,得不偿失
      改进:减少第1步访问内存的时间。增设一个具有“并行查询”能力的高速缓冲寄存器,称为“快表”,也称“联想寄存器”(Associative memory),IBM系统称为TLB(Translation Look aside Buffer)。
    1. 两级、多级页表,反置页表
      页表大小的讨论
      进程分页离散存放,但页表的数据是连续在存放内存的。而页表可能很大:
      现代操作系统支持非常大的逻辑地址空间的进程。如32位系统,可编址的最大代码数为232,若页面大小为4KB(4*210),则支持的最大进程页表项数可达码232/212=220,有1M个,每个页表项占1B(字节),则页表大小就有1MB。
      ①两级页表
      将页表分页,并离散地将页表的各个页面分别存放在不同的物理块中
      为离散分配的页表再建立一张页表,称为“外层页表”,其每个表项记录了页表页面所在的物理块号。
      ②多级页表
      64位操作系统下,两级仍然不足以解决页表过大问题时,可按同样道理继续分页下去形成多级页表。
      ③反置页表
      每个进程一张页表

4.基本分段存储管理方式

1)分段系统的基本原理
程序通过分段(segmentation)划分为多个模块,每个段定义一组逻辑信息。如代码段(主程序段main,子程序段X)、数据段D、栈段S等。
编译程序(基于源代码)
段的特点
每段有自己的名字(一般用段号做名),都从0编址,可分别编写和编译。装入内存时,每段赋予各段一个段号。
每段占据一块连续的内存。(即有离散的分段,又有连续的内存使用)
各段大小不等。

分段下的相对地址:
地址结构:段号 + 段内地址
段表:记录每段实际存放的物理地址
2)段表与地址变换机构
段是连续存放在内存中。段表中针对每个“段编号”记录:“内存首地址”和“段长”

3)分页和分段的主要区别
需求:分页是出于系统管理的需要,是一种信息的物理划分单位,分段是出于用户应用的需要,是一种逻辑单位,通常包含一组意义相对完整的信息。
一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
大小:页大小是系统固定的,而段大小则通常不固定。分段没有内碎片,但连续存放段产生外碎片,可以通过内存紧缩来消除。相对而言分页空间利用率高。
逻辑地址:
分页是一维的,各个模块在链接时必须组织成同一个地址空间;
分段是二维的,各个模块在链接时可以每个段组织成一个地址空间。
其他:通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。分段模式下,还可针对不同类型采取不同的保护;按段为单位来进行共享
4)信息共享
分段系统的突出优点:
易于实现共享
在分段系统中,实现共享十分容易,只需在每个进程的段表中为共享程序设置一个段表项。
比较课本图。对同样的共享内容的管理上,很明显分段的空间管理更简单。分页的图涉及太多的页面划分和地址记录的管理。
易于实现保护:
5)段页式存储管理方式
①基本原理
将用户程序分成若干段,并为每个段赋予一个段名。
把每个段分成若干页
地址结构包括段号、段内页号和页内地址三部分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值