【实验目的】
1.理解进程的概念,明确进程和程序的区别
2.理解并发执行的实质。
3.掌握进程的创建、睡眠、撤销等进程控制方法。
【实验内容】
用C语言编写程序,模拟实现创建新的进程:查看运行进程;换出某个进程:杀死运行进程等功能。
【实验步骤】
1.数据结构
struct jincheng_type//定义一个进程控制块
{
int pid;//进程标识符
int youxian;//进程优先级
int daxiao;
int zhuangtai;//标识进程状态,0-不在内存,1-在内存,2-阻塞
char info[10];
}
struct jincheng_type neicun[20];//结构体数组,存放20个进程控制块
int shumu=0,zuse=0,pid,flag=0;//定义变量
void Create(void)//创建一个进程
void Run(void)//查看一个进程
void Zuse(void)//阻塞一个进程
void Kill(void)//杀死一个进程
void Huanxing(void)//唤醒一个进程
2 .程序流程图
实验代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct jincheng_type
{
int pid;
int youxian;
int daxiao;
int zhuangtai;//标识进程状态,0-不在内存,1-在内存,2-阻塞
char info[10];
};
struct jincheng_type neicun[20];
int shumu = 0;
int pid;
int zuse = 0;
int flag = 0;
void Create(void)
{
if(shumu >= 20)
printf("内存已满,请先唤醒或杀死进程\n");
else
{
int i = 0;
int j = 0;
for(i = 0; i < 20; i++)
{
//定位,找到可以还未创建的进程
if(neicun[i].zhuangtai == 0)
{
for(j = 0; j < i; j++)
if(neicun[i].pid == neicun[j].pid)
{
printf("该进程已存在\n");
return;
}
}
printf("请输入新进程pid:\n");
scanf("%d", &(neicun[i].pid));
printf("请输入新进程优先级:\n");
scanf("%d", &(neicun[i].youxian));
printf("请输入新进程大小:\n");
scanf("%d", &(neicun[i].daxiao));
printf("请输入新进程内容:\n");
scanf("%s", neicun[i].info);
//创建进程,使标记位为1
neicun[i].zhuangtai = 1;
printf("进程已成功创建!\n");
shumu++;
break;
}
}
}
void Run(void)
{
int i = 0;
for(i = 0; i < 20; i++)
{
if(neicun[i].zhuangtai == 1)
{
//输出运行进程的各个属性值
printf("pid=%d\n",neicun[i].pid);
printf("youxian=%d\n",neicun[i].youxian);
printf("daxiao=%d\n",neicun[i].daxiao);
printf("zhuangtai=%d\n",neicun[i].zhuangtai);
printf("info=%s\n",neicun[i].info);
flag=1;
}
if(!flag)
printf("当前没有运行进程\n");
}
}
void Zuse(void)
{
int i = 0;
if(!shumu)
{
printf("当前没有运行进程\n");
return;
}
printf("输入阻塞进程的pid值:\n");
scanf("%d", &pid);
for(i = 0; i < 20; i++)
{
//定位,找到所要阻塞的进程,根据其状态做相应处理
if(pid == neicun[i].pid)
{
if(neicun[i].zhuangtai == 1)
{
neicun[i].zhuangtai = 2;
zuse++;
printf("已经成功阻塞进程\n");
}
else if(neicun[i].zhuangtai == 0)
{
printf("要阻塞的进程不存在\n");
}
else
{
printf("要阻塞的进程已被挂起\n");
}
flag = 1;
break;
}
}
if(flag == 0)
{
printf("要阻塞的进程不存在\n");
}
}
void Kill(void)
{
int i = 0;
if(!shumu)
{
printf("当前没有运行进程\n");
return;
}
printf("请输入pid进程值:\n");
scanf("%d", &pid);
for(i = 0; i < 20; i++)
{
//定位,找到所要杀死的进程,根据其状态做相应处理
if(pid == neicun[i].pid)
{
if(neicun[i].zhuangtai == 1)
{
neicun[i].zhuangtai == 0;
shumu--;
printf("已成功杀死进程\n");
}
else if(neicun[i].zhuangtai == 0)
printf("要杀死的进程不存在\n");
else
printf("要杀死的进程已被挂起\n");
flag=1;
break;
}
}
//找不到,则说明进程不存在
if(!flag)
printf("要杀死的进程不存在\n");
}
void Huanxing(void)
{
int i = 0;
if(!shumu)
{
printf("当前没有运行进程\n");
return;
}
if(!zuse)
{
printf("当前没有挂起进程\n");
return;
}
printf("请输入唤醒进程的pid值:\n");
scanf("%d", &pid);
for(i = 0; i < 20; i++)
{
//定位,找到所要唤醒的进程,根据其状态做相应处理
if(pid == neicun[i].pid)
{
flag = false;
if(neicun[i].zhuangtai == 2)
{
neicun[i].zhuangtai = 1;
zuse--;
printf("已经成功唤醒进程\n");
}
else if(neicun[i].zhuangtai == 0)
printf("要唤醒的进程不存在\n");
else
printf("要唤醒的进程已被唤醒\n");
break;
}
}
//找不到,则说明进程不存在
if(!flag)
printf("要唤醒的进程不存在\n");
}
int main(void)
{
int n = 1;
int num;
int i = 0;
//一开始所有进程都不在内存中
for(i = 0; i < 20; i++)
{
neicun[i].zhuangtai = 0;
while(n)
{
printf("\n***********************************************************");
printf("\n* 进程演示系统 *");
printf("\n***********************************************************");
printf("\n* 1.创建新的进程 2.查看运行进程* ");
printf("\n* 3.阻塞某个进程 4.杀死运行进程* ");
printf("\n* 5.唤醒某个进程 6.退出系统* ");
printf("\n************************************************************");
printf("\n请选择(1~6):\n");
scanf("%d", &num);
switch(num)
{
case 1 : Create();
break;
case 2 : Run();
break;
case 3 : Zuse();
break;
case 4 : Kill();
break;
case 5 : Huanxing();
break;
case 6 : exit(0);
default : n=0;
}
flag=0;//恢复标记
}
}
}