一、实验目的
1.通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
2.通过实验来了解进程的三种状态以及状态间的转换。
二、实验内容及要求
用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程换出某个进程;杀死运行进程以及进程之间通信等功能。
三、实验条件(可含设备、材料、工具、软件等)
一台装有C语言环境的电脑
四、实验原理(可含实验思想、原理图、程序框图、代码等)
实验思想:(并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。)
1.编写程序
2.调试代码
3.键盘一共输入多少进程,以及可共享的资源时间
4.每个进程的运行时间和优先级
5.运行代码,查看结果
//主要代码:
#include <stdio.h>
#pragma hdrstop
#include <tchar.h>
#include<stdlib.h>
#include<string.h>
#define Max 100
#pragma argsused
typedef struct pcb
{
char name[Max]; //进程名
int priority; //优先级
int arrtime; //到达时间
int needtime; //需要运行时间
int usedtime; //已用时间
char state; //进程状态
}PCB;
PCB pcb[Max];
int n=1;
int m=0;
int pTime;
char SelectMenu();
void Input();
void Sort();
void Print();
void Attemper();
char SelectMenu()
{
char select;
printf("功能菜单:");
printf("\n 1.增加并调度进程");
printf("\n 2.打印进程");
printf("\n 3.退出");
printf("\n请输入你的选择(1--3):");
do{
select=getchar();
}while(select!='1'&&select!='2'&&select!='3');
return select;
}
void main()
{
int choice;
n=1;
printf(" \n");
printf("\t\t欢迎使用进程调度模拟\n\n");
choice=SelectMenu();
do{
if(choice=='1')
{
printf("\n");
printf("请设置时间片的大小:");
scanf("%d",&pTime);
Input();
Print();
Attemper();
}
if(choice=='2')
{
Print();
}
if(choice=='3')
{
return;
}
choice=SelectMenu();
}while(1);
}
void Input()
{
printf("输入要创建进程的数目:\n");
scanf("%d",&m);
do{
printf("\n---请输入第%d个进程进程---\n",n);
printf("\n进程名:");
scanf("%s",&pcb[n].name);
printf("进程优先级:");
scanf("%d",&pcb[n].priority);
printf("进程需要的时间:");
scanf("%d",&pcb[n].needtime);
pcb[n].arrtime=n;
pcb[n].usedtime=0;
pcb[n].state='W';
n++;
}while(n<=m);
}
void Sort()
{
int i,j;
PCB temp;
for(i=0;i<n-1;i++) //按照到达时间排序
{
for(j=n-2;j>=i;j--)
{
if(pcb[j+1].arrtime<pcb[j].arrtime)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
for(i=0;i<n-1;i++) //按照优先级排序
{
for(j=n-2;j>=i;j--)
{
if(pcb[j+1].priority>pcb[j].priority)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
if(pcb[0].state!='F')
{
pcb[0].state='R';
}
}
void Print()
{
int i;
Sort();
printf("\n 进程名 优先级 到达时间 需要时间 已用时间 进程状态 \n");
for(i=0;i<n;i++)
{
printf("%8s%8d %8d %10d %10d %10c\n",pcb[i].name,pcb[i].priority,pcb[i].arrtime,pcb[i].needtime,pcb[i].usedtime,pcb[i].state);
}
}
void Attemper()
{
do{
if((pcb[0].needtime-pcb[0].usedtime)>pTime) //判断进程剩余的运行时间是否大于时间片
{
pcb[0].usedtime+=pTime;
pcb[0].priority--;
pcb[0].state='W';
}
else //已完成的进程
{
pcb[0].usedtime=pcb[0].needtime;
pcb[0].priority=-1;
pcb[0].state='F';
}
Print();
}while(pcb[0].state!='F');
}
运行结果: