2021-09-09 linux内核理解——系统内存管理功能1

2021-09-09  本文已影响0人  MaggieXie

linux内核总的来说具有四种功能:

(1)系统内存管理功能

(2)软件程序管理功能

(3)硬件设备管理功能

(4)文件系统管理功能

一.首先是对于系统内存的管理

于我的理解来看,系统内存管理就是对进程合理分配内存和回收的过程。

内存管理主要分为连续分配方式,非连续分配方式和虚拟内存管理。

    连续分配方式,顾名思义,就是为一个进程分配一片连续的内存空间。

    单一连续分配思路最为简单。我们可以将内存分为系统区和用户区,当进程来时,直接将整个用户区作为一个整体储存进程。显然这样的方式一次只能运行一个进程,适合单用户单任务的操作系统。

    而固定分区分配则是将内存的用户区固定分为几个,并且大小不再变动。该种方式又可以分为等分和不等分。等分既是将用户区分成大小相同的部分,这种思路很简单,但是缺点也很明显。如果进程很小,会造成内存的浪费,而进程很大,虽然总的内存也很大,但是每个内存分区无法容纳,因此进程还是无法运行。不等分是将用户内存按照从上到下分成大小不同的部分,当进程来时,依次从小到大进行比对,遇到第一个合适的分区,就将进程存入。如下图的分区使用表,提供了起始地址,内存大小以及使用状态。

    总的来说,单一连续分配内存的分配在进程来前就已经固定,无法进行调整,可能会造成空间的浪费和不足,不够灵活。

    动态分配方式:也就是要多少给多少,但是只能分配2^n 的空间。如下图所示,空间大小根据进程的大小进行划分,当进程危100kb时,也只能给他分到128kb的空间,那么剩余的分区2的28kb大小的以及被分配了,但是不能被额外利用,就称为内部碎片。而当再来一个进程,大小>剩余可分配的空间时,进程就无法被存放,那么剩下的这部分没有被分配出去,并且也不属于任何进程,也无法分配给申请内存空间的新进程的内存空间区域就叫做外部碎片。

    当一个进程结束时,需要对其空间进行再回收。可以用空闲分区链或空闲分区表对其进行规划。

有三种算法进行分配和回收。

首次适应算法

左边是低地址,右边是高地址,如果来了一个进程,沿着链表从低地址到高地址分区扫描,当遇到第一个合适的空闲分区,就划出一块合适的分区给它,当进程执行完毕后,回收存储空间,如果有两个存储空间地址相邻,那么合并这两个存储空间。

因为这种方法是从低到高扫描,所以在高地址区域会剩下大块的空闲空间,以便后来的大空间进程用。但是容易产生大量的外部碎片。因为是按照地址排序,而不是按照大小排序,所以可能并不是最适合进程的分区。分配大空间的时候,需要扫描更多的链表节点,会花费更多的时间。

最佳适应算法

把表中的空闲区按照分区块的大小进行排序,分配的时候,找到第一个比进程空间大的分配。进程执行完之后回收,检查并合并临近地址的空闲分区,合并之后还要进一步按照分区大小进行排序。这样就可以尽可能减小大空闲分区被拆分的可能,缩小外部碎片的大小,产生外部碎片多且小,因为回收操作需要进行额外的步骤,速度慢。

最坏适应算法

同样按照分区大小排序,从大到小排序,分配和回收同上最佳适应算法。

因为选择了最大的分区储存,因此可以减少碎片出现的概率。但是会产生大量的外部碎片,会破坏大空闲分区。

介于静态分配方式和动态分配方式两者之间的叫做伙伴系统。例如如果存在一个1M的存储区,来了一个66K的进程A,首先将1M等分为512K,512K的1/2还是>66K,因此继续等分,知道分成128K存储区,将A分配给128K的存储区。如果另外一个进程B为251K,则将251K的B分配给252K,如果进程C为41K,128的1/2>41K,继续等分,得到64K的存储区,分配一个给C,又来130K的D,将512K的存储区等分再分配给D。

如果进程C运行完毕,将其释放,有一个存储区大小相同并且由同一个分裂而来,则将两者合并,如果大小不同则不合并,等待下一个进程的释放。

非连续分配方式和虚拟内存管理下期见。

注:开这个帖子的目的是为了记录一下自己负基础的生信学习过程,本次笔记的视频来自于操作系统【内存管理】_哔哩哔哩_bilibili,若是有记录的不妥之处,欢迎各位指正。

上一篇 下一篇

猜你喜欢

热点阅读