📜  操作系统外观和C语言调度(1)

📅  最后修改于: 2023-12-03 15:39:53.089000             🧑  作者: Mango

操作系统外观和C语言调度

操作系统是计算机系统中最重要的一部分之一,而操作系统的外观则直接关系到用户的使用体验。外观设计好的操作系统不仅能提高用户的使用效率,而且还能在一定程度上减少用户的心理负担。因此,在开发操作系统的过程中,外观设计至关重要。

除了外观设计,操作系统还需要实现合理的调度算法,以确保各个进程能够有序地运行。C语言是操作系统编程的主要语言之一,掌握C语言调度算法也是操作系统编程必备的技能。

操作系统外观

一个好的操作系统外观设计应该具备以下特点:

界面简洁

虽然操作系统中有许多复杂的功能,但是一个好的操作系统应该在界面设计上力求简洁。尽可能隐藏无关的信息,通过标签和图标等直观方式展示必要信息,使用户一目了然。

操作直观

用户在使用操作系统时不应该因为操作不当而浪费时间。因此,操作系统的设计必须尽可能地让用户做出正确的决策。例如,在删除文件时需要弹出警示窗口,以避免用户误删重要文件。

风格统一

操作系统的各种元素应该保持风格统一,这样可以提高用户使用的效率。风格统一不仅体现在界面颜色、字体、图标等方面,还包括操作方式的一致性。

C语言调度

操作系统中的调度算法是确保各个进程按照一定顺序运行的重要手段。常见的调度算法包括:

先来先服务(FCFS)

FCFS算法是按照到达时间的先后顺序,依次执行各个进程。在这种算法下,后来的进程需要等待前面的进程运行完毕后才能运行,可能会导致进程运行时间过长,不利于系统响应速度。

最短作业优先(SJF)

SJF算法的核心思想是尽量让运行时间最短的进程优先执行。在这种算法下,系统可以快速响应用户的请求,但是如果一个进程执行时间过长,可能会影响其他进程的运行,从而影响系统的性能。

轮转调度(RR)

RR算法将CPU分为许多时间片,并依次为每个进程分配一段时间片进行运行。在一个时间片结束后,如果该进程没有完成,则重新加入等待队列,并依次为下一个进程分配时间片。这种算法可以避免进程长时间占用CPU,但是过长或过短的时间片都会影响系统的性能。

以上仅是常见的几种调度算法,实际开发中可能需要结合实际情况选择合适的算法。

// 以下示例代码为最短作业优先(SJF)算法的实现

#include <stdio.h>

struct Process {
    int id; // 进程id
    int arriveTime; // 到达时间
    int burstTime; // 执行时间
};

void SJF(struct Process processList[], int n) {
    int waitingTime = 0;
    int turnaroundTime = 0;
    int completionTime[n];
    completionTime[0] = processList[0].arriveTime + processList[0].burstTime;
    
    for (int i = 1; i < n; ++i) {
        int shortestIndex = i; // 寻找还未完成的进程中剩余时间最短的
        for (int j = i + 1; j < n; ++j) {
            if (processList[j].burstTime < processList[shortestIndex].burstTime) {
                shortestIndex = j;
            }
        }
        
        // 将找到的最短剩余时间的进程移动到最前面
        struct Process temp = processList[i];
        processList[i] = processList[shortestIndex];
        processList[shortestIndex] = temp;
        
        completionTime[i] = completionTime[i-1] + processList[i].burstTime;
    }
    
    printf("process id\t arrival time\t burst time\t waiting time\t turnaround time\n");
    for (int i = 0; i < n; ++i) {
        waitingTime += completionTime[i] - processList[i].arriveTime - processList[i].burstTime;
        turnaroundTime += completionTime[i] - processList[i].arriveTime;
        printf("%d\t\t %d\t\t %d\t\t %d\t\t %d\n", processList[i].id, processList[i].arriveTime,
               processList[i].burstTime, completionTime[i] - processList[i].arriveTime - processList[i].burstTime,
               completionTime[i] - processList[i].arriveTime);
    }
    
    double averageWaitingTime = (double)waitingTime / n;
    double averageTurnaroundTime = (double)turnaroundTime / n;
    printf("\nAverage Waiting Time: %f\n", averageWaitingTime);
    printf("Average Turnaround Time: %f\n", averageTurnaroundTime);
}

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