#include <stdio.h>
#define N 5
typedef struct {
char name[3];
float arrival;
float service;
float start;
float finish;
float turnaround;
float waiting;
int done;
} Process;
int main() {
Process p[N] = {
{"P1", 0.0, 3.0},
{"P2", 2.0, 6.0},
{"P3", 4.0, 4.0},
{"P4", 6.0, 5.0},
{"P5", 8.0, 2.0}
};
int completed = 0;
float sumTAT = 0.0, sumWait = 0.0, totalService = 0.0;
int i, shortest;
printf("\n===== SIMULATION SJF (non préemptif, float) =====\n");
while (completed < N) {
shortest = -1;
float minService = 9999.0;
// Find shortest job available at 'time'
for (i = 0; i < N; i++) {
if (!p
[i
].
done && p
[i
].
arrival <= time && p
[i
].
service < minService
) { minService = p[i].service;
shortest = i;
}
}
// If no process has arrived yet
if (shortest == -1) {
time += 0.5; // move time forward slightly continue;
}
// Execute selected process
p
[shortest
].
start = time; p[shortest].finish = p[shortest].start + p[shortest].service;
p[shortest].turnaround = p[shortest].finish - p[shortest].arrival;
p[shortest].waiting = p[shortest].turnaround - p[shortest].service;
p[shortest].done = 1;
time = p
[shortest
].
finish; completed++;
sumTAT += p[shortest].turnaround;
sumWait += p[shortest].waiting;
totalService += p[shortest].service;
}
float avgTAT = sumTAT / N;
float avgWait = sumWait / N;
float throughput
= (float)N
/ time; float cpuUtil
= (totalService
/ time) * 100.0;
printf("\n%-8s%-10s%-10s%-10s%-10s%-10s%-10s\n", "Process", "Arrive", "Service", "Start", "Finish", "Tr", "Tw");
printf("---------------------------------------------------------------\n");
for (i = 0; i < N; i++) {
printf("%-8s%-10.1f%-10.1f%-10.1f%-10.1f%-10.1f%-10.1f\n", p[i].name, p[i].arrival, p[i].service,
p[i].start, p[i].finish, p[i].turnaround, p[i].waiting);
}
printf("\n--- Résultats globaux ---\n"); printf("Temps moyen de rotation : %.2f\n", avgTAT
); printf("Temps moyen d'attente : %.2f\n", avgWait
); printf("Débit du système : %.2f processus/unité de temps\n", throughput
); printf("Utilisation du CPU : %.2f %%\n", cpuUtil
);
// ===== Diagramme de Gantt =====
printf("\n--- Diagramme de Gantt ---\n\n");
// First line: bars
for (i = 0; i < N; i++) {
int blocks = (int)(p[i].service * 2); // each unit = 0.5
for (int j = 0; j < blocks; j++)
}
// Second line: process names
for (i = 0; i < N; i++) {
int blocks = (int)(p[i].service * 2);
for (int j = 0; j < blocks; j++)
}
// Third line: time scale
for (i = 0; i < N; i++) {
if (i == 0)
printf("%*.1f", (int)(p
[i
].
service * 2), p
[i
].
finish); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIE4gNQoKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBuYW1lWzNdOwogICAgZmxvYXQgYXJyaXZhbDsKICAgIGZsb2F0IHNlcnZpY2U7CiAgICBmbG9hdCBzdGFydDsKICAgIGZsb2F0IGZpbmlzaDsKICAgIGZsb2F0IHR1cm5hcm91bmQ7CiAgICBmbG9hdCB3YWl0aW5nOwogICAgaW50IGRvbmU7Cn0gUHJvY2VzczsKCmludCBtYWluKCkgewogICAgUHJvY2VzcyBwW05dID0gewogICAgICAgIHsiUDEiLCAwLjAsIDMuMH0sCiAgICAgICAgeyJQMiIsIDIuMCwgNi4wfSwKICAgICAgICB7IlAzIiwgNC4wLCA0LjB9LAogICAgICAgIHsiUDQiLCA2LjAsIDUuMH0sCiAgICAgICAgeyJQNSIsIDguMCwgMi4wfQogICAgfTsKCiAgICBpbnQgY29tcGxldGVkID0gMDsKICAgIGZsb2F0IHRpbWUgPSAwLjA7CiAgICBmbG9hdCBzdW1UQVQgPSAwLjAsIHN1bVdhaXQgPSAwLjAsIHRvdGFsU2VydmljZSA9IDAuMDsKICAgIGludCBpLCBzaG9ydGVzdDsKCiAgICBwcmludGYoIlxuPT09PT0gU0lNVUxBVElPTiBTSkYgKG5vbiBwcsOpZW1wdGlmLCBmbG9hdCkgPT09PT1cbiIpOwoKICAgIHdoaWxlIChjb21wbGV0ZWQgPCBOKSB7CiAgICAgICAgc2hvcnRlc3QgPSAtMTsKICAgICAgICBmbG9hdCBtaW5TZXJ2aWNlID0gOTk5OS4wOwoKICAgICAgICAvLyBGaW5kIHNob3J0ZXN0IGpvYiBhdmFpbGFibGUgYXQgJ3RpbWUnCiAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICBpZiAoIXBbaV0uZG9uZSAmJiBwW2ldLmFycml2YWwgPD0gdGltZSAmJiBwW2ldLnNlcnZpY2UgPCBtaW5TZXJ2aWNlKSB7CiAgICAgICAgICAgICAgICBtaW5TZXJ2aWNlID0gcFtpXS5zZXJ2aWNlOwogICAgICAgICAgICAgICAgc2hvcnRlc3QgPSBpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiBubyBwcm9jZXNzIGhhcyBhcnJpdmVkIHlldAogICAgICAgIGlmIChzaG9ydGVzdCA9PSAtMSkgewogICAgICAgICAgICB0aW1lICs9IDAuNTsgLy8gbW92ZSB0aW1lIGZvcndhcmQgc2xpZ2h0bHkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvLyBFeGVjdXRlIHNlbGVjdGVkIHByb2Nlc3MKICAgICAgICBwW3Nob3J0ZXN0XS5zdGFydCA9IHRpbWU7CiAgICAgICAgcFtzaG9ydGVzdF0uZmluaXNoID0gcFtzaG9ydGVzdF0uc3RhcnQgKyBwW3Nob3J0ZXN0XS5zZXJ2aWNlOwogICAgICAgIHBbc2hvcnRlc3RdLnR1cm5hcm91bmQgPSBwW3Nob3J0ZXN0XS5maW5pc2ggLSBwW3Nob3J0ZXN0XS5hcnJpdmFsOwogICAgICAgIHBbc2hvcnRlc3RdLndhaXRpbmcgPSBwW3Nob3J0ZXN0XS50dXJuYXJvdW5kIC0gcFtzaG9ydGVzdF0uc2VydmljZTsKICAgICAgICBwW3Nob3J0ZXN0XS5kb25lID0gMTsKCiAgICAgICAgdGltZSA9IHBbc2hvcnRlc3RdLmZpbmlzaDsKICAgICAgICBjb21wbGV0ZWQrKzsKCiAgICAgICAgc3VtVEFUICs9IHBbc2hvcnRlc3RdLnR1cm5hcm91bmQ7CiAgICAgICAgc3VtV2FpdCArPSBwW3Nob3J0ZXN0XS53YWl0aW5nOwogICAgICAgIHRvdGFsU2VydmljZSArPSBwW3Nob3J0ZXN0XS5zZXJ2aWNlOwogICAgfQoKICAgIGZsb2F0IGF2Z1RBVCA9IHN1bVRBVCAvIE47CiAgICBmbG9hdCBhdmdXYWl0ID0gc3VtV2FpdCAvIE47CiAgICBmbG9hdCB0aHJvdWdocHV0ID0gKGZsb2F0KU4gLyB0aW1lOwogICAgZmxvYXQgY3B1VXRpbCA9ICh0b3RhbFNlcnZpY2UgLyB0aW1lKSAqIDEwMC4wOwoKICAgIHByaW50ZigiXG4lLThzJS0xMHMlLTEwcyUtMTBzJS0xMHMlLTEwcyUtMTBzXG4iLCAKICAgICAgICAiUHJvY2VzcyIsICJBcnJpdmUiLCAiU2VydmljZSIsICJTdGFydCIsICJGaW5pc2giLCAiVHIiLCAiVHciKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlLThzJS0xMC4xZiUtMTAuMWYlLTEwLjFmJS0xMC4xZiUtMTAuMWYlLTEwLjFmXG4iLAogICAgICAgICAgICBwW2ldLm5hbWUsIHBbaV0uYXJyaXZhbCwgcFtpXS5zZXJ2aWNlLAogICAgICAgICAgICBwW2ldLnN0YXJ0LCBwW2ldLmZpbmlzaCwgcFtpXS50dXJuYXJvdW5kLCBwW2ldLndhaXRpbmcpOwogICAgfQoKICAgIHByaW50ZigiXG4tLS0gUsOpc3VsdGF0cyBnbG9iYXV4IC0tLVxuIik7CiAgICBwcmludGYoIlRlbXBzIG1veWVuIGRlIHJvdGF0aW9uIDogJS4yZlxuIiwgYXZnVEFUKTsKICAgIHByaW50ZigiVGVtcHMgbW95ZW4gZCdhdHRlbnRlICAgOiAlLjJmXG4iLCBhdmdXYWl0KTsKICAgIHByaW50ZigiRMOpYml0IGR1IHN5c3TDqG1lICAgICAgICA6ICUuMmYgcHJvY2Vzc3VzL3VuaXTDqSBkZSB0ZW1wc1xuIiwgdGhyb3VnaHB1dCk7CiAgICBwcmludGYoIlV0aWxpc2F0aW9uIGR1IENQVSAgICAgIDogJS4yZiAlJVxuIiwgY3B1VXRpbCk7CgogICAgLy8gPT09PT0gRGlhZ3JhbW1lIGRlIEdhbnR0ID09PT09CiAgICBwcmludGYoIlxuLS0tIERpYWdyYW1tZSBkZSBHYW50dCAtLS1cblxuIik7CgogICAgLy8gRmlyc3QgbGluZTogYmFycwogICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIHByaW50ZigifCIpOwogICAgICAgIGludCBibG9ja3MgPSAoaW50KShwW2ldLnNlcnZpY2UgKiAyKTsgLy8gZWFjaCB1bml0ID0gMC41CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBibG9ja3M7IGorKykKICAgICAgICAgICAgcHJpbnRmKCLilogiKTsKICAgIH0KICAgIHByaW50ZigifFxuIik7CgogICAgLy8gU2Vjb25kIGxpbmU6IHByb2Nlc3MgbmFtZXMKICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBwcmludGYoIiUtM3MiLCBwW2ldLm5hbWUpOwogICAgICAgIGludCBibG9ja3MgPSAoaW50KShwW2ldLnNlcnZpY2UgKiAyKTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJsb2NrczsgaisrKQogICAgICAgICAgICBwcmludGYoIiAgIik7CiAgICB9CiAgICBwcmludGYoIlxuIik7CgogICAgLy8gVGhpcmQgbGluZTogdGltZSBzY2FsZQogICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIGlmIChpID09IDApCiAgICAgICAgICAgIHByaW50ZigiJS4xZiIsIHBbaV0uc3RhcnQpOwogICAgICAgIHByaW50ZigiJSouMWYiLCAoaW50KShwW2ldLnNlcnZpY2UgKiAyKSwgcFtpXS5maW5pc2gpOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwoKICAgIHJldHVybiAwOwp9Cg==