#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PROCESS 10 // 最大进程数
// 进程控制块 PCB
typedef struct PCB {
char name[20]; // 进程名
int priority; // 优先数(数值越大优先级越高)
int need_time; // 需要运行时间
int run_time; // 已运行时间
char state; // 进程状态:'R'就绪, 'r'运行, 'F'完成
struct PCB *next; // 指向下一个进程的指针
} PCB;
PCB *ready = NULL; // 就绪队列头指针
PCB *running = NULL; // 当前运行进程
// 函数声明
void init_process(); // 初始化进程
void insert_ready(PCB *p); // 按优先级插入就绪队列
PCB *get_highest_priority(); // 获取优先级最高的进程
void print_queue(); // 打印就绪队列
void schedule(); // 调度函数
void run_process(); // 运行进程
void destroy_process(PCB *p); // 撤销进程
// 初始化进程信息(可手动输入或预置)
void init_process() {
int n, i;
PCB *p;
printf("===== 进程调度模拟程序(最高优先数优先)=====\n\n"); printf("请输入进程数量(最多%d个): ", MAX_PROCESS
);
if (n <= 0 || n > MAX_PROCESS) {
return;
}
for (i = 0; i < n; i++) {
p
= (PCB
*)malloc(sizeof(PCB
)); if (p == NULL) {
return;
}
printf("\n--- 输入第%d个进程信息 ---\n", i
+ 1); scanf("%d", &p
->priority
); scanf("%d", &p
->need_time
);
p->run_time = 0;
p->state = 'R'; // 初始状态为就绪
p->next = NULL;
insert_ready(p); // 插入就绪队列
}
}
// 按优先级从高到低插入就绪队列(优先级相同则按先来先服务)
void insert_ready(PCB *p) {
PCB *curr, *prev;
if (ready == NULL) {
// 队列为空
ready = p;
p->next = NULL;
return;
}
// 找到插入位置(优先级降序)
prev = NULL;
curr = ready;
while (curr != NULL && curr->priority >= p->priority) {
prev = curr;
curr = curr->next;
}
if (prev == NULL) {
// 插入队首
p->next = ready;
ready = p;
} else {
// 插入中间或队尾
p->next = curr;
prev->next = p;
}
}
// 取出就绪队列中优先级最高的进程
PCB *get_highest_priority() {
PCB *p;
if (ready == NULL) return NULL;
p = ready;
ready = ready->next;
p->next = NULL;
return p;
}
// 打印当前就绪队列状态
void print_queue() {
PCB *p = ready;
if (p == NULL) {
return;
}
while (p != NULL) {
printf("[%s|优先数:%d|需时:%d|已运行:%d|状态:%c] -> ", p->name, p->priority, p->need_time, p->run_time, p->state);
p = p->next;
}
}
// 打印当前运行进程
void print_running() {
if (running != NULL) {
printf(" [%s|优先数:%d|需时:%d|已运行:%d|状态:%c]\n", running->name, running->priority, running->need_time, running->run_time, running->state);
}
}
// 调度函数:选择优先级最高的进程投入运行
void schedule() {
if (running != NULL) return; // 已有运行进程
running = get_highest_priority();
if (running != NULL) {
running->state = 'r'; // 置为运行态
}
}
// 运行当前进程一个时间片
void run_process() {
if (running == NULL) {
return;
}
printf("\n========================================\n"); printf(">>> 正在运行进程: %s\n", running
->name
); printf(">>> 运行前: 优先数=%d, 已运行=%d, 需运行=%d\n", running->priority, running->run_time, running->need_time);
running->run_time++; // 已运行时间加1
running->priority--; // 动态优先数:运行一次后优先级降低1
printf(">>> 运行后: 优先数=%d, 已运行=%d\n", running
->priority
, running
->run_time
);
// 检查进程是否完成
if (running->run_time >= running->need_time) {
running->state = 'F'; // 置为完成态
printf(">>> 进程 %s 运行完毕!\n", running
->name
); destroy_process(running);
running = NULL;
} else {
// 未完成,重新放回就绪队列
running->state = 'R';
printf(">>> 进程 %s 时间片用完,重新进入就绪队列\n", running
->name
); insert_ready(running);
running = NULL;
}
}
// 撤销进程(释放内存)
void destroy_process(PCB *p) {
if (p != NULL) {
printf(">>> 撤销进程 %s,释放资源\n", p
->name
); }
}
// 主函数
int main() {
int choice;
int step = 1;
init_process(); // 初始化进程
if (ready == NULL) {
return 0;
}
printf("\n========================================"); printf("\n进程初始化完成,开始调度...\n"); print_queue();
// 调度循环
while (ready != NULL || running != NULL) {
printf("\n========================================"); printf("\n【第 %d 轮调度】\n", step
++);
schedule(); // 调度
print_running(); // 显示运行进程
run_process(); // 运行进程
print_queue(); // 显示就绪队列
printf("\n按回车键继续下一轮调度(输入0退出)..."); if (choice == '0') {
break;
}
// 清除缓冲区
}
printf("\n========================================\n");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBNQVhfUFJPQ0VTUyAxMCAgLy8g5pyA5aSn6L+b56iL5pWwCgovLyDov5vnqIvmjqfliLblnZcgUENCCnR5cGVkZWYgc3RydWN0IFBDQiB7CiAgICBjaGFyIG5hbWVbMjBdOyAgICAgIC8vIOi/m+eoi+WQjQogICAgaW50IHByaW9yaXR5OyAgICAgICAvLyDkvJjlhYjmlbDvvIjmlbDlgLzotorlpKfkvJjlhYjnuqfotorpq5jvvIkKICAgIGludCBuZWVkX3RpbWU7ICAgICAgLy8g6ZyA6KaB6L+Q6KGM5pe26Ze0CiAgICBpbnQgcnVuX3RpbWU7ICAgICAgIC8vIOW3sui/kOihjOaXtumXtAogICAgY2hhciBzdGF0ZTsgICAgICAgICAvLyDov5vnqIvnirbmgIHvvJonUiflsLHnu6osICdyJ+i/kOihjCwgJ0Yn5a6M5oiQCiAgICBzdHJ1Y3QgUENCICpuZXh0OyAgIC8vIOaMh+WQkeS4i+S4gOS4qui/m+eoi+eahOaMh+mSiAp9IFBDQjsKClBDQiAqcmVhZHkgPSBOVUxMOyAgICAgIC8vIOWwsee7qumYn+WIl+WktOaMh+mSiApQQ0IgKnJ1bm5pbmcgPSBOVUxMOyAgICAvLyDlvZPliY3ov5DooYzov5vnqIsKCi8vIOWHveaVsOWjsOaYjgp2b2lkIGluaXRfcHJvY2VzcygpOyAgICAgICAgICAgLy8g5Yid5aeL5YyW6L+b56iLCnZvaWQgaW5zZXJ0X3JlYWR5KFBDQiAqcCk7ICAgICAvLyDmjInkvJjlhYjnuqfmj5LlhaXlsLHnu6rpmJ/liJcKUENCICpnZXRfaGlnaGVzdF9wcmlvcml0eSgpOyAgIC8vIOiOt+WPluS8mOWFiOe6p+acgOmrmOeahOi/m+eoiwp2b2lkIHByaW50X3F1ZXVlKCk7ICAgICAgICAgICAgLy8g5omT5Y2w5bCx57uq6Zif5YiXCnZvaWQgc2NoZWR1bGUoKTsgICAgICAgICAgICAgICAvLyDosIPluqblh73mlbAKdm9pZCBydW5fcHJvY2VzcygpOyAgICAgICAgICAgIC8vIOi/kOihjOi/m+eoiwp2b2lkIGRlc3Ryb3lfcHJvY2VzcyhQQ0IgKnApOyAgLy8g5pKk6ZSA6L+b56iLCgovLyDliJ3lp4vljJbov5vnqIvkv6Hmga/vvIjlj6/miYvliqjovpPlhaXmiJbpooTnva7vvIkKdm9pZCBpbml0X3Byb2Nlc3MoKSB7CiAgICBpbnQgbiwgaTsKICAgIFBDQiAqcDsKICAgIHByaW50ZigiPT09PT0g6L+b56iL6LCD5bqm5qih5ouf56iL5bqP77yI5pyA6auY5LyY5YWI5pWw5LyY5YWI77yJPT09PT1cblxuIik7CiAgICBwcmludGYoIuivt+i+k+WFpei/m+eoi+aVsOmHjyjmnIDlpJolZOS4qik6ICIsIE1BWF9QUk9DRVNTKTsKICAgIHNjYW5mKCIlZCIsICZuKTsKICAgIAogICAgaWYgKG4gPD0gMCB8fCBuID4gTUFYX1BST0NFU1MpIHsKICAgICAgICBwcmludGYoIui/m+eoi+aVsOmHj+S4jeWQiOazle+8gVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgcCA9IChQQ0IgKiltYWxsb2Moc2l6ZW9mKFBDQikpOwogICAgICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgICAgcHJpbnRmKCLlhoXlrZjliIbphY3lpLHotKXvvIFcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHByaW50ZigiXG4tLS0g6L6T5YWl56ysJWTkuKrov5vnqIvkv6Hmga8gLS0tXG4iLCBpICsgMSk7CiAgICAgICAgcHJpbnRmKCLov5vnqIvlkI06ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIHAtPm5hbWUpOwogICAgICAgIHByaW50Zigi5LyY5YWI5pWwKOaVsOWAvOi2iuWkp+S8mOWFiOe6p+i2iumrmCk6ICIpOwogICAgICAgIHNjYW5mKCIlZCIsICZwLT5wcmlvcml0eSk7CiAgICAgICAgcHJpbnRmKCLpnIDopoHov5DooYzml7bpl7Q6ICIpOwogICAgICAgIHNjYW5mKCIlZCIsICZwLT5uZWVkX3RpbWUpOwogICAgICAgIAogICAgICAgIHAtPnJ1bl90aW1lID0gMDsKICAgICAgICBwLT5zdGF0ZSA9ICdSJzsgIC8vIOWIneWni+eKtuaAgeS4uuWwsee7qgogICAgICAgIHAtPm5leHQgPSBOVUxMOwogICAgICAgIAogICAgICAgIGluc2VydF9yZWFkeShwKTsgIC8vIOaPkuWFpeWwsee7qumYn+WIlwogICAgfQp9CgovLyDmjInkvJjlhYjnuqfku47pq5jliLDkvY7mj5LlhaXlsLHnu6rpmJ/liJfvvIjkvJjlhYjnuqfnm7jlkIzliJnmjInlhYjmnaXlhYjmnI3liqHvvIkKdm9pZCBpbnNlcnRfcmVhZHkoUENCICpwKSB7CiAgICBQQ0IgKmN1cnIsICpwcmV2OwogICAgCiAgICBpZiAocmVhZHkgPT0gTlVMTCkgewogICAgICAgIC8vIOmYn+WIl+S4uuepugogICAgICAgIHJlYWR5ID0gcDsKICAgICAgICBwLT5uZXh0ID0gTlVMTDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIC8vIOaJvuWIsOaPkuWFpeS9jee9ru+8iOS8mOWFiOe6p+mZjeW6j++8iQogICAgcHJldiA9IE5VTEw7CiAgICBjdXJyID0gcmVhZHk7CiAgICB3aGlsZSAoY3VyciAhPSBOVUxMICYmIGN1cnItPnByaW9yaXR5ID49IHAtPnByaW9yaXR5KSB7CiAgICAgICAgcHJldiA9IGN1cnI7CiAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICB9CiAgICAKICAgIGlmIChwcmV2ID09IE5VTEwpIHsKICAgICAgICAvLyDmj5LlhaXpmJ/pppYKICAgICAgICBwLT5uZXh0ID0gcmVhZHk7CiAgICAgICAgcmVhZHkgPSBwOwogICAgfSBlbHNlIHsKICAgICAgICAvLyDmj5LlhaXkuK3pl7TmiJbpmJ/lsL4KICAgICAgICBwLT5uZXh0ID0gY3VycjsKICAgICAgICBwcmV2LT5uZXh0ID0gcDsKICAgIH0KfQoKLy8g5Y+W5Ye65bCx57uq6Zif5YiX5Lit5LyY5YWI57qn5pyA6auY55qE6L+b56iLClBDQiAqZ2V0X2hpZ2hlc3RfcHJpb3JpdHkoKSB7CiAgICBQQ0IgKnA7CiAgICBpZiAocmVhZHkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAgICAKICAgIHAgPSByZWFkeTsKICAgIHJlYWR5ID0gcmVhZHktPm5leHQ7CiAgICBwLT5uZXh0ID0gTlVMTDsKICAgIHJldHVybiBwOwp9CgovLyDmiZPljbDlvZPliY3lsLHnu6rpmJ/liJfnirbmgIEKdm9pZCBwcmludF9xdWV1ZSgpIHsKICAgIFBDQiAqcCA9IHJlYWR5OwogICAgcHJpbnRmKCJcbuOAkOW9k+WJjeWwsee7qumYn+WIl+eKtuaAgeOAkVxuIik7CiAgICBpZiAocCA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCIgIOWwsee7qumYn+WIl+S4uuepulxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBwcmludGYoIiAg6Zif6aaWIC0+ICIpOwogICAgd2hpbGUgKHAgIT0gTlVMTCkgewogICAgICAgIHByaW50ZigiWyVzfOS8mOWFiOaVsDolZHzpnIDml7Y6JWR85bey6L+Q6KGMOiVkfOeKtuaAgTolY10gLT4gIiwgCiAgICAgICAgICAgICAgIHAtPm5hbWUsIHAtPnByaW9yaXR5LCBwLT5uZWVkX3RpbWUsIHAtPnJ1bl90aW1lLCBwLT5zdGF0ZSk7CiAgICAgICAgcCA9IHAtPm5leHQ7CiAgICB9CiAgICBwcmludGYoIumYn+WwvlxuIik7Cn0KCi8vIOaJk+WNsOW9k+WJjei/kOihjOi/m+eoiwp2b2lkIHByaW50X3J1bm5pbmcoKSB7CiAgICBpZiAocnVubmluZyAhPSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJcbuOAkOW9k+WJjei/kOihjOi/m+eoi+OAkVxuIik7CiAgICAgICAgcHJpbnRmKCIgIFslc3zkvJjlhYjmlbA6JWR86ZyA5pe2OiVkfOW3sui/kOihjDolZHznirbmgIE6JWNdXG4iLCAKICAgICAgICAgICAgICAgcnVubmluZy0+bmFtZSwgcnVubmluZy0+cHJpb3JpdHksIHJ1bm5pbmctPm5lZWRfdGltZSwgcnVubmluZy0+cnVuX3RpbWUsIHJ1bm5pbmctPnN0YXRlKTsKICAgIH0KfQoKLy8g6LCD5bqm5Ye95pWw77ya6YCJ5oup5LyY5YWI57qn5pyA6auY55qE6L+b56iL5oqV5YWl6L+Q6KGMCnZvaWQgc2NoZWR1bGUoKSB7CiAgICBpZiAocnVubmluZyAhPSBOVUxMKSByZXR1cm47ICAvLyDlt7LmnInov5DooYzov5vnqIsKICAgIAogICAgcnVubmluZyA9IGdldF9oaWdoZXN0X3ByaW9yaXR5KCk7CiAgICBpZiAocnVubmluZyAhPSBOVUxMKSB7CiAgICAgICAgcnVubmluZy0+c3RhdGUgPSAncic7ICAvLyDnva7kuLrov5DooYzmgIEKICAgIH0KfQoKLy8g6L+Q6KGM5b2T5YmN6L+b56iL5LiA5Liq5pe26Ze054mHCnZvaWQgcnVuX3Byb2Nlc3MoKSB7CiAgICBpZiAocnVubmluZyA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCLlvZPliY3msqHmnInov5DooYzov5vnqIvvvIFcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgcHJpbnRmKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgcHJpbnRmKCI+Pj4g5q2j5Zyo6L+Q6KGM6L+b56iLOiAlc1xuIiwgcnVubmluZy0+bmFtZSk7CiAgICBwcmludGYoIj4+PiDov5DooYzliY06IOS8mOWFiOaVsD0lZCwg5bey6L+Q6KGMPSVkLCDpnIDov5DooYw9JWRcbiIsIAogICAgICAgICAgIHJ1bm5pbmctPnByaW9yaXR5LCBydW5uaW5nLT5ydW5fdGltZSwgcnVubmluZy0+bmVlZF90aW1lKTsKICAgIAogICAgcnVubmluZy0+cnVuX3RpbWUrKzsgICAgICAvLyDlt7Lov5DooYzml7bpl7TliqAxCiAgICBydW5uaW5nLT5wcmlvcml0eS0tOyAgICAgIC8vIOWKqOaAgeS8mOWFiOaVsO+8mui/kOihjOS4gOasoeWQjuS8mOWFiOe6p+mZjeS9jjEKICAgIAogICAgcHJpbnRmKCI+Pj4g6L+Q6KGM5ZCOOiDkvJjlhYjmlbA9JWQsIOW3sui/kOihjD0lZFxuIiwgcnVubmluZy0+cHJpb3JpdHksIHJ1bm5pbmctPnJ1bl90aW1lKTsKICAgIAogICAgLy8g5qOA5p+l6L+b56iL5piv5ZCm5a6M5oiQCiAgICBpZiAocnVubmluZy0+cnVuX3RpbWUgPj0gcnVubmluZy0+bmVlZF90aW1lKSB7CiAgICAgICAgcnVubmluZy0+c3RhdGUgPSAnRic7ICAvLyDnva7kuLrlrozmiJDmgIEKICAgICAgICBwcmludGYoIj4+PiDov5vnqIsgJXMg6L+Q6KGM5a6M5q+V77yBXG4iLCBydW5uaW5nLT5uYW1lKTsKICAgICAgICBkZXN0cm95X3Byb2Nlc3MocnVubmluZyk7CiAgICAgICAgcnVubmluZyA9IE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIC8vIOacquWujOaIkO+8jOmHjeaWsOaUvuWbnuWwsee7qumYn+WIlwogICAgICAgIHJ1bm5pbmctPnN0YXRlID0gJ1InOwogICAgICAgIHByaW50ZigiPj4+IOi/m+eoiyAlcyDml7bpl7TniYfnlKjlrozvvIzph43mlrDov5vlhaXlsLHnu6rpmJ/liJdcbiIsIHJ1bm5pbmctPm5hbWUpOwogICAgICAgIGluc2VydF9yZWFkeShydW5uaW5nKTsKICAgICAgICBydW5uaW5nID0gTlVMTDsKICAgIH0KfQoKLy8g5pKk6ZSA6L+b56iL77yI6YeK5pS+5YaF5a2Y77yJCnZvaWQgZGVzdHJveV9wcm9jZXNzKFBDQiAqcCkgewogICAgaWYgKHAgIT0gTlVMTCkgewogICAgICAgIHByaW50ZigiPj4+IOaSpOmUgOi/m+eoiyAlc++8jOmHiuaUvui1hOa6kFxuIiwgcC0+bmFtZSk7CiAgICAgICAgZnJlZShwKTsKICAgIH0KfQoKLy8g5Li75Ye95pWwCmludCBtYWluKCkgewogICAgaW50IGNob2ljZTsKICAgIGludCBzdGVwID0gMTsKICAgIAogICAgaW5pdF9wcm9jZXNzKCk7ICAvLyDliJ3lp4vljJbov5vnqIsKICAgIAogICAgaWYgKHJlYWR5ID09IE5VTEwpIHsKICAgICAgICBwcmludGYoIuayoeacieWIm+W7uuS7u+S9lei/m+eoi++8jOeoi+W6j+mAgOWHuuOAglxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAKICAgIHByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CiAgICBwcmludGYoIlxu6L+b56iL5Yid5aeL5YyW5a6M5oiQ77yM5byA5aeL6LCD5bqmLi4uXG4iKTsKICAgIHByaW50X3F1ZXVlKCk7CiAgICAKICAgIC8vIOiwg+W6puW+queOrwogICAgd2hpbGUgKHJlYWR5ICE9IE5VTEwgfHwgcnVubmluZyAhPSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICAgICBwcmludGYoIlxu44CQ56ysICVkIOi9ruiwg+W6puOAkVxuIiwgc3RlcCsrKTsKICAgICAgICAKICAgICAgICBzY2hlZHVsZSgpOyAgICAgICAgICAvLyDosIPluqYKICAgICAgICBwcmludF9ydW5uaW5nKCk7ICAgICAvLyDmmL7npLrov5DooYzov5vnqIsKICAgICAgICBydW5fcHJvY2VzcygpOyAgICAgICAvLyDov5DooYzov5vnqIsKICAgICAgICBwcmludF9xdWV1ZSgpOyAgICAgICAvLyDmmL7npLrlsLHnu6rpmJ/liJcKICAgICAgICAKICAgICAgICBwcmludGYoIlxu5oyJ5Zue6L2m6ZSu57un57ut5LiL5LiA6L2u6LCD5bqm77yI6L6T5YWlMOmAgOWHuu+8iS4uLiIpOwogICAgICAgIGNob2ljZSA9IGdldGNoYXIoKTsKICAgICAgICBpZiAoY2hvaWNlID09ICcwJykgewogICAgICAgICAgICBwcmludGYoIueUqOaIt+mAieaLqemAgOWHuuiwg+W6puOAglxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyDmuIXpmaTnvJPlhrLljLoKICAgICAgICB3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOwogICAgfQogICAgCiAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgICBwcmludGYoIuaJgOaciei/m+eoi+iwg+W6puWujOaIkO+8gVxuIik7CiAgICAKICAgIHJldHVybiAwOwp9