操作系统实验报告
姓 名:
班 级:
学 号:
指导教师:
实验一 进程调度算法模拟,用动态优先数及时间片轮转法
实现进程调度
一.实验内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程
二.实验要求:
① 进程数不少于5个;
② 进程调度算法任选;
最好选用动态优先数法,每运行一个时间片优先数减3
③ 用C++(或C)语言编程;
④ 程序运行时显示进程调度过程。
三.实验步骤:
① 设计PCB及其数据结构:
struct pcb
{ /* 定义进程控制块PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb* link;
} *ready=NULL,*p;
typedef struct pcb PCB;
② 设计进程就绪队列及数据结构;
三个应用队列: PCB *ready=NULL,*run=NULL,*finish=NULL;
③ 设计进程调度算法,并画出程序流程图;
Y
N
N
Y
Y
N
N
Y
Y
N
N
Y
④ 设计输入数据和输出格式;
结构格式:当前正运行的进程:0
当前就绪队列:2,1,3,4
⑤ 编程上机,验证结果。
源程序代码如下:
#include
void main(){
int a[4][5]={{0,1,2,3,4},{9,38,30,29,0},{0,0,0,0,0},{3,3,6,3,4}};
int a1[5],a0[5],a2[5],num;
printf("当前系统中有5个进程,其初始状态如下:\n\n");
for(int i=0;i<4;i++){
if(i==0)
printf("ID ");
if(i==1)
printf("PRIORITY ");
if(i==2)
printf("CPUTIME ");
if(i==3)
printf("ALLTIME ");
for(int j=0;j<5;j++){
printf("%5d ",a[i][j]);
}
printf("\n");
}
printf("STATE ready ready ready ready ready");
for(;;){
for(i=0;i<5;i++){
a0[i]=a[1][i];
}
for(i=0;i<5;i++){
for(int j=0;j<5-1;j++){
if(a0[j]<=a0[j+1]){
num=a0[j];
a0[j]=a0[j+1];
a0[j+1]=num;
}
}
}
//a0数组为排列好的优先极
for(int j=0;j<5;j++){
a2[j]=a[1][j];
}
for(i=0;i<5;i++){
for(int j=0;j<5;j++){
if(a0[i]==a2[j]){
a1[i]=j;
a2[j]=-10;
break;
}
}
}
a[1][a1[0]]-=3;
a[2][a1[0]]+=1;
a[3][a1[0]]-=1;
printf("\n");
if(a[3][a1[0]]<=0){
a[1][a1[0]]=-3;
}
int ji=0;
for(i=0;i<5;i++){
ji+=a[3][i];
}
printf("\n当前运行程序为:%d\n当前就绪队列: ",a1[0]);
for(i=1;i<5;i++){
if(a[1][a1[i]]>=0)
printf("%d ",a1[i]);
}
if(ji<=0)break;
printf("\n\n程序正在运行中...");
}
printf("\n\n当前程序已全部运行完毕\n");
}
实验结果:
四.实验总结:
(1)本次试验后对优先数调度算法和时间片轮转调度算法实现 的过程,有了很清楚的认识、理解。设计计数器来对进程执行状 态的时间
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
,使得进程调度这一抽象模型得到具体化。之后, 便是对进程的插入(执行完,插入到完成队列,否则插入到就绪) 和再次调度(当改进程再次满足条件时,从就绪队列调度到执行 队列)重复过程。
(2)通过设计 PCB 结构,模拟进程调度,加深了对进程的理解。 (3)提高了 C 语言编程动手能力,在设计就绪队列时,通过优 先数将新进程插入就绪队列中的适当位置。要做多重判断,但实际又是“链表插入”模型的运用,这感觉很爽,无论多复杂的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,都可以分化成简单的问题在已有的模型上处理。
输入开始进程数n
创建n个PCB并加入ready-queue中
ready-queue是否为空
Running<=id
Running<=逐个将redy_pc中的PCB
阻塞Running
Running=idle
将Running从ready_queue中删除,再将running加入block_queueb
更新新进程就绪队列进程优先数,优先数加1
是否创建新PCB
创建新进程并加入到ready_queue中
随机 对block_queue中的进程PCB询问是否要唤醒?
处理完了吗
是否要唤醒
将其从blick_queuek队列是中删除,再将其加入ready_queuek