进程调度算法的模拟实现

【实验目的】

1.理解和掌握课堂上讲的进程调度算法,并编程模拟实现调度过程。
2.研究进程调度算法的实现方法,并对算法性能参数进行对比。

【实验要求】

编程模拟实现传统的进程调度算法:FCFS调度算法、SPF调度算法、RR调度算法、优先级调度,高响应比优先等算法。

/*FCFS 和 SPF 调度算法*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
/*进程控制块*/
typedef struct{
	char pname;//进程名
	int arrive_t;//到达时间
	int service_t;//服务时间
	int finish_t;//完成时间
	int turnaround_t;//周转时间
	double w_turnaround_t;//带权周转时间
}PCB;

PCB p[20]; //声明n个进程控制块
int n=5;
/*初始化进程信息:进程名、到达时间、服务时间、状态*/
void init();
/*输出初状态*/
void original_P();
//排序
bool cmp1(PCB a,PCB b);
bool cmp2(PCB a,PCB b);
bool cmp3(PCB a,PCB b);
bool cmp4(PCB a,PCB b);
/*FCFS算法*/
void FCFS_work();
/*SPF算法*/
void SPF_work();
/*输出最终状态*/
void Print();
int main()
{
	init();
	original_P();
	char op;
	printf("请输入要使用的调度算法(<f/F-->FCFS> <s/S-->SPF>):");
	scanf("%c",&op);
	getchar();
	if(op=='s'||op=='S')
	{
		SPF_work();
	}
	if(op=='f'||op=='F')
	{
		FCFS_work();
	}
	Print();
	return 0;
}

void init()//初始化进程信息:进程名、到达时间、服务时间
{
	p[0].pname = 'A';
	p[0].arrive_t = 0;
	p[0].service_t = 3;
	
	p[1].pname = 'B';
	p[1].arrive_t = 2;
	p[1].service_t = 6;
	
	p[2].pname = 'C';
	p[2].arrive_t = 4;
	p[2].service_t = 4;
	
	p[3].pname = 'D';
	p[3].arrive_t = 6;
	p[3].service_t = 5;
	
	p[4].pname = 'E';
	p[4].arrive_t = 8;
	p[4].service_t = 2;
}
void original_P()//输出初始状态
{
	printf("进程初始状态\n");
	printf("------------------------------------------------------------------\n");
	printf("进程名\t\t到达时间\t服务时间\n");
	int i;
	for(i=0;i<n;i++)
	{
		printf("%c\t\t    %d\t\t    %d\n",p[i].pname,p[i].arrive_t,p[i].service_t);
	}
	printf("--------------------------------------------------------------------------------------------------\n");
 }
 bool cmp1(PCB a,PCB b)
{
    return a.arrive_t<b.arrive_t;//按到达时间从小到达排序
}
 void FCFS_work()
{
    sort(p,p+n,cmp1);
    p[0].finish_t=p[0].arrive_t+p[0].service_t;//第一个进程的完成时间=到达时间+服务时间
    for(int i=1;i<n;i++)
    {
        p[i].finish_t=max(p[i].arrive_t,p[i-1].finish_t)+p[i].service_t;//完成时间=开始运行时间+服务时间
    }

}

 //按先达到时间排序,再按服务时间排序
 bool cmp2(PCB a,PCB b)
 {
     if(a.arrive_t==b.arrive_t)
     {
         return a.service_t<b.service_t;
     }
     else
     {
         return a.arrive_t<b.arrive_t;
     }
 }
 //按服务时间排序
 bool cmp3(PCB a,PCB b)
 {
     return a.service_t<b.service_t;
 }
