用结构体的方式存放进程的起始地址,进程的分区长度,进程编号,与分区状态。
用链表的方式来记录空闲分区,代码同1,区别在于,进程占用的分区对应的状态为1,而空闲分区的状态为0。
采用首次适配算法,判断内存链表中的空闲分区的大小是否满足当前进程的需求,如果内存不够:打印内存分配失败。
如果内存大小充足,则从该空闲块中划分出进程大小的分区,并修正空闲分区的起始地址与空闲大小。
释放单一进程的信息,查询链表中是否存在将释放的进程,若无输出查无此进程,若有,将该分区的状态更新为空闲。
更新链表:查询链表中是否存在相邻的两个空闲进程,将这两个空闲进程进行合并,否则可能由于某一分区大小过小导致其他进程无法使用,造成空间浪费。
temp=p->next;
然后随机生成三个进程大小的进程,此处为52171,则对应初始地址为:8、60、77,那么剩下的空闲分区为起始地址为78,剩余内存为434,显示状态为空闲,然后将这些进程删除,依次将这些进程对应的分区状态更改为空闲,然后使用refresh函数更新链表情况,将同样空闲的分区合并。
例如下图:
(此处代码未修正,root显示为操作系统)
此图中的第一个3进程未释放,然后创建了大小分别为68、63、57的三个进程,先分配进程1,占用8-76对应的内存,与原进程3间剩下大小为30的空闲分区,不足以让新的进程2与进程3进行使用,而3
之后的空闲分区可以使用,所以2的起始地址为124。新进程3同理。
第二次进行内存分配:
由于此处的分配是在先前三个进程都删除的情况下,所以进程1的起始是从8开始,各进程依次进行内存占用。
如果更改创建进程与删除进程的顺序,或者某些进程不删除,那么会出现如下情况:
此图可以参照图二,图二中的323进程都未删除,此时再创建3个进程,大小分别为32、11、83,由于第一个三进程的与root进程(此处为操作系统)间的空闲分区为98,可以创建进程一与进程二,而三无法创建在此段空闲分区内,故而延后值323之后。