fcfs调度算法代码c语言

以下是一个简单的FCFS调度算法的C语言代码示例:

#include <stdio.h>

struct Process {
    int pid; // 进程ID
    int arrival_time; // 到达时间
    int burst_time; // 执行时间
    int waiting_time; // 等待时间
    int turnaround_time; // 周转时间
};

void calculateWaitingTime(struct Process processes[], int n) {
    int total_waiting_time = 0;
    int i;

    // 第一个进程的等待时间为0
    processes[0].waiting_time = 0;

    // 计算每个进程的等待时间
    for (i = 1; i < n; i++) {
        processes[i].waiting_time = processes[i - 1].waiting_time + processes[i - 1].burst_time;
        total_waiting_time += processes[i].waiting_time;
    }
}

void calculateTurnaroundTime(struct Process processes[], int n) {
    int i;

    // 计算每个进程的周转时间
    for (i = 0; i < n; i++) {
        processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
    }
}

void calculateAverageTime(struct Process processes[], int n) {
    int total_waiting_time = 0;
    int total_turnaround_time = 0;
    int i;

    // 计算等待时间和周转时间
    calculateWaitingTime(processes, n);
    calculateTurnaroundTime(processes, n);

    // 计算总等待时间和总周转时间
    for (i = 0; i < n; i++) {
        total_waiting_time += processes[i].waiting_time;
        total_turnaround_time += processes[i].turnaround_time;
    }

    // 计算平均等待时间和平均周转时间
    float average_waiting_time = (float)total_waiting_time / n;
    float average_turnaround_time = (float)total_turnaround_time / n;

    // 输出结果
    printf("Average Waiting Time: %.2f\n", average_waiting_time);
    printf("Average Turnaround Time: %.2f\n", average_turnaround_time);
}

void displayProcessDetails(struct Process processes[], int n) {
    int i;

    // 输出每个进程的详细信息
    printf("Process\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\n");

    for (i = 0; i < n; i++) {
        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);
    }
}

int main() {
    int n, i;

    printf("Enter the number of processes: ");
    scanf("%d", &n);

    struct Process processes[n];

    // 输入每个进程的到达时间和执行时间
    for (i = 0; i < n; i++) {
        printf("Enter arrival time and burst time for process %d: ", i + 1);
        scanf("%d %d", &processes[i].arrival_time, &processes[i].burst_time);
        processes[i].pid = i + 1;
    }

    // 按到达时间对进程进行排序
    for (i = 0; i < n - 1; i++) {
        int j;
        for (j = 0; j < n - i - 1; j++) {
            if (processes[j].arrival_time > processes[j + 1].arrival_time) {
                struct Process temp = processes[j];
                processes[j] = processes[j + 1];
                processes[j + 1] = temp;
            }
        }
    }

    // 计算平均等待时间和平均周转时间
    calculateAverageTime(processes, n);

    // 输出每个进程的详细信息
    displayProcessDetails(processes, n);

    return 0;
}

这个代码示例首先要求用户输入进程的数量,然后依次输入每个进程的到达时间和执行时间。接下来,它按照到达时间对进程进行排序,并计算平均等待时间和平均周转时间。最后,它输出每个进程的详细信息,包括到达时间、执行时间、等待时间和周转时间。

FCFS(First-Come, First-Served)调度算法是一种简单的调度算法,按照进程到达的顺序进行调度,即先到达的进程先执行。下面是一个使用FCFS调度算法的C语言代码示例:

#include <stdio.h>

struct Process {
    int pid; // 进程ID
    int arrival_time; // 到达时间
    int burst_time; // 执行时间
    int waiting_time; // 等待时间
    int turnaround_time; // 周转时间
};

void calculateWaitingTime(struct Process processes[], int n) {
    int total_waiting_time = 0;
    int i;

    // 第一个进程的等待时间为0
    processes[0].waiting_time = 0;

    // 计算每个进程的等待时间
    for (i = 1; i < n; i++) {
        processes[i].waiting_time = processes[i - 1].waiting_time + processes[i - 1].burst_time;
        total_waiting_time += processes[i].waiting_time;
    }
}

void calculateTurnaroundTime(struct Process processes[], int n) {
    int i;

    // 计算每个进程的周转时间
    for (i = 0; i < n; i++) {
        processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
    }
}

void calculateAverageTime(struct Process processes[], int n) {
    int total_waiting_time = 0;
    int total_turnaround_time = 0;
    int i;

    // 计算等待时间和周转时间
    calculateWaitingTime(processes, n);
    calculateTurnaroundTime(processes, n);

    // 计算总等待时间和总周转时间
    for (i = 0; i < n; i++) {
        total_waiting_time += processes[i].waiting_time;
        total_turnaround_time += processes[i].turnaround_time;
    }

    // 计算平均等待时间和平均周转时间
    float average_waiting_time = (float)total_waiting_time / n;
    float average_turnaround_time = (float)total_turnaround_time / n;

    // 输出结果
    printf("Average Waiting Time: %.2f\n", average_waiting_time);
    printf("Average Turnaround Time: %.2f\n", average_turnaround_time);
}

void displayProcessDetails(struct Process processes[], int n) {
    int i;

    // 输出每个进程的详细信息
    printf("Process\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\n");

    for (i = 0; i < n; i++) {
        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);
    }
}

int main() {
    int n, i;

    printf("Enter the number of processes: ");
    scanf("%d", &n);

    struct Process processes[n];

    // 输入每个进程的到达时间和执行时间
    for (i = 0; i < n; i++) {
        printf("Enter arrival time and burst time for process %d: ", i + 1);
        scanf("%d %d", &processes[i].arrival_time, &processes[i].burst_time);
        processes[i].pid = i + 1;
    }

    // 按到达时间对进程进行排序
    for (i = 0; i < n - 1; i++) {
        int j;
        for (j = 0; j < n - i - 1; j++) {
            if (processes[j].arrival_time > processes[j + 1].arrival_time) {
                struct Process temp = processes[j];
                processes[j] = processes[j + 1];
                processes[j + 1] = temp;
            }
        }
    }

    // 计算平均等待时间和平均周转时间
    calculateAverageTime(processes, n);

    // 输出每个进程的详细信息
    displayProcessDetails(processes, n);

    return 0;
}

这个代码示例首先要求用户输入进程的数量,然后依次输入每个进程的到达时间和执行时间。接下来,它按照到达时间对进程进行排序,并计算平均等待时间和平均周转时间。最后,它输出每个进程的详细信息,包括到达时间、执行时间、等待时间和周转时间。

在这个示例中,我们使用了一个结构体Process来表示每个进程,其中包含进程的ID、到达时间、执行时间、等待时间和周转时间。calculateWaitingTime函数用于计算每个进程的等待时间,calculateTurnaroundTime函数用于计算每个进程的周转时间,calculateAverageTime函数用于计算平均等待时间和平均周转时间,displayProcessDetails函数用于输出每个进程的详细信息。

main函数中,我们首先获取用户输入的进程数量,并创建一个包含相应数量的Process结构体数组。然后,我们依次输入每个进程的到达时间和执行时间,并为每个进程分配一个唯一的ID。接下来,我们按照到达时间对进程进行排序,以确保先到达的进程先执行。最后,我们调用calculateAverageTime函数计算平均等待时间和平均周转时间,并调用displayProcessDetails函数输出每个进程的详细信息。

请注意,这只是一个简单的示例,可能不适用于所有情况。在实际应用中,可能需要考虑更多的因素,如优先级、时间片轮转等。