内存管理
1.内存管理
1.1内存分层体系结构
计算机体系结构如下
CPU,内存,IO设备通过总线进行通信,其中内存用来存放数据和程序,CPU主要由ALU,CU,寄存器,高速缓存以及存储管理单元MMU来组成。
在计算机体系中,内存具有分层体系结构
CPU中含有高速缓存,速度快,但是容量小;其次是主存,容量与地址线位数有关,32位操作系统最大可寻址4G;其次是硬盘,可以通过虚拟内存的方式来扩展系统的存储容量。CPU中的存储主要由MMU管理,内存和外存主要由操作系统管理。
操作系统中的内存管理
操作系统通过地址空间来组织管理内存,物理地址空间主要包括内存和外存,逻辑地址空间由操作系统程序使用。
操作系统主要提供对于内存的抽象,保护,共享和虚拟化管理。
操作系统对于内存的管理方式有:重定位,分段,分页以及虚拟存储等;其实现需要依赖于硬件,CPU中含有MMU单元主要实现逻辑地址和物理地址的转换。
1.2地址空间
物理地址空间
硬件支持的地址空间 起始地址0,直到 MAXsys 其大小与地址总线位数有关。
逻辑地址空间
在CPU运行的进程看到的地址 起始地址0, 直到 MAXprog 逻辑地址空间大小可以大于物理地址空间,使用虚拟内存覆盖技术等虚拟化扩展内存。
逻辑地址生成
逻辑地址空间由程序编译,链接以及加载来生成
地址生成过程
CPU执行某一条指令时,指令中给出的是逻辑地址;
逻辑地址通过MMU转换为物理地址;
控制器向内存发送物理地址请求;
内存将该物理地址单元处数据发送给CPU;
地址检查
操作系统负责实现逻辑地址和物理地址的转换,如果系统采用简单的分段机制,则逻辑地址到物理地址的转换可以使用段基址寄存器和逻辑地址加和来完成,在过程中会执行检查操作,监测程序访问的地址是否超出规定的长度,否则发生内存异常。
1.3空闲内存管理
使用位图存储管理
内存被划分为分配单元,每个分配单元对应位图中的一位,0表示空闲,1表示占用;
分配单元过小,则位图过大;分配单元过大,则容易造成内存浪费;
分配k个连续的内存单元,需要在位图中搜索k个连续的零,耗费时间
使用链表存储管理
链表的每一个节点包含指示标志空闲区或者进程标记P,起始地址,长度以及下一个节点指针;
2.连续内存分配
给进程分配一块不小于指定大小的连续的物理内存区域
某一个进程的地址空间主要包括代码段,数据段以及堆栈段
内存碎片 由于空闲内存不能被利用而产生内存碎片,主要包括外部碎片和内部碎片。
外部碎片 分配单元之间的未被使用内存
内部碎片 分配单元内部的未被使用内存 取决于分配单元大小是否要取整
动态分区分配:当程序被加载执行时,分配一个进程指定大小可变的分区(块、内存块) 分区的地址是连续的
2.1动态分区分配策略
首次适配算法
沿着段链表搜索,找到第一个可以分配所需内存的空闲块;如果该空闲块大于所需内存,则该空闲块分为进程块和一个小的空闲块
优点:简单 在高地址空间有大块的空闲分区
缺点: 外部碎片 分配大块时较慢
下次适配算法
记录每次找到最优块的位置,下一次分配内存时从上一次位置开始搜索
最佳适配算法
搜索整个空闲区,找到能够容纳进程的最小空闲区
优点:大部分分配的尺寸较小时,效果很好 可避免大的空闲分区被拆分 可减小外部碎片的大小 相对简单
缺点: 外部碎片 释放分区较慢 容易产生很多无用的小碎片
最差适配算法
分配最大的可用空闲块
优点:中等大小的分配较多时,效果最好 避免出现太多的小碎片
缺点:释放分区较慢 外部碎片 容易破坏大的空闲分区,因此后续难以分配大的分区
快速适配算法
为常用大小的空闲区维护单独的链表
维护一个n项链表,第一项指向4KN大小空闲区链表表头,第二个指向8KB,第三个指向12KB。。。
2.2碎片整理
通过调整进程占用的分区位置来减少或避免分区碎片
碎片整理:紧凑(compaction)
通过移动分配给进程的内存分区,以合并外部碎片
碎片整理:分区对换(Swapping in/out)
通过抢占并回收处于等待状态进程的分区,以增大可用内存空间
参考:清华大学 操作系统 陈渝 http://os.cs.tsinghua.edu.cn/oscourse/OS2015/