资源简介
操作系统中的实验,用C语言实现循环首次适应算法的功能
代码片段和文件信息
#include
#include
#define MAX_SIZE 128 //系统分配给用户的最大内存
typedef struct MCB{//内存控制块
int add; //分区起始地址
int sta; //分区状态,0为可用
int size; //分区大小
int jno; //分区装入作业号作业号从1开始
struct MCB* next; //链连指针8
}MCB;
MCB *free_table*ft; //可用分区的头指针,尾指针
MCB *used_table*ut; //已分配分区的头指针,尾指针
MCB *next_ft=NULL; // ******************** added 下一个可用分区的头指针
/* 函数声明 */
void initFree_table();
void initUsed_table();
void add_ut(MCB *pfint sizeint jno);
int Is_Jno_Exists(int jno); // ******************** added 判断改作业是否存在
void allot(int jnoint size);
void reclaim(int jno);
void displayUt(MCB *pMCB);
void displayFt(MCB *pMCB);
/* 函数定义 */
void initFree_table()//初始化可用区链表初始大小为整个用户分区
{
if(!(free_table=(MCB*)malloc(sizeof(struct MCB))))
exit(1);
free_table->add = 0;
free_table->size = MAX_SIZE;
free_table->sta = 0;
free_table->jno = 0;
free_table->next = NULL;
ft=free_table;
}
void initUsed_table()//初始化已分配分区链表
{
if(!(used_table=(MCB*)malloc(sizeof(struct MCB))))
exit(1);
used_table->add = 0;
used_table->size = 0;
used_table->sta = 1;
used_table->jno = 0;
used_table->next = NULL;
ut=used_table;
}
void add_ut(MCB *pfint sizeint jno)
{
//修改已分配链表
if(used_table->next == NULL && used_table->size == 0)
{//已用分区表的第一块
used_table->add = pf->add;
used_table->size = size;
used_table->jno = jno;
}else{//将新增分区加到已分配链表末尾
//pt为临时MCB
MCB *pt;
if(!(pt=(MCB*)malloc(sizeof(struct MCB))))
exit(1);
pt->size = size;
pt->add = pf->add;
pt->jno = jno;
pt->sta = 1;
pt->next = NULL;
ut->next = pt;
ut = ut->next;
}
}
int Is_Jno_Exists(int jno)// ******************** added
{
int Is_Exists = 0;
MCB *tmp_usedtable=used_table;
while(NULL != tmp_usedtable)
{
if (jno == tmp_usedtable->jno)
{
Is_Exists =1;
break;
}
tmp_usedtable = tmp_usedtable->next;
}
return Is_Exists;
}
void allot(int jnoint size)//首次适应法为作业分配存储空间
{
MCB *pf = NULL;
MCB *p = NULL;
MCB *q = free_table;///
if((jno <= 0 )||(1 == Is_Jno_Exists(jno))) /* jno小于0或jno有重复 */
{
printf(“输入作业号有误请重新输入!\n“);
return;
}
if(size > MAX_SIZE)
{
printf(“作业太大,无法分配!\n“);
return;
}
if(size <= 0)
{
printf(“作业大小不合法!\n“);
}
/********************* startadded */
if (NULL == next_ft) // 下一个空闲列表节点为空,表明已到末尾,则回到空闲列表开头开始扫描
{
pf = free_table;
p = pf;
}
else
{
pf = next_ft;
p = pf;
}
while (q->next !=next_ft) //new
{
next_ft = q->next ;
}
//查空白分区链表
while(pf != NULL && pf->size < size)
{
p = pf;
pf = pf->next;
}
/********************* endadded */
if( (pf == NULL) && ( NULL != ne
- 上一篇:控制台嵌入MFC
- 下一篇:c++primerplus第六版源码
评论
共有 条评论