#include <stdio.h>
#include <stdlib.h>
#define MAX_PROCESS 5 // 进程数量
#define TIME_SLICE 1 // 时间片大小(单位时间)
// 进程状态
enum State{
READY,
RUNNING,
FINISHED
};
// 进程控制块
typedef struct{
int pid; // 进程ID
int priority; // 优先级
int need_time; // 剩余需要运行时间
int total_time; // 总运行时间
int arrival_time; // 到达时间
int start_time; // 开始运行时间
int finish_time; // 完成时间
enum State state; // 进程状态
}PCB;
// 全局进程数组
PCB processes[MAX_PROCESS];
// 当前时间
int current_time = 0;
// 初始化5个进程
void init_processes(){
// 正确初始化所有进程
processes[0] = (PCB){1, 3, 4, 4, 0, -1, 0, READY};
processes[1] = (PCB){2, 5, 2, 2, 1, -1, 0, READY};
processes[2] = (PCB){3, 2, 1, 1, 2, -1, 0, READY};
processes[3] = (PCB){4, 4, 3, 3, 3, -1, 0, READY};
processes[4] = (PCB){5, 1, 2, 2, 4, -1, 0, READY};
}
// 检查是否所有进程都已完成
int all_finished(){
for(int i=0; i<MAX_PROCESS; i++){
if(processes[i].state != FINISHED)
return 0;
}
return 1;
}
// 选择当前就绪队列中优先级最高的进程(若优先级相同,选择ID较小的)
// 返回进程在数组中的下标,若没有就绪进程则返回-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){
if(processes[i].priority > max_priority){
max_priority = processes[i].priority;
selected = i;
}else if(processes[i].priority == max_priority){
// 优先级相同,选择ID更小的
if(selected == -1 || processes[i].pid < processes[selected].pid){
selected = i;
}
}
}
}
return selected;
}
int main(){
init_processes();
printf("-----进程调度模拟过程-----\n"); printf("调度算法:最高优先数优先(抢占式,动态优先级)\n"); printf("动态规则:每获得一次CPU,优先数减1\n\n");
int last_selected = -1;
while(!all_finished()){
int selected = select_highest_priority();
// 无就绪进程,时间流逝
if(selected == -1){
current_time++;
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
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;
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,
processes[i].total_time,
processes[i].finish_time,
turnaround);
}
printf("\n平均周转时间=%.2f\n", (float)total_turnaround
/ MAX_PROCESS
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2RlZmluZSBNQVhfUFJPQ0VTUyA1ICAgLy8g6L+b56iL5pWw6YePCiNkZWZpbmUgVElNRV9TTElDRSAxICAgIC8vIOaXtumXtOeJh+Wkp+WwjyjljZXkvY3ml7bpl7QpCgovLyDov5vnqIvnirbmgIEKZW51bSBTdGF0ZXsKCVJFQURZLAoJUlVOTklORywKCUZJTklTSEVECn07CgovLyDov5vnqIvmjqfliLblnZcKdHlwZWRlZiBzdHJ1Y3R7CglpbnQgcGlkOyAgICAgICAgICAgIC8vIOi/m+eoi0lECglpbnQgcHJpb3JpdHk7ICAgICAgIC8vIOS8mOWFiOe6pwoJaW50IG5lZWRfdGltZTsgICAgICAvLyDliankvZnpnIDopoHov5DooYzml7bpl7QKCWludCB0b3RhbF90aW1lOyAgICAgLy8g5oC76L+Q6KGM5pe26Ze0CglpbnQgYXJyaXZhbF90aW1lOyAgIC8vIOWIsOi+vuaXtumXtAoJaW50IHN0YXJ0X3RpbWU7ICAgICAvLyDlvIDlp4vov5DooYzml7bpl7QKCWludCBmaW5pc2hfdGltZTsgICAgLy8g5a6M5oiQ5pe26Ze0CgllbnVtIFN0YXRlIHN0YXRlOyAgIC8vIOi/m+eoi+eKtuaAgQp9UENCOwoKLy8g5YWo5bGA6L+b56iL5pWw57uEClBDQiBwcm9jZXNzZXNbTUFYX1BST0NFU1NdOwoKLy8g5b2T5YmN5pe26Ze0CmludCBjdXJyZW50X3RpbWUgPSAwOwoKLy8g5Yid5aeL5YyWNeS4qui/m+eoiwp2b2lkIGluaXRfcHJvY2Vzc2VzKCl7CgkvLyDmraPnoa7liJ3lp4vljJbmiYDmnInov5vnqIsKCXByb2Nlc3Nlc1swXSA9IChQQ0IpezEsIDMsIDQsIDQsIDAsIC0xLCAwLCBSRUFEWX07Cglwcm9jZXNzZXNbMV0gPSAoUENCKXsyLCA1LCAyLCAyLCAxLCAtMSwgMCwgUkVBRFl9OwoJcHJvY2Vzc2VzWzJdID0gKFBDQil7MywgMiwgMSwgMSwgMiwgLTEsIDAsIFJFQURZfTsKCXByb2Nlc3Nlc1szXSA9IChQQ0IpezQsIDQsIDMsIDMsIDMsIC0xLCAwLCBSRUFEWX07Cglwcm9jZXNzZXNbNF0gPSAoUENCKXs1LCAxLCAyLCAyLCA0LCAtMSwgMCwgUkVBRFl9Owp9CgovLyDmo4Dmn6XmmK/lkKbmiYDmnInov5vnqIvpg73lt7LlrozmiJAKaW50IGFsbF9maW5pc2hlZCgpewoJZm9yKGludCBpPTA7IGk8TUFYX1BST0NFU1M7IGkrKyl7CgkJaWYocHJvY2Vzc2VzW2ldLnN0YXRlICE9IEZJTklTSEVEKQoJCQlyZXR1cm4gMDsKCX0KCXJldHVybiAxOwp9CgovLyDpgInmi6nlvZPliY3lsLHnu6rpmJ/liJfkuK3kvJjlhYjnuqfmnIDpq5jnmoTov5vnqIvvvIjoi6XkvJjlhYjnuqfnm7jlkIzvvIzpgInmi6lJROi+g+Wwj+eahO+8iQovLyDov5Tlm57ov5vnqIvlnKjmlbDnu4TkuK3nmoTkuIvmoIfvvIzoi6XmsqHmnInlsLHnu6rov5vnqIvliJnov5Tlm54tMQppbnQgc2VsZWN0X2hpZ2hlc3RfcHJpb3JpdHkoKXsKCWludCBzZWxlY3RlZCA9IC0xOwoJaW50IG1heF9wcmlvcml0eSA9IC0xOwoJZm9yKGludCBpPTA7IGk8TUFYX1BST0NFU1M7IGkrKyl7CgkJaWYocHJvY2Vzc2VzW2ldLnN0YXRlID09IFJFQURZKXsKCQkJaWYocHJvY2Vzc2VzW2ldLnByaW9yaXR5ID4gbWF4X3ByaW9yaXR5KXsKCQkJCW1heF9wcmlvcml0eSA9IHByb2Nlc3Nlc1tpXS5wcmlvcml0eTsKCQkJCXNlbGVjdGVkID0gaTsKCQkJfWVsc2UgaWYocHJvY2Vzc2VzW2ldLnByaW9yaXR5ID09IG1heF9wcmlvcml0eSl7CgkJCQkvLyDkvJjlhYjnuqfnm7jlkIzvvIzpgInmi6lJROabtOWwj+eahAoJCQkJaWYoc2VsZWN0ZWQgPT0gLTEgfHwgcHJvY2Vzc2VzW2ldLnBpZCA8IHByb2Nlc3Nlc1tzZWxlY3RlZF0ucGlkKXsKCQkJCQlzZWxlY3RlZCA9IGk7CgkJCQl9CgkJCX0KCQl9Cgl9CglyZXR1cm4gc2VsZWN0ZWQ7Cn0KCmludCBtYWluKCl7Cglpbml0X3Byb2Nlc3NlcygpOwoJcHJpbnRmKCItLS0tLei/m+eoi+iwg+W6puaooeaLn+i/h+eoiy0tLS0tXG4iKTsKCXByaW50Zigi6LCD5bqm566X5rOVOuacgOmrmOS8mOWFiOaVsOS8mOWFiO+8iOaKouWNoOW8j++8jOWKqOaAgeS8mOWFiOe6p++8iVxuIik7CglwcmludGYoIuWKqOaAgeinhOWImTrmr4/ojrflvpfkuIDmrKFDUFXvvIzkvJjlhYjmlbDlh48xXG5cbiIpOwoJCglpbnQgbGFzdF9zZWxlY3RlZCA9IC0xOwoJCgl3aGlsZSghYWxsX2ZpbmlzaGVkKCkpewoJCWludCBzZWxlY3RlZCA9IHNlbGVjdF9oaWdoZXN0X3ByaW9yaXR5KCk7CgkJCgkJLy8g5peg5bCx57uq6L+b56iL77yM5pe26Ze05rWB6YCdCgkJaWYoc2VsZWN0ZWQgPT0gLTEpewoJCQljdXJyZW50X3RpbWUrKzsKCQkJY29udGludWU7CgkJfQoJCQoJCS8vIOiusOW9lemmluasoei/kOihjOaXtumXtAoJCWlmKHByb2Nlc3Nlc1tzZWxlY3RlZF0uc3RhcnRfdGltZSA9PSAtMSl7CgkJCXByb2Nlc3Nlc1tzZWxlY3RlZF0uc3RhcnRfdGltZSA9IGN1cnJlbnRfdGltZTsKCQl9CgkJCgkJLy8g6L+b56iL5YiH5o2i5pe25omT5Y2w5L+h5oGvCgkJaWYobGFzdF9zZWxlY3RlZCAhPSBzZWxlY3RlZCl7CgkJCXByaW50ZigiLT7ml7bliLslZDog6YCJ5Lit6L+b56iLUCVkICjkvJjlhYjnuqc9JWQsIOWJqeS9meaXtumXtD0lZClcbiIsCgkJCSAgICAgICBjdXJyZW50X3RpbWUsIHByb2Nlc3Nlc1tzZWxlY3RlZF0ucGlkLCBwcm9jZXNzZXNbc2VsZWN0ZWRdLnByaW9yaXR5LCBwcm9jZXNzZXNbc2VsZWN0ZWRdLm5lZWRfdGltZSk7CgkJfQoJCQoJCS8vIOi/kOihjOS4gOS4quaXtumXtOeJhwoJCXByb2Nlc3Nlc1tzZWxlY3RlZF0uc3RhdGUgPSBSVU5OSU5HOwoJCXByb2Nlc3Nlc1tzZWxlY3RlZF0ubmVlZF90aW1lLS07CgkJY3VycmVudF90aW1lKys7CgkJCgkJLy8g5Yqo5oCB5LyY5YWI57qn77ya6L+Q6KGM5LiA5qyh5LyY5YWI57qnLTEKCQlwcm9jZXNzZXNbc2VsZWN0ZWRdLnByaW9yaXR5LS07CgkJCgkJLy8g6L+b56iL5a6M5oiQCgkJaWYocHJvY2Vzc2VzW3NlbGVjdGVkXS5uZWVkX3RpbWUgPT0gMCl7CgkJCXByb2Nlc3Nlc1tzZWxlY3RlZF0uc3RhdGUgPSBGSU5JU0hFRDsKCQkJcHJvY2Vzc2VzW3NlbGVjdGVkXS5maW5pc2hfdGltZSA9IGN1cnJlbnRfdGltZTsKCQkJcHJpbnRmKCLov5vnqItQJWTlt7LlrozmiJDvvIHvvIjlrozmiJDml7bliLs9JWTvvIlcbiIsIHByb2Nlc3Nlc1tzZWxlY3RlZF0ucGlkLCBjdXJyZW50X3RpbWUpOwoJCX1lbHNlewoJCQlwcm9jZXNzZXNbc2VsZWN0ZWRdLnN0YXRlID0gUkVBRFk7CgkJfQoJCQoJCWxhc3Rfc2VsZWN0ZWQgPSBzZWxlY3RlZDsKCX0KCQoJLy8g6L6T5Ye66LCD5bqm57uT5p6c57uf6K6hCglwcmludGYoIlxuLS0tLS3osIPluqblrozmiJAtLS0tLVxuIik7CglwcmludGYoIui/m+eoi1x05Yiw6L6+5pe26Ze0XHTlvIDlp4vml7bpl7RcdOaAu+i/kOihjOaXtumXtFx05a6M5oiQ5pe26Ze0XHTlkajovazml7bpl7RcbiIpOwoJaW50IHRvdGFsX3R1cm5hcm91bmQgPSAwOwoJZm9yKGludCBpPTA7IGk8TUFYX1BST0NFU1M7IGkrKyl7CgkJaW50IHR1cm5hcm91bmQgPSBwcm9jZXNzZXNbaV0uZmluaXNoX3RpbWUgLSBwcm9jZXNzZXNbaV0uYXJyaXZhbF90aW1lOwoJCXRvdGFsX3R1cm5hcm91bmQgKz0gdHVybmFyb3VuZDsKCQlwcmludGYoIlAlZFx0JWRcdFx0JWRcdFx0JWRcdFx0JWRcdFx0JWRcbiIsCgkJICAgICAgIHByb2Nlc3Nlc1tpXS5waWQsCgkJICAgICAgIHByb2Nlc3Nlc1tpXS5hcnJpdmFsX3RpbWUsCgkJICAgICAgIHByb2Nlc3Nlc1tpXS5zdGFydF90aW1lLAoJCSAgICAgICBwcm9jZXNzZXNbaV0udG90YWxfdGltZSwKCQkgICAgICAgcHJvY2Vzc2VzW2ldLmZpbmlzaF90aW1lLAoJCSAgICAgICB0dXJuYXJvdW5kKTsKCX0KCQoJcHJpbnRmKCJcbuW5s+Wdh+WRqOi9rOaXtumXtD0lLjJmXG4iLCAoZmxvYXQpdG90YWxfdHVybmFyb3VuZCAvIE1BWF9QUk9DRVNTKTsKCXJldHVybiAwOwp9