首先理解这几个概念
1. 内存物理空间的划分
内存空间被动态的划分为若干个长度不相同的 物理段, 每个物理段由起始地址和长度确定。
2. 内存分配
以段为单位分配内存, 每个段在内存中占据连续 空间(内存随机分割, 需要多少分配多少), 但各段之间 可以不连续存放。
3.通过段表进行地址映射
段表记录各段的首(地)址和长度
4.内存的分配算法
首先适配(FF);最佳适配(BF);最坏适配(WF);
首次适配算法:(特点:简单、快速分配)
当接到内存申请时, 查空闲块表(按地址有序), 找 到第一个不小于请求的空块, 将其分割并分配。
最佳适配算法: (特点:用最小空间满足要求)
接到内存申请时, 在空闲块表(按容量递增有序) 中找到一个不小于请求的最小空块进行分配。
最坏适配算法: (特点:分割后空闲块仍较大)
接到内存申请时, 在空闲块表(按容量递减有序) 中找到一个不小于请求的最大空块进行分配。
//常量
//内存分配算法
int mem_size = DEFAULT_MEM_SIZE; //内存大小
int ma_algorithm = MA_FF; //当前算法
static int pid = 0; //初始化pid
int flag = 0; //设置内存大小标志
//函数声明
int display_menu(); //展示功能菜单
int set_mem_size(); //设置申请内存空间大小
int set_algorithm(); //设置算法
int rearrange_FF(); //首次适配算法
int rearrange_BF(); //最优适配算法
int rearrange_WF(); //最坏适配算法
int kill_process(); //删除进程,归还分配的储存空间
int do_exit(); //退出程序,释放空间
int display_mem_usage() ; //显示当前内存的使用情况,包括空闲区和已经分配的情况
int rearrange(int algorithm) ; //选择算法
int free_mem(struct get_block *ab); //释放链表
int allocate_mem(struct get_block *ab); //分配内存模块
int dispose(struct get_block* free_ab); //处理free后的链表
int FF(); //按地址由低到高排序
int BF(); //按内存大小由小到大排序
int WF(); //按内存大小由大到小排序
struct get_block* find_process(int pid); //按pid找到需要释放的链表节点
struct free_block* init_free_block(int mem_size); //初始化空闲块
//内存空闲分区
struct free_block {
int size;
int start_addr;
struct free_block* next;
};
struct free_block* free_b;//内存空闲块来链表的首指针
//分配到内存块的描述
struct get_block {
int pid;
int size;
int start_addr;
char process_name[PROCESS_NAME_LEN];
struct get_block* next;
};
struct get_block* get_block_head = NULL; //进程分配内存块链表的首指针
struct free_block* init_free_block(int mem_size) {
struct free_block *fb,*ptemp;
get_block_head = (struct get_block*)malloc(sizeof(struct get_block));
fb = (struct free_block*)malloc(sizeof(struct free_block));
ptemp=(struct free_block*)malloc(sizeof(struct free_block));
if (fb == NULL) {
printf("No nen \n");
}
get_block_head->next=NULL;
fb->next=ptemp;
ptemp->size = mem_size;
ptemp->start_addr = DEFAULT_MEM_START;
ptemp->next = NULL;
return fb;
}
int display_menu()
{