实验报告书 课程名: 《操作系统原理》 题 目: 进程调度 班 级: 学 号: 姓 名: 《操作系统原理 》实验报告 - 1 - 一、实验目的 进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C/C++/Java语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。本实验可加深对进程调度算法的理解。
二、实验内容 1、设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。 2、模拟调度程序可任选两种调度算法实现。 3、程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
三、实验说明 1.先来先服务算法 FCFS调度算法需分别列出各进程的到达时间(arrivetime),要求服务时间(servertime),开始执行时间(starttime),完成时间(endtime)。并计算出相应的周转时间(turnroundtime),平均周转时间(avturnaroundtime)。这些数据都在程序中以变量的形式出现。 FCFS调度算法中的进程运行顺序由进程的到达时间所决定,即先到达的进程无论服务时间的长短优先运行。这种算法有利于长作业进程而不利于短作业进程。 2.最高响应比算法 高响应比算法是一种为各个进程引入了动态优先权的算法。优先权=(等待时间+要求服务时间)/要求服务时间。这使得进程的优先级一直随着等待时间的增加而以速率a提高。因此高响应比算法与其他几种算法的不同在于短作业和先到达的作业会优先得到处理,但长作业在经过一定的等待时间之后,必然会有机会分配到处理机,因此长、短作业的处理得到了更加合理的分配。该算法既照顾了短作业,又考虑到了作业到达的先后顺序,不会使得长作业得不到服务,实现了一种较好的折衷。由于每次进行进程调度前都需要计算相应响应比,因此会增加系统开销。
3.实验程序流程图 《操作系统原理 》实验报告 - 2 - 四、实验源程序 #include using namespace std; #define MAX 10 struct task_struct { char name[10]; /*进程名称*/ int number; /*进程编号*/
P=HEAD ; i=0 P=Q;P=P->NEXT; P=P->NEXT;
Q->STARTTIME=TIME Q->STATE=’T’ … …
开始
i++;输出执行进程信息 结束
P->STATE==’F’?
Q->ARRIVETIME > TIME?
i < n ? Q->STARTTIME=ARRIVETIME Q->STATE=’T’ … …
Y N Y N
N Y 《操作系统原理 》实验报告 - 3 - float arrivetime; /*到达时间*/ float starttime; /*开始时间*/ float run_time; /*运行时间*/ float endtime; /*结束时间*/ int priority; /*优先级*/ int order; /*运行顺序*/ int run_flag; }tasks[MAX]; int counter; /*实际进程个数*/ int fcfs(); /*先来先服务*/ int hrrn(); /*响应比高优先*/ int pinput(); /*进程参数输入*/ int poutput(); /*调度结果输出*/ void main() { int option; pinput(); printf("请选择调度算法(0~4):\n"); printf("1.先来先服务\n"); printf("2.响应比高优先\n"); printf("0.退出\n"); scanf("%d",&option); switch (option) { case 0: printf("运行结束。\n"); break; case 1: printf("对进程按先来先服务调度。\n\n"); fcfs(); poutput(); break; 《操作系统原理 》实验报告 - 4 - case 2: printf("对进程按响应比高优先调度。\n\n"); hrrn(); poutput(); break; } } int fcfs() /*先来先服务*/ { float time_temp=0; int i; int number_schedul; time_temp=tasks[0].arrivetime; for(i=0;itasks[i].starttime=time_temp; tasks[i].endtime=tasks[i].starttime+tasks[i].run_time; tasks[i].run_flag=1; time_temp=tasks[i].endtime; number_schedul=i; tasks[number_schedul].order=i+1; } return 0; } int hrrn() /*响应比高优先*/ { int j,number_schedul,temp_counter; float temp_time,respond_rate,max_respond_rate; /*第一个进程被调度*/ tasks[0].starttime=tasks[0].arrivetime; tasks[0].endtime=tasks[0].starttime+tasks[0].run_time; temp_time=tasks[0].endtime; tasks[0].run_flag=1; tasks[0].order=1; temp_counter=1; /*调度其他进程*/ while(temp_counter{ max_respond_rate=0; for(j=1;j《操作系统原理 》实验报告 - 5 - { if((tasks[j].arrivetime<=temp_time)&&(!tasks[j].run_flag)) { respond_rate=(temp_time-tasks[j].arrivetime)/tasks[j].run_time; if (respond_rate>max_respond_rate) { max_respond_rate=respond_rate; number_schedul=j; } } } /*找响应比高的进程*/ tasks[number_schedul].starttime=temp_time;
tasks[number_schedul].endtime=tasks[number_schedul].starttime+tasks[number_schedul].run_time; temp_time=tasks[number_schedul].endtime; tasks[number_schedul].run_flag=1; temp_counter+=1; tasks[number_schedul].order=temp_counter; } return 0; } int pinput() /*进程参数输入*/ { int i; printf("请输入运行进程数量:\n"); scanf("%d",&counter); for(i=0;i{ printf("******************************************\n"); printf("请输入序列为 %d th :\n",i+1); 《操作系统原理 》实验报告 - 6 - printf("请输入进程名称:\n"); scanf("%s",tasks[i].name); printf("请输入进程编号:\n"); scanf("%d",&tasks[i].number); printf("请输入进程到达时间:\n"); scanf("%f",&tasks[i].arrivetime); printf("请输入进程服务时间:\n"); scanf("%f",&tasks[i].run_time); printf("请输入优先级:\n"); scanf("%d",&tasks[i].priority); tasks[i].starttime=0; tasks[i].endtime=0; tasks[i].order=0; tasks[i].run_flag=0; } return 0; } int poutput() /*调度结果输出*/ { int i; float turn_round_time=0,f1,w=0; printf("进程名称 进程编号 到达时间 服务时间 开始时间 结束时间 优先级 结束顺序 周转时间\n"); for(i=0;i{ f1=tasks[i].endtime-tasks[i].arrivetime; turn_round_time+=f1; w+=(f1/tasks[i].run_time);
printf(" %s, %d, %5.3f, %5.3f, %5.3f, %5.3f, %d, %d, %5.3f\n",tasks[i].name,tasks[i].number,