#include<sys/types、h>
#include〈sys/ipc、h〉
#include〈semaphore、h>
#include<fcntl、h>
#include<sys/stat、h>
intmain(intargc,char*argv[])
{
inti=0;
sem_t*hei=sem_open("chess_black_sem”,O_CREAT,0666,1);
sem_t*hong=sem_open(”chess_red_sem",O_CREAT,0666,0);
for(i=0;i〈10;i++)
{
sem_wait(hong);
if(i!
=9){
printf("Blackchesshadmoved,redchessgo!
\n”);
}
else{
printf("Blackchess win!
\n");
}
fflush(stdout);
sem_post(hei);
}
sleep(10);
sem_close(hei);
sem_close(hong);
sem_unlink(”chess_red_sem");
sem_unlink(”chess_black_sem”);
exit(0);
}
实验结果:
实验四 作业调度算法模拟
一、实验目得
(1)掌握周转时间、等待时间、平均周转时间等概念及其计算方法。
(2)理解五种常用得进程调度算法(FCFS、SJF、HRRF、HPF、RR),区分算法之间得差异性,并用C语言模拟实现各算法。
(3)了解操作系统中高级调度、中级调度与低级调度得区别与联系.
二、实验环境
硬件环境:
计算机一台,局域网环境;
软件环境:
LinuxUbuntu操作系统,gcc编译器。
三、实验内容与步骤
本实验所选用得调度算法均默认为非抢占式.
实验所用得测试数据如下表所示。
本实验所用得测试数据如下表所示
表实验测试数据
作业Id
到达时间
执行时间
优先权
1
800
50
0
2
815
30
1
3
830
25
2
4
835
20
2
5
845
15
2
6
700
10
1
7
820
5
0
作业得数据结构:
typedefstructnode
{
ﻩint number;//作业号
intreach_time;//作业抵达时间
intneed_time;//作业得执行时间
intprivilege;// 作业优先权
ﻩfloatexcellent;//响应比
intstart_time;//作业开始时间
int wait_time;//等待时间
intvisited;//作业就是否被访问过
boolisreached;//作业就是否已经抵达
}job;
代码:
#include〈stdio、h>
#include<string、h>
#include
#include〈stdbool、h〉
//最大作业数量
constintMAXJOB=50;
//作业得数据结构
typedefstructnode
{
intnumber;//作业号
int reach_time;//作业抵达时间
intneed_time;//作业得执行时间
int privilege;//作业优先权
floatexcellent;//响应比
intstart_time;//作业开始时间
int wait_time;//等待时间
int visited;//作业就是否被访问过
boolisreached;//作业就是否抵达
}job;
jobjobs[50];//作业序列
intquantity;//作业数量
//初始化作业序列
void initial_jobs()
{
inti;
for(i=0;i〈MAXJOB;i++)
{
jobs[i]、number=0;
jobs[i]、reach_time=0;
jobs[i]、privilege=0;
jobs[i]、excellent=0;
jobs[i]、start_time=0;
jobs[i]、wait_time=0;
jobs[i]、visited=0;
jobs[i]、isreached=false;
}
quantity=0;
}
//重置全部作业信息
void reset_jinfo()
{
int i;
for(i=0;i〈MAXJOB;i++)
{
jobs[i]、start_time=0;
jobs[i]、wait_time=0;
jobs[i]、visited=0;
}
}
//查找当前current_time已到达未执行得最短作业,若无返回-1
intfindminjob(jobjobs[],intcount)
{
intminjob=-1;//=jobs[0]、need_time;
intminloc=-1;
inti;
for(i=0;i<count;i++)
{
if(minloc==-1){
if(jobs[i]、isreached==true&&jobs[i]、visited==0){
minjob=jobs[i]、need_time;
minloc=i;
}
}
elseif(minjob〉jobs[i]、need_time&&jobs[i]、visited==0&&jobs[i]、isreached==true)
{
minjob=jobs[i]、need_time;
minloc=i;
}
}
returnminloc;
}
//查找最早到达作业,若全部到达返回-1、
intfindrearlyjob(jobjobs[],int count)
{
intrearlyloc=—1;
int rearlyjob=-1;
inti;
for(i=0;i〈count;i++)
{
if(rearlyloc==—1){
if(jobs[i]、visited==0){
rearlyloc=i;
rearlyjob=jobs[i]、reach_time;
}
}
else if(rearlyjob〉jobs[i]、reach_time&&jobs[i]、visited==0)
{
rearlyjob=jobs[i]、reach_time;
rearlyloc=i;
}
}
returnrearlyloc;
}
//读取作业数据
voidreadJobdata()
{
FILE*fp;
charfname[20];
inti;
//输入测试文件文件名
printf(”pleaseinputjobdata\n”);
scanf("%s",fname);
if((fp=fopen(fname,"r"))==NULL)
{
printf(”error,open , pleasecheck:
\n");
}
else
{
//依次读取作业信息
while(!
feof(fp))
{
if(fscanf(fp,"%d %d %d%d”,&jobs[quantity]、number,&jobs[quantity]、reach_time,&jobs[quantity]、need_time,&jobs[quantity]、privilege)==4)
quantity++;
}
//打印作业信息
printf("outputthe originjobdata\n”);
printf(”-—-———-—-—-------—----—--—--——------——--—-——-—---—-—---——--—---—---——\n”);
printf("\tjobID\treachtime\tneedtime\tprivilege\n”);
for(i=0;i〈quantity;i++)
{
printf(”\t%—8d\t%-8d\t%-8d\t%-8d\n",jobs[i]、number,jobs[i]、reach_time,jobs[i]、need_time,jobs[i]、privilege);
}
}
}
//FCFS
void FCFS()
{
int i;
intcurrent_time=0;
intloc;
inttotal_waitime=0;
int total_roundtime=0;
//获取最近到达得作业
loc=findrearlyjob(jobs,quantity);
//输出作业流
printf(”\n\nFCFS算法作业流\n”);
printf("---—-----—-——---—-——-—--—------———-------——--—-———----—---—-—---—-—-----\n”);
printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n”);
current_time=jobs[loc]、reach_time;
//每次循环找出最先到达得作业并打印相关信息
for(i=0;i<quantity;i++)
{
if(jobs[loc]、reach_time>current_time)
{
jobs[loc]、start_time=jobs[loc]、reach_time;
current_time=jobs[loc]、reach_time;
}
else
{
jobs[loc]、start_time=current_time;
}
jobs[loc]、wait_time=current_time-jobs[loc]、reach_time;
printf("\t%-8d\t%-8d\t%—8d\t%-8d\t%-8d\n",loc+1,jobs[loc]、reach_time,jobs[loc]、start_time,jobs[loc]、wait_time,
jobs[loc]、wait_time+jobs[loc]、need_time);
jobs[loc]、visited=1;
current_time+=jobs[loc]、need_time;
total_waitime+=jobs[loc]、wait_time;
total_roundtime=total_roundtime+jobs[loc]、wait_time+jobs[loc]、need_time;
//获取剩余作业中最近到达作业
loc=findrearlyjob(jobs,quantity);
}
printf(”总等待时间:
%—8d 总周转时间:
%-8d\n",total_waitime,total_roundtime);
printf(“平均等待时间:
%4、2f平均周转时间:
%4、2f\n”,(float)total_waitime/(quantity),(float)total_roundtime/(quantity));
}
//短作业优先作业调度
voidSFJschdulejob(jobjobs[],intcount)
{
}
intma