操作系统源代码.docx
- 文档编号:23313295
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:28
- 大小:20.53KB
操作系统源代码.docx
《操作系统源代码.docx》由会员分享,可在线阅读,更多相关《操作系统源代码.docx(28页珍藏版)》请在冰豆网上搜索。
操作系统源代码
#include
#include
#include
intmemoryStartAddress=-1;
intmemorySize=-1;
structjobList
{
intid;/*作业ID*/
intsize;/*作业大小(需要的存储空间大小)*/
intstatus;
/*作业状态0:
newjob,1:
inthememory,2:
finished、*/
structjobList*next;/*作业链表指针*/
};
structfreeList
{
intstartAddress;/*分区起始地址*/
intsize;/*分区大小*/
structfreeList*next;/*分区链表指针*/
};
structusedList
{
intstartAddress;/*分区起始地址*/
intjobID;/*分区中存放作业ID*/
structusedList*next;/*分区链表指针*/
};
voiderrorMessage(void)/*出现严重错误时显示信息并结束程序*/
{
printf("\n\tError!
\a");
printf("\nPressanykeytoexit!
");
getch();
exit
(1);
}
voidopen**fp,char**mode)
/*以要求的方式打开文件*/
{
if((*fp=fopen())==NULL)
{
printf("\nCan'topen%sinmode%s、",);
errorMessage();
}
}
voidmakeFreeNode(structfreeList**empty,intstartAddress,intsize)
/*根据参数startAddress、size创建空闲节点,由empty指针返回*/
{
if((*empty=malloc(sizeof(structfreeList)))==NULL)
{
printf("\nNotenoughtoallocateforthefreenode、");
errorMessage();
}
(*empty)->startAddress=startAddress;
(*empty)->size=size;
(*empty)->next=NULL;
}
voidiniMemory(void)/*初始化存储空间起始地址、大小*/
{
charMSA[10],MS[10];
printf("\nPleaseinputthestartaddressofthememory!
");
scanf("%s",MSA);
memoryStartAddress=atoi(MSA);
printf("\nPleaseinputthesizeofthememory!
");
scanf("%s",MS);
memorySize=atoi(MS);
}
charselectFitMethod(void)/*选择适应算法*/
{
FILE*fp;
charfitMethod;
do{
printf("\n\nPleaseinputacharasfallowtoselectthefitmethod!
\
\n1(Bestfit)\
\n2(Worstfit)\
\n3(Firstfit)\
\n4(Lastfit)\n");
fitMethod=getche();
}while(fitMethod<'1'||fitMethod>'4');
open,"d:
\\result、cl","a");
switch(fitMethod)
{
case'1':
fprintf(fp,"\n\n\n\n\tBestfit");
fprintf(fp,"\n**********************************************");
break;
case'2':
fprintf(fp,"\n\n\n\n\tWorstfit");
fprintf(fp,"\n**********************************************");
break;
case'3':
fprintf(fp,"\n\n\n\n\tFirstfit");
fprintf(fp,"\n**********************************************");
break;
case'4':
fprintf(fp,"\n\n\n\n\tLastfit");
fprintf(fp,"\n**********************************************");
break;
}
fclose(fp);
returnfitMethod;
}
voidinputJob(void)/*从键盘输入作业到D盘的JOB文件*/
{
int/*id,size,*/status=0,jobnum=0;
FILE*fp;
charid[10],size[10];
open,"d:
\\job、cl","w");
fprintf(fp,"job_ID\tsize\tstatus");
printf("\n\n\n\nPleaseinputthejobsasfallow!
\
\nEnteraintegersmallerthan1toquit、\njob_ID\tsize\n");
do{
/*scanf("%d%d",&id,&size);*/
scanf("%s\t%s",id,size);
if(atoi(id)>0&&atoi(size)>0)
{
fprintf(fp,"\n%s\t%s\t%d",id,size,status);
/*fprintf(fp,"\n%d\t%d\t%d",id,size,status);*/
jobnum++;
}
elsebreak;
}while
(1);
if(jobnum)
printf("\nFinishedtoinputthejobs!
");
else
{
printf("\nNojobwasgiven、");
errorMessage();
}
fclose(fp);
}
intmakeJobList(structjobList**jobs)
/*从JOB文件中读出作业并创建作业链表*/
{
charjobID[10],size[10],status[10];
structjobList*rear;
FILE*fp;
open,"d:
\\job、cl","r");
fscanf(fp,"%s%s%s",jobID,size,status);
if((*jobs=malloc(sizeof(structjobList)))==NULL)
{
printf("\nNotenoughtoallocateforthejob、");
fclose(fp);
errorMessage();
}
rear=*jobs;
(*jobs)->next=NULL;
while(!
feof(fp))
{
structjobList*p;
fscanf(fp,"%s%s%s",jobID,size,status);
if((p=malloc(sizeof(structjobList)))==NULL)
{
printf("\nNotenoughtoallocateforthejob、");
fclose(fp);
errorMessage();
}
p->next=rear->next;
rear->next=p;
rear=rear->next;
rear->id=atoi(jobID);
rear->size=atoi(size);
rear->status=atoi(status);
}
fclose(fp);
return0;
}
intupdateJobjobList*jobs)/*更新作业链表中作业的状态*/
{
FILE*fp;
structjobList*p;
open,"d:
\\job、cl","w");
fprintf(fp,"job_ID\tsize\tstatus");
for(p=jobs->next;p;p=p->next)
fprintf(fp,"\n%d\t%d\t%d",p->id,p->size,p->status);
fclose(fp);
return0;
}
intshowFreeList(structfreeList*empty)/*空闲分区队列显示*/
{
FILE*fp;
structfreeList*p=empty->next;
intcount=0;
open,"d:
\\result、cl","a");
fprintf(fp,"\n\nNowshowthefreelist、、、");
printf("\n\nNowshowthefreelist、、、");
if(p)
{
fprintf(fp,"\nnumber\tsize\tstartAddress");
printf("\nnumber\tsize\tstartAddress");
for(;p;p=p->next)
{
fprintf(fp,"\n%d\t%d\t%d",++count,p->size,p->startAddress);
printf("\n%d\t%d\t%d",count,p->size,p->startAddress);
}
fclose(fp);
return1;
}
else
{
fprintf(fp,"\nThememorywasusedout!
");
printf("\nThememorywasusedout!
");
fclose(fp);
return0;
}
}
voidgetJobInfo(structjobList*jobs,intid,int*size,int*status)
/*获取作业的信息*/
{
structjobList*p=jobs->next;
while(p&&p->id!
=id)
p=p->next;
if(p==NULL)
{
printf("\nCan'tfindthejobwhichidis:
%d、",id);
errorMessage();
}
else
{
*size=p->size;
*status=p->status;
}
}
voidupdateJobStatus(structjobList**jobs,intid,intstatus)
{
structjobList*p=(*jobs)->next;
while(p&&p->id!
=id)
p=p->next;
if(p==NULL)
{
printf("\nCan'tfindthejobwhichidis:
%d、",id);
errorMessage();
}
else
p->status=status;
}
intshowUsedList(structjobList*jobs,structusedList*used)
/*作业占用链表显示*/
{
FILE*fp;
structusedList*p=used->next;
intcount=0,size,status;
open,"d:
\\result、cl","a");
fprintf(fp,"\n\nNowshowtheusedlist、、、");
printf("\n\nNowshowtheusedlist、、、");
if(p)
{
fprintf(fp,"\nnumber\tjobID\tsize\tstartAddress");
printf("\nnumber\tjobID\tsize\tstartAddress");
for(;p;p=p->next)
{
getJobInfo(jobs,p->jobID,&size,&status);
fprintf(fp,"\n%d\t%d\t%d\t%d",++count,p->jobID,size,p->startAddress);
printf("\n%d\t%d\t%d\t%d",count,p->jobID,size,p->startAddress);
}
fclose(fp);
return1;
}
else
{
fprintf(fp,"\nNojobinthememory!
Youshouldinputsomejobstoit、");
printf("\nNojobinthememory!
Youshouldinputsomejobstoit、");
fclose(fp);
return0;
}
}
intshowJobList(structjobList*jobs)/*显示作业链表*/
{
structjobList*p;
p=jobs->next;
if(p==NULL)
{
printf("\nNojobinthelist!
Tryagainnexttime、");
return0;
}
printf("\n\nThejoblistisasfallow:
\njob_ID\tsize\tstatus");
while(p)
{
printf("\n%d\t%d\t%d",p->id,p->size,p->status);
p=p->next;
}
return1;
}
voidmoveFragment(structjobList*jobs,structfreeList**empty,structusedList**used)
{
intsize,status;
structusedList*p;
intaddress=memoryStartAddress;
/*全局变量,初始化时分配存储空间始址*/
if((*empty)->next==NULL)/*空闲分区链表为空,提示并返回*/
{
printf("\nThememorywasusedoutatall、\nMaybeyoushouldfinishsomejobsfirstorpressanykeytotryagain!
");
getch();
return;
}
for(p=(*used)->next;p;p=p->next)
/*循环的修改占用分区的始址*/
{
p->startAddress=address;
getJobInfo(jobs,p->jobID,&size,&status);
/*由作业ID获得作业大小*/
address+=size;
}
(*empty)->next->startAddress=address;
/*修改空闲分区的首节点始址、大小*/
(*empty)->next->size=memorySize-(address-memoryStartAddress);
(*empty)->next->next=NULL;
/*删除首节点后的所有节点*/
}
voidorder(structfreeList**empty,intbySize,intinc)
{
structfreeList*p,*q,*temp;
intstartAddress,size;
for(p=(*empty)->next;p;p=p->next)
{/*按bySize与inc两个参数寻找合适的节点,用temp指向它*/
for(temp=q=p;q;q=q->next)
{
switch(bySize)
{
case0:
switch(inc)
{
case0:
if(q->size
temp=q;break;
default:
if(q->size>temp->size)
temp=q;break;
}break;
default:
switch(inc)
{
case0:
if(q->startAddress
temp=q;break;
default:
if(q->startAddress>temp->startAddress)
temp=q;break;
}break;
}
}/*交换节点的成员值*/
if(temp!
=p)
{
startAddress=p->startAddress;
size=p->size;
p->startAddress=temp->startAddress;
p->size=temp->size;
temp->startAddress=startAddress;
temp->size=size;
}
}
}
intallocate(structfreeList**empty,intsize)
/*为作业分配存储空间、状态必须为0*/
{
structfreeList*p,*prep;
intstartAddress=-1;
p=(*empty)->next;
while(p&&p->size p=p->next; if(p! =NULL) { if(p->size>size) { startAddress=p->startAddress; p->startAddress+=size; p->size-=size; } else { startAddress=p->startAddress; prep=*empty; while(prep->next! =p) prep=prep->next; prep->next=p->next; free(p); } } elseprintf("\nMaybeyoushouldmovethefragmenttogether、");/*Unsuccessful! */ returnstartAddress; } voidinsertUsedNode(structusedList**used,intid,intstartAddress)/*插入释放的空间到used链表中(作业号为id,startAddress由函数13返回)*/ { structusedList*q,*r,*prer; if((q=malloc(sizeof(structusedList)))==NULL) { printf("\nNotenoughtoallocatefortheusednode、"); errorMessage(); } q->startAddress=startAddress; q->jobID=id; prer=*used; r=(*used)->next; while(r&&r->startAddress { prer=r; r=r->next; } q->next=prer->next; prer->next=q; } intfinishJob(structusedList**used,intid,int*startAddress) /*结束一个作业号为id的作业,释放存储空间(由*startAddress返回空间的起始地址)*/ { structusedList*p,*prep; prep=*used; p=prep->next; while(p&&p->jobID! =id) { prep=p; p=p->next; } if(p==NULL) { printf("\nThejobwhichidis: %disnotinthememory! ",id); return0; } else { *startAddress=p->startAddress; prep->next=p->next; free(p); return1; } } voi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 源代码