做个操作系统进程模拟运行系统试试,就当复习一下OS和C了
对于Process Control Block并没有想太多只把瞬间想到的表征进程特性的项目记录了下来。程序只是对进程的运行步骤进行简单模拟,并未完全实现进程在内存中的创建、运行、阻塞、唤醒、撤销等过程。
为了debug方便程序并没有对输入缓存区进行任何限制,若输入格式有误造成程序崩溃属正常现象。当然,在每一条输入语句后面加一句fflush(stdin);即可简单解决。其余格式问题对输入值做条件限制即可,因为我实在是太懒了,所以就不弄了;
C语言程序描述如下:
#include<stdio.h>
#include<stdlib.h>
struct process_type {
int proId;//process id,标识进程ID。
int priority;//标识进程优先级
int size;//标识进程size,无单位。
int state;//标识进程satae,0表示不在内存,1表示在内存,2表示阻塞
char info[10];//标识进程information。
};
//定义20个进程结构体
struct process_type memory[20];
//定义全局变量
int proNum = 0, numofblocked = 0, proId;
//创建进程函数
void CreateProcess() {
if (proNum >= 20)printf("\n内存已满,请先唤醒或杀死进程n");
//最多允许创建20个进程。
else {
int i, j;
for (i = 0; i < 20; i++)
//定位,找到可以还未创建的进程
if (memory[i].state == 0)break;
printf("\n请输入新进程ID \n");
scanf("%d", &(memory[i].proId));
for (j = 0; j < i; j++) {
if (memory[i].proId == memory[j].proId) {
printf("\n该进程已存在n");
return;
}
}
printf("\n请输入新进程优先级 \n");
scanf("%d", &(memory[i].priority));
printf("\n请输入新进程大小 \n");
scanf("%d", &(memory[i].size));
printf("\n请输入新进程内容 \n");
scanf("%s", &(memory[i].info));
//创建进程,使标记位为1
memory[i].state = 1;
proNum++;
}
}
//显示正在运行进程函数
void RunningProcess() {
int i, count = 0;
for (i = 0; i < 20; i++) {
if (memory[i].state == 1) {
//输出运行进程的各个属性值
printf("\n进程%d\tproId=%d\t", i + 1, memory[i].proId);
printf("priority=%d\t", memory[i].priority);
printf("size=%d\t", memory[i].size);
printf("state=%d\t", memory[i].state);
printf("info=%s\n", memory[i].info);
count++;
}
}
printf("当前进程运行数为%d\n", count);
}
//阻塞进程函数
void BlockProcess() {
if (!proNum) {
printf("当前没有运行进程\n");
return;
}
printf("\n请输入需要阻塞的进程ID ");
scanf("%d", &proId);
int i;
for (i = 0; i < 20; i++) {
//定位,找到所要阻塞的进程,根据其状态做相应处理
if (proId == memory[i].proId) {
if (memory[i].state == 1) {
memory[i].state = 2;
numofblocked++;
printf("\n已经成功阻塞进程\n");
} else if (memory[i].state == 0) {
printf("\n要阻塞的进程不存在\n");
} else printf("\n要阻塞的进程已被阻塞\n");
break;
}
}
if (i >= 20) {
printf("\n要阻塞的进程不存在\n");
}
}
//杀死进程函数
void KillProcess() {
if (!proNum) {
printf("当前没有运行进程\n");
return;
}
printf("\n请输入需要杀死的进程ID ");
scanf("%d", &proId);
int i;
for (i = 0; i < 20; i++) {
//定位,找到所要杀死的进程,根据其状态做相应处理
if (proId == memory[i].proId) {
if (memory[i].state == 1) {
memory[i].state = 0;
proNum--;
printf("\n已成功杀死进程\n");
} else if (memory[i].state == 0)
printf("\n:要杀死的进程不存在\n");
else printf("\n要杀死的进程已被阻塞\n");
break;
}
}
//找不到,则说明进程不存在
if (i >= 20) {
printf("\n要杀死的进程不存在\n");
}
}
//唤醒进程函数
void RouseProcess() {
if (!proNum) {
printf("\n当前没有运行进程\n");
return;
}
if (!numofblocked) {
printf("\n当前没有阻塞进程\n");
return;
}
printf("\n请输入需要唤醒的进程ID:\n");
scanf("%d", &proId);
int i;
for (i = 0; i < 20; i++) {
//定位,找到所要唤醒的进程,根据其状态做相应处理
if (proId == memory[i].proId) {
if (memory[i].state == 2) {
memory[i].state = 1;
numofblocked--;
printf("\n已经成功唤醒进程\n");
} else if (memory[i].state == 0) {
printf("\n要唤醒的进程不存在\n");
} else
printf("\n要唤醒的进程正在运行,不必唤醒!\n");
printf("%当前阻塞进程数为:%d", numofblocked);
break;
}
}
//找不到,则说明进程不存在
if (i >= 20) {
printf("\n要唤醒的进程不存在\n");
}
}
//退出程序函数
void EndOfJob() {
printf("谢谢使用,正在退出!\n");
exit(0);
}
//主函数
void main() {
int num, i;
//一开始所有进程都不在内存中
for (i = 0; 1 < 20; i++) {
memory[i].state = 0;
while (1) {
printf("\n---------------------------------");
printf("\n*进程演示系统*");
printf("\n---------------------------------");
printf("\n*1.创建新的进程\t*2.查看运行进程");
printf("\n*3.阻塞某个进程\t*4.杀死运行进程");
printf("\n*5.唤醒某个进程\t*0.退出系统");
printf("\n---------------------------------");
printf("\n请选择(0~5)\n");
InputError:
scanf("%d", &num);
switch (num) {
case 1:
CreateProcess();
break;
case 2:
RunningProcess();
break;
case 3:
BlockProcess();
break;
case 4:
KillProcess();
break;
case 5:
RouseProcess();
break;
case 0:
EndOfJob();
default: {
printf("%输入错误!请重新输入: ");
goto InputError;
}
}
}
}
}
那就这样吧,再见!