(一) 进程调度

 进程调度算法有FIFO,优先数调度算法,时间片轮转调度算法,分级调度算法,目前主要是考虑FIFO和优先数调度算法(静态优先级)。
 输入:

  进程流文件,其中存储的是一系列要执行的进程, 
  每个作业包括四个数据项:
 进程名  进程状态(1就绪 2等待 3运行)  所需时间  优先数(0级最高)
 输出:
 进程执行流 和等待时间 平均等待时间
 本程序包括:FIFO,优先数调度算法,时间片轮转调度算法

 

 

进程调度
 
   
#include < stdio.h >
#include
< string .h >
#include
< iostream.h >

const int block_time = 10 ; // 定义时间片的长度为10秒
const int MAXPCB = 100 ; // 定义最大进程数

// 定义进程结构体
typedef struct node{
char name[ 20 ];
int status;
int time;
int privilege;
int finished;
int wait_time;
}pcb;

pcb pcbs[MAXPCB];
int quantity;

// 初始化函数
void initial(){
int i;

for (i = 0 ;i < MAXPCB;i ++ ){
strcpy(pcbs[i].name,
"" );
pcbs[i].status
= 0 ;
pcbs[i].time
= 0 ;
pcbs[i].privilege
= 0 ;

pcbs[i].finished
= 0 ;
pcbs[i].wait_time
= 0 ;
}

quantity
= 0 ;
}

// 读数据函数
int readData(){
FILE
* fp;
char fname[ 20 ];
int i;

cout
<< " 请输入进程流文件名: " ;
cin
>> fname;
if ((fp = fopen(fname, " r " )) == NULL){
cout
<< " 错误,文件打不开,请检查文件名 " << endl;
}
else {
while ( ! feof(fp)){
fscanf(fp,
" %s %d %d %d " ,pcbs[quantity].name, & pcbs[quantity].status, & pcbs[quantity].time, & pcbs[quantity
].privilege);
quantity
++ ;
}

// 输出所读入的数据
cout << " 输出所读入的数据 " << endl;
cout
<< " 进程名 进程状态 所需时间 优先数 " << endl;
for (i = 0 ;i < quantity;i ++ ){
cout
<< " " << pcbs[i].name << " " << pcbs[i].status << " " << pcbs[i].time << " " << pcbs[i].privilege << endl;
}
return ( 1 );
}
return ( 0 );

}

// 重置数据,以供另一个算法使用
void init()
{
int i;

for (i = 0 ;i < MAXPCB;i ++ ){

pcbs[i].finished
= 0 ;
pcbs[i].wait_time
= 0 ;
}
}

// 先进先出算法
void FIFO()
{
int i,j;
int total;

// 输出FIFO算法执行流
cout << endl << " --------------------------------------------------------------- " << endl;
cout
<< " FIFO算法执行流: " << endl;
cout
<< " 进程名 等待时间 " << endl;
for (i = 0 ;i < quantity;i ++ ){
cout
<< " " << pcbs[i].name << " " << pcbs[i].wait_time << endl;

for (j = i + 1 ;j < quantity;j ++ ){
pcbs[j].wait_time
+= pcbs[i].time;
}
}
total
= 0 ;
for (i = 0 ;i < quantity;i ++ ){
total
+= pcbs[i].wait_time;
}
cout
<< " 总等待时间: " << total << " 平均等待时间: " << total / quantity << endl;

}

// 优先数调度算法
void privilege()
{
int i,j,p;
int passed_time = 0 ;
int total;

int queue[MAXPCB];
int current_privilege = 1000 ;

for (i = 0 ;i < quantity;i ++ ){
current_privilege
= 1000 ;
for (j = 0 ;j < quantity;j ++ ){
if ((pcbs[j].finished == 0 ) && (pcbs[j].privilege < current_privilege)){
p
= j;
current_privilege
= pcbs[j].privilege;
}
}
queue[i]
= p;
pcbs[p].finished
= 1 ;
pcbs[p].wait_time
+= passed_time;
passed_time
+= pcbs[p].time;
}

// 输出优先数调度执行流
cout << endl << " --------------------------------------------------------------- " << endl;
cout
<< " 优先数调度执行流: " << endl;
cout
<< " 进程名 等待时间 " << endl;
for (i = 0 ;i < quantity;i ++ ){
cout
<< " " << pcbs[queue[i]].name << " " << pcbs[queue[i]].wait_time << endl;
}

total
= 0 ;
for (i = 0 ;i < quantity;i ++ ){
total
+= pcbs[i].wait_time;
}
cout
<< " 总等待时间: " << total << " 平均等待时间: " << total / quantity << endl;

}

// 时间片轮转调度算法
void timer()
{
int i,j,number,flag = 1 ;
int passed_time = 0 ;
int max_time = 0 ;
int round = 0 ;

int queue[ 1000 ];
int total = 0 ;

while (flag == 1 ){
flag
= 0 ;
number
= 0 ;

for (i = 0 ;i < quantity;i ++ ){
if (pcbs[i].finished == 0 ){
number
++ ;
j
= i;
}
}

if (number == 1 ){
queue[total]
= j;
total
++ ;
pcbs[j].finished
= 1 ;
}

if (number > 1 ){

for (i = 0 ;i < quantity;i ++ ){
if (pcbs[i].finished == 0 ){
flag
= 1 ;
queue[total]
= i;
total
++ ;
if (pcbs[i].time <= block_time * (round + 1 )){
pcbs[i].finished
= 1 ;
}
}
}
}
round
++ ;
}

if (queue[total - 1 ] == queue[total - 2 ]){
total
-- ;
}

cout
<< endl << " --------------------------------------------------------------- " << endl;
cout
<< " 时间片轮转调度执行流: " ;
for (i = 0 ;i < total;i ++ ){
cout
<< pcbs[queue[i]].name << " " ;
}


}

// 显示版权信息函数
void version()
{
cout
<< endl << endl;

cout
<< " ┏━━━━━━━━━━━━━━━━━━━━━━━┓ " << endl;
cout
<< " ┃       进程调度模拟系统         ┃ " << endl;
cout
<< " ┠───────────────────────———————┨ " << endl;
cout
<< " ┃    (c)All Right Reserved Neo       ┃ " << endl;
cout
<< " ┃      sony006@163.com       ┃ " << endl;
cout
<< " ┃     version 2004 build 1122     ┃ " << endl;
cout
<< " ┗━━━━━━━━━━━━━━━━━━━━━━━┛ " << endl;
cout
<< endl << endl;
}


// 主函数
void main()
{
int flag;

version();

initial();

flag
= readData();

if (flag == 1 ){
FIFO();
init();

privilege();
init();

timer();
}
}

 

转载于:https://www.cnblogs.com/FCWORLD/archive/2010/12/04/1896340.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先(抢占式和非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程进程控制块,进程控制块至少包括: a) 进程称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格式显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值