当前位置:
文档之家› 操作系统实验--处理机调度算法实现
操作系统实验--处理机调度算法实现
主要用到的技术是STL中的vector以维护和保存进程容器、就绪容器、完成容器。
当程序启动时,用户可以选择不同的调度算法。然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。判断进程容器中是否有新的进程可以加入就绪队列。
struct proc //定义进程结构体
{
char name[5];
int num;
int pri;
};
void main()//主函数
{ char ch;
struct proc pr[n];//声明结构体数组
int i,k,j;
int count=n;
for(i=0;i<n;i++)//输入5个进程
函数描述:
struct proc/*定义结构体内部包含进程的信息*/
{
char name[5]; /*定义进程名*/
int num; /*定义运行时间*/
int pri; /*定义优先权*/
};
Void main()/*主函数:掌控整个程序的运行过程,是程序的主体部分*/
struct proc pr[n];/*声明结构体数组*/
4.处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。
5.若要求运行时间为零,则将其状态置为“结束”,且退出队列。
6.运行所设计程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程
实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)
for(k=1;k<n;k++)
{for(j=0;j<n-1;j++)
if(pr[j].pri<pr[j+1].pri)
{
struct proc temp;
temp=pr[j];
pr[j]=pr[j+1];
pr[j+1]=temp;
}
}
while(pr[0].num!=0)//进程运行循环;
{
ch=getchar();
for(i=0;i<n;i++)/*for函数定义输入进程数*/
for(k=1;k<n;k++)/*for函数判断优先权大小并进行排序*/
while(pr[0].num!=0)/*while进程运行循环*/
附
实验代码:
#include<stdio.h>
#include<string>
#define n 5
{for(j=0;j<count-1;j++)
if(pr[j].pri<pr[j+1].pri)
{ห้องสมุดไป่ตู้
struct proc temp;
temp=pr[j];
pr[j]=pr[j+1];
pr[j+1]=temp;
}
}
}
}
试验结果:
1.执行结果
2.结果分析
当程序启动时,用户可以选择不同的调度算法。然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。判断进程容器中是否有新的进程可以加入就绪队列。
{ printf("第%d个进程:\n",i+1);
printf("名称:");
scanf("%s",&pr[i].name);
printf("运行时间:");
scanf("%d",&pr[i].num);
printf("优先级:");
scanf("%d",&pr[i].pri);
}
//按进程优先级大小排序
天津理工大学
计算机与通信工程学院
实验报告
2011至2012学年第二学期
课程名称
操作系统
实验(1)
实验名称
处理机调度算法的实现
实验时间
2012年5月5日第1节至第6节
学号姓名
******
专业
主讲教师
辅导教师
软件环境
VC++6
硬件环境
PC机
实验目的
了解操作系统处理机调度的基本概念,处理机调度程序的功能,常用的处理机调度算法。C或C++编程方法与语句格式,提前初步编好实验程序。
实验内容(应包括实验题目、实验要求、实验任务等)
实验题目:处理机调度算法的实现
实验要求:学生应正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确。
实验任务:
1.设定系统中有五个进程,每一个进程用一个进程控制块表示。
2.输入每个进程的“优先数”和“要求运行时间”,
3.为了调度方便,将五个进程按给定的优先数从大到小连成就绪队列。用一单元指出队列首进程,用指针指出队列的连接情况。
实验步骤:
1.根据实验任务,先进行算法构思。因为是采取高优先权调度算法,因此在编写程序之前,先构思算法。具体算法见下面算法描述。
2.根据上一步骤写好的算法。
3.编写程序。
4.采用VC++进行程序的编写,并对编写的程序进行测试
(1)初始化进程信息。(2)将各个进程按优先数从高到低排列成就绪队列。(3)检查所有队列是否为空,若空则结束,否则将队首进程调入执行。(4)检查该运行进程是否运行完毕,若运行完毕,将此进程状态改为完成,插入另一个完成进程队列;否则,将该进程的优先数减1,然后重新对它进行排序,插入就绪队列适当位置后等待CPU。(5)重复步骤(3)、(4),直到就绪队列为空。
pr[0].pri=pr[0].pri-1;
pr[0].num=pr[0].num-1;
printf("此次执行的进程数据属性:\n");
printf("名称--%s,执行时间--%d,优先权--%d\n",pr[0].name,pr[0].num,pr[0].pri);
if(pr[0].num==0)
{
printf("进程%s结束!!\n",pr[0].name);
count=count-1;
printf("还有%d个进程在等待执行.....\n",count);
for(i=0;i<count;i++){pr[i]=pr[i+1];}//排除掉运行完的进程
}
for(k=1;k<count;k++)//再排序
算法描述:
将每个进程抽象成一个控制块PCB,PCB用一个结构体描述。
构建一个进程调度类。将进程调度的各种算法分装在一个类中。类中存在三个容器,一个保存正在或未进入就绪队列的进程,一个保存就绪的进程,另一个保存已完成的进程。还有一个PCB实例。主要保存正在运行的进程。类中其他方法都是围绕这三个容器可以这个运行中的PCB展开。