将有限的资源分配给任务,当任务完成时将释放资源
#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;
}