浅谈计算机的内存管理(1)

本文探讨了计算机内存管理的各个方面,包括物理内存的动态与静态分配、连续与非连续分配,以及虚拟内存的请求分页、页面置换算法等。还介绍了内存管理在操作系统中的角色,如地址转换、空间扩充和保护。文章强调了内存管理的重要性,并通过程序装入与链接的过程解释了进程如何在内存中运行。最后,提到了分页、分段等非连续分配方式,以及早期的实地址模式和保护地址模式下的地址映射,为后续的分页机制奠定了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍内存管理
个人认为,内存管理分为内存管理和虚拟内存管理(交换分区)。
物理内存管理有内存的交换与覆盖、内存的连续分配管理方式和非连续分配管理方式,其中连续分配又分为动态分配和静态分配,非连续分配管理方式分为:分页式、分段式、段页式,这儿在之后都会讲到、
虚拟内存管理有请求分页管理方式、页面置换算法、页面分配策略、工作集和抖动。
当物理内存管理和虚拟内存管理相结合时才能称得上是真正的内存管理,接下来我们来分析分析内存管理,一窥阵容。
二、内存管理总览
这里的内存管理的命名思考了许久,根据内存的交换和覆盖,连续分配或不连续分配很显然是物理内存才能做得到,分配的是实际的物理内存,可是进行划分操作的确实操作系统,说是物理内存管理也不是很合适,故使用了内存管理这一“模棱两可”的说辞,希望有想法的朋友可以在评论区留下各位的想法和思考。

内存管理的功能有以下几点:
内存空间的分配:操作系统来进行的分配和管理,保证分配准确,不需要编程人员手动进行划分。
物理地址和虚拟地址的转换:现代的一台计算机不可能在同一时间只运行一个程序,早期的实地址模式并不适合这样的工作情况,这也就导致了程序中的逻辑地址与内存中的物理地址不可能一致,进行地址的转换就是必须进行的一项工作了,这也是内存管理的重要功能之一。
内存空间的扩充:使用内存交换和内存覆盖的技术保证内存空间能被有效地利用、
内存空间的保护:保证各个不同的作业在各自的内存空间内运行,互不干扰。

有人可能有疑问,程序是怎么进入内存?如何run起来?这个涉及到程序编译的过程,以后的博客会提到,我们这里先回顾一下程序是怎样变成进程,从磁盘中加载到内存中的。

三、程序的装入与链接
我们知道,在程序编译的最后生成.exe文件的时候,内部的地址重定位已经完成,运行exe文件时,系统做了一下几步动作,为我们创建一个进程:

  1. 创建内核映射结构体(PCB)并建立虚拟地址空间和物理内存的映射
  2. 加载指令和数据(下一行指令寄存器,加快速度,高速内存和内存也是跟不上CPU的速度)保存上下文
  3. 把入口地址写入下一行指令寄存器

四、内存的分配方式
当程序转变为进程时,问题就来了,进程大小不一(程序所占内存空间不尽相同),如何保证内存空间如何有效利用,这便是编程人员一直在思考和优化的问题所在。
划分内存有以下几个方法:

分区的概念:程序加载时,将程序整体加载到一块分区上

固定分区:固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该分区,如此循环。
固定分区有两种情况:
分区大小相等:用于利用一台计算机去控制多个相同对象的场合,缺乏灵活性。
分区大小不等:划分为含有多个较小的分区、适量的中等分区及少量的大分区。

优势:实现简单,只需要极少的操作系统开销。
劣势:由于有内部碎片,对内存的使用不充分;活动进程的最大数量是固定的。

动态分区:动态分区分配又称为可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的。

优势:没有内部碎片;可以更充分地使用内存。
劣势:由于需要压缩外部碎片的开销,处理器利用率低。

对于动态分区,我们有四种管理方式:
首次适应(First Fit)算法:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
最佳适应(Best Fit)算法:空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。
最坏适应(Worst Fit)算法:又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。
邻近适应(Next Fit)算法:又称循环首次适应算法,由首次适应算法演变而成。不同之处是分配内存时从上次查找结束的位置开始继续查找。
以上四种分区方法在之后的博文中会详细介绍

