首次适应(FirstFit)算法(空闲区地址递增)
来源:互联网 发布:松下触摸屏编程软件 编辑:程序博客网 时间:2024/05/16 07:40
基本思想:要求空闲区按地址递增的次序排列。当进行内存分配时,从空闲区表头开始顺序查找,直到找到第一个能滿足其大小要求的空闲区为止。分一块给请求者,余下部分仍留在空闲区中。
#include <malloc.h> #include <stdio.h> #include <string.h> #define NULL 0 typedef struct table {int address; /*存储分区起始地址*/ int length; /*存储分区长度*/ int flag; /*存储分区标志,0 为空闲,1 为被作业占据*/ char name[10]; /*当flag==1 时存储分区占用标志作业名,否则存储空nil*/ struct table *next; }node; bool success=false; /*分配成功与否的标志*/ node *insert(node *head, node *p) /*按照“地址递增方式”将p 结点插入链表相应位置*/ { node *r,*t; r=head; while(r&&r->address<=p->address) { t=r; r=r->next; } if(r==head) { p->next=head; head=p; } else if(r==NULL) { t->next=p; t=p; } else { p->next = r; t->next = p; } return head;} node *creat() /*根据地址递增方式建立分配分区表(flag==1)或空闲分区表(flag==0)*/ { node *head,*p1; int n=0; printf("address length flag(0 or 1)\n"); p1=(node *)malloc(sizeof(node)); scanf("%d%d%d",&p1->address,&p1->length,&p1->flag); p1->next=NULL; if(p1->flag==1) { printf("\t\tinput job_name:"); scanf("%s",&p1->name); } else strcpy(p1->name,"nil"); head=NULL; while (p1->length>0)/*输入0表示结束*/ { n=n+1; if (n==1) head=p1; else head=insert(head,p1); p1=(node *) malloc (sizeof(node)); scanf("%d%d%d",&p1->address,&p1->length,&p1->flag); if(p1->flag==1) { printf("\t\tinput job_name:"); scanf("%s",&p1->name); } else strcpy(p1->name,"nil"); p1->next=NULL; } return head;} node *distribute(node *freehead, node *distributedhead, node *work) /*在空闲分区表中找出首次合适work 的分区,同时修改空闲分区表和分配分区表*/ { node *q; q=freehead; while(q) { if(q->length>=work->length)/*可分配*/ { work->address=q->address; work->flag=1; success=true; if(q->length>work->length)/*剩余部分仍修改为空闲分区*/ { q->address=q->address+work->length; q->length=q->length-work->length; } break; } else success=false; q=q->next; } return freehead;}void print (node *head) /*输出链表*/ { node *p; p=head; if(!p) printf("链表为空!"); else { while(p) { printf("%d,%d,%d,%s\n",p->address,p->length,p->flag,p->name); p=p->next; } }} int main() { int a; struct table *dtable,*d,*ftable,*f,*work,*t; char workn[10]; printf("The distributed table is:\n"); dtable=d=creat(); /*dtable 输入已分配情况表*/ printf("\nThe free table is:\n"); ftable=f=creat(); /*ftable 输入未分配情况表*/ /* 以下模拟逐个内存申请过程*/ while(1){ printf("\nThe length of worked job is:");/*输入要分配的工作情况*/ scanf("%d",&a); printf("The name of worked job is: "); scanf("%s",&workn); work=(node*)malloc(sizeof(node)); work->length=a; work->next=NULL; strcpy(work->name,workn); f=distribute(ftable,dtable,work); if(success) { printf("\ndistributing is successful!\n"); printf("\nThe free table is !\n"); print(f); while(d->next) { t=d; d=d->next; if(d->address>work->address) break; } work->next=t->next; t->next=work; printf("\nThe distributed table is !\n"); print(dtable); d=dtable; } else { printf("\ndistributing is not successful!\n"); printf("\nThe free table is !\n"); print(ftable); printf("\nThe distribute table is !\n"); print(dtable); } } return 0; }
阅读全文
0 0
- 首次适应(FirstFit)算法(空闲区地址递增)
- 常见内存分配算法:首次适应算法(FirstFit)循环首次适应算法(NextFit)最佳适应算法(BestFit)最坏适应算法(WorstFit)
- 内存分配(首次适应算法)
- 循环首次适应算法
- 操作系统-首次适应算法
- 首次适应算法(FF)和循环首次适应算法(NF)
- 操作系统-循环首次适应算法
- 首次适应算法和最佳适应算法和循环首次适应算法和最坏适应算法
- OS-内存分配回收(最佳适应,最差适应,首次适应)
- 循环首次适应算法、首次适应算法、最佳适应算法_C语言版
- 动态分区分配-循环首次适应算法+最佳适应算法
- 动态分区分配-首次适应算法
- 动态分区分配-首次适应算法
- FF(首次适应)算法C,Java实现
- 实例分析首次适应算法、最佳适应算法、最差适应算法
- 最佳适应(BestFit)算法
- 操作系统——动态分区存储管理(首次适应算法)
- 采用首次适应算法的动态分区分配模拟
- 树的层次遍历,紫书P150UVa122
- HDU 3062 Party(2-SAT模板)
- 组合模式
- 系统设计:关于高可用系统的一些技术方案
- 软件开发工具选择
- 首次适应(FirstFit)算法(空闲区地址递增)
- POJ
- ♪ ♩ ♫海的声音-《管理学的应用题-破局而出》
- 读书笔记之邻家的百万富翁
- C# hijack NSQuery::LookupServiceNext(DNS解析)
- 65. Valid Number
- 信仰缺失下的迷茫 (白岩松)
- 【南阳】字符串匹配
- redis简介01