1. 程式人生 > >作業系統輪轉排程演算法(c語言描述)

作業系統輪轉排程演算法(c語言描述)

/*輪轉排程演算法*/
#include<stdio.h>
#include<malloc.h>
#define N 100
typedef struct RR{
int arivaltime;
int gotime,copytime;
int finaltime;
int time;
float dtime;
    struct RR * nextRR;
}RR;
int k=0;
struct RR JC[N];
struct RR *CreatRR(int n){
struct RR * head;
struct RR * q=(struct RR *)malloc(sizeof(RR));
q->nextRR=NULL;
head=q;
for(int i=0;i<n;i++){
struct RR * p=(struct RR *)malloc(sizeof(RR));
printf("第%d個程序的到達時間:",i+1);
scanf("%d",&(p->arivaltime));
printf("第%d個程序的執行時間:",i+1);
scanf("%d",&(p->gotime));
p->dtime=0;
p->finaltime=0;
p->time=0;
q->nextRR=p;
p->copytime=p->gotime;
p->nextRR=NULL;
q=p;
}
return head;
}
struct RR * deleteQueue(struct RR * head,struct RR * n){
struct RR *p,*q;
p=head;
while(p!=n){
q=p;
p=p->nextRR;
}
if(q->nextRR==n){
q->nextRR=p->nextRR;
n->time=n->finaltime-n->arivaltime;
n->dtime=(float)n->time/n->gotime;
JC[k].arivaltime=n->arivaltime;
        JC[k].gotime=n->gotime;
JC[k].finaltime=n->finaltime;
JC[k].time=n->finaltime-n->arivaltime;
JC[k].dtime=(float)JC[k].time/JC[k].gotime;
k++;
delete p;
}
return q->nextRR;
}
void Sort(struct RR a[],int n){
int m=0;
struct RR temp;
for(int i=0;i<n;i++){
m=i;
for(int j=i+1;j<n;j++){
if(a[m].arivaltime>=a[j].arivaltime){
m=j;
}
}
if(m!=i){
temp=a[m];
a[m]=a[i];
a[i]=temp;
}
}
}
int Number(struct RR * head){
int number=0;
struct RR *p;
if(head->nextRR==NULL){
return 0;
}
p=head;
while(p->nextRR){
number++;
p=p->nextRR;
}
return number;
}
int main(){
int n,dt,localtime=0,j;
struct RR * p;
struct RR * head;
printf("程序的個數:");
scanf("%d",&n);
printf("時間片大小:");
scanf("%d",&dt);
    p=CreatRR(n);
head=p;
p=p->nextRR;
localtime=p->arivaltime;
printf("提交時間    服務時間    完成時間    週轉時間    帶權週轉時間\n");
while(Number(head)&&p!=NULL){
for(j=0;j<dt;j++){
p->finaltime=localtime+1;
localtime=p->finaltime;
(p->copytime)--;
if(p->copytime==0){
p=deleteQueue(head,p);
break;
}
}
if(j<dt){
if(p==NULL){
p=head->nextRR;
}
}
else{
p=p->nextRR;
if(p==NULL){
p=head->nextRR;
}
}
}
Sort(JC,k);
for(int l=0;l<n;l++){
      printf("  %2d          %2d          %2d           %2d           %.2f\n",JC[l].arivaltime,JC[l].gotime,JC[l].finaltime,JC[l].time,JC[l].dtime);
}
return 0;

}

鏈佇列使用、結構體的定義

輪轉排程演算法,時間片長類似於先來先服務排程演算法,時間片短類似於短作業優先排程演算法!