哈尔滨理工大学课程设计报告
printf(\找不到合适的内存分区,分配失败...\\n\ return 0; }
// 最佳适应算法
int bestFit(int taskId, int size) {
subAreaNode *tar = NULL; int tarSize = SIZE + 1; subAreaNode *p = subHead.nxt; while(p != NULL) { // 寻找最佳空闲区间
if(p->state == Free && p->size >= size && p->size < tarSize) { tar = p;
tarSize = p->size; } p = p->nxt; }
if(tar != NULL) {
// 找到要分配的空闲分区 if(tar->size - size <= MINSIZE) { // 整块分配 tar->state = Busy; tar->taskId = taskId; } else {
// 分配大小为size的区间
subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode)); node->addr = tar->addr + size;
哈尔滨理工大学课程设计报告
node->size = tar->size - size; node->state = Free; node->taskId = -1; // 修改分区链节点指针 node->pre = tar; node->nxt = tar->nxt; if(tar->nxt != NULL) { tar->nxt->pre = node; }
tar->nxt = node; // 分配空闲区间 tar->size = size; tar->state = Busy; tar->taskId = taskId; }
printf(\内存分配成功!\\n\ return 1; } else {
// 找不到合适的空闲分区
printf(\找不到合适的内存分区,分配失败...\\n\ return 0; } }
int worstFit(int taskId, int size) {
subAreaNode *tar = NULL; int tarSize;
哈尔滨理工大学课程设计报告
int mm=1;
subAreaNode *p = subHead.nxt; while(p != NULL&&mm==1) { // 寻找最佳空闲区间
if(p->state == Free && p->size >= size) { tar = p;
tarSize = p->size; mm=0; }
else
p = p->nxt;
}
p=subHead.nxt;
while(p != NULL)
{
// 寻找最大空闲区间
if(p->state == Free && p->size >= tarSize && p->size>=size) { tar = p;
tarSize = p->size;//遍历找到最大空闲区间
p=p->nxt;
} else
p = p->nxt;
}
if(tar != NULL) {
// 找到要分配的空闲分区 if(tar->size-size<= MINSIZE) {
哈尔滨理工大学课程设计报告
// 整块分配 tar->state = Busy; tar->taskId = taskId; } else {
// 分配大小为size的区间 subAreaNode*node=(subAreaNode*)malloc(sizeof(subAreaNode)); node->addr = tar->addr + size; node->size = tar->size - size; node->state = Free; node->taskId = -1; // 修改分区链节点指针 node->pre = tar; node->nxt = tar->nxt; if(tar->nxt != NULL) { tar->nxt->pre = node; }
tar->nxt = node; // 分配空闲区间 tar->size = size; tar->state = Busy; tar->taskId = taskId; }
printf(\内存分配成功!\\n\ return 1; } else {
// 找不到合适的空闲分区
哈尔滨理工大学课程设计报告
printf(\找不到合适的内存分区,分配失败...\\n\ return 0; } }
// 回收内存
int freeSubArea(int taskId) {
int flag = 0;
subAreaNode *p = subHead.nxt, *pp; while(p != NULL) {
if(p->state == Busy && p->taskId == taskId) { flag = 1;
if((p->pre != &subHead && p->pre->state == Free) && (p->nxt != NULL && p->nxt->state == Free)) { // 情况1:合并上下两个分区 // 先合并上区间 pp = p; p = p->pre; p->size += pp->size; p->nxt = pp->nxt; pp->nxt->pre = p; free(pp); // 后合并下区间 pp = p->nxt; p->size += pp->size; p->nxt = pp->nxt;