📄 main.cpp
字号:
#include "stdio.h"
#include <stdlib.h>
#include "conio.h"
#include <time.h> //用来产生随机函数的
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
#define N 5
struct pcb { /* 定义进程控制块PCB */
int name;
char state; /*进程的状态是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一*/
int nspace; //
int rspace;
int ntime; //need time
int rtime; //have ran time
struct pcb* link;
}*ready=NULL,*readytail=NULL,*running=NULL,*runningtail=NULL,*p;
typedef struct pcb PCB;
int mem[8]={20,20,40,40,40,40,60,60};
int memp[8]={-1,-1,-1,-1,-1,-1,-1,-1};
int memflag[8]={0,0,0,0,0,0,0,0};
void sort() /*insert进程*/
{
if(!ready)
{ ready=readytail=p; }
else
{ readytail->link=p;readytail=p; }
}
void input() /* 建立进程控制块函数*/
{
int i,num;
system("cls"); /*清屏*/
printf("\n请输入进程块数?");
scanf("%d",&num);
for(i=1;i<=num;i++)
{
p=getpch(PCB);
p->name=i;
p->nspace=(1+rand()%6)*10;
p->rspace=-1;
p->ntime=1+rand()%5;
p->rtime=0;
p->state='w';
p->link=NULL;
sort(); /* 调用sort函数*/
}
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf("\t| %d\t",pr->name);
printf(" %c\t",pr->state);
printf(" %d\t",pr->nspace);
printf(" %d\t",pr->rspace);
printf(" %d\t",pr->ntime);
printf(" %d |\n",pr->rtime);
}
void displayqueue(PCB* ppp)
{
PCB*pr=ppp;
printf("\t---------------------------------------------\n");
printf("\t|名称\t状态\t需存\t地址\t需时\t运时|\n");
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
printf("\t---------------------------------------------\n");
}
void run() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
PCB *r,*first=NULL,*last=NULL;
while(running)
{
r=running;
running=running->link;
r->link=NULL; //一定要加,注意
r->rtime++;
if( r->rtime == r->ntime )
{
memflag[r->rspace]=0;
memp[r->rspace]=-1;
printf("\t进程%d已经完成\n",r->name);
}
else
{
if(!first)
{ first=last=r; }
else
{
last->link=r; last=r;last->link=NULL;
}
}
}
running=first;
}
void sleep(int n)
{
time_t temp=time(NULL);
while(time(NULL)<temp+n) ;
}
void displaytable()
{
int i,address=0;
printf("\t=========================================\n");
printf("\t|分区号\t大小\t起址\t状态\t进程\t|\n");
for(i=0;i<8;i++)
{
printf("\t| %d\t %d\t %d\t %d\t %d\t|\n",i,mem[i],address,memflag[i],memp[i]);
address+=mem[i];
}
printf("\t=========================================\n");
}
int findn(PCB* l)
{
int i;
for(i=0;i<8;i++)
{
if((l->nspace <= mem[i]) && !memflag[i] )
return i;
}
return -1;
}
void main() /*主函数*/
{
int n,t=0;
int flag=1;
srand(time(0));
printf("用固定分区分配管理内存n\t");
sleep(1);
input();
printf("当前产生的进程:\n");
displayqueue(ready);
getchar();
printf("\n请按任意键开始运行内存分配。。。\n");
getchar();
while( running || ready ) /*运行和就绪队列*/
{
//system("cls");
printf("\t time:%d\n",t);
while( flag && ready )
{
p=ready;
n=findn(p);
if(n>=0)
{
memflag[n]=1;
memp[n]=p->name;
p->rspace=n;
if(!running) {running=runningtail=p;}
else { runningtail->link=p; runningtail=p; }
ready=ready->link;
runningtail->link=NULL;
}
else
{ flag=0; }
}
flag=1;
displaytable();
printf("\n当前的运行队列\n");
displayqueue(running);
t++;
run();
sleep(1);
}
printf("\n 全部进程已经完成.\n");
getchar();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -