编写C程序模拟实现单处理机系统中进程调度,实现对多个进程的调度模拟,要求采用多级反馈队列调度算法进行模拟调度。(江西师范大学)

编写C程序模拟实现单处理机系统中进程调度,实现对多个进程的调度模拟,要求采用多级反馈队列调度算法进行模拟调度。

数据结构设计:PCB:结构体;就绪队列:每个节点为进程PCB;进程状态

具体调度算法:FCFS、SJF、PR;涉及多种操作:排序、链表操作

程序输出设计:调度进程的顺序、每个进程的起始时间、终止时间等CPU每次调度的过程

分析:关于链表的一些功能,如果说能够使用STL的话,能省去手写链表的时间,且更加安全。

然后是对多个进程之间的模拟调度,可以用STL的queue来模拟队列,然后用vector来代替链表。

记住,在c++里面,用了对应的一些功能的函数,可能是要加上一些头文件的。

这里因为是用了vector,所以加了头文件#include<vector>

同时也用了queue,所以加上了#include<queue>

下面是运行结果:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

// 进程结构体,包含进程ID、需要运行的时间、剩余运行时间和所在的队列
struct Process {
    int pid;
    int time_needed;
    int remaining_time;
    int queue_level;
};

int main() {
    int n, m, quantum;
    cout << "Enter the number of queues: ";
    cin >> n;
    cout << "Enter the number of processes: ";
    int num_processes;
    cin >> num_processes;
    cout << "Enter the number of time slices for each queue: ";
    cin >> quantum;

    // 创建 n 个队列
    vector<queue<Process>> queues(n);

    // 输入进程信息
    for (int i = 0; i < num_processes; i++) {
        Process p;
        cout << "Enter the process ID: ";
        cin >> p.pid;
        cout << "Enter the time needed for the process: ";
        cin >> p.time_needed;
        p.remaining_time = p.time_needed;
        p.queue_level = 0; // 初始时所有进程都在最高优先级队列
        queues[0].push(p);
    }

    // 模拟调度过程,每次处理一个时间片
    int current_time = 0;
    while (true) {
        bool all_queues_empty = true;
        for (int current_level = 0; current_level < n; current_level++) {
            if (queues[current_level].empty()) continue;
            all_queues_empty = false;
            Process p = queues[current_level].front();
            queues[current_level].pop();

            // 输出当前时间片运行的进程
            cout << "Time " << current_time << " - Running process " << p.pid << " in queue " << current_level << endl;

            // 运行当前时间片
            p.remaining_time -= quantum;

            // 如果进程还未执行完,则将其加入下一级队列中
            if (p.remaining_time > 0) {
                p.queue_level = min(current_level + 1, n - 1);
                queues[p.queue_level].push(p);
            }
        }
        if (all_queues_empty) break;
        current_time += quantum;
    }

    return 0;
}

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
处理器系统进程调度 1.实验目的 加深对进程概念的理解,明确进程程序的区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式; 进程的创建; 进程调度。 3.实验内容 编写程序完成处理机系统进程调度要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。 4.提示与讲解 这个实验主要要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。 考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统,无论进程控制块信息量多少,信息都可以大致分为以下四类: ① 标识信息 每个进程都要有一个惟一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序采用编号方式,也就是为每个进程依次分配一个不相同的正整数。 ② 说明信息 用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放位置、进程数据存放位置等等。实验,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。 ③ 现场信息 现场信息记录各个寄存器的内容。当进程由于某种原因让出处理器时,需要将现场信息记录在进程控制块,当进行进程调度时,从选进程进程控制块读取现场信息进行现场恢复。现场信息就是处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态字寄存器等。在实验,可选取几个寄存器作为代表。用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字寄存器。 ④ 管理信息 管理信息记录进程管理和调度的信息。例如进程优先数、进程队列指针等。实验,仅包括队列指针。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值