一、实验目的
(1)掌握周转时间、等待时间、平均周转时间等概念及其计算方法。
(2)理解五种常用的进程调度算法(FCFS、SJF、HRRF、HPF),区分算法之间的差异性,并用 C 语言模拟实现各算法。
(3)了解操作系统中高级调度、中级调度和低级调度的区别和联系。
(4)经过对银行家算法的设计,加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。
使用C语言对银行家算法模拟。
二、实验内容和步骤
1.进程调度算法实现
实验说明:本实验选用的调度算法均为非抢占式。
代码实现:
#include<stdio.h>
#define MAX 10
struct task_struct
{
int number; /*进程编号*/
float come_time; /*到达时间*/
float run_begin_time; /*开始运行时间*/
float run_time; /*运行时间*/
float run_end_time; /*运行结束时间*/
int priority; /*优先级*/
int order; /*运行次序*/
int run_flag; /*调度标志*/
}tasks[MAX];
int counter; /*实际进程个数*/
int fcfs(); /*先来先服务*/
int ps(); /*优先级调度*/
int sjf(); /*短作业优先*/
int hrrn(); /*响应比高优先*/
int pinput(); /*进程参数输入*/
int poutput(); /*调度结果输出*/
void main()
{
int option;
pinput();
printf("请选择调度算法(0~4):\n");
printf("1.先来先服务\n");
printf("2.优先级调度\n");
printf("3.短作业优先\n");
printf("4.响应比高优先\n");
printf("0.退出\n");
scanf("%d",&option);
switch (option)
{
case 0:
printf("运行结束。\n");
break;
case 1:
printf("对进程按先来先服务调度。\n\n");
fcfs();
poutput();
break;
case 2:
printf("对进程按优先级调度。\n\n");
ps();
poutput();
break;
case 3:
printf("对进程按短作业优先调度。\n\n");
sjf();
poutput();
break;
case 4:
printf("对进程按响应比高优先调度。\n\n");
hrrn();
poutput();
break;
}
}
int fcfs() /*先来先服务*/
{
float time_temp=0;
int i,j;
int number_schedul=0;
int first_come_time=0;
//find the first come
i=0;
time_temp=-1;
first_come_time=tasks[0].come_time;
for(i=0;i<counter;i++)
{
//find the first come
for(j=0;j<counter;j++)
{
if((tasks[j].come_time<=first_come_time)&&(!tasks[j].run_flag))
{
first_come_time=tasks[j].come_time;
number_schedul=j;
}
}
printf("number_schedul=%d\n",number_schedul);
if(time_temp==-1)
tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;
else tasks[number_schedul].run_begin_time=time_temp;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
tasks[number_schedul].run_flag=1;
first_come_time=time_temp=tasks[number_schedul].run_end_time;
number_schedul=number_schedul;
tasks[number