#include <stdio.h>
// #include <stdlib.h>
struct pcb
{
//char* name;
int no; //进程号
int priority; //优先级
int arrtime; //到达时间
int runtime; //需要运行时间
int cputime; //已运行时间
int io_num; //需要io次数(以1s为单位)
char state; //状态,就绪Wait(W)、运行R(Run)、或阻塞B(Block)
};
struct pcb pcb[20]; //所有进程
struct pcb wait[20]; //等待队列
int current_pcb;
int i,j,num;
void run(){
pcb[current_pcb].priority--;
pcb[current_pcb].runtime--;
pcb[current_pcb].cputime++;
pcb[current_pcb].state = 'r';
}
int compare(struct pcb wait[]){
//找出优先级最高的
current_pcb=wait[0].no;
int x;
x = wait[0].priority;
for(i=1;i<j;i++){
if( x< wait[i].priority){
current_pcb = wait[i].no;
x = wait[i].priority;
}
}
return current_pcb; //返回运行的进程编号
}
void io(){
for(i=1;i<=num;i++){
if(pcb[i].io_num ==0 && pcb[i].state == 'b'){
pcb[i].state = 'w';
pcb[i].cputime++;
}
if(pcb[i].io_num>0 && (pcb[i].state =='b'|| pcb[i].state == 'r') ){
pcb[i].io_num--;
pcb[i].state = 'b';
pcb[i].cputime++;
}
}
}
void pcb_finish(){
int no;
for(i =0;i<num;i++){
if(pcb[i].runtime ==0){
no = pcb[i].no;
pcb[i].no = pcb[i+1].no;
pcb[i].priority = pcb[i+1].priority;
pcb[i].arrtime = pcb[i+1].arrtime;
pcb[i].runtime = pcb[i+1].runtime;
pcb[i].cputime = pcb[i+1].cputime;
pcb[i].io_num = pcb[i+1].io_num;
pcb[i].state = pcb[i+1].state;
num--;
}
}
}
int main()
{
printf("输入进程号.进程优先级.进程到达时间.进程运行时间.进程所需I/O时间\n"); for(int i=0; i<num; i++){
scanf("%d %d %d %d %d",&pcb
[i
].
no,&pcb
[i
].
priority,&pcb
[i
].
arrtime,&pcb
[i
].
runtime,&pcb
[i
].
io_num); }
printf("--------------------时间片0--------------------\n"); printf("进程号 进程优先级 进程到达时间 进程运行时间 进程已用时间 I/O时间\n"); for(int i=0; i<num; i++){
printf("%2d %5d %8d %8d %8d %8d\n",pcb
[i
].
no, pcb
[i
].
priority, pcb
[i
].
arrtime, pcb
[i
].
runtime, pcb
[i
].
cputime, pcb
[i
].
io_num); }
while(num!=0){ //pcb[i]运行完一个num就减少一个,直到pcb清空为0结束
printf("------------------------------------------------\n"); wait[0].no = -1;
for(i=0,j=0;i<num;i++){ //检查哪个进程到达了并且没有阻塞或者运行中
if(pcb
[i
].
arrtime <= time && pcb
[i
].
state != 'b' ){ pcb[i].state = 'w';
wait[j].priority = pcb[i].priority;
wait[j].no= i; //进程编号进入wait
printf("%d %d \n",wait
[j
].
priority,wait
[j
].
no); j=j+1;
}
}
if(wait[0].no == -1){ //没有进程到达
}
else{
current_pcb = compare(wait); //j-1为到达个数,wait编号1到j-1,max=到达的优先级最高的进程编号
run(); //运行优先级最高的进程
}
printf("进程号 进程优先级 进程到达时间 进程运行时间 进程已用时间 I/O时间\n"); for(int i=0; i<num; i++){
printf("%2d %5d %8d %8d %8d %8d\n",pcb
[i
].
no, pcb
[i
].
priority, pcb
[i
].
arrtime, pcb
[i
].
runtime, pcb
[i
].
cputime, pcb
[i
].
io_num); }
io();
pcb_finish();
/* 输入3
1 90 1 2 1
2 60 2 2 0
3 70 1 1 0*/
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Ci8vICNpbmNsdWRlIDxzdGRsaWIuaD4KCgpzdHJ1Y3QgcGNiCnsKCS8vY2hhciogbmFtZTsKCWludCBubzsJCQkJLy/ov5vnqIvlj7cKCWludCBwcmlvcml0eTsJCS8v5LyY5YWI57qnCglpbnQgYXJydGltZTsJCS8v5Yiw6L6+5pe26Ze0CglpbnQgcnVudGltZTsJCS8v6ZyA6KaB6L+Q6KGM5pe26Ze0CglpbnQgY3B1dGltZTsJCS8v5bey6L+Q6KGM5pe26Ze0CglpbnQgaW9fbnVtOwkJCS8v6ZyA6KaBaW/mrKHmlbDvvIjku6Uxc+S4uuWNleS9je+8iQoJY2hhciBzdGF0ZTsJCQkvL+eKtuaAge+8jOWwsee7qldhaXTvvIhX77yJ44CB6L+Q6KGMUu+8iFJ1bu+8ieOAgeaIlumYu+WhnkLvvIhCbG9ja++8iQp9OwoKc3RydWN0IHBjYiBwY2JbMjBdOwkJLy/miYDmnInov5vnqIsKc3RydWN0IHBjYiB3YWl0WzIwXTsJLy/nrYnlvoXpmJ/liJcKaW50IHRpbWU7CmludCBjdXJyZW50X3BjYjsKaW50IGksaixudW07Cgp2b2lkIHJ1bigpeyAKCXBjYltjdXJyZW50X3BjYl0ucHJpb3JpdHktLTsgICAgICAgICAgICAgICAgICAgCiAgCXBjYltjdXJyZW50X3BjYl0ucnVudGltZS0tOyAgICAgICAgICAgICAgICAgCiAgCXBjYltjdXJyZW50X3BjYl0uY3B1dGltZSsrOyAgICAgICAgICAgICAgICAgCiAgCXBjYltjdXJyZW50X3BjYl0uc3RhdGUgPSAncic7ICAgICAgICAgICAgICAgCiAgCXByaW50Zigi5pe26Ze054mHJWTov5DooYzvvJrov5vnqIsgJWRcbiIsdGltZSxjdXJyZW50X3BjYik7Cn0KaW50IGNvbXBhcmUoc3RydWN0IHBjYiB3YWl0W10pewogLy/mib7lh7rkvJjlhYjnuqfmnIDpq5jnmoQJICAKCSBjdXJyZW50X3BjYj13YWl0WzBdLm5vOwoJIGludCB4OwoJIHggPSB3YWl0WzBdLnByaW9yaXR5OwoJIGZvcihpPTE7aTxqO2krKyl7CgkJIGlmKCB4PCB3YWl0W2ldLnByaW9yaXR5KXsKCQkJIGN1cnJlbnRfcGNiID0gd2FpdFtpXS5ubzsKCQkJIHggPSB3YWl0W2ldLnByaW9yaXR5OwoJCSB9CgkgfQoJIHJldHVybiBjdXJyZW50X3BjYjsgICAgICAgICAgLy/ov5Tlm57ov5DooYznmoTov5vnqIvnvJblj7cKfQoKdm9pZCBpbygpewoJIAkgZm9yKGk9MTtpPD1udW07aSsrKXsKCQkgaWYocGNiW2ldLmlvX251bSA9PTAgJiYgcGNiW2ldLnN0YXRlID09ICdiJyl7CgkJCSBwY2JbaV0uc3RhdGUgPSAndyc7CgkJCSBwY2JbaV0uY3B1dGltZSsrOwoJCSB9CgkJIGlmKHBjYltpXS5pb19udW0+MCAmJiAocGNiW2ldLnN0YXRlID09J2InfHwgcGNiW2ldLnN0YXRlID09ICdyJykgKXsJCSAJCQkJCQoJCQkgcGNiW2ldLmlvX251bS0tOwoJCQkgcGNiW2ldLnN0YXRlID0gJ2InOwkJIAkJCQkKCQkJIHBjYltpXS5jcHV0aW1lKys7CgkJCSB9CgkgfQp9CnZvaWQgcGNiX2ZpbmlzaCgpewoJaW50IG5vOwoJZm9yKGkgPTA7aTxudW07aSsrKXsKCQlpZihwY2JbaV0ucnVudGltZSA9PTApewoJCQlubyA9IHBjYltpXS5ubzsKCQkJcGNiW2ldLm5vID0gcGNiW2krMV0ubm87CgkJCXBjYltpXS5wcmlvcml0eSA9IHBjYltpKzFdLnByaW9yaXR5OwoJCQlwY2JbaV0uYXJydGltZSA9IHBjYltpKzFdLmFycnRpbWU7CgkJCXBjYltpXS5ydW50aW1lID0gcGNiW2krMV0ucnVudGltZTsKCQkJcGNiW2ldLmNwdXRpbWUgPSBwY2JbaSsxXS5jcHV0aW1lOwoJCQlwY2JbaV0uaW9fbnVtID0gcGNiW2krMV0uaW9fbnVtOwoJCQlwY2JbaV0uc3RhdGUgPSBwY2JbaSsxXS5zdGF0ZTsJCQkJIAoJCQludW0tLTsKCQkJcHJpbnRmKCLov5vnqIslZOi/kOihjOWujOavlSIsbm8pOwoJCSB9CgkgfQogfQoKaW50IG1haW4oKQp7CglwcmludGYoIuivt+i+k+WFpei/m+eoi+eahOaVsOmHj++8mlxuIik7CglzY2FuZigiJWQiLCZudW0pOyAKIAlwcmludGYoIui+k+WFpei/m+eoi+WPty7ov5vnqIvkvJjlhYjnuqcu6L+b56iL5Yiw6L6+5pe26Ze0Lui/m+eoi+i/kOihjOaXtumXtC7ov5vnqIvmiYDpnIBJL0/ml7bpl7RcbiIpOyAgICAgICAgICAgCiAJZm9yKGludCBpPTA7IGk8bnVtOyBpKyspewogCQlzY2FuZigiJWQgJWQgJWQgJWQgJWQiLCZwY2JbaV0ubm8sJnBjYltpXS5wcmlvcml0eSwmcGNiW2ldLmFycnRpbWUsJnBjYltpXS5ydW50aW1lLCZwY2JbaV0uaW9fbnVtKTsKIAl9CgogCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS3ml7bpl7TniYcwLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCXByaW50Zigi6L+b56iL5Y+3IOi/m+eoi+S8mOWFiOe6pyDov5vnqIvliLDovr7ml7bpl7Qg6L+b56iL6L+Q6KGM5pe26Ze0IOi/m+eoi+W3sueUqOaXtumXtCBJL0/ml7bpl7RcbiIpOwogCWZvcihpbnQgaT0wOyBpPG51bTsgaSsrKXsgIAkgCgkJcHJpbnRmKCIlMmQgJTVkICU4ZCAlOGQgJThkICU4ZFxuIixwY2JbaV0ubm8sIHBjYltpXS5wcmlvcml0eSwgcGNiW2ldLmFycnRpbWUsIHBjYltpXS5ydW50aW1lLCBwY2JbaV0uY3B1dGltZSwgcGNiW2ldLmlvX251bSk7ICAKIAl9CiAJdGltZSA9IDE7CgoJd2hpbGUobnVtIT0wKXsgICAgICAgICAgICAgLy9wY2JbaV3ov5DooYzlrozkuIDkuKpudW3lsLHlh4/lsJHkuIDkuKos55u05YiwcGNi5riF56m65Li6MOe7k+adnwkgIAoJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgICAgICAgICAgICAgICAgCSAKCQlwcmludGYoIuaXtumXtOeJhyVkXG4iLHRpbWUpOyAgCgkJd2FpdFswXS5ubyA9IC0xOwoJCWZvcihpPTAsaj0wO2k8bnVtO2krKyl7ICAgICAgICAgIC8v5qOA5p+l5ZOq5Liq6L+b56iL5Yiw6L6+5LqG5bm25LiU5rKh5pyJ6Zi75aGe5oiW6ICF6L+Q6KGM5LitCSAKCQkJaWYocGNiW2ldLmFycnRpbWUgPD0gdGltZSAmJiBwY2JbaV0uc3RhdGUgIT0gJ2InICl7CSAKCQkJCXBjYltpXS5zdGF0ZSA9ICd3JzsKCQkJCXdhaXRbal0ucHJpb3JpdHkgPSBwY2JbaV0ucHJpb3JpdHk7ICAgICAgICAKCQkJCXdhaXRbal0ubm89IGk7ICAgICAgICAgICAgICAvL+i/m+eoi+e8luWPt+i/m+WFpXdhaXQKCQkJCXByaW50ZigiJWQgJWQgIFxuIix3YWl0W2pdLnByaW9yaXR5LHdhaXRbal0ubm8pOwoJCQkJaj1qKzE7ICAgICAgICAgICAgICAgCgkJCX0JCQoJCX0KCQlpZih3YWl0WzBdLm5vID09IC0xKXsgICAgICAvL+ayoeaciei/m+eoi+WIsOi+vgoJCQl0aW1lKys7CgkJfQoJCWVsc2V7CgkJCWN1cnJlbnRfcGNiID0gY29tcGFyZSh3YWl0KTsgICAgICAgIC8vai0x5Li65Yiw6L6+5Liq5pWwLHdhaXTnvJblj7cx5Yiwai0x77yMbWF4PeWIsOi+vueahOS8mOWFiOe6p+acgOmrmOeahOi/m+eoi+e8luWPtwkJCgkJCXByaW50ZigiJWQiLGN1cnJlbnRfcGNiKTsKCQkJcnVuKCk7ICAgICAgICAgICAgICAgICAvL+i/kOihjOS8mOWFiOe6p+acgOmrmOeahOi/m+eoiwoJCX0KCgkJcHJpbnRmKCLov5vnqIvlj7cg6L+b56iL5LyY5YWI57qnIOi/m+eoi+WIsOi+vuaXtumXtCDov5vnqIvov5DooYzml7bpl7Qg6L+b56iL5bey55So5pe26Ze0IEkvT+aXtumXtFxuIik7CgkJZm9yKGludCBpPTA7IGk8bnVtOyBpKyspeyAgCSAKCQlwcmludGYoIiUyZCAlNWQgJThkICU4ZCAlOGQgJThkXG4iLHBjYltpXS5ubywgcGNiW2ldLnByaW9yaXR5LCBwY2JbaV0uYXJydGltZSwgcGNiW2ldLnJ1bnRpbWUsIHBjYltpXS5jcHV0aW1lLCBwY2JbaV0uaW9fbnVtKTsgIAogCX0KCgkJaW8oKTsKCQlwY2JfZmluaXNoKCk7ICAgICAgICAgICAKCQl0aW1lKys7CgkJLyog6L6T5YWlMwoJCSAgIDEgOTAgMSAyIDEKCSAgICAgICAyIDYwIDIgMiAwCgkgICAgICAgMyA3MCAxIDEgMCovCiB9CgogCXJldHVybiAwOwp9