动态分区分配是根据进程的实际需要,动态的为之分配内存空间。而在实现可变分区分配时,将涉及到分区分配中
所用的数据结构、分区分配算法和分区的分配与内存回收的过程。
分区分配中的数据结构:(1)描述空闲块的数据结构。(2)内存块的描述。
#define PROCESS_NAME_LEN 32 //进程名长度 #define MIN_SLICE 10 //最小碎片的大小 #define DEFAULT_MEM_SIZE 1024 //内存大小 #define DEFAULT_MEM_START 0 //起始位置 //内存分配算法 #define MA_FF 1 #define MA_BF 2 #define MA_WF 3 //描述每一个空闲块的数据结构 struct free_block_type { int size; //空闲块大小 int start_addr; //空闲块起始位置 struct free_block_type *next; //指向下一个空闲块 }; //指向内存中空闲块链表的首地址 struct free_block_type *free_block= NULL; //每个进程分配到的内存块的描述 struct allocated_block { int pid; int size; //进程大小 int start_addr; //进程分配到的内存块的起始地址 char process_name[PROCESS_NAME_LEN]; //进程名 struct allocated_block *next; //指向下一个进程控制块 }; //进程分配内存块链表的首指针 struct allocated_block *allocated_block_head= NULL; int free_block_count= 0; //空闲块的个数 int mem_size= DEFAULT_MEM_SIZE; //内存大小 int current_free_mem_size= 0; //当前空闲内存大小 int ma_algorithm= MA_FF; //当前分配算法 static int pid= 0; int flag= 0; //设置内存大小标志,表示内存大小是否设置
分区分配算法:
(1)首次适应算法(First Fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给
作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到
高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
(2)最佳适应算法(Best Fit):从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使
碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一
个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。
(3)最差适应算法(Worst Fit):从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中
的结点大小趋于均匀,适用于请求分配的内存大小范围较窄的系统。为适应此算法,空闲分区表(空闲区链)中的空
闲分区按大小从大到小进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留小的空闲区,尽量
减少小的碎片产生。
下面是进行以上三种算法的实现:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <unistd.h> #define PROCESS_NAME_LEN 32 //进程名长度 #define MIN_SLICE 10 //最小碎片的大小 #define DEFAULT_MEM_SIZE 1024 //内存大小 #define DEFAULT_MEM_START 0 //起始位置 //内存分配算法 #define MA_FF 1 #define MA_BF 2 #define MA_WF 3 //描述每一个空闲块的数据结构 struct free_block_type { int size; //空闲块大小 int start_addr; //空闲块起始位置 struct free_block_type *next; //指向下一个空闲块 }; //指向内存中空闲块链表的首地址 struct free_block_type *free_block= NULL; //每个进程分配到的内存块的描述 struct allocated_block { int pid; int size; //进程大小 int start_addr; //进程分配到的内存块的起始地址 char process_name[PROCESS_NAME_LEN]; //进程名 struct allocated_block *next; //指向下一个进程控制块 }; //进程分配内存块链表的首指针 struct allocated_block *allocated_block_head= NULL; int free_block_count= 0; //空闲块的个数 int mem_size= DEFAULT_MEM_SIZE; //内存大小 int current_free_mem_size= 0; //当前空闲内存大小 int ma_algorithm= MA_FF; //当前分配算法 static int pid= 0; int flag= 0; //设置内存大小标志,表示内存大小是否设置 struct free_block_type* init_free_block(int mem_size); void display_menu(); int set_mem_size(); void set_algorithm(); void rearrange(int algorithm); int rearrange_WF(); int rearrange_BF(); int rearrange_FF(); int new_process(); int allocate_mem(struct allocated_block *ab); void kill_process(); int free_mem(struct allocated_block *ab); int dispose(struct allocated_block *free_ab); int display_mem_usage(); struct allocated_block* find_process(int pid); int do_exit(); int allocate_FF(struct allocated_block *ab); int allocate_BF(struct allocated_block *ab); int allocate_WF(struct allocated_block *ab); int allocate(struct free_block_type *pre,