进程调度——优先数算法
来源:互联网 发布:淘宝店铺类目修改 编辑:程序博客网 时间:2024/05/18 01:37
自己写的小程序,实验作业,有什么不对的地方还请高手指导啊啊啊啊-------------
#include<stdio.h>
#include<stdlib.h>
typedef struct process {
int symbol;//进程号
struct process *conn;//指向下一个进程的指针,但是饿哦写的程序中没有用到,只是赋了值
int ordernum;//优先数,通过优先数排序决定进程占用cpu顺序,后面的程序中党两个进程优先数相等时,也要交换位置
int cpunum;//占用cpu的时间,初值为0
int neednum;//进程所需要执行的时间
int state;//进程状态,1表示ready,2表示running,3表示over,初始化时为1
}pro;
#include<stdlib.h>
typedef struct process {
int symbol;//进程号
struct process *conn;//指向下一个进程的指针,但是饿哦写的程序中没有用到,只是赋了值
int ordernum;//优先数,通过优先数排序决定进程占用cpu顺序,后面的程序中党两个进程优先数相等时,也要交换位置
int cpunum;//占用cpu的时间,初值为0
int neednum;//进程所需要执行的时间
int state;//进程状态,1表示ready,2表示running,3表示over,初始化时为1
}pro;
void createpro(pro *p) {//此函数通过输入创建进程
int sy, co, ord, cpu, nee, stat;//刚开始的时候输入写的比较复杂。。。
printf("Symbol");
scanf("%d",&sy);
printf("ordernum");
scanf("%d",&ord);
printf("cpunum");
scanf("%d",&cpu);
printf("neednum");
scanf("%d",&nee);
printf("state");
scanf("%d",&stat);
p->symbol = sy;
p->ordernum = ord;
p->cpunum = cpu;
p->neednum = nee;
p->state = stat;
}
//另外下面注释掉的三个函数都是一开始不知道怎么给结构体排序写的。。。
/*
测试数据
1
12
0
3
1
2
9
0
4
1
3
6
0
2
1
4
3
0
3
1
12
0
3
1
2
9
0
4
1
3
6
0
2
1
4
3
0
3
1
*/
/*int reordernum(pro* p) {
return p->ordernum;
/*int reordernum(pro* p) {
return p->ordernum;
}*/
void inorder(pro *p[], int n) {//进程根据ordernum进行冒泡排序
int i = 0, j;
pro *t;
for (i = 0; i<n - 1; i++) {
for (j = i + 1; j<n; j++) {
if (p[i]->ordernum<=p[j]->ordernum) {
t = p[i];
p[i] = p[j];
p[j] = t;
}
}
}
int i = 0, j;
pro *t;
for (i = 0; i<n - 1; i++) {
for (j = i + 1; j<n; j++) {
if (p[i]->ordernum<=p[j]->ordernum) {
t = p[i];
p[i] = p[j];
p[j] = t;
}
}
}
}
/*void ordernow(pro *pp[], int n, int p[]) {
int i = 0;
for (i = 0; i<n; i++) {
p[i] = pp[i]->ordernum;
}
将ordernum保存到p数组中,然后给p数组排序,然后再调用forder
int i = 0;
for (i = 0; i<n; i++) {
p[i] = pp[i]->ordernum;
}
将ordernum保存到p数组中,然后给p数组排序,然后再调用forder
}*/
void reorder(pro *p) {//进程执行时所做的动作,优先数减三,cpunum++,neednum--
int t,c,need;
t = p->ordernum;
t = t - 3;
p->ordernum = t;
c=p->cpunum;
c=c+1;
p->cpunum=c;
need=p->neednum;
need=need-1;
p->neednum=need;
int t,c,need;
t = p->ordernum;
t = t - 3;
p->ordernum = t;
c=p->cpunum;
c=c+1;
p->cpunum=c;
need=p->neednum;
need=need-1;
p->neednum=need;
}
int jud(pro *p) {//判断简称是否运行完毕,即是否运行了它所需要的时间
int need,n;
need = p->neednum;
if (need ==0) {
n = -1;
}
return n;
}
int need,n;
need = p->neednum;
if (need ==0) {
n = -1;
}
return n;
}
int delate(int n) {//将当前的可运行进程减掉一个
n--;
return n;
}
n--;
return n;
}
/*void forder(pro *pp[], int p[], int n,pro *pr[]) {
int i = 0, j = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (pp[j]->ordernum == p[i]) {
pr[i] = pp[j];
pp[j]->ordernum = -100;
}
}
}
是用来通过int数组将pp数组中的pro重新排序i并且存放到pr里面
int i = 0, j = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (pp[j]->ordernum == p[i]) {
pr[i] = pp[j];
pp[j]->ordernum = -100;
}
}
}
是用来通过int数组将pp数组中的pro重新排序i并且存放到pr里面
}*/
void main()
{
pro *p1 = (pro *)malloc(sizeof(pro));//分配空间
pro *p2 = (pro *)malloc(sizeof(pro));
pro *p3 = (pro *)malloc(sizeof(pro));
pro *p4 = (pro *)malloc(sizeof(pro));
int n = 0, coun = 0, judge,j,k,u,countnum;
pro *pp[10];//存放可运行进程
pro *gameover[10];//存放运行完毕进程
//int p[10];原来用来存放ordernum
createpro(p1);//设置每个进程具体参数
coun++;//记录可运行
createpro(p2);
coun++;
createpro(p3);
coun++;
createpro(p4);
coun++;
pp[0]=p1;//将初始化完毕后的进程存入数组中,其实可以直接赋值,不过最初是这样写的
pp[1]=p2;
pp[2]=p3;
pp[3]=p4;
judge = coun;//这个变量后面用来记录可运行的进程数,不过其实可以直接用coun
countnum=0;//用来记录over的进程数
char c;//调试用,可以删掉
while(judge!=0&&(c=getchar())=='\n'){//可运行进程数不为0时进行循环
inorder(pp,judge);//根据ordernum排序,因为ordernum的顺序不一定是1234的顺序,虽然测试数据是这样
j=jud(pp[0]);//判断队首元素是否已经运行完,即neednum=0
if (j == -1) {
countnum++;
pp[0]->state=3;//将状态设置为over
gameover[countnum]=pp[0];//放入over数组中
printf("process %d is over!\n",pp[0]->symbol);
for(u=0;u<judge-1;u++){
pp[u]=pp[u+1];
}//将该进程从可运行进程数组中删掉
judge = delate(judge);//可运行进程数--
}
{
pro *p1 = (pro *)malloc(sizeof(pro));//分配空间
pro *p2 = (pro *)malloc(sizeof(pro));
pro *p3 = (pro *)malloc(sizeof(pro));
pro *p4 = (pro *)malloc(sizeof(pro));
int n = 0, coun = 0, judge,j,k,u,countnum;
pro *pp[10];//存放可运行进程
pro *gameover[10];//存放运行完毕进程
//int p[10];原来用来存放ordernum
createpro(p1);//设置每个进程具体参数
coun++;//记录可运行
createpro(p2);
coun++;
createpro(p3);
coun++;
createpro(p4);
coun++;
pp[0]=p1;//将初始化完毕后的进程存入数组中,其实可以直接赋值,不过最初是这样写的
pp[1]=p2;
pp[2]=p3;
pp[3]=p4;
judge = coun;//这个变量后面用来记录可运行的进程数,不过其实可以直接用coun
countnum=0;//用来记录over的进程数
char c;//调试用,可以删掉
while(judge!=0&&(c=getchar())=='\n'){//可运行进程数不为0时进行循环
inorder(pp,judge);//根据ordernum排序,因为ordernum的顺序不一定是1234的顺序,虽然测试数据是这样
j=jud(pp[0]);//判断队首元素是否已经运行完,即neednum=0
if (j == -1) {
countnum++;
pp[0]->state=3;//将状态设置为over
gameover[countnum]=pp[0];//放入over数组中
printf("process %d is over!\n",pp[0]->symbol);
for(u=0;u<judge-1;u++){
pp[u]=pp[u+1];
}//将该进程从可运行进程数组中删掉
judge = delate(judge);//可运行进程数--
}
else//neednum!=0时
{
for(u=0;u<judge-1;u++){//给进程中指向下一个进程的指针赋值,只赋值coun-1个
pp[u]->conn=pp[u+1];
}
printf("now!\n");//打印出未运行时pp0的参数值
printf("cpunum = %d",pp[0]->cpunum);
for(k=0;k<5;k++){
printf(" ");
}
printf("neednum = %d",pp[0]->neednum);
for(k=0;k<5;k++){
printf(" ");
}
printf("ordernum = %d\n",pp[0]->ordernum);
pp[0]->state=2;//将队首元素状态设为running
printf("process========");
printf("%d",pp[0]->symbol);
printf("is running!\n");
reorder(pp[0]);//改变运行进程的参数值
printf("reorder!\n");//打印出运行后的参数值,可以对比发现变化
printf("cpunum = %d",pp[0]->cpunum);
for(k=0;k<5;k++){
printf(" ");
}
printf("neednum = %d",pp[0]->neednum);
for(k=0;k<5;k++){
printf(" ");
}
printf("ordernum = %d\n",pp[0]->ordernum);
printf("\n");
if(pp[0]->neednum==0){//判断是否有进程运行完毕
pp[0]->state=3;
}
else{
pp[0]->state=1;
}
for(k=0;k<judge;k++){//打印出当前ready和over进程
if(pp[k]->state==1){
printf("process %d is ready to run!\n",pp[k]->symbol);
}
}
for(k=0;k<judge;k++){
if(pp[k]->state==3){
printf("process %d is over!\n",pp[k]->symbol);
}
}
printf("\n");
}
{
for(u=0;u<judge-1;u++){//给进程中指向下一个进程的指针赋值,只赋值coun-1个
pp[u]->conn=pp[u+1];
}
printf("now!\n");//打印出未运行时pp0的参数值
printf("cpunum = %d",pp[0]->cpunum);
for(k=0;k<5;k++){
printf(" ");
}
printf("neednum = %d",pp[0]->neednum);
for(k=0;k<5;k++){
printf(" ");
}
printf("ordernum = %d\n",pp[0]->ordernum);
pp[0]->state=2;//将队首元素状态设为running
printf("process========");
printf("%d",pp[0]->symbol);
printf("is running!\n");
reorder(pp[0]);//改变运行进程的参数值
printf("reorder!\n");//打印出运行后的参数值,可以对比发现变化
printf("cpunum = %d",pp[0]->cpunum);
for(k=0;k<5;k++){
printf(" ");
}
printf("neednum = %d",pp[0]->neednum);
for(k=0;k<5;k++){
printf(" ");
}
printf("ordernum = %d\n",pp[0]->ordernum);
printf("\n");
if(pp[0]->neednum==0){//判断是否有进程运行完毕
pp[0]->state=3;
}
else{
pp[0]->state=1;
}
for(k=0;k<judge;k++){//打印出当前ready和over进程
if(pp[k]->state==1){
printf("process %d is ready to run!\n",pp[k]->symbol);
}
}
for(k=0;k<judge;k++){
if(pp[k]->state==3){
printf("process %d is over!\n",pp[k]->symbol);
}
}
printf("\n");
}
}
}
但是有一个问题。。。。。
此时已经判断1neednum=0,即处于over状态,但是它还处于pp【】数组中,没有从中删除并且进入gameover数组
此时1才从pp中删除,后面也是这样的情况。。。。。
0 0
- 进程调度——优先数算法
- 进程调度—最大优先数
- 模拟实现进程调度——采用高优先数优先和先来服务算法
- C语言模拟最高优先数优先进程调度算法
- Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
- Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
- 进程调度实验(最高优先数优先算法)的java实现
- 进程调度算法模拟,用动态优先数及时间片轮转法实现进程调度_Java语言模拟实现
- 进程调度算法 短作业优先 SJF
- 短进程优先的调度算法详解
- 短进程优先的调度算法详解
- c++模拟操作系统进程调度算法(优先数,时间片轮转)
- 进程调度算法(优先数法和简单轮转法)C/C++
- 操作系统——进程调度之短进程优先
- 操作系统——进程调度之短进程优先
- 操作系统——进程调度之短进程优先
- 按优先数调度算法实现处理器调度的程序
- 进程调度的优先数法和简单轮转法
- 14.6 设置后台线程
- AJAX
- 系统学习机器学习之神经网络(二) --MLP实现及源码分析
- iOS中之RSA加密和解密篇
- Library not loaded: @rpath/AFNetworking.framework
- 进程调度——优先数算法
- 浅谈Android架构之MVP,MVVM
- ffmpeg 视频抽取音频,视音频分离
- ionic的在Android手机运行
- 解决视频在微信公众平台中无法播放的问题(python实现)
- WebApi 接口参数:传参详解 和动态类dynamic
- GET与POST比较-使用HTTP协议将客户端的请求传送到服务器端的两种方式
- Java常用的八种排序算法与代码实现
- 1086. Tree Traversals Again (25)