进程管理和存储管理算法.docx
《进程管理和存储管理算法.docx》由会员分享,可在线阅读,更多相关《进程管理和存储管理算法.docx(14页珍藏版)》请在冰豆网上搜索。
进程管理和存储管理算法
#include
#include
#include
#include
#defineN100//共有100个内存块
intprocess[N][N+1];//存放每个进程的页表
intblock[N];//内存块状态标志数组,0:
空闲,1:
使用
intblockCount;//记录当前内存剩余空间
intprocessCount;//记录当前进程数
boolflag=true;
intM;
typedefstructnode{
intpid;
intround;
intneedtime;
intcputime;
intcount;
intstate;
structnode*next;
}PCB;
PCB*finish,*ready,*tail,*run;
//voidinit();
voidoutput();
//boolcreateProcess();
//boolendProcess();
voidinit()
{
inti,j;
//初始化内存状态标志数组
for(i=0;iblock[i]=0;
for(i=0;i<80;i++)
block[rand()%(N-1)]=1;
blockCount=0;
for(i=0;iif(block[i]==0)
blockCount++;
//初始化存放进程的数组
for(i=0;iprocess[i][0]=0;
for(j=1;jprocess[i][j]=-1;
}
processCount=0;
printf("初始化结果如下:
");
output();
flag=false;
}
voidoutput()
{
printf("\n内存总量:
%d块,已用空间:
%d块,剩余空间:
%d块,进程总数:
%d个\n",N,N-blockCount,blockCount,processCount);
if(flag&&blockCount{
printf("已使用的内存块(%d):
\n",N-blockCount);
for(intk=0,count=0;k{
if(block[k]==1)
printf("%2d",k,++count);
if(count==10)
{
putchar('\n');
count=0;
}
}
putchar('\n');
}
//输出各进程占用内存详细情况
if(processCount>0)
{
intid;
printf("请输入要查看的进程号:
");
scanf("%d",&id);
printf("内存详细使用情况如下:
\n");
//for(inti=0;i//{
if(process[id][0]>0)
{
printf("进程号:
%d占用内存块(%2d):
\n",id,process[id][0]);
printf("|------------|\n");
printf("|页号|块号|\n");
printf("|------------|\n");
for(intj=1,count=0;j<=process[id][0];j++)
{
printf("|%2d|%2d|\n",count,process[id][j],count++);
printf("|------------|\n");
//printf("%2d",process[i][j],count++);
/*if(count==15)
{
putchar('\n');
printf("");
count=0;
}*/
}
printf("***输出结束***\n");
//putchar('\n');
}
//}
}
else
printf("当前内存无进程!
\n");
putchar('\n');
}
voidfirstin()
{
run=ready;
run->state='R';
ready=ready->next;
}
voidprt1(PCB*q)
{
printf("*%-10d%-10d%-10d%-10d%-10d%-10c*\n",
q->pid,q->cputime,q->needtime,q->count,q->round,q->state);
}
voidprt()
{
PCB*q;
printf("*进程号cpu时间所需时间记数时间片状态*\n");
if(run!
=NULL)
prt1(run);
q=ready;
while(q!
=NULL&&q!
=run)
{
prt1(q);
if(q->next==run)
break;
elseq=q->next;
}
q=finish;
while(q!
=NULL)
{
prt1(q);
q=q->next;
}
getchar();
}
voidinsert(PCB*q)
{
tail->next=q;
tail=tail->next;
}
boolcreateProcess()
{
intna;
intpages,k=0;
PCB*p;
inttime;
//charna[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("输入进程数:
");
scanf("%d",&M);
for(intj=1;j<=M;j++)
{
loop:
printf("请输入进程号(小于%d)和运行时间和所需页面数:
",N);
scanf("%d%d%d",&na,&time,&pages);
if(na>99)
{
printf("错误!
进程号过大!
\n");
gotoloop;
}
if(pages>blockCount)
returnfalse;
blockCount-=pages;
process[na][0]=pages;
for(inti=1;i<=pages;i++)
{
while(block[k]==1&&k<100)
k++;
process[na][i]=k;
block[k]=1;
k++;
}
p=(PCB*)malloc(sizeof(PCB));
//strcpy(p->pid,pid);
p->pid=na;
p->cputime=0;
p->needtime=time;
p->state='W';
p->round=0;
p->count=0;
if(ready!
=NULL)
insert(p);
else
{
p->next=ready;
ready=p;
tail=ready;
}
processCount++;
printf("创建新进程成功!
\n\n");
}
returntrue;
}
Roundrun()
{
inttimeSlice;
//if(processCount<1)
//printf("当前程序无进程,请重新输入\n\n");
//return0;
printf("请输入时间片的大小:
");
//printf("");
scanf("%d",&timeSlice);
printf("时间片轮转法输出信息\n");
printf("*****************************************************************************\n");
run=ready;
ready=ready->next;
tail->next=run;
run->state='R';
prt();
while(run!
=NULL)
{
run->cputime=run->cputime+timeSlice;
run->needtime=run->needtime-timeSlice;
run->round+=timeSlice;
run->count++;
if(run->needtime<=0)
{
run->needtime=0;
run->next=finish;
finish=run;
if(run!
=tail)
{
tail->next=ready;
}
else
{
ready=NULL;
}
run->state='F';
run=NULL;
if(ready!
=NULL)
{
firstin();
}
}
else
{
if(ready!
=NULL)
{
run->state='W';
tail=run;
run=ready;
run->state='R';
ready=ready->next;
}
}
prt();
}
printf("*****************************************************************************\n");
printf("输出结束\n");
}
boolendProcess()
{
intID,pages;
if(processCount<1)
{
printf("当前内存没有进程!
\n\n");
returnfalse;
}
printf("当前内存中的进程有%d个,进程号为:
",processCount);
for(inti=0;iif(process[i][0]>0)
printf("%2d",i);
putchar('\n');
printf("请输入您要结束的进程号(小于%d):
",N);
scanf("%d",&ID);
PCB*p1,*p2;
p1=ready;
while(ID!
=p1->pid&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(ID==p1->pid)
{
if(p1==ready)
ready=p1->next;
else
p2->next=p1->next;
printf("已删除进程%d\n",ID);
}
else
printf("对不起!
您所要结束的进程%d不存在,请重新输入\n\n",ID);
/*pages=process[ID][0];
if(pages==0)
{
printf("对不起!
该进程不存在!
\n");
returnfalse;
}
*/
for(intj=1;j{
block[process[ID][j]]=0;
process[ID][j]=-1;
}
process[ID][0]=0;
processCount--;
blockCount+=pages;
returntrue;
}
voidmenu()
{
intchoice;
while(true)
{
printf("操作菜单:
\n");
printf("1-->创建进程\n2-->结束进程\n3-->查看内存\n4-->运行程序\n0-->退出程序\n");
printf("请输入您要进行的操作:
");
scanf("%d",&choice);
switch(choice)
{
case1:
if(createProcess())
//else
//printf("抱歉!
内存空间不足,创建新进程失败!
\n\n");
continue;
case2:
if(endProcess())
//printf("进程已结束!
\n\n");
//else
//printf("进程结束失败!
\n\n");
break;
case3:
output();
break;
case4:
Roundrun();
break;
case0:
return;
default:
printf("对不起!
您的选择有误!
请重新选择!
\n\n");
}
}
}
voidmain()
{
init();
menu();
}