• 大小: 9KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-12
  • 语言: C/C++
  • 标签:

资源简介

操作系统中的实验,用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

评论

共有 条评论