3.0

第三章 内存管理

01

内存:用于存放数据,程序在被执行之前需要先调入内存才能被CPU处理(用于缓和CPU和硬盘之间的速度矛盾)


每个程序的数据放在什么地方呢? 

子节

存储单元:内存存放数据的最小单元         存储单元的大小与计算机系统有关


指令的工作原理

指令 = 操作码+参数

可执行文件亦称作装入模块

程序经过编译、连接后生成的指令指明的逻辑地址(相对地址)


装入的三种模式(通过指令逻辑地址生成物理地址的三种方式)

绝对装入:在编译的时候就将指令中的逻辑地址转化为绝对的物理地址

静态重定位(可重定位装入):指令中使用的地址,数据存放的地址都是相对于其实地址而言的逻辑地址,可根据内存的具体情况,将装入模块装入到内存的合适位置。在装入的时候对地址进行重定位,将逻辑地址转化为物理地址。

特点:在一个作业装入内存时,必须分配其所要求的全部内存空间,若没有足够的空间,就不能装入该做作业。同时分配的空间必须是连续的。 除此之外,作业一旦进入内存开始运行后,这个空间在程序运行期间是不能移动的。

动态运行时装入(动态重定位):在编译和装入内存时都不会讲逻辑地址转化为物理地址,而是在程序要真正运行时才进行地址转化,但这种方式需要一个重定位寄存器的支持。

重定位寄存器存放了作业的起始地址,在指令执行过程中,将逻辑地址与起始地址相加形成最后的物理地址。

特点:可将程序分配到不连续的存储区,只需要装入部分代码即可投入运行,在程序运行期间也可移动程序的内存空间


从写程序到程序运行的历程

源代码--编译--目标模块(机器语言)--组装所有模块(除了自己编写的还有一些库函数)形成装入模块,有一个完整的逻辑地址—装入内存 



各个模块的组装方式—链接

三种链接方式

先链接完再装入

边装入边链接

边运行边链接


思维导图



内存管理

02内存管理

内存管理要实现的功能

1.内存空间的分配与回收

2.从逻辑上对内存空间进行扩充

3.地址转化:逻辑地址到物理地址的转化---也称作地址重定位。(三种装入方式上一章节又讲)

4.内存保护:拒绝一些进程对一部分内存的访问,比如进程之间不能相互访问对方的内存空间

内存保护实现方式:

1.上限寄存器和下限寄存器确定进程可访问内存的范围。

2.使用重定位寄存器(基址寄存器)以及界地址寄存器(又称限长寄存器,用于存储进程的最大逻辑地址)进行确定进程的可访问的内存的地址范围。


总结


内存管理03  ----  内存空间的扩充 

 

一个进程对应多个模块

 

1.覆盖技术

针对程序大小超过物理内存总和的问题

思路:把程序分为多个段(多个模块),并分类为常用模块和非常用模块

       同时把内存分为一个固定区和多个覆盖区 常用模块常驻在内存的固定区,调入后就不会被调出(除非程序运行结束),不常用的模块放在覆盖区,需要的时候调入内存,用不着的时候调出内存。

A放在固定区,因为是常用模块

B和C不可能同时被程序调用

D E  F不可能同时被程序调用

逻辑上的对内存扩展

缺点:必须有程序员声明覆盖结构,增加了编程负担,操作系统完成自动覆盖。对用户不透明,


2.交换技术/兑换技术

思路:内存空间紧张时,系统会将内存中某些进程暂时换出内存,把外存中某些已经具备运行条件的进程换入内存。

实例:中级调度。

但需要注意的是:进程的PCB需要常驻内存

1.外存一般指的就是磁盘:磁盘空间分为对换区和文件区。文件区一般追求存储空间的利用率,文件区空间的管理采取离散分配的方式。而内存中被换出的进程应该保存在对换区。而因为对换区需要追求对换进程的速度,因此通常采取连续分配方式。故而可以推断出对换区的IO速度比文件区快。

2.什么时候应该交换呢?

交换发生在许多进程运且内存吃紧时进行。

3.优先换出阻塞进程,优先级比较低的进程,以及考虑进程在内存中的驻留时间。


换出进程并不意味着进程的一切都将会被移出内存。


覆盖也是在同一个程序或者进程中的,针对的是进程内部子模块的调出与调入

交换是不同进程或者作业的总的模块调出与调入。


内存管理04内存空间的分配与回收

连续分配管理方式

连续分配:指为用户进程分配的空间必须是一个连续的内存空间。


在单一连续分配方式中,内存被分为系统区和用户区。且这种情况下,内存中只能有一道用户程序。,这个用户程序独占所有的用户区空间。


优点:实现简单,且没有外部碎片。,且内存不需要内存保护,因为只有一个进程在内存上运行。

缺点:只能用于单用户,单任务的操作系统中,有内部碎片,且存储器利用率很低。


固定分区分配方式

为了支持多道程序的系统,将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业。

1.分区大小相等

       缺乏灵活性,但是适合于用一台计算机控制多个相同对象的场合。

2.分区大小不等

       增加了灵活性


分区说明表,针对固定分区分配方法

用数组或者链表可以是现这个表。


固定分区分配:实现简单,无外部碎片


动态分区分配

根据进程的所需内存大小来分配内存


针对第一个问题:

       采用空闲分区表或者空闲分区链


针对第二个问题:

动态分区分配算法(下个小节详细介绍)

针对第三个问题:

听不下去了

你可能感兴趣的:(3.0)