孤问尘
孤问尘
Published on 2025-01-13 / 1 Visits
0
0

资源分配

将有限的资源分配给任务,当任务完成时将释放资源

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

#define MAX_RESOURCES 5
#define MAX_PROCESSES 100
#define TIME_QUANTUM 1

typedef struct {
    int printers;
    int scanners;
    int tapes;
    int disks;
    int memory;
} Resource;

typedef struct {
    char id;
    int priority;
    int arrival_time;
    int service_time;
    int remaining_time;
    int resources[MAX_RESOURCES];
} Process;

void read_input(const char *filename, Resource *system_resources, Process processes[], int *num_processes) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("Error opening file: %s\n", filename);
        exit(1);
    }

    // Read system resources
    fscanf(file, "%d,%d,%d,%d,%d", &system_resources->printers, &system_resources->scanners, 
                                    &system_resources->tapes, &system_resources->disks, 
                                    &system_resources->memory);

    // Read processes
    *num_processes = 0;
    char id = 'A';
    while (fscanf(file, "%d,%d,%d,%d,%d,%d,%d,%d", &processes[*num_processes].priority, 
                                                   &processes[*num_processes].arrival_time, 
                                                   &processes[*num_processes].service_time, 
                                                   &processes[*num_processes].resources[0], 
                                                   &processes[*num_processes].resources[1], 
                                                   &processes[*num_processes].resources[2], 
                                                   &processes[*num_processes].resources[3], 
                                                   &processes[*num_processes].resources[4]) == 8) {
        processes[*num_processes].id = id++;
        processes[*num_processes].remaining_time = processes[*num_processes].service_time;
        (*num_processes)++;
    }

    fclose(file);
}

void simulate_process_scheduling(Resource *system_resources, Process processes[], int num_processes) {
    int time = 0;
    int remaining_processes = num_processes;
    bool *completed = (bool *)malloc(num_processes * sizeof(bool));
    for (int i = 0; i < num_processes; i++) {
        completed[i] = false;
    }

    while (remaining_processes > 0) {
        for (int i = 0; i < num_processes; i++) {
            if (!completed[i] && processes[i].arrival_time <= time) {
                int available_resources[MAX_RESOURCES];
                for (int j = 0; j < MAX_RESOURCES; j++) {
                    available_resources[j] = system_resources->printers - processes[i].resources[j];
                }

                bool can_run = true;
                for (int j = 0; j < MAX_RESOURCES; j++) {
                    if (available_resources[j] < 0) {
                        can_run = false;
                        break;
                    }
                }

                if (can_run) {
                    printf("[%d,%d) %c %c\n", time, time + 1, i, processes[i].id);
                    processes[i].remaining_time--;
                    if (processes[i].remaining_time == 0) {
                        completed[i] = true;
                        remaining_processes--;
                    }
                }
            }
        }

        time++;
    }

    free(completed);
}

int main() {
    Resource system_resources;
    Process processes[MAX_PROCESSES];
    int num_processes;

    read_input("input.txt", &system_resources, processes, &num_processes);

    simulate_process_scheduling(&system_resources, processes, num_processes);

    return 0;
}


Comment