采用静态优先权优先算法的进程调度程序之欧阳家百创编
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
采用静态优先权优先算法的进程调度程序
欧阳家百(2021.03.07)
学号:
姓名:
专业:
指导教师:
日期:
目录
第1部分课设简介3
1.1 课程设计题目3
1.2 课程设计目的3
1.3 课程设计内容3
1.4 时间安排3
第2部分实验原理分析3
2.1问题描述3
2.2解决方法4
第3部分主要的功能模块5
3.1主要的函数5
3.2 测试用例及运行结果7
第4部分源代码9
第5部分总结及参考文献16
5.1 总结16
5.2 参考文献17
第1部分课设简介
1.1 课程设计题目
采用静态优先权优先算法的进程调度程序
1.2 课程设计目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
1)进一步巩固和复习操作系统的基础知识。
2)培养学生结构化程序、模块化程序设计的方法和能力。
3)提高学生调试程序的技巧和软件设计的能力。
4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
1.3 课程设计内容
设计并实现一个采用静态优先权算法的进程调度演示程序
1.4 时间安排
1)分析设计贮备阶段(1 天)
2)编程调试阶段(7 天)
3)写课程设计报告、考核(2 天)
第2部分实验原理分析
2.1问题描述
(1)每一个进程有一个PCB,其内容可以根据具体情况设定。
(2)进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定
(3)可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、作业大小、进程优先级的初始化(4)可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互斥资源与进程间的同步关系,故只有两种状态)(5)采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列
(6)有性能比较功能,可比较同一组数据在不同调度算法下的平均周转时间
(7)具有一定的数据容错性
2.2程序设计流程图
2.3解决方法
通过数组容纳所有数据,根据冒泡排序把数据按从小到大顺序排列,在分析a[0]和其他数据的大小,如果a[0]的完成时间大于其他数据就按照冒泡的排列顺序,如果小,就比较其他数据的优先级,按优先级大小排序。
第3部分主要的功能模块
3.1主要的函数
void fcfs()
{
int i,j,n,min,px;
float sum1,sum2;
printf("\t请输入有n个进程(0<n<=50):\t");
scanf("%d",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入: ");
scanf("%d",&n);
}
printf("\n\n");
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int wct; //完成时刻
float zt; //周转时间
float dczt; //带权周转时间};
Gzuo a[N];
for(i=0;i<n;i++)
{
a[i].id=i+1;
printf("\t到达时间: ");
scanf("%d",&a[i].dt);
printf("\t服务时间: ");
scanf("%d",&a[i].st);
printf("\n");
}
for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
}
}
}
a[0].wct=a[0].st+a[0].dt;
a[0].zt=(float)a[0].st;
a[0].dczt=a[0].zt/a[0].st;
for(i=1;i<n;i++)
{
if(a[i].dt>a[i-1].wct)
{
a[i].wct=a[i].dt+a[i].st;
a[i].zt=(float)a[i].st;
a[i].dczt=a[i].zt/a[i].st;
}
else
{
a[i].wct=a[i-1].wct+a[i].st;
a[i].zt=(float)(a[i].wct-a[i].dt);
a[i].dczt=a[i].zt/a[i].st;
}
}
3.2 测试用例及运行结果
第4部分源代码
#include"stdio.h"
#define N 50
void main()
{ void fcfs();
void yxj();
int a;
while(true)
{
printf("\n\n");
printf("\t\t/*************************/");
printf("\n\t\t/* 1、先到先服务调度 */");
printf("\n\t\t/* 2、优先级优先调度 */");
printf("\n\t\t/* 0、退出 */\n");
printf("\t\t/*************************/");
printf("\n\n\t请选择菜单项:\t");
scanf("%d",&a);
printf("\n");
switch(a)
{
case 1: fcfs();break;
case 2: yxj();break;
default: break;
}
if(a<0&&a>2) break;
}
}
void fcfs()
{
int i,j,n,min,px;
float sum1,sum2;
printf("\t请输入有n个进程(0<n<=50):\t");
scanf("%d",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入: ");
scanf("%d",&n);
}
printf("\n\n");
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int wct; //完成时刻
float zt; //周转时间
float dczt; //带权周转时间};
Gzuo a[N];
for(i=0;i<n;i++)
{
a[i].id=i+1;
printf("\t到达时间: ");
scanf("%d",&a[i].dt);
printf("\t服务时间: ");
scanf("%d",&a[i].st);
printf("\n");
}
for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
}
}
}
a[0].wct=a[0].st+a[0].dt;
a[0].zt=(float)a[0].st;
a[0].dczt=a[0].zt/a[0].st;
for(i=1;i<n;i++)
{
if(a[i].dt>a[i-1].wct)
{
a[i].wct=a[i].dt+a[i].st;
a[i].zt=(float)a[i].st;
a[i].dczt=a[i].zt/a[i].st;
}
else
{
a[i].wct=a[i-1].wct+a[i].st;
a[i].zt=(float)(a[i].wct-a[i].dt);
a[i].dczt=a[i].zt/a[i].st;
}
}
printf("\t1、按id号依次输出\n");
printf("\t2、按完成顺序依次输出\n");
printf("\n\t请选择输出顺序:\t");
scanf("%d",&px);
printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
sum1=0;
sum2=0;
switch(px)
{
case 2:
{
for(i=0;i<n;i++)
{
printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i]. st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
case 1:
{
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(a[i].id==j+1)
{
printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i]. st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
default: break;
}
}
void yxj()
{
int i,j,n,min,px;
int b=0,z;
float sum1,sum2;
printf("\n\t\t请输入有n个进程(0<n<=50):\t");
scanf("%d/n",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入: ");
scanf("%d",&n);
}
printf("\n");
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int yxj; //优先级
int wct; //完成时刻
float zt; //周转时间
float dczt; //带权周转时间
};
Gzuo a[N];
for(i=0;i<n;i++)
{
a[i].id=i+1;
printf("\t到达时间: ");
scanf("%d",&a[i].dt);
printf("\t服务时间: ");
scanf("%d",&a[i].st);
printf("\t优先级: ");
scanf("%d",&a[i].yxj);
printf("\n");
}
min=a[0].dt;
for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].yxj;
a[i].yxj=a[i+1].yxj;
a[i+1].yxj=min;
}
if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj) {
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].yxj;
a[i].yxj=a[i+1].yxj;
a[i+1].yxj=min;
}
}
}
a[0].wct=a[0].st+a[0].dt;
a[0].zt=(float)a[0].st;
a[0].dczt=a[0].zt/a[0].st;
for(i=1;i<n;i++)
{
if(a[i].dt>a[0].wct) ;
else b++;
}
for(j=b-1;j>=1;j--)
{
for(i=1;i<j;i++)
{
if(a[i].yxj<a[i+1].yxj)
{
min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;
min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
min=a[i].yxj;
a[i].yxj=a[i+1].yxj;
a[i+1].yxj=min;
}
}
}
for(i=1;i<n;i++)
{
if(a[i].dt>a[i-1].wct)
{
a[i].wct=a[i].dt+a[i].st;
a[i].zt=(float)a[i].st;
a[i].dczt=a[i].zt/a[i].st;
}
else
{
a[i].wct=a[i-1].wct+a[i].st;
a[i].zt=(float)(a[i].wct-a[i].dt);
a[i].dczt=a[i].zt/a[i].st;
}
for(j=i+1,b=j;j<n;j++)
{
if(a[j].dt>a[i].wct) ;
else b=b+1;
}
for(j=b-1;j>=i;j--)
{
for(z=i;z<j;z++)
{
if(a[z].yxj<a[z+1].yxj)
{
min=a[z].dt;
a[z].dt=a[z+1].dt;
a[z+1].dt=min;
min=a[z].st;
a[z].st=a[z+1].st;
a[z+1].st=min;
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;
}
}
}
}
printf("\n\t请选择输出顺序\n");
printf("\t1、按id号依次输出\n");
printf("\t2、按完成顺序依次输出\n");
scanf("%d",&px);
printf("\nid:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n");
sum1=0;
sum2=0;
switch(px)
{
case 2:
{
for(i=0;i<n;i++)
{
printf("%d:%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i]. dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
case 1:
{
for(j=0;j<n;j++)
{ for(i=0;i<n;i++)
if(a[i].id==j+1)
{
printf("%d:%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i]. dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
default: break;
}
}
第5部分总结及参考文献
欧阳家百创编
5.1 总结
1)多线程编程对于解决一些并发性的问题是很高效的,而且也很必要,现在学会了使用多线程编程,对于以后解决类似的并发性问题(例如网络编程中经常遇到的多客户线程同时访问的问题),都会很有用。
2)虽然我们学习的操作系统理论课里面说多线程间的执行顺序具有随机性和不确定性,但我们毕竟是在一个特定的操作系统平台上实验,Windows 的线程调度机制我是不得而知的,所以出现的一些奇怪的问题也很难调试,只好人为地去
5.2 参考文献
1)宗大华,宗涛,陈吉人著操作系统北京:人民邮电出版社,2009
2)李爱华,程磊著面相对象程序设计(C++语言)北京: 清华大学出版社,2010
3)宋晓宇,windows操作系统核心编程实验教程中国铁道出版社
4)张丽芬刘利雄王金玉编著操作系统实验教程清华大学出版社
欧阳家百创编。