#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
#include <ctype.h>
#define M 2000
#define maxsize 300
#define minsize 30
#define readylen 5
typedef struct node
{
char name[10];
int prio;
int round;
int cputime;
int needtime;
int count;
int size;
int start;
char state;
struct node *next;
}PCB;
typedef struct book
{
int order;
int size;
int start;
char state;
}Mem;
PCB *finish,*ready,*run,*block,*prepare;
Mem m[100];
int N,mnum=0,pnum=0;
void init()
{int i=1;
m[i].order=i;
m[i].size=rand()% (maxsize-minsize)+minsize;
m[i].start=0;
m[i].state='N';
do
{ i++;
m[i].order=i;
m[i].size=rand()%(maxsize-minsize)+minsize;
m[i].start=m[i-1].start+m[i-1].size;
m[i].state='N';
}while(m[i].start+m[i].size<=M&&i<=100);
mnum=i;
}
void print()
{
int i;
printf("\norder size start state\n");
printf("there is [%d] empty region\n\n",mnum);
for(i=1;i<=mnum;i++)
printf(" %-10d %-10d%-10d%-10c\n",m[i].order,m[i].size,m[i].start,m[i].state);
}
void smove(int i)
{
int j;
for(j=i;j<mnum;j++)
{
m[j].size=m[j+1].size;
m[j].start=m[j+1].start;
}
mnum=mnum-1;
}
void xmove(int i)
{
int j;
for(j=mnum+1;j>=i+1;j--)
{
m[j].order=j;
m[j].state='N';
m[j].size=m[j-1].size;
m[j].start=m[j-1].start;
}
mnum=mnum+1;
}
int divide(PCB *p,int pnum)
{
int psize,i=0;
psize=p->size;
if(pnum<readylen)
{
while(psize>m[i].size)
i++;
if(i<=mnum)
{
if(m[i].size-psize<minsize)
{
p->size=m[i].size;
p->start=m[i].start;
smove(i);
}
else
{
p->start=m[i].start;
m[i].start=m[i].start+psize;
m[i].size=m[i].size-psize;
}
return 1;
}
else
{printf("\nthere is no available space,it cann't divide\n");
return 0;
}
}
}
void recy(PCB *p)
{
int i=1;
while(p->start>m[i].start&&i<=mnum)
i++;
if(i<=mnum&&i!=1)
{if(m[i-1].start+m[i-1].size==p->start&&p->start+p->size==m[i].start)
{
m[i-1].size=m[i-1].size+p->size+m[i].size;
smove(i);
}
else
if(m[i-1].start+m[i-1].size==p->start)
m[i-1].size=m[i-1].size+p->size;
else
if(p->start+p->size==m[i].start)
{
m[i].start=p->start;
m[i].size=m[i].size+p->size;
}
else
{
xmove(i);
m[i].size=p->size;
m[i].start=p->start;
}
}
else
if(i==1)
if(p->size==m[i].start)
{m[i].size=p->size+m[i].size;
m[i].start=p->size;
}
else
{xmove(i);
m[i].start=0;
m[i].size=p->size;
}
printf("mem recycle over\n");
}
void firstin()
{
run=ready;
run->state='R';
ready=ready->next;
}
int timesj(void)
{
int i,xt;
time_t t;
srand((unsigned) time(&t));
xt = rand() % 10 +1;
return xt;
}
void prt1(char a)
{
if(toupper(a)=='1')
printf(" name cputime needtime priority state size start\n");
else
if(toupper(a)=='2')
printf(" name cputime needtime priority state size start\n");
else
printf(" name cputime needtime priority state size start\n");
}
void prt2(char a,PCB *q)
{
if(toupper(a)=='1')
printf(" %-10s%-10d%-10d%-10d %-10c%-10d%-10d\n",q->name,
q->cputime,q->needtime,q->prio,q->state,q->size,q->start);
else
if(toupper(a)=='2')
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
q->cputime,q->needtime,q->prio,q->state,q->size,q->start);
else
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
q->cputime,q->needtime,q->prio,q->state,q->size,q->start);
}
void prt(char algo)
{
PCB *p;
prt1(algo);
if(run!=NULL)
prt2(algo,run);
p=ready;
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
p=finish;
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
p=block;
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
p=prepare;
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
getch();
return;
}
void insert(PCB *q)
{
PCB *p1,*s,*r;
int b;
s=q;
p1=ready;
r=p1;
b=1;
while((p1!=NULL)&&b)
if(p1->prio>=s->prio)
{
r=p1;
p1=p1->next;
}
else
b=0;
if(r!=p1)
{
r->next=s;
s->next=p1;
}
else
{
s->next=p1;
ready=s;
}
}
void create(char alg)
{
PCB *p,*r;
int i,time,sjt,priost,lab;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
block=NULL;
prepare=NULL;
printf("Enter name and time of process\n");
printf("----\n");
for(i=1;i<=N;i++)
{
p=(PCB*)malloc(sizeof(PCB));
printf("Enter name%d",i);
printf(":");
scanf("%s",na);
printf("Random time%d",i);
printf(":");
sjt=timesj();
printf("%d\n", sjt);
printf("Random priority%d",i);
printf(":");
printf("%d\n", 20-sjt);
strcpy(p->name,na);
p->cputime=0;
p->needtime=sjt;
p->state='w';
p->prio=20-sjt;
p->round=1;
p->count=0;
p->size=rand()%(maxsize-minsize)+minsize;
lab=divide(p,pnum);
if(lab==0)
if(prepare!=NULL)
{ r=prepare;
while(r->next!=NULL)
r=r->next;
p->state='p';
p->start=0;
r->next=p;
p->next=NULL;
}
else
{
p->state='p';
p->start=0;
p->next=prepare;
prepare=p;
}
else
if(ready!=NULL)
{insert(p);
pnum++;
}
else
{
p->next=ready;
ready=p;
pnum=1;
}
}
clrscr();
printf(" Display Process Of Priority:\n");
printf("-----\n");
prt(alg);
run=ready;
ready=ready->next;
run->state='R';
}
void suspend()
{ PCB *p;
p=block;
if(p==NULL)
{block=run;
firstin();
block->next=NULL;
block->prio++;
block->state='S';
}
else
{while(p->next!=NULL)
p=p->next;
p->next=run;
firstin();
p=p->next;
p->next=NULL;
p->prio++;
p->state='S';
}
}
void unsuspend(char *sname)
{ PCB *p,*q;
char *s;
p=block;
s=p->name;
while(strcmp(sname,s)!=0&&p!=NULL)
{q=p;
p=p->next;
s=p->name;
}
if(p!=NULL)
{q->next=p->next;
p->state='W';
insert(p);}
}
void menu1()
{
printf("***********choice*****************\n");
printf("\n 1:suspend \n");
printf(" 2:unsuspend \n");
printf(" 3:increase process \n");
printf(" 4:print memory \n");
printf(" 5:end run \n");
printf(" else:exit choice \n");
printf("Enter your choice:");
}
void roundrun(char alg)
{int lab;
PCB *r;
char sname[10];
while(run!=NULL)
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->count=run->count+1;
run->prio=run->prio-1;
menu1();
scanf("%d",&lab);
getchar();
printf("\n");
switch(lab)
{ case 1: suspend();break;
case 2:
{printf("please input the jiegua name\n");
scanf("%s",sname);
unsuspend(sname);
}
break;
case 3: create('1');break;
case 4: print();break;
case 5: exit(0);break;
}