操作系统进程模拟运行系统---C语言实现---Ss1Two

周六早上无聊,做个操作系统进程模拟运行系统试试,就当复习一下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;
				}
			}
		}
	}
}

那就这样吧,再见!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值