作业进程调度算法设计与实现操作系统实验报告1通用doc.docx
- 文档编号:5408301
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:9
- 大小:17.88KB
作业进程调度算法设计与实现操作系统实验报告1通用doc.docx
《作业进程调度算法设计与实现操作系统实验报告1通用doc.docx》由会员分享,可在线阅读,更多相关《作业进程调度算法设计与实现操作系统实验报告1通用doc.docx(9页珍藏版)》请在冰点文库上搜索。
作业进程调度算法设计与实现操作系统实验报告1通用doc
作业进程调度算法设计与实现操作系统实验报告1
实验报告
课程名称
实验项目
实验仪器
院系计算机学院
专业计算机科学与技术
班级/学号计0503/29
学生姓名杨天心
实验日期成绩指导老师2007-11
计算机操作系统
作业/进程调度算法设计与实现
实验二作业/进程调度算法设计与实现
一.实验目的
调度是操作系统的主要功能,本实验通过自行设计实现的调度程序,使同学们加深对作业/进程调度功能的理解,从而掌握操作系统的基本原理。
同时还可以提高同学们的编程能力。
二.实验要求
用C语言编制按优先级调度三个进程的调度程序,其中要求进程的优先级随着运行时间的延长而降低,但却随着等待时间的延长而升高。
三.实验方法内容
(一)算法设计的思路
1、设计进程控制块为以下结构:
structPRO
﹛
charid;/*进程的id号,可以表示为a,b,c*/
intpri;/*进程的初始优先级*/
intp;/*等待进程可以动态增加的优先级量*/
ints;/*运行进程应该动态减少的优先级量*/
intstatus;/*表示进程的状态,0为等待,1为运行*/
﹜A={‘a’,2,1,1,0},B={‘b’,1,1,1,0},C={‘c’,0,1,1,0};
2、要求接管时钟中断:
INT1Ch
使用到的C语言函数为:
getvect(intno)/*获得intno的中断向量*/(要求保存在一个全局变量中)
setvect(intno,time)/*设置intno的中断向量为函数time的入口地址*/
3、在自己编制的新的时钟中断处理程序中,完成进程优先级的修改;并记录被中断的
次数。
Voidinterrupttime()
{
if(A.status==1)A.pri=A.pri-A.s;
elseA.pri=A.pri+A.p;
……..
…….
xx++;
}
计0503计算机操作系统
杨天心29
4、编制函数select(),其功能是从三个进程中选择优先级最高的进程,并将其状态设
置为运行,其余设置为等待。
并返回运行进程的序号供主程序选择运行。
5、编制函数intprime(intn),功能是判断n是否为素数,如果是素数,返回n;否则
返回0。
该函数是三个进程的执行过程。
6、主程序框架如下:
main()
{inta[3]={100,100,100};
intI,j,k,u,v,w=0,x=0,y=0;
charc;
/*获得时钟中断向量*/
/*设置新的中断向量*/
………..
while(xx进程的运行过程*/
{u=select();/*调度一次*/
switch(u)
{case0:
a[0]++;if(a[0]>10000)a[0]=100;v=prime(a[0]);
if(v){gotoxy(2,4);printf(“a%6d%6d”,v,w++);}break;
case1:
…………………..
case2:
…………………..
}
}
/*恢复时钟中断*/
}
(二)题目理解说明:
从实验的题目可以看出本次实验的内容是在已经给定的结构上对程序进行补充完善。
通过对已给程序的分析,只需要完成时钟中断处理函数time(),进程选择程序select(),求素数函数prime()以及主函数中switch语句部分的程序编制即可。
(三)算法的功能框架流程图
(四)此算法中用到的数据结构:
进程实体结构,模拟PCB:
structPRO
{
charid;/*进程id号*/
intpri;//进程优先级
intp;/*优先级递增量*/
ints;/*优先级递减量*/
intstatus;//进程状态
}
(五)主要常量变量:
INTR:
存放中断号1ch的常量
Xx:
存放中断次数的全局变量
Oldhandler:
指向原中断处理程序的向量
a[3]:
对素数进行操作的数组空间
(六)主要模块:
1.中断处理函数
voidinterrupttime(...)
接管时钟中断,当中断到达时,对A,B,C三个进程数据结构中优先级pri进行修改。
对正在运行的程序,优先级减去一个递减量s,对于未运行的程序,优先级增加一个的增量p。
处理完成后,中断次数xx加1。
2.进程选择函数
charselect()
根据进程的优先级进行选择。
选出优先级最高的进程,将其状态status设置为1,即为该进程分配处理机,投入运行,返回该进程的进程号id。
将其他进程状态status设置为0,即剥夺处理机或不为其分配处理机。
此函数模拟对PCB的操作。
3求素数函数
intprime(intn)
用于判断n是否为素数。
通过循环依次用从2到n的平方根对n取模。
如果能被除尽,余数为零。
跳出循环,返回0。
如果始终没被除尽,表明n为素数,返回n。
4.主函数
voidmain()
首先定义所需要的变量,数组。
获取中断,并将中断处理程序设置到time()函数上。
输出提示信息后。
便开始模拟进程调度过程。
通过select()函数取得优先级最高的进程号。
通过switch语句判别进程号,选中三个模拟的循环求素数进程的程序体中的一个,执行其中的内容,输出信息。
如果中断次数xx小于300次,则继续调用select()函数选出进程并执行,直至满足这个条件。
计0503计算机操作系统
杨天心29
最后恢复系统原有的中断处理程序。
四.实验代码:
ex2.c
//====================================================================#include
#include
#include
#include
#defineINTR0x1C//INT1Ch
intxx=0;//记录中断次数的全局变量
voidinterrupt(*oldhandler)(...);//定义中断向量
//进程控制块结构体
structPRO
{
charid;/*进程id号*/
intpri;//进程优先级
intp;/*优先级递增量*/
ints;/*优先级递减量*/
intstatus;//进程状态
}A={'a',2,1,1,0},B={'b',1,1,1,0},C={'c',0,1,1,0};
//中断处理函数
voidinterrupttime(...)
{inta;
if(A.status==1)A.pri=A.pri-A.s;
elseA.pri=A.pri+A.p;
if(B.status==1)B.pri=B.pri-B.s;
elseB.pri=B.pri+B.p;
if(C.status==1)C.pri=C.pri-C.s;
elseC.pri=C.pri+C.p;
xx++;
}
/*进程选择函数*/
charselect()
{if(A.pri>=B.pri&&A.pri>=C.pri){A.status=1;B.status=0;C.status=0;returnA.id;}
elseif(B.pri>A.pri&&B.pri>=C.pri){A.status=0;B.status=1;C.status=0;returnB.id;}
else{A.status=0;B.status=0;C.status=1;returnC.id;}
}
/*求素数函数*/
intprime(intn)
{intk,i,j;
k=sqrt(n);
for(i=2;i<=k;i++)
作业进程调度算法设计与实现操作系统实验报告1第2页
if(n%i==0)return0;
returnn;
}
//主函数
voidmain()
{inta[3]={100,100,100};
intu,v,w=0,x=0,y=0;
charc;
oldhandler=getvect(INTR);/*获取中断处理INT1Ch*/
setvect(INTR,time);/*将中断处理函数设为time()*/
gotoxy(10,2);printf("THEPROCESSESAREPLAYING:
\n");
gotoxy(10,4);printf("ProcessidPrimeTimes\n");
while(xx{u=select();
switch(u)
{
case'a':
a[0]++;if(a[0]>10000)a[0]=100;v=prime(a[0]);
if(v){gotoxy(10,6);printf("A%6d%6d",v,w++);}break;
case'b':
a[1]++;if(a[1]>10000)a[1]=100;v=prime(a[1]);
if(v){gotoxy(10,8);printf("B%6d%6d",v,x++);}break;
case'c':
a[2]++;if(a[2]>10000)a[2]=100;v=prime(a[2]);
if(v){gotoxy(10,10);printf("C%6d%6d",v,y++);}break;
}
gotoxy(13,12);printf("TIMEINTERRUPT%d",xx);
}
setvect(INTR,oldhandler);/*恢复中断*/
getchar();
}
//================================================================五.执行结果:
(一)结果截图:
计0503计算机操作系统
杨天心29
(二)结果分析:
程序执行结果中processid代表了每个参与调度的进程号,prime为进程的程序体即求素数过程在最后一次执行时所求得的那个素数。
Times中的数据为各个进程各自得出的素数的个数的总数。
Timeinterrupt后的值为程序执行过程中中断的次数。
该结果正好符合题目要求,达到了实验的目的。
六.用户操作指南:
本程序没有过多涉及人机交互的处理,在程序调试通过并编译链接之后,只需要直接执行便可看到演示的过程和最终结果。
七.实验总结:
首先,通过本次实验加深了我对于作业/进程调度功能的认识,并且更加深刻地理解了操作系统中进程调度的基本原理。
本次实验中用到的有关中断处理函数及返回类型信息是通过TurboC帮助文档获得的。
这种经历使我对怎样通过使用程序的联机帮助文档来有查阅自己需要的信息有了更深刻的认识。
八.所有的源程序清单
ex2.c:
程序主文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 进程 调度 算法 设计 实现 操作系统 实验 报告 通用 doc