/** * 通过首次适应算法进行内存分配 * @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**/ }
时间: 2023-07-01 10:18:49 浏览: 102
用首次适应算法模拟内存的分配和回收
补全的代码如下:
```C++
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) {
if (cur->size >= size) { // 如果当前空闲分区的大小大于等于进程所需的大小
LNode *assign_node = (LNode*)malloc(sizeof(LNode)); // 分配一个节点用于存放分配分区
assign_node->begin = cur->begin;
assign_node->end = cur->begin + size - 1;
assign_node->size = size;
assign_node->next = NULL;
cur->begin += size; // 更新空闲分区的起始地址和大小
cur->size -= size;
if (cur->size == 0) { // 如果当前空闲分区被分配完了,则从空闲分区链表中删除该节点
LNode *pre = free_list.m_head;
while (pre->next != cur) pre = pre->next;
pre->next = cur->next;
free(cur);
}
// 将分配分区节点插入到分配分区链表的末尾
LNode *last = assign_list.m_head;
while (last->next) last = last->next;
last->next = assign_node;
*ret_begin = assign_node->begin;
*ret_end = assign_node->end;
return true;
}
cur = cur->next;
}
return false; // 遍历完所有空闲分区都无法满足进程的需求,返回false
}
```
该函数的作用是使用首次适应算法在空闲分区链表 `free_list` 中分配一块大小为 `size` 的内存块,将其插入到分配分区链表 `assign_list` 的末尾,并将分配的内存块的起始地址和结束地址分别存入 `ret_begin` 和 `ret_end` 中。如果分配成功则返回true,否则返回false。其中,空闲分区链表和分配分区链表都是带头结点的单向链表,节点类型为 `LNode`。
阅读全文