操作系统源代码.docx

上传人:b****3 文档编号:6024865 上传时间:2023-05-09 格式:DOCX 页数:28 大小:20.16KB
下载 相关 举报
操作系统源代码.docx_第1页
第1页 / 共28页
操作系统源代码.docx_第2页
第2页 / 共28页
操作系统源代码.docx_第3页
第3页 / 共28页
操作系统源代码.docx_第4页
第4页 / 共28页
操作系统源代码.docx_第5页
第5页 / 共28页
操作系统源代码.docx_第6页
第6页 / 共28页
操作系统源代码.docx_第7页
第7页 / 共28页
操作系统源代码.docx_第8页
第8页 / 共28页
操作系统源代码.docx_第9页
第9页 / 共28页
操作系统源代码.docx_第10页
第10页 / 共28页
操作系统源代码.docx_第11页
第11页 / 共28页
操作系统源代码.docx_第12页
第12页 / 共28页
操作系统源代码.docx_第13页
第13页 / 共28页
操作系统源代码.docx_第14页
第14页 / 共28页
操作系统源代码.docx_第15页
第15页 / 共28页
操作系统源代码.docx_第16页
第16页 / 共28页
操作系统源代码.docx_第17页
第17页 / 共28页
操作系统源代码.docx_第18页
第18页 / 共28页
操作系统源代码.docx_第19页
第19页 / 共28页
操作系统源代码.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统源代码.docx

《操作系统源代码.docx》由会员分享,可在线阅读,更多相关《操作系统源代码.docx(28页珍藏版)》请在冰点文库上搜索。

操作系统源代码.docx

操作系统源代码

#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);

}

voidopenFile(FILE**fp,char*filename,char*mode)

/*以要求的方式打开文件*/

{

if((*fp=fopen(filename,mode))==NULL)

{

printf("\nCan'topen%sinmode%s.",filename,mode);

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');

openFile(&fp,"d:

\\","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];

openFile(&fp,"d:

\\","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;

openFile(&fp,"d:

\\","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;

}

intupdateJobFile(structjobList*jobs)/*更新作业链表中作业的状态*/

{

FILE*fp;

structjobList*p;

openFile(&fp,"d:

\\","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;

openFile(&fp,"d:

\\","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;

openFile(&fp,"d:

\\","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->sizesize)

temp=q;break;

default:

if(q->size>temp->size)

temp=q;break;

}break;

default:

switch(inc)

{

case0:

if(q->startAddressstartAddress)

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->n

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2