083. 编写代码实现简单的操作系统调度算法

在操作系统中,调度算法用于决定哪个进程或线程应该获得CPU资源。常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)、轮转调度(RR)和优先级调度等。以下将分别实现这些简单的调度算法。

1. 先来先服务(FCFS)调度算法

先来先服务(FCFS)调度算法是最简单的调度算法,按照进程到达的顺序进行调度。

示例代码:FCFS调度算法

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int processID;
    int arrivalTime;
    int burstTime;
    int completionTime;
    int waitingTime;
    int turnaroundTime;
} Process;

void fcfsScheduling(Process processes[], int n) {
    int currentTime = 0;
    for (int i = 0; i < n; i++) {
        processes[i].completionTime = currentTime + processes[i].burstTime;
        processes[i].waitingTime = currentTime - processes[i].arrivalTime;
        processes[i].turnaroundTime = processes[i].completionTime - processes[i].arrivalTime;
        currentTime = processes[i].completionTime;
    }
}

void printProcesses(Process processes[], int n) {
    printf("PID\tArrival\tBurst\tCompletion\tWaiting\tTurnaround\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%d\t%d\t%d\t%d\t%d\n",
               processes[i].processID,
               processes[i].arrivalTime,
               processes[i].burstTime,
               processes[i].completionTime,
               processes[i].waitingTime,
               processes[i].turnaroundTime);
    }
}

int main() {
    Process processes[] = {
        {1, 0, 5},
        {2, 1, 3},
        {3, 2, 8},
        {4, 3, 6},
        {5, 4, 2}
    };
    int n = sizeof(processes) / sizeof(processes[0]);

    fcfsScheduling(processes, n);
    printProcesses(processes, n);

    return 0;
}

2. 最短作业优先(SJF)调度算法

最短作业优先(SJF)调度算法选择具有最短执行时间的进程进行调度。

示例代码:SJF调度算法

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int processID;
    int arrivalTime;
    int burstTime;
    int completionTime;
    int waitingTime;
    int turnaroundTime;
} Process;

int compare(const void* a, const void* b) {
    Process* p1 = (Process*)a;
    Process* p2 = (Process*)b;
    return p1->burstTime - p2->burstTime;
}

void sjfScheduling(Process processes[], int n) {
    qsort(processes, n, sizeof(Process), compare);

    int currentTime = 0;
    for (int i = 0; i < n; i++) {
        processes[i].completionTime = currentTime + processes[i].burstTime;
        processes[i].waitingTime = currentTime - processes[i].arrivalTime;
        processes[i].turnaroundTime = processes[i].completionTime - processes[i].arrivalTime;
        currentTime = processes[i].completionTime;
    }
}

void printProcesses(Process processes[], int n) {
    printf("PID\tArrival\tBurst\tCompletion\tWaiting\tTurnaround\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%d\t%d\t%d\t%d\t%d\n",
               processes[i].processID,
               processes[i].arrivalTime,
               processes[i].burstTime,
               processes[i].completionTime,
               processes[i].waitingTime,
               processes[i].turnaroundTime);
    }
}

int main() {
    Process processes[] = {
        {1, 0, 5},
        {2, 1, 3},
        {3, 2, 8},
        {4, 3, 6},
        {5, 4, 2}
    };
    int n = sizeof(processes) / sizeof(processes[0]);

    sjfScheduling(processes, n);
    printProcesses(processes, n);

    return 0;
}

3. 轮转调度(RR)算法

轮转调度(RR)算法是一种时间片轮转调度算法,每个进程轮流获得一定时间的CPU资源。

示例代码:RR调度算法

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int processID;
    int arrivalTime;
    int burstTime;
    int remainingTime;
    int completionTime;
    int waitingTime;
    int turnaroundTime;
} Process;

void rrScheduling(Process processes[], int n, int timeQuantum) {
    int currentTime = 0;
    int completed = 0;
    while (completed < n) {
        for (int i = 0; i < n; i++) {
            if (processes[i].arrivalTime <= currentTime && processes[i].remainingTime > 0) {
                if (processes[i].remainingTime <= timeQuantum) {
                    currentTime += processes[i].remainingTime;
                    processes[i].remainingTime = 0;
                    processes[i].completionTime = currentTime;
                    processes[i].waitingTime = currentTime - processes[i].arrivalTime - processes[i].burstTime;
                    processes[i].turnaroundTime = currentTime - processes[i].arrivalTime;
                    completed++;
                } else {
                    processes[i].remainingTime -= timeQuantum;
                    currentTime += timeQuantum;
                }
            }
        }
    }
}

void printProcesses(Process processes[], int n) {
    printf("PID\tArrival\tBurst\tCompletion\tWaiting\tTurnaround\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%d\t%d\t%d\t%d\t%d\n",
               processes[i].processID,
               processes[i].arrivalTime,
               processes[i].burstTime,
               processes[i].completionTime,
               processes[i].waitingTime,
               processes[i].turnaroundTime);
    }
}

int main() {
    Process processes[] = {
        {1, 0, 5, 5},
        {2, 1, 3, 3},
        {3, 2, 8, 8},
        {4, 3, 6, 6},
        {5, 4, 2, 2}
    };
    int n = sizeof(processes) / sizeof(processes[0]);
    int timeQuantum = 2;

    rrScheduling(processes, n, timeQuantum);
    printProcesses(processes, n);

    return 0;
}

4. 优先级调度算法

优先级调度算法根据进程的优先级进行调度,优先级高的进程先获得CPU资源。

示例代码:优先级调度算法

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int processID;
    int arrivalTime;
    int burstTime;
    int priority;
    int completionTime;
    int waitingTime;
    int turnaroundTime;
} Process;

int compare(const void* a, const void* b) {
    Process* p1 = (Process*)a;
    Process* p2 = (Process*)b;
    return p1->priority - p2->priority;
}

void priorityScheduling(Process processes[], int n) {
    qsort(processes, n, sizeof(Process), compare);

    int currentTime = 0;
    for (int i = 0; i < n; i++) {
        processes[i].completionTime = currentTime + processes[i].burstTime;
        processes[i].waitingTime = currentTime - processes[i].arrivalTime;
        processes[i].turnaroundTime = processes[i].completionTime - processes[i].arrivalTime;
        currentTime = processes[i].completionTime;
    }
}

void printProcesses(Process processes[], int n) {
    printf("PID\tArrival\tBurst\tPriority\tCompletion\tWaiting\tTurnaround\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
               processes[i].processID,
               processes[i].arrivalTime,
               processes[i].burstTime,
               processes[i].priority,
               processes[i].completionTime,
               processes[i].waitingTime,
               processes[i].turnaroundTime);
    }
}

int main() {
    Process processes[] = {
        {1, 0, 5, 2},
        {2, 1, 3, 1},
        {3, 2, 8, 3},
        {4, 3, 6, 2},
        {5, 4, 2, 1}
    };
    int n = sizeof(processes) / sizeof(processes[0]);

    priorityScheduling(processes, n);
    printProcesses(processes, n);

    return 0;
}

5. 总结

通过实现简单的操作系统调度算法,可以理解调度的基本原理和方法。这些算法虽然简单,但在某些场景中仍然有用。对于需要高效率和公平性的调度,可以进一步研究更复杂的调度算法,如多级反馈队列调度等。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)