基于以上两项技术的缺陷,发起了另外一种技术,叫伙伴系统。
相邻块可以任意拆分组合。每次拆分为原大小的一半,最初合成为一个大块,当需要使用的时候,例如1MB生2个512KB,再其中1个512KB生2个256KB,直到大小约等于进程大小容量的块。当最后使用的块空闲时,块将自动合并成大块。实现原理是二叉树结构

以上被称为内存的连续分配管理方式,无论是固定分区还是动态分区都是划分一整块的内存供我们使用,他们的优缺点也很明显,外部碎片和内部碎片都是我们需要克服的地方,但是日益增长的需求要求我们与更加便于管理的方式来管理内存分配,这就是接下来要介绍的非连续分配管理方式。
非连续分配管理方式
固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低。我们希望内存的使用能尽量避免碎片的产生,这就引入了分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。

分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会产生外部碎片。但它又有本质的不同点:块的大小相对分区要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行,并且程序在磁盘上也是按照4k大小的页面这样进行存储,故,进程只会在为最后一个不完整的块申请一个主存块空间时,才产生主存碎片,所以尽管会产生内部碎片,但是这种碎片相对于进程来说也是很小的,每个进程平均只产生半个块大小的内部碎片(也称页内碎片)。
总结来说:

  1. 相当于固定分区,但是块更小;
  2. 采用页表,映射逻辑地址到物理地址的关系,因此存储同一个进程的分区可以不连续
  3. 加载程序时,操作系统为每个进程维护一个页表,一个程序可以不连续的在内存中占据多个页帧

分段:加载程序时,根据程序的段,将程序加载到内存上去,操作系统为每一个进程维护一个段表,一个进程可以不连续的在内存上占据多个段。每个页帧的大小是固定的,而每一个段是根据程序的段分大小,大小不固定。

交换分区(也叫虚拟内存技术)
(在磁盘上拓展的内存空间)在磁盘开辟一块空间以管理内存的方式管理这块磁盘空间空间,在这之前我们来了解一下X86下的地址映射
一、实地址模式
4004
8008
8080
8085 8位芯片 16位地址总线 64K 在芯片中继承16位的汇编指令
分割线
8086 16位芯片 20位地址总线 1MB
80186
80286
80386//此时开始进入32位处理器时代
80486

16位 CS代码text寄存器 DS 数据data寄存器 SS 栈stack寄存器 IP偏移寄存器 分别存储其基地址
在没有操作系统出现的时候 以上四个寄存器分别表示代码 数据 栈和偏移,当出现GDTR和LDTR时,他们的作用如下:
低两位存储权限 11是最低权限用户 00是最高权限 是内核所拥有的
第三位是指明使用哪种模式 1 LDT 0 GDT
前13位: 下标,段选择子 2^13次方 = 819,系统初始化为12位
每个段的大小必须是16的倍数,段基址也就是16的倍数,二进制数据上,后四位肯定是0
实地址计算公式
DS<<4(段基址)+IP(偏移量/偏移地址)=真实的物理地址 早期没有操作系统,纯粹计算,没有映射
实地址模式问题很大,越界只是其中一个问题

二、保护地址模式
GDTR
LDTR

GDTR[DS>>3].baseAddr + IPE (IPE <length) = 线性地址------->(如果没有开启分页模式 CR0) 物理地址

PageDirectory(页目录)需要10位来标识PD的下标 1024个
PageTable(页表)需要10位来表示PT的下标 1024个
PAGE(物理页面) 需要12位标识偏移量 2^12 也就是4k大小
可以看出PD每20位控制一个PT,因为需要寻址,PT每20位控制一个PAGE,前12位是控制位
P位:页面是否存在与物理内存中,若不存在(显示为0),出发缺页中断,MMU将页面置换到内存中
M位:数据被修改(脏页,显示为1)需要交换到外部才能覆盖,如果数据没有被修改,更改只需要覆盖就可以了
在这里插入图片描述
这里分页使用了二级映射,三级映射会增加一个PMD页,每个页都是4k大小,一个PD页可以管理2^10
2^12K = 4MB的大小,存在于内核中,PT存在于内存中,因为PT页过多,两者不在同一区域,可能出现缺页异常,同时10244M = 4G,也就是二级映射最大能够管理的大小是4G,正好是我们x86体系管理的虚拟内存大小,计算机知识都是息息相关的。
下一篇博文会详细介绍分页机制和二级三级映射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值