模拟抢占式优先权调度算法(C++)

抢占式优先权调度算法
在这种方式下,系统把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。

具体代码:

#include <iostream>
#include <string>
#include <vector>

using namespace std;
using std::cout;

struct PCB
{
    // 进程名
    string name;
    // 到达时间
    int arrivetime;
    // 运行时间
    int runtime;                
    // 仍需运行时间
    int resttime;
    // 开始时间
    int starttime;
    // 完成时间
    int endtime;
    // 运行次数
    int runcount;
    // 周转时间
    int zhouzhuangtime;
    // 带权周转时间(周转时间/运行时间)
    double weightzhouzhuangtime;
    // 优先级(静态)
    int priority;

    PCB *next;
};

// 进程数
int num_process;
// 记录所有进程的总时间
int totaltime;
// 记录所有进程的总带权周转时间
double weighttotaltime;

PCB *createPCB()
{
    int i;
    // 定义队首、队尾
    PCB *head, *rear;
    // 初始化
    head = rear = NULL;
    // 临时指针变量
    PCB *p;

    cout<<"请输入进程数量:";
    cin>>num_process;

    for(i = 0; i < num_process; i++)
    {
        // 初始化一个空间给进程
        p = new PCB;

        cout<<"请依次输入第"<<i+1<<"个进程的信息(进程名、优先级、到达时间、运行时间):"<<endl;
        cin>>p->name>>p->priority>>p->arrivetime>>p->runtime;
        p->resttime = p->runtime;
        p->runcount = 1;
        totaltime += p->runtime;
        p->starttime = 0;
        p->endtime = 0;
        p->zhouzhuangtime = 0;
        p->weightzhouzhuangtime = 0;
        p->next = NULL;

        // 存入链表中
        if(rear == NULL)
        {
            head = p;
            rear = p;
        }
        else
        {
            rear->next = p;
            rear = p;
        }

    }
    return head;
}

// 链表插入排序
PCB *insertSort(PCB *head)
{
    /*
        1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点;
        2、从待定节点中取节点,插入到有序链表中相应位置;
        3、实际上只有一条链表,在排序中,实际只增加了一个用于指向剩下需要排序节点的头指针。
    */
    PCB *first
  • 6
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抢占静态优先权调度算法是一种进程调度算法,它根据进程的静态优先级来决定进程的调度顺序。在Java中,可以使用以下步骤来实现非抢占优先权调度算法: 1. 定义一个进程控制块(PCB)类,包含作业名、到达时间、服务时间、优先级、开始执行时间、完成时间、周转时间、带权周转时间等属性。 2. 创建一个进程队列,将所有进程按照到达时间从小到大排序。 3. 定义一个优先级比较器,用于将进程按照优先级从高到低排序。 4. 循环遍历进程队列,每次选择优先级最高的进程进行执行,直到所有进程都执行完毕。 下面是Java代码的一个简单实现: ```java import java.util.*; class PCB { String threadName; // 作业名 int timeArrival; // 到达时间 int timeSever; // 服务时间 int priority; // 优先级 int timeStart; // 开始执行时间 int timeComplete; // 完成时间 int timeTurnaround; // 周转时间 double timeWeightedTurnaround; // 带权周转时间 public PCB(String threadName, int timeArrival, int timeSever, int priority) { this.threadName = threadName; this.timeArrival = timeArrival; this.timeSever = timeSever; this.priority = priority; } } class PriorityComparator implements Comparator<PCB> { public int compare(PCB p1, PCB p2) { return p2.priority - p1.priority; } } public class NonPreemptivePriorityScheduling { public static void main(String[] args) { List<PCB> processList = new ArrayList<PCB>(); processList.add(new PCB("P1", 0, 5, 3)); processList.add(new PCB("P2", 1, 3, 1)); processList.add(new PCB("P3", 2, 8, 2)); processList.add(new PCB("P4", 3, 6, 4)); Collections.sort(processList, new Comparator<PCB>() { public int compare(PCB p1, PCB p2) { return p1.timeArrival - p2.timeArrival; } }); int currentTime = 0; for (PCB process : processList) { process.timeStart = currentTime; process.timeComplete = currentTime + process.timeSever; process.timeTurnaround = process.timeComplete - process.timeArrival; process.timeWeightedTurnaround = (double) process.timeTurnaround / process.timeSever; currentTime = process.timeComplete; } Collections.sort(processList, new PriorityComparator()); System.out.println("作业名\t到达时间\t服务时间\t优先级\t开始时间\t完成时间\t周转时间\t带权周转时间"); for (PCB process : processList) { System.out.println(process.threadName + "\t" + process.timeArrival + "\t\t" + process.timeSever + "\t\t" + process.priority + "\t\t" + process.timeStart + "\t\t" + process.timeComplete + "\t\t" + process.timeTurnaround + "\t\t" + process.timeWeightedTurnaround); } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值