📜  使用优先队列实现非抢占式最短作业优先(1)

📅  最后修改于: 2023-12-03 15:36:38.068000             🧑  作者: Mango

使用优先队列实现非抢占式最短作业优先

在操作系统中,最短作业优先算法是一种流行的调度算法,它考虑了进程的作业大小,以此来进行进程调度。同时,非抢占式表示一旦进程开始执行,则不会被其他进程中断。

使用优先队列实现非抢占式最短作业优先算法是一种常见的实现方式,下面将介绍其实现方式和相关代码。

实现方式

首先,需要定义一个进程结构体,包括进程的ID,作业大小等信息。然后,将所有进程放入一个优先队列中,使用优先队列的性质进行调度,即每次从队列中取出作业大小最小的进程执行。

同时,由于是非抢占式调度,每次只有一个进程在执行,因此可以使用一个全局变量来保存当前正在执行的进程,以便其他进程可以等待。

在每个进程完成后,可以将该进程从优先队列中移除,并将全局变量中的当前执行进程设为NULL,以便下一个进程执行。

相关代码
#include <iostream>
#include <queue>
#include <string>

struct Process {
    int id;
    int job_size;
};

// Define a comparison function for Process
struct CompareProcess {
    bool operator()(Process const& p1, Process const& p2) {
        // Compare job_size of two process
        return p1.job_size > p2.job_size;
    }
};

// Define a global variable to store the current executing process
Process* current_process = NULL;

void execute_process(Process* p) {
    // Simulate executing process
    std::cout << "Executing process: " << p->id << std::endl;
    for (int i = 0; i < p->job_size; i++) {
        // Do some work
    }
    std::cout << "Finished process: " << p->id << std::endl;
}

int main() {
    std::priority_queue<Process, std::vector<Process>, CompareProcess> pq;

    // Add some processes to priority queue
    pq.push({1, 30});
    pq.push({2, 15});
    pq.push({3, 20});

    // Execute processes in priority order
    while (!pq.empty()) {
        Process p = pq.top();
        pq.pop();

        // Execute process if there is no current executing process
        if (current_process == NULL) {
            current_process = &p;
            execute_process(&p);
            current_process = NULL;
        }
        // If there is a current executing process, push process back to priority queue
        else {
            pq.push(p);
        }
    }

    return 0;
}

代码说明:

首先,定义了一个进程结构体Process,包括进程的ID和作业大小等信息。

使用了一个std::priority_queue来存储所有进程,使用CompareProcess比较函数进行进程优先级排序。

在主函数中,首先添加了一些进程到优先队列中,并执行进程,最后输出执行结果。

在执行进程时,首先判断当前是否有进程正在执行。若没有,则将当前执行进程设为该进程,并调用execute_process函数执行进程。执行完进程后,将执行进程设为NULL,以便其他进程可以等待执行。若当前有进程正在执行,则将该进程放回优先队列,等待下一次执行。

以上就是使用优先队列实现非抢占式最短作业优先的方式和相关代码。