欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

操作系统实验--进程调度(FCFS,PF,SJF,HRRN)

程序员文章站 2022-03-05 09:54:29
...
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;
#define MAX 10  //进程最多个数

struct JCB{
string name;
float comeTime;//到的时间
float runTime;//运行所需时间
float sTime;//开始运行时间
float eTime;//结束运行时间
int priority;//优先级
int flag;//运行标志
float T;//周转时间
float W;//带权周转时间
};
JCB run[MAX];//最多有10个进程
int num;//实际进程个数
int choice;//算法选择

void input();
void clear_();
int FCFS();//先来先服务
int PS();//优先级调度
int SJF();//短作业优先
int HRRN();//最高响应比优先
void output();


int main()
{
    /*
    cout<<"请选择算法"<<endl;
    cout<<"1--先来先服务"<<endl;
    cout<<"2--优先级调度"<<endl;
    cout<<"3--短作业优先"<<endl;
    cout<<"4--最高响应比优先"<<endl;
    cout<<"0--退出"<<endl;
    cin>>choice;
    input();
    switch(choice)
    {
        case 0: exit(0);
        case 1: FCFS(); break;
        case 2: PS(); break;
        case 3: SJF(); break;
        case 4: HRRN(); break;
        default: exit(1);
    }
    output();
    */
    input();
    do{
            clear_();
    cout<<"请选择算法"<<endl;
    cout<<"1--先来先服务"<<endl;
    cout<<"2--优先级调度"<<endl;
    cout<<"3--短作业优先"<<endl;
    cout<<"4--最高响应比优先"<<endl;
    cout<<"0--退出"<<endl;
    cin>>choice;
    switch(choice)
    {
        case 0: exit(0);
        case 1: FCFS(); break;
        case 2: PS(); break;
        case 3: SJF(); break;
        case 4: HRRN(); break;
        default: exit(1);
    }
    output();
    }while(choice!=0);

    return 0;
}
void input()
{
    cout<<"请输入进程个数(不超过10): ";
    cin>>num;
    int i;
    for(i=0;i<num;i++)
    {
        cout<<"进程"<<i+1<<"的名字: ";
        cin>>run[i].name;
        cout<<"进程"<<i+1<<"的到达时间: ";
        cin>>run[i].comeTime;
        cout<<"进程"<<i+1<<"运行所需时间: ";
        cin>>run[i].runTime;
       // if(choice==2)
        //{
            cout<<"进程"<<i+1<<"的优先级: ";
            cin>>run[i].priority;
        //}
    }
    if(i==num)
        cout<<"输入结束!"<<endl;
}
void clear_()//清除进程标识
{
    for(int i=0;i<num;i++)
    run[i].flag=0;
}
int FCFS()//先来先服务
{
    int temp=run[0].comeTime;
    for(int i=0;i<num;i++)
    {
        if(run[i].comeTime<=temp)
        {
            run[i].sTime=temp;
            run[i].eTime=temp+run[i].runTime;
            temp=run[i].eTime;
        }
        else{
            temp=run[i].comeTime;
            run[i].sTime=temp;
            run[i].eTime=temp+run[i].runTime;
            temp=run[i].eTime;
        }
    }
    return 0;
}
int PS()//优先级调度
{

    int x=0;//将被调度的进程序号
    int max_priority=run[0].priority;
    float temp=run[0].comeTime;//当前时间
    for(int j=1;j<num;j++)
    {
        if(run[j].comeTime==run[0].comeTime&&run[j].priority>max_priority)//与第一个进程同时到达的进程,且优先级大于第一个进程
        {
            max_priority=run[j].priority;
            x=j; //求优先级最高的进程序号
        }
    }
    temp=run[x].comeTime;
    run[x].sTime=temp;
    run[x].eTime=run[x].runTime+temp;
    temp=run[x].eTime;
    run[x].flag=1;
    //确定第一个调度的进程

    int counter=1;
    int a=0;//在当前时间前到达的进程数目
    while(counter<num)
    {
        max_priority=0;
        for(int j=0;j<num;j++)
        {
            if(run[j].comeTime<=temp&&run[j].flag==0)//在当前时间内到达且未被标记的进程
            {
                a++;
                if(run[j].priority>max_priority)
                {
                    max_priority=run[j].priority;
                    x=j;//求优先级最高的进程序号
                }
            }
        }
        if(a==0)//如果当前时间内没有进程到达,时间跳转
            temp=run[x+1].comeTime;
        else//当前时间内有进程到达
        {
            run[x].flag=1;
            run[x].sTime=temp;
            run[x].eTime=temp+run[x].runTime;
            temp=run[x].eTime;
            counter++;
        }
    }
    return 0;

}
int SJF()//短作业优先
{
    float min_time=run[0].runTime;
    float temp=run[0].comeTime;
    int x=0;
    for(int i=1;i<num;i++)
    {
        if(run[i].comeTime==temp&&run[i].runTime<min_time)//与第一个进程同时到达的进程,且运行时间小于第一个进程
        {
            min_time=run[i].runTime;
            x=i;//求运行时间最短的进程序号
        }
    }
    temp=run[x].comeTime;
    run[x].sTime=temp;
    run[x].eTime=temp+run[x].runTime;
    temp=run[x].eTime;
    run[x].flag=1;
    //确定第一个被调度的进程

    int counter=1;
    int a=0;//当前时间内到达的进程数目

    while(counter<num)
    {
        min_time=100;
        for(int i=0;i<num;i++)
        {
            if(run[i].comeTime<=temp&&run[i].flag==0)//在当前时间内到达且未被标记的进程
            {
                a++;
                if(run[i].runTime<min_time)
                {
                    min_time=run[i].runTime;
                    x=i;//求最短运行时间的进程序号
                }
            }
        }
        if(a==0)//如果当前时间内没有进程到达,时间跳转
            temp=run[x+1].comeTime;
        else//当前时间内有进程到达
        {
            run[x].flag=1;
            run[x].sTime=temp;
            run[x].eTime=temp+run[x].runTime;
            temp=run[x].eTime;
            counter++;
        }
    }
    return 0;
}