补全下述代码:#include "free_list.h" #include "assign_list.h" /** * 通过首次适应算法进行内存分配 * @param free_list 待操作的空闲分区链表 * @param assign_list 待操作的分配分区链表 * @param size 进程请求的内存大小 * @param ret_begin 分配成功时分配的内存块的起始地址 * @param ret_end 分配成功时分配的内存块的结束地址 * @return 分配成功返回true,反之返回false */ bool FF(LinkList free_list, LinkList assign_list, int size, int *ret_begin, int *ret_end) { LNode *cur = free_list.m_head->next; /***begin 补全以下代码***/ /**end**/ } /** * 向内存中归还内存块 * @param free_list 待操作的空闲分区链表 * @param assign_list 待操作的分配分区链表 * @param begin 待归还内存块的起始地址 * @param end 待归还内存块的结束地址 * @return 归还成功返回true,否则返回false */ bool RetSpace(LinkList free_list, LinkList assign_list, int begin, int end) { /***begin 补全以下代码***/ /**end**/ } int main() { LinkList free_list; LinkList assign_list; int records[5][2]; // 累计会申请五次内存,记录这五块内存的起始地址和结束地址 /* 初始化两个链表 */ freeListInit(&free_list, 0, 512); assignListInit(&assign_list); freeListShow(free_list); assignListShow(assign_list); /* reg(300KB) */ printf("----------reg(300KB)----------\n"); FF(free_list, assign_list, 300, &records[0][0], &records[0][1]); freeListShow(free_list); assignListShow(assign_list); /* reg(100KB) */ printf("----------reg(100KB)----------\n"); FF(free_list, assign_list, 100, &records[1][0], &records[1][1]); freeListShow(free_list); assignListShow(assign_list); /* release(300KB) */ printf("----------release(300KB)----------\n"); RetSpace(free_list, assign_list, records[0][0], records[0][1]); freeListShow(free_list); assignListShow(assign_list); /* reg(150KB) */ printf("----------reg(150KB)----------\n"); FF(free_list, assign_list, 150, &records[2][0], &records[2][1]); freeListShow(free_list); assignListShow(assign_list); /* reg(50KB) */ printf("----------reg(50KB)----------\n"); FF(free_list, assign_list, 50, &records[3][0], &records[3][1]); freeListShow(free_list); assignListShow(assign_list); /* reg(90KB) */ printf("----------reg(90KB)----------\n"); FF(free_list, assign_list, 90, &records[4][0], &records[4][1]); freeListShow(free_list); assignListShow(assign_list); /* 销毁两个链表 */ listDestroy(free_list); listDestroy(assign_list); return 0; }
时间: 2024-03-18 15:45:09 浏览: 68
#include "free_list.h"
#include "assign_list.h"
/**
* 通过首次适应算法进行内存分配
* @param free_list 待操作的空闲分区链表
* @param assign_list 待操作的分配分区链表
* @param size 进程请求的内存大小
* @param ret_begin 分配成功时分配的内存块的起始地址
* @param ret_end 分配成功时分配的内存块的结束地址
* @return 分配成功返回true,反之返回false
*/
bool FF(LinkList free_list, LinkList assign_list, int size, int *ret_begin, int *ret_end) {
LNode *cur = free_list.m_head->next;
while(cur != NULL) { // 遍历空闲分区链表
if(cur->size >= size) { // 如果当前空闲分区空间足够
// 将空闲分区划分为分配分区
LNode *new_node = (LNode*)malloc(sizeof(LNode));
new_node->begin = cur->begin;
new_node->end = cur->begin + size - 1;
new_node->size = size;
new_node->next = NULL;
// 将新的分配分区添加到分配分区链表中
assignListInsert(assign_list, new_node);
// 更新空闲分区链表中相关节点的信息
cur->begin += size;
cur->size -= size;
// 返回分配成功的内存块的起始地址和结束地址
*ret_begin = new_node->begin;
*ret_end = new_node->end;
return true;
}
cur = cur->next;
}
return false;
}
/**
* 向内存中归还内存块
* @param free_list 待操作的空闲分区链表
* @param assign_list 待操作的分配分区链表
* @param begin 待归还内存块的起始地址
* @param end 待归还内存块的结束地址
* @return 归还成功返回true,否则返回false
*/
bool RetSpace(LinkList free_list, LinkList assign_list, int begin, int end) {
LNode *cur = assign_list.m_head->next;
LNode *pre = assign_list.m_head;
while(cur != NULL) { // 遍历分配分区链表
if(cur->begin == begin && cur->end == end) { // 找到待归还的分配分区
// 将分配分区划分为空闲分区
LNode *new_node = (LNode*)malloc(sizeof(LNode));
new_node->begin = begin;
new_node->end = end;
new_node->size = end - begin + 1;
new_node->next = NULL;
// 将新的空闲分区添加到空闲分区链表中
freeListInsert(free_list, new_node);
// 从分配分区链表中删除该分配分区
pre->next = cur->next;
free(cur);
return true;
}
pre = cur;
cur = cur->next;
}
return false;
}
int main() {
LinkList free_list;
LinkList assign_list;
int records[5][2]; // 累计会申请五次内存,记录这五块内存的起始地址和结束地址
/* 初始化两个链表 */
freeListInit(&free_list, 0, 512);
assignListInit(&assign_list);
freeListShow(free_list);
assignListShow(assign_list);
/* reg(300KB) */
printf("----------reg(300KB)----------\n");
FF(free_list, assign_list, 300, &records[0][0], &records[0][1]);
freeListShow(free_list);
assignListShow(assign_list);
/* reg(100KB) */
printf("----------reg(100KB)----------\n");
FF(free_list, assign_list, 100, &records[1][0], &records[1][1]);
freeListShow(free_list);
assignListShow(assign_list);
/* release(300KB) */
printf("----------release(300KB)----------\n");
RetSpace(free_list, assign_list, records[0][0], records[0][1]);
freeListShow(free_list);
assignListShow(assign_list);
/* reg(150KB) */
printf("----------reg(150KB)----------\n");
FF(free_list, assign_list, 150, &records[2][0], &records[2][1]);
freeListShow(free_list);
assignListShow(assign_list);
/* reg(50KB) */
printf("----------reg(50KB)----------\n");
FF(free_list, assign_list, 50, &records[3][0], &records[3][1]);
freeListShow(free_list);
assignListShow(assign_list);
/* reg(90KB) */
printf("----------reg(90KB)----------\n");
FF(free_list, assign_list, 90, &records[4][0], &records[4][1]);
freeListShow(free_list);
assignListShow(assign_list);
/* 销毁两个链表 */
listDestroy(free_list);
listDestroy(assign_list);
return 0;
}
阅读全文