c++ 操作系统实验 进程调度

来源:互联网 发布:光纤交换机端口 编辑:程序博客网 时间:2024/06/05 21:05

实验一  进程调度

实验学时:4学时

实验类型:设计

实验要求:必修

一、 实验目的

多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。

二、 实验内容

1. 优先权法、轮转法

简化假设

1) 进程为计算型的(无I/O

2) 进程状态:readyrunningfinish

3) 进程需要的CPU时间以时间片为单位确定

2. 算法描述

1) 优先权法——动态优先权

当前运行进程用完时间片后,其优先权减去一个常数。

2) 轮转法

三、 流程图


 


四、实验要求

1. 产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。

2. 进程数n不要太大通常取4~8

3. 使用动态数据结构

4. 独立编程

五、实验报告

主要包括实验预习和实验报告两部分。

学生在上机做实验前,要根据教师布置的题目,对实验内容应作相应的预习,编写相关程序,准备好测试数据,进行静态检查后方可上机。

实验结束后,根据实验过程和结果写出实验报告,主要内容包括对实验数据、实验中的特殊现象、实验操作的成败、实验的关键点等内容进行整理、解释、分析总结,回答思考题,提出实验结论或提出自己的看法等。

严禁抄袭或拷贝他人的成果,自觉培养科学、严谨的作风。

六、其它说明

学生在实验过程中应遵守实验室的各项规章制度,注意人身和设备安全,配合和服从实验室人员管理。

该程序来源于网路,根据实验要求略作修改运行环境vc++6.0

/*①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。 ②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 ③在优先数算法中,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的队尾上。 ④对于遇到优先数一致的情况,采用FIFO策略解决。*/#include <iostream>#include <vector>#include <algorithm>#include <iomanip>#include <ctime>using namespace std;//优先权法pcbclass PCB//类定义PCB表,适用于优先数{public:    int ID;    int priority;    int CPUtime;//runnedtime    int ALLtime;//needtime    int State;//1ready 2runing 3finish    int flag;//flag=1 finished    void set_PCB(int a,int b,int c,int d, int e,int f)    {        ID=a;        priority = b;        CPUtime=c;        ALLtime=d;        State=e;        flag=f;    }};//轮转法pcbclass PCB2{public:    int ID;    int CPUtime;    int ALLtime;    int State;    int flag;    void set_PCB2(int a,int b,int c,int d, int e)    {        ID=a;        CPUtime=b;        ALLtime=c;        State=d;        flag=e;    }};bool priority_sort_higher(const PCB &m, const PCB &n)//sort函数,定义按优先数排序,当优先数相同时按序号排序(即先进先出)/priority high id small{    if(m.priority == n.priority) return m.ID < n.ID;    return m.priority > n.priority;}void priority_way(vector <PCB> &pcb, vector<PCB> &wait,int pcbnum)//优先数算法{    vector<PCB>::iterator it1;    it1 = pcb.begin();    int flag = pcbnum;    while(flag)    {        wait.erase(wait.begin());        (*it1).State = 2;        (*it1).priority -= 3;        (*it1).CPUtime  += 1;        (*it1).ALLtime -= 1;        if((*it1).ALLtime == 0)        {            flag -= 1;            (*it1).flag =1;            cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl;            pcb.erase(pcb.begin());            sort(wait.begin(), wait.end(), priority_sort_higher);            sort(pcb.begin(), pcb.end(), priority_sort_higher);        }        else        {            cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl;            (*it1).State = 1;            wait.push_back(*it1);            sort(wait.begin(),wait.end(),priority_sort_higher);            sort(pcb.begin(),pcb.end(),priority_sort_higher);        }    }}void round_robin_way(vector <PCB2> &pcb2,vector<PCB2> &wait2)//时间片,every 2{    vector<PCB2>::iterator it2;    it2 = wait2.begin();    int flag=5;    while(flag)    {        it2 = pcb2.begin();        wait2.erase(wait2.begin());//出队(等待队列)        (*it2).State = 2;        if((*it2).ALLtime==1)        {            (*it2).CPUtime +=1;            (*it2).ALLtime -=1;            flag -= 1;            (*it2).flag = 1;            cout << left << setw(10) << (*it2).ID << setw(10) << (*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;            pcb2.erase(pcb2.begin());            continue;        }        else if((*it2).ALLtime==2)        {            (*it2).CPUtime +=2;            (*it2).ALLtime -=2;            flag-=1;            (*it2).flag =1;            cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;            pcb2.erase(pcb2.begin());            continue;        }        else        {            (*it2).State = 2;            (*it2).CPUtime +=2;            (*it2).ALLtime -=2;            cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;            (*it2).State = 2;            wait2.push_back(*it2);            PCB2 q = *it2;            pcb2.erase(pcb2.begin());            pcb2.push_back(q);        }    }}int random(int start, int end){    return start+(end-start)*rand()/(RAND_MAX + 1.0);}int main( ){cout<<"-------------------------------模拟进程调度----------------------------------"<<endl;srand(unsigned(time(0)));    int flag_0;    cout<<"请输入想要模拟进程调度算法的编号"<<endl;    cout<<"1.优先数调度;2.时间片轮转调度。" <<endl;    cin>>flag_0;int pcbnum=0;cout<<"创建进程数量:";cin>>pcbnum;int pro,time;    if(flag_0 == 1)    {vector<PCB> pcb;        cout<<"创建"<<pcbnum<<"个进程,即将设置随机优先数与运行时间(优先数越大优先级越高)"<<endl;        for( int i = 1; i <= pcbnum; i++)        {            pro=random(1,30);time=random(1,20);            PCB q;            q.set_PCB(i,pro,0,time,1,0);cout<<"id:"<<i<<" "<<"priority:"<<pro<<" "<<"Alltime:"<<time<<endl;            pcb.push_back(q);        }        sort(pcb.begin(),pcb.end(),priority_sort_higher);//按优先数排序,利用sort函数        vector<PCB> wait(pcbnum);        copy(pcb.begin(),pcb.end(),back_inserter(wait));        cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl;        cout <<left<<setw(10)<< "ID"<<setw(10)<<"State"<<setw(10)<<"priority"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime "<<setw(10)<<"flag1" << endl;        priority_way(pcb,wait,pcbnum);    }    else if(flag_0 ==2)    {        vector <PCB2> pcb2;        vector<PCB2>::iterator it2;        it2 = pcb2.begin();cout<<"创建"<<pcbnum<<"个进程,即将设置随机优先数与运行时间(优先数越大优先级越高)"<<endl;        for(int i = 1; i <= 5; i++)        {time=random(1,20);            PCB2 q2;            q2.set_PCB2(i,0,time,1,0);cout<<"id:"<<i<<" "<<"Alltime:"<<time<<endl;            pcb2.push_back(q2);        }        vector<PCB2> wait2(pcbnum);        copy(pcb2.begin(),pcb2.end(),back_inserter(wait2));        cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl;        cout << left<<setw(10)<< "ID"<<setw(10)<<"State"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime "<<setw(10)<<"flag1" << endl;        round_robin_way(pcb2, wait2);    }    cout<<"----------------------------------END--------------------------------------"<<endl;    return 0;}


原创粉丝点击