用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

c++ 进程调度模拟系统(FIFO,优先数调度算法,时间片轮转调度算法)

2013-03-08 作者: 小蜜锋举报

[c++]代码库

#include<stdio.h>
#include<string.h>
#include<iostream.h>
 
const int block_time=10; //定义时间片的长度为10秒
const int MAXPCB=100; //定义最大进程数
 
 
//定义进程结构体
typedef struct node {
    char name[20];
    int status;
    int time;
    int privilege;
 
    int finished;
    int wait_time;
} pcb;
 
pcb pcbs[MAXPCB];
int quantity;
 
//初始化函数
void initial() {
    int i;
 
    for ( i=0; i<MAXPCB; i++ ) {
        strcpy ( pcbs[i].name,"" );
        pcbs[i].status=0;
        pcbs[i].time=0;
        pcbs[i].privilege=0;
 
        pcbs[i].finished=0;
        pcbs[i].wait_time=0;
    }
 
    quantity=0;
}
 
//读数据函数
int readData() {
    FILE *fp;
    char fname[20];
    int i;
 
    cout<<"请输入进程流文件名:";
    cin>>fname;
    if ( ( fp=fopen ( fname,"r" ) ) ==NULL ) {
        cout<<"错误,文件打不开,请检查文件名"<<endl;
    } else {
        while ( !feof ( fp ) ) {
            fscanf ( fp,"%s %d %d %d",pcbs[quantity].name,&pcbs[quantity].status,&pcbs[quantity].time,&pcbs[quantity
                                                                                                           ].privilege );
            quantity++;
        }
 
//输出所读入的数据
        cout<<"输出所读入的数据"<<endl;
        cout<<"进程名 进程状态 所需时间 优先数"<<endl;
        for ( i=0; i<quantity; i++ ) {
            cout<<" "<<pcbs[i].name<<" "<<pcbs[i].status<<" "<<pcbs[i].time<<" "<<pcbs[i].privilege<<endl;
        }
        return ( 1 );
    }
    return ( 0 );
 
}
 
//重置数据,以供另一个算法使用
void init() {
    int i;
 
    for ( i=0; i<MAXPCB; i++ ) {
 
        pcbs[i].finished=0;
        pcbs[i].wait_time=0;
    }
}
 
 
//先进先出算法
void FIFO() {
    int i,j;
    int total;
 
//输出FIFO算法执行流
    cout<<endl<<"---------------------------------------------------------------"<<endl;
    cout<<"FIFO算法执行流:"<<endl;
    cout<<"进程名 等待时间"<<endl;
    for ( i=0; i<quantity; i++ ) {
        cout<<" "<<pcbs[i].name<<" "<<pcbs[i].wait_time<<endl;
 
        for ( j=i+1; j<quantity; j++ ) {
            pcbs[j].wait_time+=pcbs[i].time;
        }
    }
    total=0;
    for ( i=0; i<quantity; i++ ) {
        total+=pcbs[i].wait_time;
    }
    cout<<"总等待时间:"<<total<<" 平均等待时间:"<<total/quantity<<endl;
 
}
 
//优先数调度算法
void privilege() {
    int i,j,p;
    int passed_time=0;
    int total;
 
    int queue[MAXPCB];
    int current_privilege=1000;
 
    for ( i=0; i<quantity; i++ ) {
        current_privilege=1000;
        for ( j=0; j<quantity; j++ ) {
            if ( ( pcbs[j].finished==0 ) && ( pcbs[j].privilege<current_privilege ) ) {
                p=j;
                current_privilege=pcbs[j].privilege;
            }
        }
        queue[i]=p;
        pcbs[p].finished=1;
        pcbs[p].wait_time+=passed_time;
        passed_time+=pcbs[p].time;
    }
 
//输出优先数调度执行流
    cout<<endl<<"---------------------------------------------------------------"<<endl;
    cout<<"优先数调度执行流:"<<endl;
    cout<<"进程名 等待时间"<<endl;
    for ( i=0; i<quantity; i++ ) {
        cout<<" "<<pcbs[queue[i]].name<<" "<<pcbs[queue[i]].wait_time<<endl;
    }
 
    total=0;
    for ( i=0; i<quantity; i++ ) {
        total+=pcbs[i].wait_time;
    }
    cout<<"总等待时间:"<<total<<" 平均等待时间:"<<total/quantity<<endl;
 
}
 
//时间片轮转调度算法
void timer() {
    int i,j,number,flag=1;
    int passed_time=0;
    int max_time=0;
    int round=0;
 
    int queue[1000];
    int total=0;
 
    while ( flag==1 ) {
        flag=0;
        number=0;
 
        for ( i=0; i<quantity; i++ ) {
            if ( pcbs[i].finished==0 ) {
                number++;
                j=i;
            }
        }
 
        if ( number==1 ) {
            queue[total]=j;
            total++;
            pcbs[j].finished=1;
        }
 
        if ( number>1 ) {
 
            for ( i=0; i<quantity; i++ ) {
                if ( pcbs[i].finished==0 ) {
                    flag=1;
                    queue[total]=i;
                    total++;
                    if ( pcbs[i].time<=block_time* ( round+1 ) ) {
                        pcbs[i].finished=1;
                    }
                }
            }
        }
        round++;
    }
 
    if ( queue[total-1]==queue[total-2] ) {
        total--;
    }
 
    cout<<endl<<"---------------------------------------------------------------"<<endl;
    cout<<"时间片轮转调度执行流:";
    for ( i=0; i<total; i++ ) {
        cout<<pcbs[queue[i]].name<<" ";
    }
 
 
}
 
//显示版权信息函数
void version() {
    cout<<endl<<endl;
 
    cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
    cout<<" ┃       进程调度模拟系统         ┃"<<endl;
    cout<<" ┠───────────────────────┨"<<endl;
    cout<<" ┃   (c)All Right Reserved Neo       ┃"<<endl;
    cout<<" ┃      sony006@163.com          ┃"<<endl;
    cout<<" ┃     version 2004 build 1122      ┃"<<endl;
    cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
    cout<<endl<<endl;
}
 
 
//主函数
void main() {
    int flag;
 
    version();
 
    initial();
 
    flag=readData();
 
    if ( flag==1 ) {
        FIFO();
        init();
 
        privilege();
        init();
 
        timer();
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...