动态优先权算法

1.设计目的与要求

1.1设计目的

        通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。

1.2设计要求

        本实验要求学生独立地用C或C++语言编写一个简单的进程管理程序,其主要部分是进程调度。调度算法可由学生自行选择,如基于动态优先级的调度算法。通过本实验可加深学生对进程各种状态的转化和各种调度算法的理解,提高系统程序设计能力。

2.设计思想及系统平台

2.1设计思想

1)数据结构

        用来标识进程的进程控制块使用结构体pcb来描述,包含以下字段:进程标识数id;进程优先数priority;进程已占用的CPU时间cputime;进程还需占用的CPU时间alltime;进程的阻塞时间startblock;进程被阻塞的时间blocktime;进程状态state,0为就绪,1为阻塞,2为完成。

        进程队列有三个,分别为就绪队列Readyqueue、阻塞队列Blockqueue、结束队列Finishqueue,类型为vector<pcb>。

2)算法

        基于动态优先级的调度算法。

3)优先数改变原则

        进程在就绪队列中呆一个时间片,优先数增加1,进程每运行一个时间片优先数减3。

2.2系统平台及使用语言

        CodeBlocks,C++

3.详细算法描述

        就绪转结束:当运行进程的alltime<=0时,进程结束;

        就绪转阻塞:当运行进程的startblock为0时,进程阻塞;

        阻塞转就绪:阻塞进程的blocktime为0时,进程转为就绪状态。

 4.源代码

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
struct pcb
{
    int id ;
    int priority;//优先权
    int cputime;//已占用的cpu时间片
    int alltime;//还需要的时间
    int startblock;//运行多少个时间片之后开始进入阻塞队列
    int blocktime;//阻塞的时间
    int state;//状态,0为就绪,1为阻塞,2为完成
};
vector<pcb> Readyqueue; //就绪队列
vector<pcb> Blockqueue;//阻塞队列
vector<pcb> Finishqueue;//结束队列
struct pcb process[5]={
	{0,9,0,3,2,3,0},
	{1,38,0,3,-1,0,0},
	{2,30,0,6,-1,0,0},
	{3,29,0,3,-1,0,0},
	{4,0,0,4,-1,0,0}
};
//排序
void sort()
{
    if(Readyqueue.empty()&&Blockqueue.empty())
        return;
    else
    {
        for(unsigned i=0;i<Readyqueue.size()-1;i++)
        {
            for(unsigned j=i+1;j<Readyqueue.size();j++)
            {
                //优先权低就交换顺序
                if (Readyqueue[i].priority < Readyqueue[j].priority)
                {
                    swap(Readyqueue[i],Readyqueue[j]);
                }
            }
        }
    }
}
void print(vector<pcb> tempqueue)
{
    cout<<"id | priority | cputime | alltime ";
    cout<<"| startblock | blocktime | state"<<endl;
    for(unsigned i=0;i<tempqueue.size();i++)
    {
        printf("%-6d",tempqueue[i].id);
        printf("%-11d",tempqueue[i].priority);
        printf("%-10d",tempqueue[i].cputime);
        printf("%-10d",tempqueue[i].alltime);
        printf("%-13d",tempqueue[i].startblock);
        printf("%-12d",tempqueue[i].blocktime);
        printf("%-6d",tempqueue[i].state);
        printf("\n");
    }
}
void display()
{
    if(!Readyqueue.empty())
    {
        cout<<"正在运行:"<<Readyqueue[0].id<<endl;
        cout<<"就绪队列:";
        for(unsigned i=1;i<Readyqueue.size();i++)
        {
            if(Readyqueue[i].state==0)
            {
                cout<<"->"<<Readyqueue[i].id;
            }
        }
        cout<<endl;
    }
    if(!Blockqueue.empty())
    {
        cout<<"阻塞队列:";
        for(unsigned i=0;i<Blockqueue.size();i++)
        {
            if(Blockqueue[i].state==1)
            {
                cout<<"->"<<Blockqueue[i].id;
            }
        }
        cout<<endl;
    }
    if (!Readyqueue.empty())
    {
        cout<<"就绪队列"<<endl;
        print(Readyqueue);
    }
    if (!Blockqueue.empty())
    {
        cout<<"阻塞队列"<<endl;
        print(Blockqueue);
    }
    if (!Finishqueue.empty())
    {
        cout<<"完成队列"<<endl;
        print(Finishqueue);
    }
}
void run()
{
	if(!Readyqueue.empty())
    {
        Readyqueue[0].priority-=3;
        Readyqueue[0].alltime--;
        Readyqueue[0].cputime++;
        //判断是否结束
        if(Readyqueue[0].alltime<=0)
        {
            //就绪转结束队列
            Readyqueue[0].state=2;
            Finishqueue.push_back(Readyqueue[0]);
            Readyqueue.erase(Readyqueue.begin()+0);
        }
        //判断是否进行阻塞
        if(Readyqueue[0].startblock>=0&&Readyqueue[0].blocktime>0)
        {
            Readyqueue[0].startblock--;
            if(Readyqueue[0].startblock==0)//就绪转阻塞队列
            {
                Readyqueue[0].state=1;
                Blockqueue.push_back(Readyqueue[0]);
                Readyqueue.erase(Readyqueue.begin()+0);
            }
        }
        //修改不在运行的线程情况
        for (unsigned i=1;i<Readyqueue.size();i++)
        {
            Readyqueue[i].priority++;
        }
    }
    //阻塞转就绪队列
	if(!Blockqueue.empty())
	{
        for(unsigned i=0;i<Blockqueue.size();i++)
        {
            Blockqueue[i].blocktime--;
            if(Blockqueue[i].blocktime==0)
            {
                Blockqueue[i].state=0;
                Readyqueue.push_back(Blockqueue[i]);
                Blockqueue.erase(Blockqueue.begin()+0);
            }
        }
	}
}
int main()
{
    for(int i=0;i<5;i++)
    {
        Readyqueue.push_back(process[i]);
    }
    int sign=0;
	while(!Readyqueue.empty())
	{
	    sign++;
	    cout<<endl<<endl<<"时间片:"<<sign<<endl;
		sort();
		run();
		display();
	}
	cout<<"运行时序为";
	for(int i=0;i<5;i++)
    {
        cout<<Finishqueue[i].id<<"->";
    }
    cout<<"END"<<endl;
    return 0;
}

