进程管理和存储管理算法.docx

上传人:b****7 文档编号:11082238 上传时间:2023-02-24 格式:DOCX 页数:14 大小:16.98KB
下载 相关 举报
进程管理和存储管理算法.docx_第1页
第1页 / 共14页
进程管理和存储管理算法.docx_第2页
第2页 / 共14页
进程管理和存储管理算法.docx_第3页
第3页 / 共14页
进程管理和存储管理算法.docx_第4页
第4页 / 共14页
进程管理和存储管理算法.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

进程管理和存储管理算法.docx

《进程管理和存储管理算法.docx》由会员分享,可在线阅读,更多相关《进程管理和存储管理算法.docx(14页珍藏版)》请在冰豆网上搜索。

进程管理和存储管理算法.docx

进程管理和存储管理算法

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

block[i]=0;

for(i=0;i<80;i++)

block[rand()%(N-1)]=1;

blockCount=0;

for(i=0;i

if(block[i]==0)

blockCount++;

//初始化存放进程的数组

for(i=0;i

process[i][0]=0;

for(j=1;j

process[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;i

if(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();

}

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1