操作系统实验一内容2——用C语言编写进程调度程序-创新互联
实验说明:FZU的操作系统课程的实验一
创新互联主营苏州网站建设的网络公司,主营网站建设方案,app软件定制开发,苏州h5成都微信小程序搭建,苏州网站营销推广欢迎苏州等地区企业咨询
实验目的
实验内容
实验要求
流程图
下面是C语言代码(个人所做,不保证完美无漏洞,仅供参考,杜绝无脑照搬)【粉丝专享注释代码】
#include#includetypedef struct process{int need;//需要时间 (1+)
int priority;//优先级(0-99)
char name[20];//名字(20以内)
int run;//已运行
}Process;
typedef struct PCB * Link;
typedef struct PCB{Link next;
Process * pro;
}PCB;
int main(){int N;//进程数
int NEEDS;//总需要的时间片
Link l;//链表头指针
printf("\n请输入进程总个数?");
scanf("%d",&N);
Process p[N];//创建进程
Link pcbhead =(Link)malloc (sizeof (PCB));
pcbhead->next = NULL;
pcbhead->pro = NULL;
printf("\n已创建进程数为%d信息的空间",N);
int i=0;//循环变量
int j;//循环变量
//输入信息
while(i++printf("\n\n进程号No.%d:\n\n输入进程名(长度为20的字符内):",i-1);
scanf("%s",&p[i-1].name);
printf("\n输入进程优先数(0~99):");
scanf("%d",&p[i-1].priority);
printf("\n输入进程运行时间(自然数):");
scanf("%d",&p[i-1].need);
p[i-1].run = 0;
NEEDS+=p[i-1].need;
//创建链表
Link t = (Link)malloc (sizeof (PCB));//新增节点
l = pcbhead;
t->next = NULL;
t->pro = &p[i-1];
if(l->pro == NULL){ l->next = t->next;
l->pro = t->pro;
// printf("赋值表头");
}
else{ Link ht = NULL;
int isinsert = 0;
for(l= pcbhead;l;ht=l,l = l->next){ if(l->pro->priority >= p[i-1].priority)continue;
if(ht == NULL){t->next=pcbhead;
pcbhead=t;
// printf("\n插入表头前");
}
else{t->next = ht->next;
// printf("\n插入表中");
ht->next=t;
}
isinsert = 1;
break;
}
if(isinsert == 0){ t->next = ht->next;
// printf("\n插入表后");
ht->next=t;
}
}
}
printf("\n");
// printf("\n序列目前如下\n");
// //处理编排就绪队列
// for(l= pcbhead;l;l = l->next){// printf("%s\n",l->pro->name);
// }
//过程
i = 0;
l=pcbhead;
while(i++printf("\n输入任意按键继续...");
getch();
printf("\n *-*-*-*-*-*-*-* The execute number: %d *-*-*-*-*-*-*-\n",i);
printf("\n *-*-*-*-* 当前正在运行的进程是: %s *-*-*-*-*\n",l->pro->name);
printf("p_name\tstate\tsuper\tndtime\truntime\n");
printf("%s\t%s\t%d\t%d\t%d\n",l->pro->name,"R",l->pro->priority,l->pro->need,l->pro->run);
//就绪队列
Link lt = l;
printf("\n *-*-*-*-* 当前就绪队列状态为: *-*-*-*-*\n");
for(lt=lt->next;lt;lt=lt->next){ printf("\np_name\tstate\tsuper\tndtime\truntime\n");
printf("%s\t%s\t%d\t%d\t%d\n",lt->pro->name,"w",lt->pro->priority,lt->pro->need,lt->pro->run);
}
//更新PCB
if(l->pro->priority>0)l->pro->priority--;
l->pro->run++;
//刷新队列
if(l->pro->run == l->pro->need){ //运行完毕释放
printf("\n时间片到期,此时进程 [%s] 已完成.",l->pro->name);
lt=l;
l=l->next;
free(lt);
}
else{ //若不为最后一个则取出插入
if(l->next){ lt=l;
Link ht = NULL;
l=l->next;
Link ll;//循环指针
int isinsert = 0;//是否在循环中插入
for(ll=l;ll;ht=ll,ll = ll->next){if(ll->pro->priority >= lt->pro->priority)continue;
if(ht == NULL){lt->next=l;
l=lt;
// printf("\n插入表头前");
}
else{lt->next = ht->next;
// printf("\n插入表中");
ht->next=lt;
}
isinsert = 1;
break;
}
if(isinsert == 0){lt->next = ht->next;
// printf("\n插入表后");
ht->next=lt;
}
}
}
}
if(N>0){printf("\n\n\n进程已全部完成.\n");
getch();
}
return 0;
}
程序流程图
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前名称:操作系统实验一内容2——用C语言编写进程调度程序-创新互联
转载源于:http://ybzwz.com/article/cddisp.html