5.运行结果

 

 

 

 

实验报告:操作系统-动态优先权算法资源-CSDN文库 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态优先权算法是一种用于进程调度的算法,其基本思想是根据进程的优先级来进行进程调度。在这种算法中,每个进程都被赋予一个优先级,优先级越高的进程越先被调度。 下面是一个简单的动态优先权算法模拟实验: 首先,我们需要定义一个进程的数据结构,包含进程的ID、到达时间、服务时间和优先级: ``` struct Process { int id; int arrival_time; int service_time; int priority; }; ``` 接下来,我们需要编写一个函数,用于根据进程的到达时间将进程按顺序添加到等待队列中: ``` void addProcessToQueue(int currentTime, vector<Process>& processes, queue<Process>& waitingQueue) { for (int i = 0; i < processes.size(); i++) { if (processes[i].arrival_time == currentTime) { waitingQueue.push(processes[i]); } } } ``` 然后,我们需要编写一个函数,用于根据进程的优先级从等待队列中选择一个进程进行调度: ``` Process selectProcessToSchedule(queue<Process>& waitingQueue) { Process selectedProcess = waitingQueue.front(); queue<Process> tempQueue = waitingQueue; while (!tempQueue.empty()) { Process currentProcess = tempQueue.front(); tempQueue.pop(); if (currentProcess.priority > selectedProcess.priority) { selectedProcess = currentProcess; } } return selectedProcess; } ``` 接下来,我们需要编写一个函数,用于模拟进程的执行过程,并更新等待队列中的进程优先级: ``` void executeProcess(Process& process, int currentTime, vector<Process>& processes, queue<Process>& waitingQueue) { process.service_time--; if (process.service_time == 0) { for (int i = 0; i < processes.size(); i++) { if (processes[i].id != process.id && processes[i].arrival_time <= currentTime && waitingQueue.front().priority < processes[i].priority) { processes[i].priority--; } } waitingQueue.pop(); } else { for (int i = 0; i < processes.size(); i++) { if (processes[i].id != process.id && processes[i].arrival_time <= currentTime && waitingQueue.front().priority <= processes[i].priority) { processes[i].priority++; } } waitingQueue.pop(); waitingQueue.push(process); } } ``` 最后,我们需要编写一个函数,用于模拟整个进程调度过程: ``` void simulate(int numProcesses, vector<Process>& processes) { queue<Process> waitingQueue; int currentTime = 0; while (!waitingQueue.empty() || currentTime == 0) { addProcessToQueue(currentTime, processes, waitingQueue); if (!waitingQueue.empty()) { Process selectedProcess = selectProcessToSchedule(waitingQueue); executeProcess(selectedProcess, currentTime, processes, waitingQueue); cout << "Time " << currentTime << ": Process " << selectedProcess.id << " executed." << endl; } else { cout << "Time " << currentTime << ": Processor idle." << endl; } currentTime++; } } ``` 使用上述函数,我们可以模拟动态优先权算法的执行过程,从而更好地理解该算法的工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值