一、实验目的
通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。基本能达到下列具体的目标:
1、 理解进程 PCB 的概念,以及 PCB 如何实现、如何组织以及管理。
2、 复习数据结构中如何对链的操作,包括建链、删除、插入结点等,来实现进程的管理。
二、实验环境说明:
此实验采用的是Win7操作系统
直接编写c或c++文件在终端用命令行执行;
3.Dev-c++
三、实验内容
1、
建立一个结点,即 PCB
块包括用户标识域、状态域(执行、等待、就绪)、 link 域。
2、
建立三个队列(执行队列、就绪队列、等待队列)。
3、
根据进程状态转换实现对三个队列的具体操作。具体的驱动可以采用时间片算法或手动调度的形式完成三个状态之间的转换
4、
用 switch 选择语句选择状态。
5、
按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)。
参考代码:
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
struct PCB_type
{ char pid[100]; //进程名输入用字符串健壮性比较好
int priority;
int cputime;
int state;
}; //缺少“};”
int shumu=0,pid_l;
struct PCB_type neicun[20];
struct PCB_type hc[10];
int max=0;
int number=0;
void create();
void run();
void huanchu();
void kill();
int main()
{
int n,a;
n=1;
system("color 0f");
while(n==1)
{
system("cls");
printf("\n欢迎进入进程管理系统");
printf("\n ");
printf("\n选择要进行的操作序号:");
printf("\n1.创建新进程");
printf("\n2.查看正在运行的程序");
printf("\n3.替换进程");
printf("\n4.杀死进程");
printf("\n请选择(1~4):");
scanf("%d",&a);
switch(a)
{ case 1:
create( );
printf("\继续");
getch();
break;
case 2 :
run();
printf("\npress any key to go on~");
getch();
break;
case 3 :
huanchu();
printf("\npress any key to go on~");
getch();
break;
case 4 :
kill();
printf("\npress any key to go on~");
getch();
break;
}
}
}
void create()
{
if(shumu>=20)
{
printf("\n内存已满,请先结束或换出进程\n");
}
else
{
shumu++;
printf("\n请输入新进程的编号\n");
scanf("%s",neicun[shumu-1].pid);
printf("\n请输入新进程的优先级(数字)\n");
scanf("%d",&neicun[shumu-1].priority);
printf("\n请输入新进程的需要的运行时间\n");//
scanf("%d",&neicun[shumu-1].cputime);
printf("\n创建进程时令其状态为就绪\n");
neicun[shumu-1].state=2;
}
printf("\n创建进程成功!\n");
}
void run()
{
if(shumu<=0)//查看//判断是否存在进程
{
printf("当前状态无进程,按任意键继续创建进程\n");
return;
}
int max=0;
for(int i=0;i<shumu;i++)//
if((neicun[i].state==2&&neicun[i].priority>=neicun[max].priority))
{
max=i; //这里判断优先级,优先级高的进程优先执行。
}
if(neicun[max].state==2)
{
neicun[max].state=3; //进程运行,状态为3
system("color 0F");
printf("当前已有进程%d个:\n",shumu);
for(int i=0;i<shumu;i++){
printf("进程编号:%d",i+1);
printf("\n当前运行进程编号:%s\n",neicun[i].pid);
printf("\n该进程的优先级:%d\n",neicun[i].priority);
printf("\n该进程的需要运行时间:%d\n",neicun[i].cputime);
printf("\n该进程的状态:%d(1为等待,2就绪,3为运行)\n\n\n",neicun[i].state); } //这里增加显示当前运行的进程
}
}
/* 换出 */
void huanchu()
{
int k;
if(shumu<=0)//判断是否存在进程
{
printf("当前进程数目为0,不能执行该操作\n");
return;
}
printf("当前已有进程%d个:\n",shumu);
for(int h=0;h<shumu;h++)//当前所有的进程
printf("序号:%d\t程序名:%s\t优先级:%d\t运行时间:%d\t状态:%d\t\n"
,h,neicun[h].pid,neicun[h].priority,neicun[h].cputime,neicun[h].state);
printf("请输入要换出程序的编号:");
scanf("%d",&k);
if(neicun[k].state==3)
{
neicun[k].state=1;
printf("已被换出,进程名为:%s、状态为:[%d]",neicun[k].pid,neicun[k].state);
}
else
printf("无法换出,进程名为:%s的进程",neicun[k].pid); //换出结果提示
}
void kill()
{
if(shumu<=0)//对存在的进程进行判断
{
printf("当前进程数目为0,不能执行该操作\n");
return;
}
int k=0;
printf("当前已有进程%d个:\n",shumu);
for(int h=0;h<shumu;h++)//当前所有的进程
printf("序号:%d\t程序名:%s\t优先级:%d\t运行时间:%d\t状态:%d\t\n"
,h,neicun[h].pid,neicun[h].priority,neicun[h].cputime,neicun[h].state);
printf("请输入要杀死程序的序号:");
scanf("%d",&k);
neicun[k].cputime=0;
neicun[k].priority=0;
neicun[k].state=0;
if(k==(shumu-1))
shumu--;
else{
for(int j=k+1;j<shumu;j++)
{
strcmp(neicun[j-1].pid,neicun[j].pid);
neicun[j-1].priority=neicun[j].priority;
neicun[j-1].cputime=neicun[j].cputime;
neicun[j-1].state=neicun[j].state;
}
shumu--;
}
printf("进程名为:%s已被杀死!\n",neicun[k].pid); //显示进程已被杀死
}