2020-11-14:进程调度算法(C++)——操作系统

本文介绍了在多道系统中处理机调度的重要性,并详细说明了实验目的——模拟实现包括FCFS、SJF、PSA和RR在内的四种调度算法。通过提供C++源代码和测试数据,帮助读者深入理解这些调度算法的工作原理。

操作系统——进程调度算法【FCFS:先到先服务,SJF:短进程优先,PSA:优先权调度算法, RR:时间片轮转调度算法】


1. 实验目的:

多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机,本实验模拟实现处理机调度,以加深了解处理机调度的工作

2. 实验内容:

选择一个调度算法,实现处理机调度。
FCFS(先到先服务),SJF(短进程优先) ,PSA(优先权调度算法), RR(时间片轮转调度算法)

3. 源代码:

进程调度算法(C++)完整代码的链接
以下为代码架构

#include <iostream>
#include<string.h>
//#include <queue>
//#include <time.h>
#define RE 'r'
#define R 'R'
#define F 'F'    //RE(ready):就绪   R(running):执行   F(finished):完成

using namespace std;


typedef struct
{
    //PCB内容:
    char Pid[10];//进程名/PID
    float time;//要求运行时间(单位时间)
    int Priority;//优先级(L:链表长度)      个人规定:Priority越小,优先级越高
    char state;//状态   RE(ready):就绪   R(running):执行   F(finished):完成
    float arrival_time;//到达时间
    float StartTime;//开始时间
    float EndTime;//结束时间(L:最早到达的进程时间)
    //float used_time;//已用CPU时间

}PCB;

typedef struct node
{
    PCB data;
    struct node *next;
}Lnode, *Llist;


void PrintPCB(Llist L)		//代码完整
{
    //cout<<"\n\tPrintPCB()\n";
    //cout<<"\n\t进程名\t要求运行时间\t优先权\t状态\t到达时间\t开始时间\t结束时间\t已用CPU时间\n";
    Llist p;
    p = L->next;
    while(p)
    {
        cout<<'\t'<<p->data.Pid<<"\t"<<p->data.time<<"\t\t"<<p->data.Priority<<"\t"<<p->data.state <<"\t"<<p->data.arrival_time<<"\t\t"<<p->data.StartTime<<"\t\t"<<p->data.EndTime<<endl;
        p = p->next;
    }
    cout<<"\n\n";
}

void CreateProcess(Llist &L)    //尾插法		代码完整
{
    cout<<"\n\tCreateProcess()\n";
    L = new Lnode;
    L->next = NULL;

    Llist r, s;
    s = L;

    int n;  //链表长度
    cout<<"输入要创建的进程个数:";
    cin>>n;
    L->data.Priority = n;
    //L->data.EndTime = 9999;

    cout<<"输入"<<n<<"行以下信息:\n进程名\t要求运行时间\t优先权\t到达时间\n";
    for(int i=0; i<n; i++)
    {
        r = new Lnode;
        //PCB内容:
        cin>>r->data.Pid>>r->data.time>>r->data.Priority>>r->data.arrival_time;
        r->data.state = RE;   //RE(ready):就绪   R(running):执行   F(finished):完成
        r->data.StartTime = 0;
        r->data.EndTime = 0;

        /*if( r->data.arrival_time < L->data.EndTime )
            L->data.EndTime = r->data.arrival_time;
        r->data.used_time = 0;*/

        s->next = r;
        s = r;
    }
    s->next = NULL;
	/*
    if(L->data.EndTime == 9999)
        L->data.EndTime = 1;
	*/
    cout<<"\n\t进程名\t要求运行时间\t优先权\t状态\t到达时间\t开始时间\t结束时间\n";
    PrintPCB(L);

}

//代码完整的三个Exchange()函数
void Exchange(char *a, char* b)//交换
{
    char c;
    c = *a;
    *a = *b;
    *b = c;
}
void Exchange(int *a, int* b)//交换
{
    //cout<<"\n\tExchange(int)\n";
    int c;
    c = *a;
    *a = *b;
    *b = c;
}
void Exchange(float *a, float* b)//交换
{
    //cout<<"\n\tExchange(float)\n";
    float c;
    c = *a;
    *a = *b;
    *b = c;
}


void sort_list(Llist &L, int change=1, int direction=1 )  //单链表排序,direction>0:升序(默认);否则,降序
{ //1.float time;要求运行时间(默认)    2.int Priority;优先级(链表长度)    3.float arrival_time;到达时间

//代码空缺

}

void PrintP(Llist p)	//代码完整
{
    //cout<<"\n\tPrintP()\n";
    cout<<'\t'<<p->data.Pid<<"\t"<<p->data.time<<"\t\t"<<p->data.Priority<<"\t"<<p->data.state <<"\t"<<p->data.arrival_time<<"\t\t"<<p->data.StartTime<<"\t\t"<<p->data.EndTime<<endl;
}

void classify( Llist &will_waiting, Llist &waiting, float cputime)//从will_waiting(cputime之外的进程结点)中,选取结点插入waiting(cputime时间之内)
{

//代码空缺


}

void FCFS(Llist L)//先到先服务,按3.arrival_time(到达时间)升序排序
{

//代码空缺


}

void SJF(Llist L)//短进程优先,按1.time(要求运行时间(单位时间))升序排序
{
    //该算法基本与PSA(Llist L)(优先级调度算法)相同,时间问题就不写了
}

void PSA(Llist L)//优先级调度算法(非抢占方式),个人规定:Priority越小,优先级越高     按2.Priority;优先级(链表长度)升序排序
{

//代码空缺


}

void RR(Llist L)//时间片轮转调度算法(遵循FCFS),优先级高的先服务,相同时FCFS   个人规定:Priority越小,优先级越高,所以优先权降一级为:Priority++
{

//代码空缺


}


int main()		//代码完整
{
    int flag = 1;//退出标志
    char a;//选项

    Llist L;
    CreateProcess(L);
    //PrintPCB(L);

    while(flag)
    {
        cout<<"*********************************************"<<endl;
        cout<<("\t F. FCFS(先到先服务) \n");
        //cout<<("\t S. SJF(短进程优先) \n");
        cout<<("\t P. PSA(优先权调度算法) \n");
        cout<<("\t R. RR(时间片轮转调度算法) \n");
        cout<<("\t Q. EXIT(退出) \n");
        cout<<"*********************************************"<<endl;
        cout<<"输入想要的操作:";
        cin>>a;
        strupr(&a);
        cout<<"\n\t进程名\t要求运行时间\t优先权\t状态\t到达时间\t开始时间\t结束时间\n";
        switch(a)
        {
            case 'Q':
                flag=0;
                break;
            case 'F':
                FCFS(L);
                break;
            /*case 'S':
                SJF(L);
                break;*/
            case 'P':
                PSA(L);
                break;
            case 'R':
                RR(L);
                break;
            default:
                cout<<"error!"<<endl;
                break;
        }

    }

    return 0;
}

4 测试数据:

输入格式:
3
a 3 2 1
e 4 3 1
r 3 2 2

5 运行结果

图一
图二

图三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈晨辰熟稳重

让我看看是哪个靓仔支持了我!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值