最近分享了关于内存分配的相关知识,整理了一下PPT,总结成博客
在操作系统中,内存管理的目的是什么呢?
其中最主要的就是提高内存的利用率,所谓的提高内存利用率,就是尽可能的在内存中多存储进程,这就涉及到为进程分配内存空间了。分配的方式主要是有两种——连续分配和离散分配
在开始分享分配方式之前,先想以下的问题
现在咱们知道了进程在CPU执行之前是存放到内存里的,那么存的方式就是上述的两种,咱们先从连续分配开始
连续分配
在操作系统刚刚发展时,内存中只能存放一个进程,所以被称为单一连续存储。而随着操作系统的发展,发展到了早期多道批处理系统,这时的内存可以存放多个进程,便有了
固定分区分配
分区的方式有两种,分区大小相等和不等,而在固定分区有个缺点便是一个进程只能存放一个进程,如下图
这时有三个用户进程存放到固定分区的内存中,由于一个进程只能存放一个用户进程,因此会产生内部碎片,为了进一步的提高内存的利用率,引入了
动态分区分配
动态分区分配:系统初始只有一个大的空闲区(用户区),当进程请求空间时,由系统根据进程需要的空间大小划分出一片空闲区分配给进程。从图中可以看出,从进程1到最后只剩下进程2,4,3。虽然提高了内存的利用率,但是也会产生外部碎片
小总结:
在连续分区分配中,进程连续的存储到内存中,会产生碎片。
试想一下假如一个进程不连续的分配(离散分配)到内存中,如下图
如果进程和内存空间被分割的足够小,是不是就可以进一步提高内存的利用率呢,这就是分页的原理
离散分配
分页存储管理
将进程分成与内存物理块(页框)一样大小的页,如图所示,16KB的进程分为四个小进程,然后不连续的装入到内存中,
那么,如何知道进程的哪一个页装入到哪一个页框中呢?这就引入了页表
而我们知道,CPU在执行进程时根本是执行的指令,所以,在进程的存储单元,其实是存放的指令,如下图
其中,进程在这时候是按逻辑地址分的,进程A_0为1KB,一般一个存储单元(内存按字节编址)为1B,进程A_0共有1024个存储单元,每一个存储单元存放的是指令,如下图所示,将它装入内存
在指令1中显示,往地址80的存储单元写入1,这时候的80还是逻辑地址,而CPU是在内存中寻找存放指令的地址(CPU寻址),即物理地址,那么这时候的物理地址怎么算呢
步骤1:根据页大小算出页框的起始地址
步骤2:加上该指令在该页的页内偏移量
步骤3:两者相加即可得出物理地址
为了按照程序员的逻辑进行编程,又引入了
分段存储管理
这时候如何完成地址转化呢,通过段表
通过这张图应该很清晰的知道进程是如何分段的,而在实际应用中,会把二者综合起来,分段(按照程序员逻辑分),再把段进行分页,这也就引入了
段页存储管理
总结
至此内存分配就总结完了,有不足之处,还请斧正