#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5 // 进程数量
// 进程状态
char *state_str[] = {"就绪", "运行", "完成"};
// 进程控制块 PCB
struct PCB {
char name[20]; // 进程名
int prio; // 优先级(动态)
int needtime; // 需要运行时间
int runtime; // 已运行时间
char state[10]; // 状态
} pcb[N];
// 初始化进程信息
void input() {
printf("请输入%d个进程的信息(进程名 优先级 需要时间):\n", N
); for (int i = 0; i < N; i++) {
scanf("%s %d %d", pcb
[i
].
name, &pcb
[i
].
prio, &pcb
[i
].
needtime); pcb[i].runtime = 0;
}
}
// 按优先级降序排序(冒泡排序)
void sort_prio() {
struct PCB temp;
for (int i = 0; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
// 优先级高的排在前面
if (pcb[i].prio < pcb[j].prio) {
temp = pcb[i];
pcb[i] = pcb[j];
pcb[j] = temp;
}
}
}
}
// 显示进程信息
void show() {
printf("\n进程名\t优先级\t需要时间\t已运行时间\t状态\n"); for (int i = 0; i < N; i++) {
printf("%s\t%d\t%d\t\t%d\t\t%s\n", pcb[i].name,
pcb[i].prio,
pcb[i].needtime,
pcb[i].runtime,
pcb[i].state);
}
}
// 调度算法
void schedule() {
int count = N; // 剩余未完成的进程数
printf("\n========== 开始进程调度 ==========\n");
while (count > 0) {
// 每次调度前按优先级排序
sort_prio();
// 找到第一个未完成的进程(优先级最高)
int idx = -1;
for (int i = 0; i < N; i++) {
if (strcmp(pcb
[i
].
state, "完成") != 0) { idx = i;
break;
}
}
if (idx == -1) break; // 所有进程都已完成
// 将该进程设为运行态
printf("\n>>> 当前调度进程: %s (优先级: %d, 还需时间: %d)\n", pcb[idx].name, pcb[idx].prio, pcb[idx].needtime - pcb[idx].runtime);
show();
// 运行一个时间片
pcb[idx].runtime++;
// 动态优先级调整:运行一次后优先级减1
pcb[idx].prio--;
// 检查是否完成
if (pcb[idx].runtime >= pcb[idx].needtime) {
printf(">>> 进程 %s 已完成!\n", pcb
[idx
].
name); count--;
} else {
}
}
printf("\n========== 所有进程调度完成 ==========\n"); show();
}
int main() {
printf("===== 最高优先数优先调度算法 =====\n"); printf("(动态优先级:每运行一次优先级减1)\n\n");
input();
show();
schedule();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBOIDUgIC8vIOi/m+eoi+aVsOmHjwoKLy8g6L+b56iL54q25oCBCmNoYXIgKnN0YXRlX3N0cltdID0geyLlsLHnu6oiLCAi6L+Q6KGMIiwgIuWujOaIkCJ9OwoKLy8g6L+b56iL5o6n5Yi25Z2XIFBDQgpzdHJ1Y3QgUENCIHsKICAgIGNoYXIgbmFtZVsyMF07ICAgICAgLy8g6L+b56iL5ZCNCiAgICBpbnQgcHJpbzsgICAgICAgICAgIC8vIOS8mOWFiOe6p++8iOWKqOaAge+8iQogICAgaW50IG5lZWR0aW1lOyAgICAgICAvLyDpnIDopoHov5DooYzml7bpl7QKICAgIGludCBydW50aW1lOyAgICAgICAgLy8g5bey6L+Q6KGM5pe26Ze0CiAgICBjaGFyIHN0YXRlWzEwXTsgICAgIC8vIOeKtuaAgQp9IHBjYltOXTsKCi8vIOWIneWni+WMlui/m+eoi+S/oeaBrwp2b2lkIGlucHV0KCkgewogICAgcHJpbnRmKCLor7fovpPlhaUlZOS4qui/m+eoi+eahOS/oeaBr++8iOi/m+eoi+WQjSDkvJjlhYjnuqcg6ZyA6KaB5pe26Ze077yJ77yaXG4iLCBOKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCLov5vnqIslZDogIiwgaSArIDEpOwogICAgICAgIHNjYW5mKCIlcyAlZCAlZCIsIHBjYltpXS5uYW1lLCAmcGNiW2ldLnByaW8sICZwY2JbaV0ubmVlZHRpbWUpOwogICAgICAgIHBjYltpXS5ydW50aW1lID0gMDsKICAgICAgICBzdHJjcHkocGNiW2ldLnN0YXRlLCAi5bCx57uqIik7CiAgICB9Cn0KCi8vIOaMieS8mOWFiOe6p+mZjeW6j+aOkuW6j++8iOWGkuazoeaOkuW6j++8iQp2b2lkIHNvcnRfcHJpbygpIHsKICAgIHN0cnVjdCBQQ0IgdGVtcDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTiAtIDE7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IE47IGorKykgewogICAgICAgICAgICAvLyDkvJjlhYjnuqfpq5jnmoTmjpLlnKjliY3pnaIKICAgICAgICAgICAgaWYgKHBjYltpXS5wcmlvIDwgcGNiW2pdLnByaW8pIHsKICAgICAgICAgICAgICAgIHRlbXAgPSBwY2JbaV07CiAgICAgICAgICAgICAgICBwY2JbaV0gPSBwY2Jbal07CiAgICAgICAgICAgICAgICBwY2Jbal0gPSB0ZW1wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDmmL7npLrov5vnqIvkv6Hmga8Kdm9pZCBzaG93KCkgewogICAgcHJpbnRmKCJcbui/m+eoi+WQjVx05LyY5YWI57qnXHTpnIDopoHml7bpl7RcdOW3sui/kOihjOaXtumXtFx054q25oCBXG4iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlc1x0JWRcdCVkXHRcdCVkXHRcdCVzXG4iLAogICAgICAgICAgICAgICBwY2JbaV0ubmFtZSwKICAgICAgICAgICAgICAgcGNiW2ldLnByaW8sCiAgICAgICAgICAgICAgIHBjYltpXS5uZWVkdGltZSwKICAgICAgICAgICAgICAgcGNiW2ldLnJ1bnRpbWUsCiAgICAgICAgICAgICAgIHBjYltpXS5zdGF0ZSk7CiAgICB9Cn0KCi8vIOiwg+W6pueul+azlQp2b2lkIHNjaGVkdWxlKCkgewogICAgaW50IGNvdW50ID0gTjsgIC8vIOWJqeS9meacquWujOaIkOeahOi/m+eoi+aVsAogICAgCiAgICBwcmludGYoIlxuPT09PT09PT09PSDlvIDlp4vov5vnqIvosIPluqYgPT09PT09PT09PVxuIik7CiAgICAKICAgIHdoaWxlIChjb3VudCA+IDApIHsKICAgICAgICAvLyDmr4/mrKHosIPluqbliY3mjInkvJjlhYjnuqfmjpLluo8KICAgICAgICBzb3J0X3ByaW8oKTsKICAgICAgICAKICAgICAgICAvLyDmib7liLDnrKzkuIDkuKrmnKrlrozmiJDnmoTov5vnqIvvvIjkvJjlhYjnuqfmnIDpq5jvvIkKICAgICAgICBpbnQgaWR4ID0gLTE7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgaWYgKHN0cmNtcChwY2JbaV0uc3RhdGUsICLlrozmiJAiKSAhPSAwKSB7CiAgICAgICAgICAgICAgICBpZHggPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGlkeCA9PSAtMSkgYnJlYWs7ICAvLyDmiYDmnInov5vnqIvpg73lt7LlrozmiJAKICAgICAgICAKICAgICAgICAvLyDlsIbor6Xov5vnqIvorr7kuLrov5DooYzmgIEKICAgICAgICBzdHJjcHkocGNiW2lkeF0uc3RhdGUsICLov5DooYwiKTsKICAgICAgICAKICAgICAgICBwcmludGYoIlxuPj4+IOW9k+WJjeiwg+W6pui/m+eoizogJXMgKOS8mOWFiOe6pzogJWQsIOi/mOmcgOaXtumXtDogJWQpXG4iLCAKICAgICAgICAgICAgICAgcGNiW2lkeF0ubmFtZSwgcGNiW2lkeF0ucHJpbywgcGNiW2lkeF0ubmVlZHRpbWUgLSBwY2JbaWR4XS5ydW50aW1lKTsKICAgICAgICAKICAgICAgICBzaG93KCk7CiAgICAgICAgCiAgICAgICAgLy8g6L+Q6KGM5LiA5Liq5pe26Ze054mHCiAgICAgICAgcGNiW2lkeF0ucnVudGltZSsrOwogICAgICAgIAogICAgICAgIC8vIOWKqOaAgeS8mOWFiOe6p+iwg+aVtO+8mui/kOihjOS4gOasoeWQjuS8mOWFiOe6p+WHjzEKICAgICAgICBwY2JbaWR4XS5wcmlvLS07CiAgICAgICAgCiAgICAgICAgLy8g5qOA5p+l5piv5ZCm5a6M5oiQCiAgICAgICAgaWYgKHBjYltpZHhdLnJ1bnRpbWUgPj0gcGNiW2lkeF0ubmVlZHRpbWUpIHsKICAgICAgICAgICAgc3RyY3B5KHBjYltpZHhdLnN0YXRlLCAi5a6M5oiQIik7CiAgICAgICAgICAgIHByaW50ZigiPj4+IOi/m+eoiyAlcyDlt7LlrozmiJDvvIFcbiIsIHBjYltpZHhdLm5hbWUpOwogICAgICAgICAgICBjb3VudC0tOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmNweShwY2JbaWR4XS5zdGF0ZSwgIuWwsee7qiIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcHJpbnRmKCJcbj09PT09PT09PT0g5omA5pyJ6L+b56iL6LCD5bqm5a6M5oiQID09PT09PT09PT1cbiIpOwogICAgc2hvdygpOwp9CgppbnQgbWFpbigpIHsKICAgIHByaW50ZigiPT09PT0g5pyA6auY5LyY5YWI5pWw5LyY5YWI6LCD5bqm566X5rOVID09PT09XG4iKTsKICAgIHByaW50Zigi77yI5Yqo5oCB5LyY5YWI57qn77ya5q+P6L+Q6KGM5LiA5qyh5LyY5YWI57qn5YePMe+8iVxuXG4iKTsKICAgIAogICAgaW5wdXQoKTsKICAgIAogICAgcHJpbnRmKCJcbuWIneWni+i/m+eoi+eKtuaAge+8miIpOwogICAgc2hvdygpOwogICAgCiAgICBzY2hlZHVsZSgpOwogICAgCiAgICByZXR1cm4gMDsKfQ==
PT09PT0g5pyA6auY5LyY5YWI5pWw5LyY5YWI6LCD5bqm566X5rOVID09PT09Cu+8iOWKqOaAgeS8mOWFiOe6p++8muavj+i/kOihjOS4gOasoeS8mOWFiOe6p+WHjzHvvIkKCuivt+i+k+WFpTXkuKrov5vnqIvnmoTkv6Hmga/vvIjov5vnqIvlkI0g5LyY5YWI57qnIOmcgOimgeaXtumXtO+8ie+8mgrov5vnqIsxOiBhYSAyIDQK6L+b56iLMjogYmIgMSAzCui/m+eoizM6IGNjIDUgMgrov5vnqIs0OiBkZCAzIDUK6L+b56iLNTogZWUgNCAxCgrliJ3lp4vov5vnqIvnirbmgIHvvJoK6L+b56iL5ZCNICDkvJjlhYjnuqcgIOmcgOimgeaXtumXtCAg5bey6L+Q6KGM5pe26Ze0ICDnirbmgIEKY2MgICAgICA1ICAgICAgIDIgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAg5bCx57uqCmVlICAgICAgNCAgICAgICAxICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIOWwsee7qgpkZCAgICAgIDMgICAgICAgNSAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICDlsLHnu6oKYWEgICAgICAyICAgICAgIDQgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAg5bCx57uqCmJiICAgICAgMSAgICAgICAzICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIOWwsee7qgoKPT09PT09PT09PSDlvIDlp4vov5vnqIvosIPluqYgPT09PT09PT09PQoKJmd0OyZndDsmZ3Q7IOW9k+WJjeiwg+W6pui/m+eoizogY2MgKOS8mOWFiOe6pzogNSwg6L+Y6ZyA5pe26Ze0OiAyKQouLi4=
===== 最高优先数优先调度算法 =====
(动态优先级:每运行一次优先级减1)
请输入5个进程的信息(进程名 优先级 需要时间):
进程1: aa 2 4
进程2: bb 1 3
进程3: cc 5 2
进程4: dd 3 5
进程5: ee 4 1
初始进程状态:
进程名 优先级 需要时间 已运行时间 状态
cc 5 2 0 就绪
ee 4 1 0 就绪
dd 3 5 0 就绪
aa 2 4 0 就绪
bb 1 3 0 就绪
========== 开始进程调度 ==========
>>> 当前调度进程: cc (优先级: 5, 还需时间: 2)
...