本代码演示了使用 C 语言实现最短作业优先 (SJF) 进程调度算法。代码中包含进程数、进入内存时间、作业长度、计算时间和 I/O 时间的设定,并提供了交互式界面。

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

#define MAX_PROCESS 10
#define MAX_RESOURCE 5

typedef struct {
    int pid; // 进程ID
    int arrivalTime; // 到达时间
    int burstTime; // 作业长度
    int remainingTime; // 剩余计算时间
    int ioTime; // I/O时间
    int waitingTime; // 等待时间
    int turnaroundTime; // 周转时间
    int completionTime; // 完成时间
    int status; // 进程状态:0-就绪,1-执行,2-阻塞
    int resources[MAX_RESOURCE]; // 进程所需的互斥资源数目
} Process;

int availableResources[MAX_RESOURCE]; // 可用的互斥资源数目

void calculateWaitingTime(Process *processes, int n) {
    int currentTime = 0;
    int completed = 0;

    // 循环直到所有进程完成
    while (completed < n) {
        int shortestJob = -1;
        int shortestBurstTime = INT_MAX;

        // 找到最短作业的进程
        for (int i = 0; i < n; i++) {
            if (processes[i].arrivalTime <= currentTime && processes[i].status == 0) {
                if (processes[i].burstTime < shortestBurstTime) {
                    shortestBurstTime = processes[i].burstTime;
                    shortestJob = i;
                }
            }
        }

        if (shortestJob == -1) {
            currentTime++; // 如果没有可执行的进程,则时间+1
            continue;
        }

        Process *process = &processes[shortestJob];
        process->status = 1; // 设置进程状态为执行
        process->waitingTime = currentTime - process->arrivalTime;
        process->completionTime = currentTime + process->burstTime;

        // 更新当前时间和进程状态
        currentTime += process->burstTime;
        process->status = 2; // 设置进程状态为阻塞

        completed++;
    }
}

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

void displayProcesses(Process *processes, int n) {
    printf("进程ID\t到达时间\t作业长度\t等待时间\t周转时间\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].pid, processes[i].arrivalTime,
               processes[i].burstTime, processes[i].waitingTime, processes[i].turnaroundTime);
    }
}

int main() {
    int n;
    Process processes[MAX_PROCESS];

    printf("请输入进程数:");
    scanf("%d", &n);

    printf("请输入进程信息:\n");
    for (int i = 0; i < n; i++) {
        printf("进程ID:");
        scanf("%d", &processes[i].pid);
        printf("到达时间:");
        scanf("%d", &processes[i].arrivalTime);
        printf("作业长度:");
        scanf("%d", &processes[i].burstTime);
        printf("I/O时间:");
        scanf("%d", &processes[i].ioTime);
        printf("所需的互斥资源数目:");
        for (int j = 0; j < MAX_RESOURCE; j++) {
            scanf("%d", &processes[i].resources[j]);
        }
        processes[i].remainingTime = processes[i].burstTime;
        processes[i].status = 0;
    }

    printf("请输入可用的互斥资源数目:");
    for (int i = 0; i < MAX_RESOURCE; i++) {
        scanf("%d", &availableResources[i]);
    }

    calculateWaitingTime(processes, n);
    calculateTurnaroundTime(processes, n);
    displayProcesses(processes, n);

    return 0;
}

在界面上设定参数:

是的,可以在界面上设定进程数、进入内存时间、作业长度、计算时间和 I/O 时间。代码中使用了 scanf 函数来从控制台接收输入。您可以将代码嵌入到一个交互式的界面中,在界面上提供输入字段,然后使用输入的值来初始化进程的相关属性。

例如,您可以使用一个图形用户界面库(例如 GTK+ 或 Qt)来创建一个窗口,其中包含以下输入字段:

  • 进程数
  • 每个进程的进入内存时间
  • 每个进程的作业长度
  • 每个进程的计算时间
  • 每个进程的 I/O 时间

然后,您可以将这些输入字段的值传递给代码中的 scanf 函数,以初始化进程的相关属性。

交互式界面示例:

您可以使用 C 语言的图形用户界面库来创建一个窗口,其中包含输入字段和一个按钮。当用户输入完所有参数后,点击按钮即可运行代码并显示结果。

代码示例:

// 使用 GTK+ 库创建一个窗口
// 在窗口中添加输入字段和按钮
// 将输入字段的值传递给代码中的 scanf 函数
// 当用户点击按钮时,运行代码并显示结果

总结:

通过使用交互式界面,您可以更方便地输入进程信息并观察结果。这将使代码更易于使用和理解。


原文地址: https://www.cveoy.top/t/topic/pGra 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录