/*
* 实验二:处理器调度模拟
* 编译:gcc -o scheduler scheduler.c
* 运行:./scheduler
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PROCESS 10
typedef struct {
int pid; // 进程ID
int arrival; // 到达时间
int burst; // 运行时间(CPU区间)
int remaining; // 剩余运行时间(RR用)
int completion; // 完成时间
int turnaround; // 周转时间
float w_turnaround;// 带权周转时间
} Process;
// 打印结果
void print_result(Process p[], int n, char *algo) {
printf("\n========== %s ==========\n", algo
); printf("PID\t到达\t运行\t完成\t周转\t带权周转\n"); float avg_tat = 0, avg_wtat = 0;
for (int i = 0; i < n; i++) {
printf("%d\t%d\t%d\t%d\t%d\t%.2f\n", p[i].pid, p[i].arrival, p[i].burst,
p[i].completion, p[i].turnaround, p[i].w_turnaround);
avg_tat += p[i].turnaround;
avg_wtat += p[i].w_turnaround;
}
avg_tat /= n;
avg_wtat /= n;
printf("平均周转时间:%.2f\n", avg_tat
); printf("平均带权周转时间:%.2f\n", avg_wtat
); }
// 先来先服务
void fcfs(Process p[], int n) {
Process q[MAX_PROCESS];
memcpy(q
, p
, sizeof(Process
) * n
); for (int i = 0; i < n; i++) {
if (time < q
[i
].
arrival) time = q
[i
].
arrival; q
[i
].
completion = time + q
[i
].
burst; q[i].turnaround = q[i].completion - q[i].arrival;
q[i].w_turnaround = (float)q[i].turnaround / q[i].burst;
}
print_result(q, n, "FCFS");
}
// 短作业优先(非抢占)
void sjf(Process p[], int n) {
Process q[MAX_PROCESS];
memcpy(q
, p
, sizeof(Process
) * n
); int completed
= 0, time = 0; int finish[MAX_PROCESS] = {0};
while (completed < n) {
int idx = -1;
int min_burst = 99999;
// 找已到达且未完成的最短作业
for (int i = 0; i < n; i++) {
if (!finish
[i
] && q
[i
].
arrival <= time && q
[i
].
burst < min_burst
) { min_burst = q[i].burst;
idx = i;
}
}
if (idx == -1) { // 没有进程到达,时间推进
continue;
}
q
[idx
].
completion = time; q[idx].turnaround = q[idx].completion - q[idx].arrival;
q[idx].w_turnaround = (float)q[idx].turnaround / q[idx].burst;
finish[idx] = 1;
completed++;
}
print_result(q, n, "SJF(非抢占)");
}
// 时间片轮转(RR),时间片=2
void rr(Process p[], int n, int quantum) {
Process q[MAX_PROCESS];
memcpy(q
, p
, sizeof(Process
) * n
); for (int i = 0; i < n; i++) q[i].remaining = q[i].burst;
int time = 0, completed
= 0; int queue[MAX_PROCESS * 10], head = 0, tail = 0;
int in_queue[MAX_PROCESS] = {0};
// 初始化:把到达时间<=0的进程加入队列
for (int i = 0; i < n; i++) {
if (q
[i
].
arrival <= time && !in_queue
[i
]) { queue[tail++] = i;
in_queue[i] = 1;
}
}
while (completed < n) {
if (head == tail) { // 队列空,时间推进
// 检查新到达进程
for (int i = 0; i < n; i++) {
if (q
[i
].
arrival <= time && !in_queue
[i
]) { queue[tail++] = i;
in_queue[i] = 1;
}
}
continue;
}
int idx = queue[head++];
int exec = (q[idx].remaining < quantum) ? q[idx].remaining : quantum;
q[idx].remaining -= exec;
// 执行期间检查新到达进程(模拟到达)
for (int i = 0; i < n; i++) {
if (q
[i
].
arrival <= time && !in_queue
[i
] && i
!= idx
) { queue[tail++] = i;
in_queue[i] = 1;
}
}
if (q[idx].remaining == 0) {
completed++;
q
[idx
].
completion = time; q[idx].turnaround = q[idx].completion - q[idx].arrival;
q[idx].w_turnaround = (float)q[idx].turnaround / q[idx].burst;
} else {
// 未完成,重新入队
queue[tail++] = idx;
}
}
print_result(q, n, "RR(时间片=2)");
}
int main() {
// 示例进程:PID, 到达时间, 运行时间
Process p[MAX_PROCESS] = {
{1, 0, 5},
{2, 1, 3},
{3, 2, 8},
{4, 3, 2},
{5, 4, 4}
};
int n = 5;
for (int i = 0; i < n; i++) {
printf("%d\t%d\t%d\n", p
[i
].
pid, p
[i
].
arrival, p
[i
].
burst); }
fcfs(p, n);
sjf(p, n);
rr(p, n, 2);
return 0;
}
LyoKICog5a6e6aqM5LqM77ya5aSE55CG5Zmo6LCD5bqm5qih5oufCiAqIOe8luivke+8mmdjYyAtbyBzY2hlZHVsZXIgc2NoZWR1bGVyLmMKICog6L+Q6KGM77yaLi9zY2hlZHVsZXIKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE1BWF9QUk9DRVNTIDEwCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgcGlkOyAgICAgICAgICAgLy8g6L+b56iLSUQKICAgIGludCBhcnJpdmFsOyAgICAgICAvLyDliLDovr7ml7bpl7QKICAgIGludCBidXJzdDsgICAgICAgICAvLyDov5DooYzml7bpl7TvvIhDUFXljLrpl7TvvIkKICAgIGludCByZW1haW5pbmc7ICAgICAvLyDliankvZnov5DooYzml7bpl7TvvIhSUueUqO+8iQogICAgaW50IGNvbXBsZXRpb247ICAgIC8vIOWujOaIkOaXtumXtAogICAgaW50IHR1cm5hcm91bmQ7ICAgIC8vIOWRqOi9rOaXtumXtAogICAgZmxvYXQgd190dXJuYXJvdW5kOy8vIOW4puadg+WRqOi9rOaXtumXtAp9IFByb2Nlc3M7CgovLyDmiZPljbDnu5PmnpwKdm9pZCBwcmludF9yZXN1bHQoUHJvY2VzcyBwW10sIGludCBuLCBjaGFyICphbGdvKSB7CiAgICBwcmludGYoIlxuPT09PT09PT09PSAlcyA9PT09PT09PT09XG4iLCBhbGdvKTsKICAgIHByaW50ZigiUElEXHTliLDovr5cdOi/kOihjFx05a6M5oiQXHTlkajovaxcdOW4puadg+WRqOi9rFxuIik7CiAgICBmbG9hdCBhdmdfdGF0ID0gMCwgYXZnX3d0YXQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBwcmludGYoIiVkXHQlZFx0JWRcdCVkXHQlZFx0JS4yZlxuIiwKICAgICAgICAgICAgICAgcFtpXS5waWQsIHBbaV0uYXJyaXZhbCwgcFtpXS5idXJzdCwKICAgICAgICAgICAgICAgcFtpXS5jb21wbGV0aW9uLCBwW2ldLnR1cm5hcm91bmQsIHBbaV0ud190dXJuYXJvdW5kKTsKICAgICAgICBhdmdfdGF0ICs9IHBbaV0udHVybmFyb3VuZDsKICAgICAgICBhdmdfd3RhdCArPSBwW2ldLndfdHVybmFyb3VuZDsKICAgIH0KICAgIGF2Z190YXQgLz0gbjsKICAgIGF2Z193dGF0IC89IG47CiAgICBwcmludGYoIuW5s+Wdh+WRqOi9rOaXtumXtO+8miUuMmZcbiIsIGF2Z190YXQpOwogICAgcHJpbnRmKCLlubPlnYfluKbmnYPlkajovazml7bpl7TvvJolLjJmXG4iLCBhdmdfd3RhdCk7Cn0KCi8vIOWFiOadpeWFiOacjeWKoQp2b2lkIGZjZnMoUHJvY2VzcyBwW10sIGludCBuKSB7CiAgICBQcm9jZXNzIHFbTUFYX1BST0NFU1NdOwogICAgbWVtY3B5KHEsIHAsIHNpemVvZihQcm9jZXNzKSAqIG4pOwogICAgaW50IHRpbWUgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAodGltZSA8IHFbaV0uYXJyaXZhbCkgdGltZSA9IHFbaV0uYXJyaXZhbDsKICAgICAgICBxW2ldLmNvbXBsZXRpb24gPSB0aW1lICsgcVtpXS5idXJzdDsKICAgICAgICB0aW1lID0gcVtpXS5jb21wbGV0aW9uOwogICAgICAgIHFbaV0udHVybmFyb3VuZCA9IHFbaV0uY29tcGxldGlvbiAtIHFbaV0uYXJyaXZhbDsKICAgICAgICBxW2ldLndfdHVybmFyb3VuZCA9IChmbG9hdClxW2ldLnR1cm5hcm91bmQgLyBxW2ldLmJ1cnN0OwogICAgfQogICAgcHJpbnRfcmVzdWx0KHEsIG4sICJGQ0ZTIik7Cn0KCi8vIOefreS9nOS4muS8mOWFiO+8iOmdnuaKouWNoO+8iQp2b2lkIHNqZihQcm9jZXNzIHBbXSwgaW50IG4pIHsKICAgIFByb2Nlc3MgcVtNQVhfUFJPQ0VTU107CiAgICBtZW1jcHkocSwgcCwgc2l6ZW9mKFByb2Nlc3MpICogbik7CiAgICBpbnQgY29tcGxldGVkID0gMCwgdGltZSA9IDA7CiAgICBpbnQgZmluaXNoW01BWF9QUk9DRVNTXSA9IHswfTsKICAgIHdoaWxlIChjb21wbGV0ZWQgPCBuKSB7CiAgICAgICAgaW50IGlkeCA9IC0xOwogICAgICAgIGludCBtaW5fYnVyc3QgPSA5OTk5OTsKICAgICAgICAvLyDmib7lt7LliLDovr7kuJTmnKrlrozmiJDnmoTmnIDnn63kvZzkuJoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBpZiAoIWZpbmlzaFtpXSAmJiBxW2ldLmFycml2YWwgPD0gdGltZSAmJiBxW2ldLmJ1cnN0IDwgbWluX2J1cnN0KSB7CiAgICAgICAgICAgICAgICBtaW5fYnVyc3QgPSBxW2ldLmJ1cnN0OwogICAgICAgICAgICAgICAgaWR4ID0gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaWR4ID09IC0xKSB7IC8vIOayoeaciei/m+eoi+WIsOi+vu+8jOaXtumXtOaOqOi/mwogICAgICAgICAgICB0aW1lKys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0aW1lICs9IHFbaWR4XS5idXJzdDsKICAgICAgICBxW2lkeF0uY29tcGxldGlvbiA9IHRpbWU7CiAgICAgICAgcVtpZHhdLnR1cm5hcm91bmQgPSBxW2lkeF0uY29tcGxldGlvbiAtIHFbaWR4XS5hcnJpdmFsOwogICAgICAgIHFbaWR4XS53X3R1cm5hcm91bmQgPSAoZmxvYXQpcVtpZHhdLnR1cm5hcm91bmQgLyBxW2lkeF0uYnVyc3Q7CiAgICAgICAgZmluaXNoW2lkeF0gPSAxOwogICAgICAgIGNvbXBsZXRlZCsrOwogICAgfQogICAgcHJpbnRfcmVzdWx0KHEsIG4sICJTSkbvvIjpnZ7miqLljaDvvIkiKTsKfQoKLy8g5pe26Ze054mH6L2u6L2s77yIUlLvvInvvIzml7bpl7TniYc9Mgp2b2lkIHJyKFByb2Nlc3MgcFtdLCBpbnQgbiwgaW50IHF1YW50dW0pIHsKICAgIFByb2Nlc3MgcVtNQVhfUFJPQ0VTU107CiAgICBtZW1jcHkocSwgcCwgc2l6ZW9mKFByb2Nlc3MpICogbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgcVtpXS5yZW1haW5pbmcgPSBxW2ldLmJ1cnN0OwoKICAgIGludCB0aW1lID0gMCwgY29tcGxldGVkID0gMDsKICAgIGludCBxdWV1ZVtNQVhfUFJPQ0VTUyAqIDEwXSwgaGVhZCA9IDAsIHRhaWwgPSAwOwogICAgaW50IGluX3F1ZXVlW01BWF9QUk9DRVNTXSA9IHswfTsKCiAgICAvLyDliJ3lp4vljJbvvJrmiorliLDovr7ml7bpl7Q8PTDnmoTov5vnqIvliqDlhaXpmJ/liJcKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKHFbaV0uYXJyaXZhbCA8PSB0aW1lICYmICFpbl9xdWV1ZVtpXSkgewogICAgICAgICAgICBxdWV1ZVt0YWlsKytdID0gaTsKICAgICAgICAgICAgaW5fcXVldWVbaV0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAoY29tcGxldGVkIDwgbikgewogICAgICAgIGlmIChoZWFkID09IHRhaWwpIHsgLy8g6Zif5YiX56m677yM5pe26Ze05o6o6L+bCiAgICAgICAgICAgIHRpbWUrKzsKICAgICAgICAgICAgLy8g5qOA5p+l5paw5Yiw6L6+6L+b56iLCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocVtpXS5hcnJpdmFsIDw9IHRpbWUgJiYgIWluX3F1ZXVlW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVbdGFpbCsrXSA9IGk7CiAgICAgICAgICAgICAgICAgICAgaW5fcXVldWVbaV0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpbnQgaWR4ID0gcXVldWVbaGVhZCsrXTsKICAgICAgICBpbnQgZXhlYyA9IChxW2lkeF0ucmVtYWluaW5nIDwgcXVhbnR1bSkgPyBxW2lkeF0ucmVtYWluaW5nIDogcXVhbnR1bTsKICAgICAgICB0aW1lICs9IGV4ZWM7CiAgICAgICAgcVtpZHhdLnJlbWFpbmluZyAtPSBleGVjOwoKICAgICAgICAvLyDmiafooYzmnJ/pl7Tmo4Dmn6XmlrDliLDovr7ov5vnqIvvvIjmqKHmi5/liLDovr7vvIkKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBpZiAocVtpXS5hcnJpdmFsIDw9IHRpbWUgJiYgIWluX3F1ZXVlW2ldICYmIGkgIT0gaWR4KSB7CiAgICAgICAgICAgICAgICBxdWV1ZVt0YWlsKytdID0gaTsKICAgICAgICAgICAgICAgIGluX3F1ZXVlW2ldID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHFbaWR4XS5yZW1haW5pbmcgPT0gMCkgewogICAgICAgICAgICBjb21wbGV0ZWQrKzsKICAgICAgICAgICAgcVtpZHhdLmNvbXBsZXRpb24gPSB0aW1lOwogICAgICAgICAgICBxW2lkeF0udHVybmFyb3VuZCA9IHFbaWR4XS5jb21wbGV0aW9uIC0gcVtpZHhdLmFycml2YWw7CiAgICAgICAgICAgIHFbaWR4XS53X3R1cm5hcm91bmQgPSAoZmxvYXQpcVtpZHhdLnR1cm5hcm91bmQgLyBxW2lkeF0uYnVyc3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8g5pyq5a6M5oiQ77yM6YeN5paw5YWl6ZifCiAgICAgICAgICAgIHF1ZXVlW3RhaWwrK10gPSBpZHg7CiAgICAgICAgfQogICAgfQogICAgcHJpbnRfcmVzdWx0KHEsIG4sICJSUu+8iOaXtumXtOeJhz0y77yJIik7Cn0KCmludCBtYWluKCkgewogICAgLy8g56S65L6L6L+b56iL77yaUElELCDliLDovr7ml7bpl7QsIOi/kOihjOaXtumXtAogICAgUHJvY2VzcyBwW01BWF9QUk9DRVNTXSA9IHsKICAgICAgICB7MSwgMCwgNX0sCiAgICAgICAgezIsIDEsIDN9LAogICAgICAgIHszLCAyLCA4fSwKICAgICAgICB7NCwgMywgMn0sCiAgICAgICAgezUsIDQsIDR9CiAgICB9OwogICAgaW50IG4gPSA1OwoKICAgIHByaW50Zigi6L+b56iL5YiX6KGo77yaXG4iKTsKICAgIHByaW50ZigiUElEXHTliLDovr5cdOi/kOihjFxuIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHByaW50ZigiJWRcdCVkXHQlZFxuIiwgcFtpXS5waWQsIHBbaV0uYXJyaXZhbCwgcFtpXS5idXJzdCk7CiAgICB9CgogICAgZmNmcyhwLCBuKTsKICAgIHNqZihwLCBuKTsKICAgIHJyKHAsIG4sIDIpOwoKICAgIHJldHVybiAwOwp9