进程调度算法有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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)