实验二 DOS进程管理
专业 网络工程1班 姓名 李灵锋 学号 201406114324
一、实验目的
利用编程工具实现系统进程管理以及调度的相关过程,理解进程调度的工作原理,熟悉系统的先关运作。
二、实验要求
1.通过模拟进程管理的实现,加深对进程这一概念的理解。
2.输入进程数目,执行程序。
3.显示出运行态,等待态以及就绪态的进程。
三、实验环境
在Windows系统或者是dos系统中,运用vs/vc++等工具实现。
四、实验原理及核心算法
1.原理:进程从创建而产生到撤销致消亡的整个生命周期,有时占有处理器执行,有时虽可运行但分不到处理器,有时虽有空闲处理器但因等待某个事发生而无法执行,这些都说明进程和程序是不同的。因此至少要定义三种进程状态,分别为:运行态、就绪态、等待态。而进程则在这三个状态之间转换。
2.代码过程:
// 201406114324.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#define READY 1//就绪态
#define RUN 2//运行态
#define BLOCK 3//等待态(阻塞)
typedef struct pcbNode
{
int num;
struct pcbNode *next;
int cputime;
int state;
}pcb;
pcb *head;
pcb *run;
pcb *CreatPCB(int n)
{
int i;
pcb *p,*q;
head=(pcb*)malloc(sizeof(pcb));
head->next=NULL;
p=head;
for(i=1;i<=n;i++)
{
q=(pcb*)malloc(sizeof(pcb));
q->num=i;
q->next=NULL;
q->cputime=rand()%100;
q->state=READY;
p->next=q;
p=q;
}
return head;
}
void DelectPCB()
{
pcb *p;
if(head->next != NULL)
{
p=head->next;
head->next=head->next->next;
free(p);
}
}
void Display()
{
pcb *p;
p=head->next;
while(p)
{
printf("%d",p->num);
p=p->next;
}
printf("\n");
}
void control()
{
run=head->next;
run->state=RUN;
{
while(run->cputime)
run->cputime--;
printf("正在执行的进程编号为:%d\n",run->num);
run->state=RUN;
run=run->next;
DelectPCB();
printf("执行进程后就绪队列中的进程是:");
Display();
printf("\n");
}
}
void main()
{
int n;
int flag=1;
printf("请输入要创建的进程数量:");
scanf("%d",&n);
head=CreatPCB(n);
printf("就绪队列中的进程数有:");
Display();
printf("\n");
while(flag)//有flag的值判断是否继续执行control()函数
{
if(head->next)//判断进程是否完成
control();
else flag=0;
}
printf("\n");
system("pause");
}
五、实验截图
六、心得总结
通过对系统进程管理、进程调度的代码模拟实现,对系统进程管理有了更深一层的理解,还需多加练习,掌握好这一方面的知识。