考勤情况
程序运行情况
程序质量
实验技能
创新精神
实验报告
设计文档
实验__ 一 __ 题目__ 进程调度 _ _____ _ 第 周星期
实验__ 二 __ 题目__ 作业调度 _______ 第 周星期
实验__ 三 ( 综合性 ) 题目__主存空间的分配与回收_ 第 周星期
实验__四 _题目_ 文件系统 _ 第 周星期
实验平台:(宋体 5 号字)
1、 计算机及操作系统:PC 机、Windows XP
2、 编程环境:C++
源程序名和可执行程序名:
实验一:多级队列进程调度.cpp; 多级队列进程调度.exe
实验二:单道环境下作业调度.cpp, 多道程序系统的作业调度.cpp; 单道环境下作业调
度.exe, 多道程序系统的作业调度.exe
实验三(综合性):主存空间的分配与回收.cpp; 主存空间的分配与回收.exe
实验四:文件系统.cpp; 文件系统.exe
备注:(宋体 5 号字)
实验__ 一 __ 题目__ 进程调度 ___ 第 周星期__ _
一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理
解.
二、实验内容和要求
设计一个有 N 个进程共行的进程调度程序。
进程调度算法:
· 采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务
算法。
· 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优
先数、到达时间、需要运行时间、已用 CPU 时间、进程状态等等。
· 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的
到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。
· 每个进程的状态可以是就绪 W(Wait)、运行 R(Run)、或完成 F(Finish)三种
状态之一。
· 就绪进程获得 CPU 后都只能运行一个时间片。用已占用 CPU 时间加 1 来表示。
· 如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该
进程,如果运行一个时间片后进程的已占用 CPU 时间还未达所需要的运行时间,也就是进
程还需要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列
等待 CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的
PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实验主要仪器设备和材料
实验环境
硬件环境:PC
软件环境:C++
四、实验原理及设计方案
1. 编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。
轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。
多队列轮转法的基本思想是: (1)设置多个就绪队列,并为各个队列赋予不同的优先
级.各个队列的优先级依次降低.而各队列中进程的优先权依次变大.(2)当有新进程进入
内存时,首先把它放在第一个队列,如果在时间片内能够完成,就离开系统,否则就调入下一个
队列的队尾.如次下去,直到该进程完成为止(在第 n 队列采用时间时间片轮转法方式).(3)
只有在第一个队列为空时,才调度第二个队列中的进程。如此下去,只有第 1~i-1 队列为
空时,才处理第 i 队列。但要注意如有在 1~i 队列中有进程时,必须马上停止第 i 队列,转
去处理前面的队列。
2. 设计方案: 设置 3 个进程就绪队列,当进程输入时按照输入顺序把它插入到队列 0。
当队列 0 不为空的时候依次从队首取出进程运行,并显示进程运行的情况以及各就绪
队列进程的情况。进程的运行是以时间片为基础的,每个队列运行的时间片不一样,
后面的队列运行的时间片要多,在最后一个队列中设置了较大的时间片数,以便进程
到了最后一个队列都能完成。当进程运行完成后回收它的空间。当上一级的队列为空
时从下一级队列的队首取出进程运行,一直到所有的进程完成。
3. 调度算法的流程图如下:
流程图(说明):
(1)就绪队列 1 和队列 2 不为空时的遍历跟队列 0 不为空时遍历相同。由于空间
关系就没有画出来。
(2)遍历完队列 0 之后就遍历队列 1,队列 1 遍历完就遍历队列 2,在队列 2 中采用
时间片轮转法遍历各个进程,直到所有进程都完成为止。
struct pcb { /* 定义进程控制块 PCB */
就 绪 队
列 0
空 ?
取队首进程运行
N
占用 CPU 时间加 1
已占 CPU 时间达所需运行时间
Y
撤销该进程
N
插入就绪队列 1
就 绪 队
列 1
空 ?
队 列 2
空 ?
Y
结束
开始
初始化 pcb,输入信息
按时间先后插入队列 0
char name[10]; /*进程名*/
char state; /*进程状态*/
int super; /*进程优先数*/
int ntime; /*进程需要运行时间*/
int rtime; /*进程已经运行时间*/
struct pcb* link; /*指向下一个进程*/
}*ready[3]={NULL,NULL,NULL},*p,*q; /*ready[3]为 3 个进程等待队列*/
int t[3]={1,2,20}; /*t{i}为第(i+1)次运行的时间片数*/
typedef struct pcb PCB;
int i;//第 i 个队列
//-------------------------------------------------------------------------
void sort(int i) /* 插入进程到第 i 个队列*/
{
if((ready[i]==NULL))
{
ready[i]=p;
p->link=NULL;
q=p;
}
else
{
q->link=p;
q=p;
}
}
void input() /* 建立进程控制块函数*/
{
int i,num;
printf("\n\n\n\n\n\n\n\n");
system("cls"); /*清屏*/
printf("\n 请输入进程数:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 进程号 No.%d:\n",i);
p=getpch(PCB);
printf(" 输入进程名(用字母表示):");
scanf("%s",p->name);
printf(" 输入进程的优先数(用数字表示):");
scanf("%d",&p->super);
printf(" 输入进程运行时间(用数字表示):");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;
p->state='w';
p->link=NULL;
sort(0); /* 调用 sort 函数*/
}
}
//---------------------------------------------------------------------------
int space(int i) /*求第 i 个队列的进程数*/
{
int l=0;
PCB* pr=ready[i];
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return l;
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf(" qname \t state \t super \t ndtime runtime \n");
printf(" |%s\t ",pr->name);
printf("|%c\t ",pr->state);
printf("|%d\t ",pr->super);
printf("|%d\t ",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
//---------------------------------------------------------------------------
void check() /* 建立进程查看函数 */
{
PCB* pr;
int j;
printf(" **** 当前正在运行的进程是:%s\n",p->name); /*显示当前运行进程*/
评论3
最新资源