#include <stdio.h>
#define MAX_PROCESS 5
#define TIME_SLICE 1//时间片大小(单位时间)
// 进程状态
typedef enum {
RUNNING = 1,
READY = 0,
FINISHED = -1
} State;
// 进程控制块结构体
typedef struct {
int pid; // 进程ID
int priority; // 优先级
int need_time; // 需要的运行时间
int arrival_time; // 到达时间
int start_time; // 开始时间
int finish_time; // 完成时间
State state; // 状态
} PCB;
// 全局变量
PCB processes[MAX_PROCESS];
int current_time = 0;
// 初始化进程数据
void init_processes() {
// 数据格式:{pid, priority, need_time, arrival_time, start_time, finish_time, state}
// 修正后:每个进程只保留7个数据
processes[0] = (PCB){1, 2, 3, 4, -1, 0, READY};
processes[1] = (PCB){2, 5, 2, 2, -1, 0, READY};
processes[2] = (PCB){3, 1, 4, 1, -1, 0, READY};
processes[3] = (PCB){4, 3, 3, 3, -1, 0, READY};
processes[4] = (PCB){5, 4, 1, 0, -1, 0, READY};
}
// 检查是否所有进程都已完成
int all_finished() {
for (int i = 0; i < MAX_PROCESS; i++) {
if (processes[i].state != FINISHED) {
return 0; // 还有未完成的
}
}
return 1; // 全部完成
}
// 选择优先级最高的进程
int select_highest_priority() {
int selected = -1;
int max_priority = -1;
for (int i = 0; i < MAX_PROCESS; i++) {
// 检查进程是否已到达且处于就绪状态
if (processes[i].state == READY && processes[i].arrival_time <= current_time) {
if (processes[i].priority > max_priority) {
max_priority = processes[i].priority;
selected = i;
}
// 优先级相同时,比较 PID (或其他规则,这里保持原代码逻辑)
else if (processes[i].priority == max_priority) {
if (selected != -1 && processes[i].pid < processes[selected].pid) {
selected = i;
}
}
}
}
return selected;
}
int main() {
init_processes();
printf("调度算法: 最高优先树优先(抢占式,动态优先级)\n"); printf("动态规则: 每获得一次CPU,优先数减1\n\n");
int last_selected = -1;
// 主调度循环
while (!all_finished()) {
int selected = select_highest_priority();
// 如果没有进程可运行(可能是还没到达),时间前移
if (selected == -1) {
current_time++;
last_selected = -1; // 重置上一次选择
continue;
}
// 记录开始时间
if (processes[selected].start_time == -1) {
processes[selected].start_time = current_time;
}
// 进程切换提示
if (last_selected != selected) {
printf("->时刻%d: 选中进程P%d (优先级=%d, 剩余时间=%d)\n", current_time, processes[selected].pid, processes[selected].priority, processes[selected].need_time);
}
// 执行进程 (运行一个时间单位)
processes[selected].state = RUNNING;
processes[selected].need_time--;
current_time++;
// 动态优先级调整:运行一次后优先级减1
if (processes[selected].priority > 0) {
processes[selected].priority--;
}
// 检查进程是否完成
if (processes[selected].need_time == 0) {
processes[selected].state = FINISHED;
processes[selected].finish_time = current_time;
printf("进程P%d已完成! (完成时刻=%d)\n", processes
[selected
].
pid, current_time
); } else {
// 未完成则变回就绪状态
processes[selected].state = READY;
}
last_selected = selected;
}
// 统计与输出结果
printf("进程\t到达时间\t开始时间\t总运行时间\t完成时间\t周转时间\n");
int total_turnaround = 0;
for (int i = 0; i < MAX_PROCESS; i++) {
// 计算周转时间 = 完成时间 - 到达时间
int turnaround = processes[i].finish_time - processes[i].arrival_time;
total_turnaround += turnaround;
// 原始总运行时间 = 需要时间 + (初始需要时间 - 剩余时间,这里简单用初始need_time推算)
// 注意:因为 need_time 在循环中被减为 0 了,这里为了演示,假设初始 need_time 已知或需额外字段存储
// 在本代码中,由于初始化数据是一样的,且被修改了,这里打印 finish - start 近似作为运行时间展示
int run_time = processes[i].finish_time - processes[i].start_time;
printf("P%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].pid,
processes[i].arrival_time,
processes[i].start_time,
run_time,
processes[i].finish_time,
turnaround);
}
printf("\n平均周转时间: %.2f\n", (float)total_turnaround
/ MAX_PROCESS
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIE1BWF9QUk9DRVNTIDUKI2RlZmluZSBUSU1FX1NMSUNFIDEvL+aXtumXtOeJh+Wkp+Wwj++8iOWNleS9jeaXtumXtO+8iQovLyDov5vnqIvnirbmgIEKdHlwZWRlZiBlbnVtIHsKICAgIFJVTk5JTkcgPSAxLAogICAgUkVBRFkgPSAwLAogICAgRklOSVNIRUQgPSAtMQp9IFN0YXRlOwoKLy8g6L+b56iL5o6n5Yi25Z2X57uT5p6E5L2TCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBwaWQ7ICAgICAgICAgICAgLy8g6L+b56iLSUQKICAgIGludCBwcmlvcml0eTsgICAgICAgLy8g5LyY5YWI57qnCiAgICBpbnQgbmVlZF90aW1lOyAgICAgIC8vIOmcgOimgeeahOi/kOihjOaXtumXtAogICAgaW50IGFycml2YWxfdGltZTsgICAvLyDliLDovr7ml7bpl7QKICAgIGludCBzdGFydF90aW1lOyAgICAgLy8g5byA5aeL5pe26Ze0CiAgICBpbnQgZmluaXNoX3RpbWU7ICAgIC8vIOWujOaIkOaXtumXtAogICAgU3RhdGUgc3RhdGU7ICAgICAgICAvLyDnirbmgIEKfSBQQ0I7CgovLyDlhajlsYDlj5jph48KUENCIHByb2Nlc3Nlc1tNQVhfUFJPQ0VTU107CmludCBjdXJyZW50X3RpbWUgPSAwOwoKLy8g5Yid5aeL5YyW6L+b56iL5pWw5o2uCnZvaWQgaW5pdF9wcm9jZXNzZXMoKSB7CiAgICAvLyDmlbDmja7moLzlvI/vvJp7cGlkLCBwcmlvcml0eSwgbmVlZF90aW1lLCBhcnJpdmFsX3RpbWUsIHN0YXJ0X3RpbWUsIGZpbmlzaF90aW1lLCBzdGF0ZX0KICAgIC8vIOS/ruato+WQju+8muavj+S4qui/m+eoi+WPquS/neeVmTfkuKrmlbDmja4KICAgIHByb2Nlc3Nlc1swXSA9IChQQ0IpezEsIDIsIDMsIDQsIC0xLCAwLCBSRUFEWX07CiAgICBwcm9jZXNzZXNbMV0gPSAoUENCKXsyLCA1LCAyLCAyLCAtMSwgMCwgUkVBRFl9OwogICAgcHJvY2Vzc2VzWzJdID0gKFBDQil7MywgMSwgNCwgMSwgLTEsIDAsIFJFQURZfTsKICAgIHByb2Nlc3Nlc1szXSA9IChQQ0IpezQsIDMsIDMsIDMsIC0xLCAwLCBSRUFEWX07CiAgICBwcm9jZXNzZXNbNF0gPSAoUENCKXs1LCA0LCAxLCAwLCAtMSwgMCwgUkVBRFl9Owp9CgovLyDmo4Dmn6XmmK/lkKbmiYDmnInov5vnqIvpg73lt7LlrozmiJAKaW50IGFsbF9maW5pc2hlZCgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1BST0NFU1M7IGkrKykgewogICAgICAgIGlmIChwcm9jZXNzZXNbaV0uc3RhdGUgIT0gRklOSVNIRUQpIHsKICAgICAgICAgICAgcmV0dXJuIDA7IC8vIOi/mOacieacquWujOaIkOeahAogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOyAvLyDlhajpg6jlrozmiJAKfQoKLy8g6YCJ5oup5LyY5YWI57qn5pyA6auY55qE6L+b56iLCmludCBzZWxlY3RfaGlnaGVzdF9wcmlvcml0eSgpIHsKICAgIGludCBzZWxlY3RlZCA9IC0xOwogICAgaW50IG1heF9wcmlvcml0eSA9IC0xOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1BST0NFU1M7IGkrKykgewogICAgICAgIC8vIOajgOafpei/m+eoi+aYr+WQpuW3suWIsOi+vuS4lOWkhOS6juWwsee7queKtuaAgQogICAgICAgIGlmIChwcm9jZXNzZXNbaV0uc3RhdGUgPT0gUkVBRFkgJiYgcHJvY2Vzc2VzW2ldLmFycml2YWxfdGltZSA8PSBjdXJyZW50X3RpbWUpIHsKICAgICAgICAgICAgaWYgKHByb2Nlc3Nlc1tpXS5wcmlvcml0eSA+IG1heF9wcmlvcml0eSkgewogICAgICAgICAgICAgICAgbWF4X3ByaW9yaXR5ID0gcHJvY2Vzc2VzW2ldLnByaW9yaXR5OwogICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOS8mOWFiOe6p+ebuOWQjOaXtu+8jOavlOi+gyBQSUQgKOaIluWFtuS7luinhOWIme+8jOi/memHjOS/neaMgeWOn+S7o+eggemAu+i+kSkKICAgICAgICAgICAgZWxzZSBpZiAocHJvY2Vzc2VzW2ldLnByaW9yaXR5ID09IG1heF9wcmlvcml0eSkgewogICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9IC0xICYmIHByb2Nlc3Nlc1tpXS5waWQgPCBwcm9jZXNzZXNbc2VsZWN0ZWRdLnBpZCkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBzZWxlY3RlZDsKfQoKaW50IG1haW4oKSB7CiAgICBpbml0X3Byb2Nlc3NlcygpOwoKICAgIHByaW50ZigiLS0t6L+b56iL6LCD5bqm5qih5ouf6L+H56iLLS0tXG4iKTsKICAgIHByaW50Zigi6LCD5bqm566X5rOVOiDmnIDpq5jkvJjlhYjmoJHkvJjlhYgo5oqi5Y2g5byPLOWKqOaAgeS8mOWFiOe6pylcbiIpOwogICAgcHJpbnRmKCLliqjmgIHop4TliJk6IOavj+iOt+W+l+S4gOasoUNQVSzkvJjlhYjmlbDlh48xXG5cbiIpOwoKICAgIGludCBsYXN0X3NlbGVjdGVkID0gLTE7CgogICAgLy8g5Li76LCD5bqm5b6q546vCiAgICB3aGlsZSAoIWFsbF9maW5pc2hlZCgpKSB7CiAgICAgICAgaW50IHNlbGVjdGVkID0gc2VsZWN0X2hpZ2hlc3RfcHJpb3JpdHkoKTsKCiAgICAgICAgLy8g5aaC5p6c5rKh5pyJ6L+b56iL5Y+v6L+Q6KGM77yI5Y+v6IO95piv6L+Y5rKh5Yiw6L6+77yJ77yM5pe26Ze05YmN56e7CiAgICAgICAgaWYgKHNlbGVjdGVkID09IC0xKSB7CiAgICAgICAgICAgIGN1cnJlbnRfdGltZSsrOwogICAgICAgICAgICBsYXN0X3NlbGVjdGVkID0gLTE7IC8vIOmHjee9ruS4iuS4gOasoemAieaLqQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIOiusOW9leW8gOWni+aXtumXtAogICAgICAgIGlmIChwcm9jZXNzZXNbc2VsZWN0ZWRdLnN0YXJ0X3RpbWUgPT0gLTEpIHsKICAgICAgICAgICAgcHJvY2Vzc2VzW3NlbGVjdGVkXS5zdGFydF90aW1lID0gY3VycmVudF90aW1lOwogICAgICAgIH0KCiAgICAgICAgLy8g6L+b56iL5YiH5o2i5o+Q56S6CiAgICAgICAgaWYgKGxhc3Rfc2VsZWN0ZWQgIT0gc2VsZWN0ZWQpIHsKICAgICAgICAgICAgcHJpbnRmKCItPuaXtuWIuyVkOiDpgInkuK3ov5vnqItQJWQgKOS8mOWFiOe6pz0lZCwg5Ymp5L2Z5pe26Ze0PSVkKVxuIiwKICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSwgcHJvY2Vzc2VzW3NlbGVjdGVkXS5waWQsIHByb2Nlc3Nlc1tzZWxlY3RlZF0ucHJpb3JpdHksIHByb2Nlc3Nlc1tzZWxlY3RlZF0ubmVlZF90aW1lKTsKICAgICAgICB9CgogICAgICAgIC8vIOaJp+ihjOi/m+eoiyAo6L+Q6KGM5LiA5Liq5pe26Ze05Y2V5L2NKQogICAgICAgIHByb2Nlc3Nlc1tzZWxlY3RlZF0uc3RhdGUgPSBSVU5OSU5HOwogICAgICAgIHByb2Nlc3Nlc1tzZWxlY3RlZF0ubmVlZF90aW1lLS07CiAgICAgICAgY3VycmVudF90aW1lKys7CgogICAgICAgIC8vIOWKqOaAgeS8mOWFiOe6p+iwg+aVtO+8mui/kOihjOS4gOasoeWQjuS8mOWFiOe6p+WHjzEKICAgICAgICBpZiAocHJvY2Vzc2VzW3NlbGVjdGVkXS5wcmlvcml0eSA+IDApIHsKICAgICAgICAgICAgcHJvY2Vzc2VzW3NlbGVjdGVkXS5wcmlvcml0eS0tOwogICAgICAgIH0KCiAgICAgICAgLy8g5qOA5p+l6L+b56iL5piv5ZCm5a6M5oiQCiAgICAgICAgaWYgKHByb2Nlc3Nlc1tzZWxlY3RlZF0ubmVlZF90aW1lID09IDApIHsKICAgICAgICAgICAgcHJvY2Vzc2VzW3NlbGVjdGVkXS5zdGF0ZSA9IEZJTklTSEVEOwogICAgICAgICAgICBwcm9jZXNzZXNbc2VsZWN0ZWRdLmZpbmlzaF90aW1lID0gY3VycmVudF90aW1lOwogICAgICAgICAgICBwcmludGYoIui/m+eoi1AlZOW3suWujOaIkCEgKOWujOaIkOaXtuWIuz0lZClcbiIsIHByb2Nlc3Nlc1tzZWxlY3RlZF0ucGlkLCBjdXJyZW50X3RpbWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIOacquWujOaIkOWImeWPmOWbnuWwsee7queKtuaAgQogICAgICAgICAgICBwcm9jZXNzZXNbc2VsZWN0ZWRdLnN0YXRlID0gUkVBRFk7CiAgICAgICAgfQoKICAgICAgICBsYXN0X3NlbGVjdGVkID0gc2VsZWN0ZWQ7CiAgICB9CgogICAgLy8g57uf6K6h5LiO6L6T5Ye657uT5p6cCiAgICBwcmludGYoIlxuLS0t6LCD5bqm5a6M5oiQLS0tXG4iKTsKICAgIHByaW50Zigi6L+b56iLXHTliLDovr7ml7bpl7RcdOW8gOWni+aXtumXtFx05oC76L+Q6KGM5pe26Ze0XHTlrozmiJDml7bpl7RcdOWRqOi9rOaXtumXtFxuIik7CgogICAgaW50IHRvdGFsX3R1cm5hcm91bmQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUFJPQ0VTUzsgaSsrKSB7CiAgICAgICAgLy8g6K6h566X5ZGo6L2s5pe26Ze0ID0g5a6M5oiQ5pe26Ze0IC0g5Yiw6L6+5pe26Ze0CiAgICAgICAgaW50IHR1cm5hcm91bmQgPSBwcm9jZXNzZXNbaV0uZmluaXNoX3RpbWUgLSBwcm9jZXNzZXNbaV0uYXJyaXZhbF90aW1lOwogICAgICAgIHRvdGFsX3R1cm5hcm91bmQgKz0gdHVybmFyb3VuZDsKCiAgICAgICAgLy8g5Y6f5aeL5oC76L+Q6KGM5pe26Ze0ID0g6ZyA6KaB5pe26Ze0ICsgKOWIneWni+mcgOimgeaXtumXtCAtIOWJqeS9meaXtumXtO+8jOi/memHjOeugOWNleeUqOWIneWni25lZWRfdGltZeaOqOeulykKICAgICAgICAvLyDms6jmhI/vvJrlm6DkuLogbmVlZF90aW1lIOWcqOW+queOr+S4reiiq+WHj+S4uiAwIOS6hu+8jOi/memHjOS4uuS6hua8lOekuu+8jOWBh+iuvuWIneWniyBuZWVkX3RpbWUg5bey55+l5oiW6ZyA6aKd5aSW5a2X5q615a2Y5YKoCiAgICAgICAgLy8g5Zyo5pys5Luj56CB5Lit77yM55Sx5LqO5Yid5aeL5YyW5pWw5o2u5piv5LiA5qC355qE77yM5LiU6KKr5L+u5pS55LqG77yM6L+Z6YeM5omT5Y2wIGZpbmlzaCAtIHN0YXJ0IOi/keS8vOS9nOS4uui/kOihjOaXtumXtOWxleekugogICAgICAgIGludCBydW5fdGltZSA9IHByb2Nlc3Nlc1tpXS5maW5pc2hfdGltZSAtIHByb2Nlc3Nlc1tpXS5zdGFydF90aW1lOwoKICAgICAgICBwcmludGYoIlAlZFx0JWRcdFx0JWRcdFx0JWRcdFx0JWRcdFx0JWRcbiIsCiAgICAgICAgICAgICAgIHByb2Nlc3Nlc1tpXS5waWQsCiAgICAgICAgICAgICAgIHByb2Nlc3Nlc1tpXS5hcnJpdmFsX3RpbWUsCiAgICAgICAgICAgICAgIHByb2Nlc3Nlc1tpXS5zdGFydF90aW1lLAogICAgICAgICAgICAgICBydW5fdGltZSwKICAgICAgICAgICAgICAgcHJvY2Vzc2VzW2ldLmZpbmlzaF90aW1lLAogICAgICAgICAgICAgICB0dXJuYXJvdW5kKTsKICAgIH0KCiAgICBwcmludGYoIlxu5bmz5Z2H5ZGo6L2s5pe26Ze0OiAlLjJmXG4iLCAoZmxvYXQpdG90YWxfdHVybmFyb3VuZCAvIE1BWF9QUk9DRVNTKTsKCiAgICByZXR1cm4gMDsKfQ==