void SPF_work()
{
    sort(p,p+n,cmp2);//先按到达时间排序,再按进程服务时间排序
    p[0].finish_t=p[0].arrive_t+p[0].service_t;//第一个进程的完成时间=到达时间+服务时间
    int cnt=1;//判断完成时间内到达的进程个数,设第一个进程已经到达
    for(int i=1;i<n;i++)//看每一个进程 
    {
        if(cnt<n)
        {
             for(int j=i;j<n;j++)//看后面来的进程 
            {
                if(p[j].arrive_t<=p[i-1].finish_t)//比较到达时间和上一个进程的完成时间 
                {
                    cnt++;//如果已经达到就标记 
                }
                else
                    break;
            }
            if(cnt>i)//需要排序时 
                sort(p+i,p+cnt,cmp3);//按服务时间排序
        }
        p[i].finish_t=max(p[i-1].finish_t,p[i].arrive_t)+p[i].service_t;//完成时间 
    }
}
bool cmp4(PCB a,PCB b)
{
	return a.pname<b.pname;//按进程名排序 
}
void Print()
{
	printf("--------------------------------------------------------------------------------------------------\n");
	int i;
	printf("进程执行顺序为:\n");
	for(i=0;i<n;i++)
    {
        printf("%c ",p[i].pname);
    }
    printf("\n");
    sort(p,p+n,cmp4);
	printf("--------------------------------------------------------------------------------------------------\n");
	printf("进程名\t\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
	int sum_t1=0;//代表总的周转时间
	double sum_t2=0;//代表总的带权周转时间
	for(i=0;i<n;i++)
	{
		p[i].turnaround_t=p[i].finish_t-p[i].arrive_t;//周转时间=完成时间-到达时间
        p[i].w_turnaround_t=(double)p[i].turnaround_t/p[i].service_t;//带权周转时间=周转时间/服务时间
		sum_t1=sum_t1 + p[i].turnaround_t;
		sum_t2=sum_t2 + p[i].w_turnaround_t;
		printf("%c\t\t    %d\t\t    %d\t\t   %d\t\t   %d\t\t  %0.2f\n",p[i].pname,p[i].arrive_t,
		       p[i].service_t,p[i].finish_t,p[i].turnaround_t,p[i].w_turnaround_t);

	}
	printf("平均周转时间:%0.2f\n",(double)sum_t1/n);
	printf("平均带权周转时间:%0.2f\n",(double)sum_t2/n);

}

//高响应比优先调度算法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
/*进程控制块*/
typedef struct{
	char pname;//进程名
	int arrive_t;//到达时间
	int service_t;//服务时间
	int finish_t;//完成时间
	int turnaround_t;//周转时间
	double w_turnaround_t;//带权周转时间
	double r;//响应比
}PCB;

PCB p[20]; //声明进程控制块
int n=6;
void init()//初始化进程信息:进程名、到达时间、服务时间
{
	p[0].pname = 'A';
	p[0].arrive_t = 0;
	p[0].service_t = 3;

	p[1].pname = 'B';
	p[1].arrive_t = 2;
	p[1].service_t = 4;

	p[2].pname = 'C';
	p[2].arrive_t = 3;
	p[2].service_t = 2;

	p[3].pname = 'D';
	p[3].arrive_t = 4;
	p[3].service_t = 5;

	p[4].pname = 'E';
	p[4].arrive_t = 5;
	p[4].service_t = 3;
	
	p[5].pname = 'F';
	p[5].arrive_t = 6;
	p[5].service_t = 6;
}
void original_P()//输出初始状态
{
	printf("进程初始状态\n");
	printf("------------------------------------------------------------------\n");
	printf("进程名\t\t到达时间\t服务时间\n");
	int i;
	for(i=0;i<n;i++)
	{
		printf("%c\t\t    %d\t\t    %d\n",p[i].pname,p[i].arrive_t,p[i].service_t);
	}
 }
bool cmp1(PCB a,PCB b)
{
    return a.arrive_t<b.arrive_t;//按到达时间从小到达排序
}
bool cmp2(PCB a,PCB b)
{
    return a.r>b.r;//按响应比从大到小排序
}

 //高响应比优先调度算法
 void HRRN_work()
 {
    sort(p,p+n,cmp1);//先按到达时间排序
    p[0].finish_t=p[0].arrive_t+p[0].service_t;//第一个进程的完成时间=到达时间+服务时间
    int cnt;//为了计算要排序的响应比对应的进程数
    for(int i=1;i<n;i++)
    {
        cnt=0;
        for(int j=i;j<n;j++)//从当前进程的下一个进程开始看
        {
            if(p[j].arrive_t<=p[i-1].finish_t)//比较到达时间和上一个进程的完成时间
            {
                p[j].r=(double)(p[i-1].finish_t-p[j].arrive_t)/p[j].service_t+1;//计算响应比
                cnt++;

            }
            else //后面的进程还没到,就不计算了
                break;

        }
        sort(p+i,p+i+cnt,cmp2);//只需要排当前进程后面未执行的进程,按响应比由高到低排序,最大的排在前面
        //按响应比最高的执行
        p[i].finish_t=max(p[i-1].finish_t,p[i].arrive_t)+p[i].service_t;//计算进程的完成时间
    }

 }
 bool cmp3(PCB a,PCB b)
{
    return a.pname<b.pname;//按进程名排序 
}
 void Print()
{
    int i;
    printf("进程执行顺序为:\n");
	for(i=0;i<n;i++)
    {
        printf("%c ",p[i].pname);
    }
    printf("\n");
    sort(p,p+n,cmp3);
	printf("--------------------------------------------------------------------------------------------------\n");
	printf("进程名\t\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
	int sum_t1=0;//代表总的周转时间
	double sum_t2=0;//代表总的带权周转时间
	for(i=0;i<n;i++)
	{
	    p[i].turnaround_t=p[i].finish_t-p[i].arrive_t;//周转时间=完成时间-到达时间
        p[i].w_turnaround_t=(double)p[i].turnaround_t/p[i].service_t;//带权周转时间=周转时间/服务时间
		sum_t1=sum_t1 + p[i].turnaround_t;
		sum_t2=sum_t2 + p[i].w_turnaround_t;
		printf("%c\t\t    %d\t\t    %d\t\t   %d\t\t   %d\t\t  %0.2f\n",p[i].pname,p[i].arrive_t,
		       p[i].service_t,p[i].finish_t,p[i].turnaround_t,p[i].w_turnaround_t);

	}
	printf("平均周转时间:%0.2f\n",(double)sum_t1/n);
	printf("平均带权周转时间:%0.2f\n",(double)sum_t2/n);

}
int main()
{
    init();
    original_P();
    HRRN_work();
    Print();
    return 0; 
}
//RR时间片轮转与HPF优先级调度算法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct{
	char pname;//进程名
	int arrive_t;//到达时间
	int service_t;//服务时间
	int finish_t;//完成时间
	int turnaround_t;//周转时间
	double w_turnaround_t;//带权周转时间
	char state;//进程状态: w:等待, m:就绪,r:运行
	int priority;//优先级
	int run_t;//运行时间
	int remaining_t;//剩余时间
}PCB;
PCB p[20];
int n=10;
char op;
void init()//初始化进程信息:进程名、到达时间、服务时间、状态
{
	p[0].pname = 'A';
	p[0].arrive_t = 0;
	p[0].service_t = 3;
	p[0].priority=2;

	p[1].pname = 'B';
	p[1].arrive_t = 2;
	p[1].service_t = 5;
	p[1].priority=1;

	p[2].pname = 'C';
	p[2].arrive_t = 2;
	p[2].service_t = 2;
	p[2].priority=4;

	p[3].pname = 'D';
	p[3].arrive_t = 4;
	p[3].service_t = 4;
	p[3].priority=3;

	p[4].pname = 'E';
	p[4].arrive_t = 4;
	p[4].service_t = 1;
	p[4].priority=10;

	p[5].pname = 'F';
	p[5].arrive_t = 4;
	p[5].service_t = 4;
	p[5].priority=8;

    p[6].pname = 'G';
	p[6].arrive_t = 6;
	p[6].service_t = 2;
	p[6].priority=9;

	p[7].pname = 'H';
	p[7].arrive_t = 6;
	p[7].service_t = 6;
	p[7].priority=6;

	p[8].pname = 'I';
	p[8].arrive_t = 6;
	p[8].service_t = 5;
	p[8].priority=7;

	p[9].pname = 'J';
	p[9].arrive_t = 6;
	p[9].service_t = 2;
	p[9].priority=5;


	for(int i=0;i<n;i++)
    {
        p[i].state='w';//初始状态都设为等待
        p[i].run_t=0;
        p[i].remaining_t=p[i].service_t;
    }
}
void original_HPF_P()//输出HPF的初始状态
{
	printf("进程的初始状态\n");
	printf("------------------------------------------------------------------\n");
	printf("进程名\t\t到达时间\t服务时间\t优先级(数越大优先级越高)\n");
	int i;
	for(i=0;i<n;i++)
	{
		printf("%c\t\t    %d\t\t    %d\t\t    %d\n",p[i].pname,p[i].arrive_t,p[i].service_t,p[i].priority);
	}
 }
 void original_RR_P()//输出时间片轮转调度算法各进程的初始状态
{
	printf("进程的初始状态\n");
	printf("------------------------------------------------------------------\n");
	printf("进程名\t\t到达时间\t服务时间\n");
	int i;
	for(i=0;i<n;i++)
	{
		printf("%c\t\t    %d\t\t    %d\n",p[i].pname,p[i].arrive_t,p[i].service_t);
	}
 }
//HPF非抢占式优先级调度算法
//比较后面的优先级
bool cmp1(PCB a,PCB b)//先按到达时间排序,再按优先级排序
{
     if(a.arrive_t==b.arrive_t)
     {
         return a.priority>b.priority;//数越大,优先级越高
     }
     else
     {
         return a.arrive_t<b.arrive_t;
     }
}
bool cmp2(PCB a,PCB b)//按优先级排序
{
    return a.priority>b.priority;
}

void HPF_work()
{
    sort(p,p+n,cmp1);//先按到达时间排序,再按优先级排序
    p[0].finish_t=p[0].arrive_t+p[0].service_t;//第一个进程的完成时间=到达时间+服务时间
    int cnt=1;//判断完成时间内到达的进程个数,设第一个进程已经到达
    for(int i=1;i<n;i++)//看每一个进程
    {
        if(cnt<n)
        {
             for(int j=i;j<n;j++)//看后面来的进程
            {
                if(p[j].arrive_t<=p[i-1].finish_t)//比较到达时间和上一个进程的完成时间
                {
                    cnt++;//如果已经达到就标记
                }
                else
                    break;
            }
            if(cnt>i)//需要排序时
                sort(p+i,p+cnt,cmp2);//按优先级排序
        }
        p[i].finish_t=max(p[i-1].finish_t,p[i].arrive_t)+p[i].service_t;//完成时间

    }
}

bool cmp3(PCB a,PCB b)//按到达时间排序
{
    return a.arrive_t<b.arrive_t;//按到达时间从小到达排序
}
//时间片轮转法,新来的进程应该放在就绪队列的末尾
void RR_work()
{
    int q=2;//设时间片=2
    //先按到达时间排序
    sort(p,p+n,cmp3);//把这些进程编号为0-9
    queue<int> ready_q;//就绪队列
    ready_q.push(0);//先把第一个来的放到就绪队列
    //如果到达了,就放在就绪队列中,弹出队首元素
    int temp;
    int now_time=p[0].arrive_t;//从第一个进程到达时间开始算
    int cnt=1;//第一个进程已经处理了,接下来从p[1]开始看。
    int i;
    printf("进程的执行顺序:\n");
    while(1)
    {
        if(!ready_q.empty())//如果不空,队列中有元素,就占用处理机,进入运行状态
        {
            temp=ready_q.front();//取队头元素
            printf("%c ",p[temp].pname);
            ready_q.pop();//弹出队首元素
            p[temp].run_t=p[temp].run_t+q;//运行时间
            now_time=now_time+q;
             //设有10个进程,下标是从0-9,按顺序排好序的,所以是按顺序到达的
            while(cnt<n&&p[cnt].arrive_t<=now_time)
            {
                ready_q.push(cnt);//放入队尾
                p[cnt].state='m';//进入就绪队列
                cnt++;//等待下一个进程的到达
            }
            if(p[temp].run_t<p[temp].service_t)//如果这个进程还没有运行完成,就放到队列尾部
            {

                p[temp].remaining_t=p[temp].service_t-p[temp].run_t;//剩余时间=需要的服务时间-已经运行的时间

                ready_q.push(temp);//当前的这个再次入队,放在队尾
                p[temp].state='m';//状态为就绪态
            }
            else
            {
                now_time=now_time-(p[temp].run_t-p[temp].service_t);
                p[temp].state='f';//已经执行完了
                p[temp].finish_t=now_time;
            }
        }
        for( i=0;i<n;i++)
        {
            if(p[i].state=='m'||p[i].state=='w')//如果还有进程是等待或者就绪态,就继续进行时间片轮转
                break;
        }
        if(i==n)//如果都执行完了
            break;
    }
    printf("\n");
}
bool cmp4(PCB a,PCB b)
{
    return a.pname<b.pname;//按进程名从小到达排序
}
void Print()
{
    int i;
    if(op=='h'||op=='H')
    {
        printf("进程执行顺序为:\n");
        for(i=0;i<n;i++)
        {
            printf("%c ",p[i].pname);
        }
        printf("\n");
    }
    sort(p,p+n,cmp4);
	printf("--------------------------------------------------------------------------------------------------\n");
	printf("进程名\t\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
	int sum_t1=0;//代表总的周转时间
	double sum_t2=0;//代表总的带权周转时间
	for(i=0;i<n;i++)
	{
	    p[i].turnaround_t=p[i].finish_t-p[i].arrive_t;//周转时间=完成时间-到达时间
        p[i].w_turnaround_t=(double)p[i].turnaround_t/p[i].service_t;//带权周转时间=周转时间/服务时间
		sum_t1=sum_t1 + p[i].turnaround_t;
		sum_t2=sum_t2 + p[i].w_turnaround_t;
		printf("%c\t\t    %d\t\t    %d\t\t   %d\t\t   %d\t\t  %0.2f\n",p[i].pname,p[i].arrive_t,
		       p[i].service_t,p[i].finish_t,p[i].turnaround_t,p[i].w_turnaround_t);

	}
	printf("平均周转时间:%0.2f\n",(double)sum_t1/n);
	printf("平均带权周转时间:%0.2f\n",(double)sum_t2/n);

}

int main()
{
    printf("请输入要使用的调度算法(<h/H:HPF> <r/R:RR>):");
    scanf("%c",&op);
    getchar();
    init();

    if(op=='h'|| op=='H')
    {
        original_HPF_P();
        HPF_work();
        Print();
    }
    if(op=='r'||op=='R')
    {
        original_RR_P();
        RR_work();
        Print();
    }
    return 0;
}

详细实验分析和实验报告下载:
https://download.csdn.net/download/QinHebtu/45045191

  • 4
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为您提供四种进程调度算法模拟实现的C语言代码,包括先来先服务(FCFS)、短作业优先(SJF)、优先级调度和时间片轮转调度。 1. 先来先服务(FCFS)算法: ```c #include <stdio.h> #include <stdlib.h> struct pcb { int pid; // 进程ID int burst_time; // 进程执行时间 int arrival_time; // 进程到达时间 int waiting_time; // 进程等待时间 int turnaround_time; // 进程周转时间 }; void fcfs(struct pcb *processes, int n) { int current_time = 0; int total_waiting_time = 0; int total_turnaround_time = 0; printf("进程ID\t到达时间\t执行时间\t等待时间\t周转时间\n"); for (int i = 0; i < n; i++) { struct pcb process = processes[i]; process.waiting_time = current_time - process.arrival_time; current_time += process.burst_time; process.turnaround_time = current_time - process.arrival_time; total_waiting_time += process.waiting_time; total_turnaround_time += process.turnaround_time; printf("%d\t%d\t\t%d\t\t%d\t\t%d\n", process.pid, process.arrival_time, process.burst_time, process.waiting_time, process.turnaround_time); } printf("平均等待时间:%f\n", (float)total_waiting_time / n); printf("平均周转时间:%f\n", (float)total_turnaround_time / n); } int main() { struct pcb processes[] = { {1, 5, 0, 0, 0}, {2, 3, 1, 0, 0}, {3, 2, 2, 0, 0}, {4, 1, 4, 0, 0}, {5, 4, 5, 0, 0} }; int n = sizeof(processes) / sizeof(processes[0]); fcfs(processes, n); return 0; } ``` 2. 短作业优先(SJF)算法: ```c #include <stdio.h> #include <stdlib.h> struct pcb { int pid; // 进程ID int burst_time; // 进程执行时间 int arrival_time; // 进程到达时间 int waiting_time; // 进程等待时间 int turnaround_time; // 进程周转时间 }; void sjf(struct pcb *processes, int n) { int current_time = 0; int total_waiting_time = 0; int total_turnaround_time = 0; int completed = 0; int *burst_times = (int *)malloc(sizeof(int) * n); for (int i = 0; i < n; i++) { burst_times[i] = processes[i].burst_time; } printf("进程ID\t到达时间\t执行时间\t等待时间\t周转时间\n"); while (completed != n) { int shortest_job = -1; int shortest_burst_time = 999; for (int i = 0; i < n; i++) { if (processes[i].arrival_time <= current_time && burst_times[i] < shortest_burst_time && burst_times[i] > 0) { shortest_job = i; shortest_burst_time = burst_times[i]; } } if (shortest_job == -1) { current_time++; } else { struct pcb process = processes[shortest_job]; process.waiting_time = current_time - process.arrival_time; current_time += process.burst_time; process.turnaround_time = current_time - process.arrival_time; total_waiting_time += process.waiting_time; total_turnaround_time += process.turnaround_time; processes[shortest_job] = process; burst_times[shortest_job] = 0; completed++; printf("%d\t%d\t\t%d\t\t%d\t\t%d\n", process.pid, process.arrival_time, process.burst_time, process.waiting_time, process.turnaround_time); } } printf("平均等待时间:%f\n", (float)total_waiting_time / n); printf("平均周转时间:%f\n", (float)total_turnaround_time / n); } int main() { struct pcb processes[] = { {1, 5, 0, 0, 0}, {2, 3, 1, 0, 0}, {3, 2, 2, 0, 0}, {4, 1, 4, 0, 0}, {5, 4, 5, 0, 0} }; int n = sizeof(processes) / sizeof(processes[0]); sjf(processes, n); return 0; } ``` 3. 优先级调度算法: ```c #include <stdio.h> #include <stdlib.h> struct pcb { int pid; // 进程ID int burst_time; // 进程执行时间 int arrival_time; // 进程到达时间 int priority; // 进程优先级 int waiting_time; // 进程等待时间 int turnaround_time; // 进程周转时间 }; void priority(struct pcb *processes, int n) { int current_time = 0; int total_waiting_time = 0; int total_turnaround_time = 0; int completed = 0; printf("进程ID\t到达时间\t执行时间\t优先级\t等待时间\t周转时间\n"); while (completed != n) { int highest_priority_job = -1; int highest_priority = -1; for (int i = 0; i < n; i++) { if (processes[i].arrival_time <= current_time && processes[i].priority > highest_priority && processes[i].burst_time > 0) { highest_priority_job = i; highest_priority = processes[i].priority; } } if (highest_priority_job == -1) { current_time++; } else { struct pcb process = processes[highest_priority_job]; process.waiting_time = current_time - process.arrival_time; current_time += process.burst_time; process.turnaround_time = current_time - process.arrival_time; total_waiting_time += process.waiting_time; total_turnaround_time += process.turnaround_time; processes[highest_priority_job] = process; completed++; printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", process.pid, process.arrival_time, process.burst_time, process.priority, process.waiting_time, process.turnaround_time); } } printf("平均等待时间:%f\n", (float)total_waiting_time / n); printf("平均周转时间:%f\n", (float)total_turnaround_time / n); } int main() { struct pcb processes[] = { {1, 5, 0, 3, 0, 0}, {2, 3, 1, 2, 0, 0}, {3, 2, 2, 4, 0, 0}, {4, 1, 4, 1, 0, 0}, {5, 4, 5, 5, 0, 0} }; int n = sizeof(processes) / sizeof(processes[0]); priority(processes, n); return 0; } ``` 4. 时间片轮转调度算法: ```c #include <stdio.h> #include <stdlib.h> struct pcb { int pid; // 进程ID int burst_time; // 进程执行时间 int arrival_time; // 进程到达时间 int remaining_time; // 进程剩余执行时间 int waiting_time; // 进程等待时间 int turnaround_time; // 进程周转时间 }; void round_robin(struct pcb *processes, int n, int quantum) { int current_time = 0; int total_waiting_time = 0; int total_turnaround_time = 0; int completed = 0; printf("进程ID\t到达时间\t执行时间\t等待时间\t周转时间\n"); while (completed != n) { for (int i = 0; i < n; i++) { if (processes[i].arrival_time <= current_time && processes[i].remaining_time > 0) { if (processes[i].remaining_time <= quantum) { current_time += processes[i].remaining_time; processes[i].remaining_time = 0; processes[i].waiting_time = current_time - processes[i].arrival_time - processes[i].burst_time; processes[i].turnaround_time = current_time - processes[i].arrival_time; total_waiting_time += processes[i].waiting_time; total_turnaround_time += processes[i].turnaround_time; completed++; printf("%d\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].pid, processes[i].arrival_time, processes[i].burst_time, processes[i].waiting_time, processes[i].turnaround_time); } else { current_time += quantum; processes[i].remaining_time -= quantum; } } } } printf("平均等待时间:%f\n", (float)total_waiting_time / n); printf("平均周转时间:%f\n", (float)total_turnaround_time / n); } int main() { struct pcb processes[] = { {1, 10, 0, 10, 0, 0}, {2, 5, 1, 5, 0, 0}, {3, 8, 2, 8, 0, 0}, {4, 7, 3, 7, 0, 0}, {5, 6, 4, 6, 0, 0} }; int n = sizeof(processes) / sizeof(processes[0]); int quantum = 2; round_robin(processes, n, quantum); return 0; } ``` 以上是四种进程调度算法模拟实现的C语言代码,您可以根据需要进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HHHᕙ(`▿´)ᕗ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值