操作系统实验2
三实验要求
实验报告要求1、写出进程管理的思想。2、画出算法流程图和设置的数据结构。3、写出调试程序出现的问题及解决的方法。4、打印实验报告及程序清单。5、报告给出测试的结果。四实验环境:
Windows8.0开发语言c++
五实验前的准备
1、阅读教材,了解有关PCB的知识。进程控制块的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,它使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
《操作系统》实验报告
实验编号
实验2
实验题目
操作系统
专业班级
实验日期
2014-04-03
实验成绩
学生学号
学生姓名
指导老师
一实验目的:
1、加深对进程概念及进程管理各个部分内容的理解;2、熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施。二实验内容
要求设置PCB,进程控制原语,进程调度算法,能描述进程调度中不同进程状态之间的转换,设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制,同步及通信机构,其进程调度算法可任意选择。每个进程用一个PCB表示,其内容可根据具体情况设置。各进程之间应有一定的同步关系。系统在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n按任一键继续......");
ch=getchar();
}
printf("\n\n进程已经完成.\n");
ch=getchar();
return 0;
{
p->link=ready;
ready=p;
}
else /*进程比较优先级,插入适当的位置中*/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/
int rtime;
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB;
char sort() /*建立对进程进行优先级排列函数*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/
结果分析:当调度进程中只剩下进程gui和进程xu时,这时根据进程优先级的大小,进程gui将进入运行态。
结果分析:当进程xu完成调度时,进程调度程序中直剩下进程gui了,这时进程gui将进入运行态,而当前就绪队列将为空。
结果分析:当进程gui的CPU占用时间等于所需要的执行时间时,进程gui调度完成,则这时进程调度中已经没有需要调度的进程了,则整个进程调度完成。
2、设计方案
(1)设计一个有N个进程共行的进程调度程序。每个进程由一个进程控制块PCB表示。进程控制块包括以下信息:进程名,进程优先数,进程需要运行的时间,占用CPU的时间以及进程的状态等。
(2)本调度程序用时间片轮转算法。
(3)编写程序并调试运行。
3、程序流程图
七出现的的问题及解决方案
在实验一开始,对算法的理解不是很清楚,后来通过上网查阅,稍微有所了解,不那么一无所知。
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb { /*定义进程控制块PCB */
char name[10];
char state;
int super;
int ntime;
p=getpch(PCB);
printf("\n输入进程名:");
scanf("%s",p->name);
printf("\n输入进程优先数:");
scanf("%d",&p->super);
printf("\n输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /*调用sort函数*/
}
return 0;
}
int space(){源自int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
char disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
return 0;
}
char destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n进程[%s]已完成.\n",p->name);
printf("|%d\t",pr->rtime);
printf("\n");
return 0;
}
char check() /*建立进程查看函数*/
{
PCB* pr;
printf("\n ****当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
disp(p);
pr=ready;
结果分析:当进程ping执行了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程xu。
按照这种方式一直运行下去,直到:
结果分析:当进程ping的CPU占用时间等于它需要的执行时间时,进程ping调度完成。则这时进程调度中还有两个进程:进程gui和进程xu。
}
十运行结果分析
结果分析:根据上述输入的三个进程的信息可以得到:优先级最高的是进程ping,所以最先调度进程ping,它的状态为运行态,需要执行的时间为5。而当前就绪队列状态为:进程xu的优先级比较高,处于就绪队列前面,而进程gui的优先级是三者中最低的,所以处于就绪队列的最后。而此时这两个进程的状态都为就绪态。
2、上网查阅相关程序,学习与PCB相关知识与应用。
六实验原理及设计方案
1、实验原理;
假设系统有5个进程,每个进程用一个进程控制块PCB来代表。为每个进程任意确定一个要求运行时间和到达时间。按照进程到达的先后顺序排成一个循环队列。再设一个队首指针指向第一个到达进程的首址。执行处理机调度时,开始选择队首的第一个进程运行。另外,再设一个当前运行进程的指针,指向当前正在运行的进程。进程运行一次后,估计运行时间减一,输出当前运行进程的名字进程运行一次后,以后的调度则将当前指针依此下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的剩余运行时间是否为零。若不为零,则等待下一轮的运行,若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出循环队列。若就绪队列不空,则重复上述的(5)和(6)步骤直到所有的进程都运行完为止。在所设计的调度程序中,应包含显示或打印语句。显示或打印每次选中的进程的名称及运行一次后队列的变化情况。
}
return 0;
}
char input() /*建立进程控制块函数*/
{
int i,num;
//clrscr(); /*清屏*/
printf("\n请输入被调度的进程数目:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n进程号No.%d:\n",i);
free(p);
return 0;
}
char running() /*建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /*调用destroy函数*/
else
{
(p->super)--;
p->state='w';
八实验小结
通过这次实验,首先加深了我对进程调度方法和功能的认识,其次让我更加深刻地理解了操作系统中进程调度中优先级调度的基本原理。优先级调度算法只是进程调度算法的一种,我们还应依照书本去学习进程调度的其它算法,以便更好地了解进程调度。