内存的最小访问单位是字节(8it),一般计算机系统是32位总线,一次读写可以读或者写32位也就是4字节。
CPU里会看到高速缓存,高速缓存就是在进行读写指令或者指令执行的过程中,访问数据都需要从内存中读数据,如果这时候有大量数据需要读写或者重复利用时,这时候在CPU中加入高速缓存,那么读写速度就会更快,提高效率。
存储的层次结构
内存层次:cpu里有两极缓存,在读写数据或者指令时,若缓存总已经有相应的内容,也就是事先读过的内容,这时候就可以直接从缓存中取出,这时候速度是最快的,如果没有就只能去内存中读取。若内存中仍然找不到,就可能去外存(虚拟内存)中读取,这时候就是最慢。
操作系统中采用的内存管理方式(高度依赖硬件)
1)重定位
直接使用总线的物理地址写程序,局限性大,写的程序只能在制定机器上运行。存储空间为连续的空间,无法交错。
2)分段
将代码,数据,堆栈分为三部分,存储空间不连续,但每一段的内容仍连续。
3)分页
把内存分为最基本的单位(不是一个字节而是有一定大小),一块基本单位是连续空间。
4)虚拟存储
有些时候将数据存在硬盘上,而外存和内存数据之间的倒换是由操作系统内部执行,这时候最希望的是程序是一个逻辑的地址空空间,甚至这个空间是大于物理内存的空间,这个空间就是虚拟存储。
内存管理中地址的生成:从程序中的符号到总线上的物理地址,中间有一个转换过程。
地址空间的定义
物理地址:在机器总线上看到的地址为物理地址,所有物理地址构成的空间叫物理地址空间,由硬件支持。32位物理地址总线:起始地址为0,直到2^32-1
逻辑地址:CPU运行时,里面的进程看见的地址空间,对应的是可执行文件的那一段区域。
连续内存分配:给内存分配一块不小于指定大小的连续的物理内存区域。对于一些没法利用的内存区域我们称为内存碎片。
内部碎片:分配单元内部的未被使用的内存,取决于分配单元大小是否要取整(内存分配为2的幂次大小)。
外部碎片:分配单元之间的未被使用的内存。
动态分区分配策略:1.最先匹配(看先遇见谁)2.最佳匹配(先找一遍,寻找最佳)3.最差匹配(找最大)
碎片整理
1.碎片紧凑:通过移动分配给进程的内存分区,以合并外部碎片。但是需要一定的条件,所有的应用程序可动态定位。
2.分区对换:通过抢占并回收处于等待状态进程的分区,以增大可用内存空间。
伙伴系统:把整个可以分配的分区的大小约定为2的幂,之后任何一块要分的时候小于内存一半的时候直接分配一半的内存空间,大于一半的时候直接分配整个一块。
实现:空闲块按大小和起始地址组织成二维空间,初始状态只有一个大小为2的u次方的空闲块。
分配过程:由小到大在空闲块数组中找最小的可用空闲块,若空闲块过大,对可用空闲块进行二等分,直到合适。
释放过程:把释放的块放入空闲块数组,合并满足合并条件的空闲块。(合并条件:相邻,大小相同,低地址的起始地址必须是2^(i+1)的倍数)