第七章 内存管理
拖延症拖了好久的第七章终于整理完了o( ̄▽ ̄)ブ
1.内存概述
内存包括系统内存和用户内存。本章讲述的均为用户内存。
程序被执行前必须全部加载进内存中。
通过细分用户内存可以满足更多进程需求,从而更高效使用CPU。
2.内存管理需求
2.1重定位
由于种种原因(主存共享、程序执行时加载到的内存位置、程序换入换出位置改变),程序加载在内存的位置不是固定的,内存访问必须映射到到新的物理地址。
即:把程序地址空间中使用的逻辑地址变成内存中物理地址的过程。
逻辑地址–>物理地址
关键:重定位寄存器
2.2保护
未授权情况下,进程不能访问其他进程的内存区域,不能干涉。
2.3共享
允许多个进程访问相同发内存区块
2.4逻辑组织
程序、数据按模块组织。采用模块管理有以下好处:模块单独编写和编译。可以执行模块级别的保护。可以在进程间共享模块。满足上述需求需要内存管理。
2.5物理组织
内存和外存之间信息流的组织具有困难。
1、可供程序或数据使用的主存可能不足•可供程序或数据使用的主存可能不足。必须采用覆盖技术。但覆盖技术浪费时间。
2、程序员在编写程序的时候不知道到底有多少可用的内存。
因此,主存、辅存两级信息流组织应该交由OS负责。顾需要内存管理。
3.内存分区
3.1固定分区
1、大小相等的分区
缺点:
程序可能太大不能放进一个分区。程序员必须进行覆盖设计以使程序能装入一个分区中运行(一个程序一个分区)
内存的利用率低,内部碎片多。
放置算法:
存在可用分区即可装入内存。
若分区已满,换出其中一个进程(调度问题)。
2、大小不等的分区
放置算法:放置到足够容纳该进程的最小分区中。
①每个区块维护一个进程队列
②所有区块一个进程调度队列
3、固定分区的缺点
分区数目固定
小作业不能有效利用空间(碎片多)
3.2动态分区
1、特点
分区长度和数目可变。进程进入内存时,系统可以分配它所需要的空间。
在内存中形成很多小空洞(外部碎片)
通过压缩技术克服外部碎片(os移动进程)
2、放置算法
①最佳适配:与要求大小最接近
②首次适配:从头开始扫描内存,选择大小足够的第一个可用块
③下次适配:从上一次放置的位置开始扫描内存,选择下一个大小足够的可用块。
3、置换算法
3.3伙伴系统
1、分配
a)整个空闲区块看成一个大小为2^U的块
b)如果请求块大小s满足: 2^(U-1) < s <= 2^U,则分配整块空闲块,结束(大于空闲块的一半,但小于整块空闲块,即占大半,一半装不下)
c)否则分成两个大小相等的伙伴块(一半装得下)
2^U ——> 2^(U-1) + 2^(U-1 )
转b)继续比较
例如:A进程,请求块大小s=128K,小于空闲块1024k,则把空闲块分成两个大小为512k的块。继续比较,128k<512k,继续把512k分成两个大小为256k的空闲块。再次比较,再次划分成两个128k的空闲块。A进程满足,可以装下。
2、释放
a)释放空间
b)有无空闲伙伴快
c)有,合并,转b);无,结束
3.4重定位
1、内存放置进程问题
每个分区一个进程队列的大小不等固定分区:利用简单重定位加载器,一个进程总可以指向同一个分区。(不管有无换入换出)
大小相等的分区,只有一个进程队列的大小不等的分区:一个进程可能在其生命周期中占据不同的分区。(换入换出造成)
压缩时,一个程序可能占用不同的分区。(进程发生移动)
2、区分地址类别
①逻辑地址:与物理分配地址无关
②相对地址:特殊的逻辑地址,相对某些已知点
③物理地址:绝对地址,内存中的实际地址
个人理解:根据下列图可以认为逻辑地址是在整个进程地址空间里面的地址,与所在分配的物理内存无关,逻辑地址是固定的。而物理地址,是对于整个内存空间来讲,是进程在内存中,指令/数据在内存中的真正地址。
所以,重定位就是将逻辑地址转换为物理地址。
3、重定位的硬件支持
基址寄存器:进程在内存中的起始地址。加上逻辑地址即等于物理地址。
界限寄存器:指明程序终止位置。如果计算得到的物理地址大于界限寄存器的值,则向操作系统发出中断信号。
4.分页
1、分页概述
大小不等的固定分区会产生内部碎片,大小可变的动态分区会产生外部碎片。所以,把内存划成大小固定、大小相等且比较小的块,每个进程也分成同样大小的小块,就不会产生外部碎片,只会产生进程最后一页的一小部分的内部碎片。(进程可能不能完整划分,会剩下比正常块要小的块)
称上述为:进程分页,内存分帧,页帧等大小。
简单分页类似于固定分区。不同之处在于分页技术的分区更小,而且一个程序占多个分区,分区不需要连续。
2、页表
OS为每个进程维护一个页表,为未使用的内存维护一个空闲帧列表。
页表给出了进程中每页所对应的帧的位置。(即进程的小块应该对应内存的哪个小块)
逻辑地址:页号+该页中的偏移量
物理地址:帧号+该帧中的偏移量(拼接,偏移量一样)
这里可以理解为帧和页并不是最小的地址单位,因为帧和框里面还会有一段地址空间,所以一条指令/数据的地址只占页或者帧的一小部分,因此会有偏移量。
5.分段
1、分段概述
与分页类似,把程序划分成几个段,段的大小可以不相等,但有最大长度限制。与动态分区类似,也会产生外部碎片,但一个程序可以占据多个分区,而且分区不连续(一个段一个分区),而且外部碎片很小。
分段对程序员是可见的,分页对程序员是透明的。
2、段表
OS为每个进程维护一个段表,也为未使用的进程维护一个空闲块列表。
段表每一项有相应段在内存中的起始地址(段号对应),还有段的长度。根据段号找起始物理地址。
逻辑地址:段号+偏移量
物理地址:起始物理地址+偏移量(做加法,偏移量一样)
6.安全问题
6.1缓冲区溢出攻击
输入到一个缓冲区或者数据保存区域的数据超过了其容量,从而导致覆盖了其他信息的一种状况。攻击者造成并利用这种状况使系统崩溃,或者通过插入特制的代码来控制系统.
防御策略:
–编译时防御系统,目的是强化系统以抵制潜伏于新程序中的恶意攻击。
–运行时防御系统,目的是检测并中止现有程序中的恶意攻击。