📄 process.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10 //最大进程控制块数
#define EMPTY -1
#define TIMEPATCH 3 //定义一个时间片为3秒
enum status {READY,RUNNING,FREE}; //表示状态
struct pcb {
char * name;
int status;
int timeNeed; //表示该进程运行完毕所需时间
int timeUsed; //表示该进程已用的时间
int next;
};
struct readyPcb
{
int head;
int tail;
};
void intialize();
int get_location();
void create_process();
void run_process();
struct pcb pcbarea[MAX];
struct readyPcb ready;
int pfree;
int run;
main()
{
int select;
int quit = 0;
intialize();
while (!quit)
{
puts("选择1、2、3执行操作");
puts("1、创建进程(最多10个)");
puts("2、开始模拟进程调度");
puts("3、退出程序");
scanf("%d",&select);
switch (select) {
case 1:
create_process();
break;
case 2:
run_process();
break;
case 3:
quit = 1;
break;
default:
scanf("%d",&select);
}
}
}
void intialize()
{
int i;
for (i=0; i<MAX; i++)
{
pcbarea[i].name = NULL;
pcbarea[i].status = FREE;
pcbarea[i].timeNeed = 0;
pcbarea[i].timeUsed = 0;
pcbarea[i].next = (i+1) % MAX;
}
pfree = 0;
run = EMPTY;
ready.head = EMPTY;
ready.tail = EMPTY;
}
void create_process()
{
int i;
if (pfree < MAX)
{
i = pfree;
pfree++;
pcbarea[i].name = (char *)malloc(10 * sizeof(char));
puts("输入进程名:");
scanf("%s",pcbarea[i].name);
puts("输入进程运行所需时间:");
scanf("%d",&pcbarea[i].timeNeed);
//pcbarea[i].timeNeed *= 1000;
pcbarea[i].status = READY;
if (ready.head == EMPTY)
{
ready.head = i;
ready.tail = i;
pcbarea[ready.tail].next = ready.head;
}
else
{
pcbarea[ready.tail].next = i;
ready.tail = i;
pcbarea[i].next = ready.head;
}
}
else
{
puts("无空闲控制块,创建失败");
}
}
void run_process()
{
int p,timep;
time_t t1,t2;
run = ready.head;
if (run != EMPTY)
{
pcbarea[ready.head].status = RUNNING;
time(&t1);
ready.head = pcbarea[ready.head].next;
if (ready.head == run) //若ready.head == run则说明原来ready对列中就一个进程
{
ready.head = EMPTY;
ready.tail = EMPTY;
}
else
{
pcbarea[ready.tail].next = ready.head;
}
printf("the process on running is %s\n",pcbarea[run].name);
if (ready.head == EMPTY)
{
puts("the ready process is empty");
puts("\n-------------------------------------------------------------------------------\n");
}
else
{
p = ready.head;
printf("the ready process :");
do //打印ready队列中的进程名
{
printf("%s-->",pcbarea[p].name);
p = pcbarea[p].next;
} while (p != ready.head);
puts("\n-------------------------------------------------------------------------------\n");
}
while (run != EMPTY)
{
time(&t2);
timep = (int)difftime(t2,t1);
if ((pcbarea[run].timeUsed + timep) >= pcbarea[run].timeNeed)
{
pcbarea[run].status = FREE;
timep = 0;
printf("process %s completed\n",pcbarea[run].name);
if (ready.head != EMPTY)
{
run = ready.head;
pcbarea[run].status = RUNNING;
t1 = t2;
printf("the process on running is %s\n",pcbarea[run].name);
ready.head = pcbarea[ready.head].next;
if (ready.head == run) //若ready.head == run则说明原来ready对列中就一个进程
{
ready.head = EMPTY;
ready.tail = EMPTY;
puts("the ready process is empty");
puts("\n-------------------------------------------------------------------------------\n");
continue;
}
pcbarea[ready.tail].next = ready.head;
printf("the ready process : ");
p = ready.head;
do //打印ready队列中的进程名
{
printf("%s-->",pcbarea[p].name);
p = pcbarea[p].next;
} while (p != ready.head);
puts("\n-------------------------------------------------------------------------------\n");
}
else {
puts("all process comleted!");
break;
}
}
else if (timep >= TIMEPATCH)
{
if (ready.head == EMPTY)
{
t1 = t2;
pcbarea[run].timeUsed += timep;
timep = 0;
continue;
}
pcbarea[run].status = READY;
pcbarea[run].timeUsed += timep;
timep = 0;
pcbarea[ready.tail].next = run;
ready.tail = run;
run = ready.head;
printf("the process on running is %s\n",pcbarea[run].name);
ready.head = pcbarea[ready.head].next;
pcbarea[ready.tail].next = ready.head;
if (ready.head == run) //若ready.head == run则说明原来ready对列中就一个进程
{
ready.head = EMPTY;
ready.tail = EMPTY;
puts("the ready process is empty");
puts("\n-------------------------------------------------------------------------------\n");
t1 = t2;
pcbarea[run].timeUsed += timep;
timep = 0;
continue;
}
printf("the ready process : ");
p = ready.head;
do //打印ready队列中的进程名
{
printf("%s-->",pcbarea[p].name);
p = pcbarea[p].next;
} while (p != ready.head);
puts("\n-------------------------------------------------------------------------------\n");
t1 = t2;
}
}
}
else
{
puts("there is no process in ready");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -