#include<stdio.h>
#include <iostream>
using namespace std
;
#define MAX 100
struct PCB
{
char name
[10];
float uptime
;
float costtime
;
float starttime
;
float endtime
;
float time
;
float averagetime
;
int run_flag
;
int start_flag
;
}WORK
[MAX
];
int worknum
;
int key
;
void shuru();
void shuchu();
void RR();
int charge();
void RR()
{
float time
=0;
int i
;
int j
=0;
int k
=0;
struct PCB WORKS
[MAX
];
for(i
=0; i
<worknum
; i
++)
WORKS
[j
++]=WORK
[i
];
time
=WORK
[0].uptime
;
while(charge())
{
for(i
=0; i
<worknum
; i
++)
{
if(i
>0)
{
if(WORK
[i
].uptime
>time
&&WORK
[i
-1].run_flag
==1)
time
=WORK
[i
].uptime
;
}
if(WORK
[i
].run_flag
==0&&WORK
[i
].uptime
<=time
)
{
if(WORK
[i
].start_flag
==0)
{
WORK
[i
].starttime
=time
;
WORK
[i
].start_flag
=1;
}
if(WORK
[i
].costtime
/key
>1)
{
WORK
[i
].costtime
=WORK
[i
].costtime
-key
;
time
=time
+key
;
}
else if(WORK
[i
].costtime
-key
==0)
{
time
=time
+key
;
WORK
[i
].endtime
=time
;
WORK
[i
].run_flag
=1;
WORK
[i
].costtime
=WORKS
[i
].costtime
;
}
else
{
time
=time
+WORK
[i
].costtime
;
WORK
[i
].endtime
=time
;
WORK
[i
].run_flag
=1;
WORK
[i
].costtime
=WORKS
[i
].costtime
;
}
}
}
}
}
int charge()
{
int k
;
int super_flag
=0;
for(k
=0; k
<worknum
; k
++)
{
if(WORK
[k
].run_flag
==0)
{
super_flag
=1;
return super_flag
;
break;
}
}
return super_flag
;
}
void shuru()
{
int i
;
printf("请输入进程数:");
cin
>>worknum
;
printf("请输入时间片长度:");
cin
>>key
;
for(i
=0; i
<worknum
; i
++)
{
printf("请依次输入%d个:进程名 到达时间 运行时间:",i
+1);
cin
>>WORK
[i
].name
>>WORK
[i
].uptime
>>WORK
[i
].costtime
;
WORK
[i
].starttime
=0;
WORK
[i
].endtime
=0;
WORK
[i
].run_flag
=0;
WORK
[i
].start_flag
=0;
}
for(int i
=0;i
<worknum
-1;i
++)
for(int j
=0;j
<worknum
-1;j
++)
if(WORK
[j
].uptime
>WORK
[j
+1].uptime
)
{
PCB temp
;
temp
=WORK
[j
+1];
WORK
[j
+1]=WORK
[j
];
WORK
[j
]=temp
;
}
}
void shuchu()
{
int i
;
float T1
=0,T2
=0;
printf("进程名 到达时间 运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
for(i
=0; i
<worknum
; i
++)
{
WORK
[i
].time
=WORK
[i
].endtime
-WORK
[i
].uptime
;
WORK
[i
].averagetime
=WORK
[i
].time
/WORK
[i
].costtime
;
T1
+=WORK
[i
].time
;
T2
+=WORK
[i
].averagetime
;
printf("%-7s%-9f%-9f%-9f%-9f%-9f%-9f%\n",WORK
[i
].name
,WORK
[i
].uptime
,WORK
[i
].costtime
,WORK
[i
].starttime
,WORK
[i
].endtime
,WORK
[i
].time
,WORK
[i
].averagetime
);
}
printf("平均周转时间=%f,平均带权周转时间=%f\n",T1
/worknum
,T2
/worknum
);
}
void main()
{
shuru();
printf("时间片轮转算法:\n");
RR();
shuchu();
}
转载请注明原文地址: https://lol.8miu.com/read-38128.html