操作系统 程序设计作业2——进程调度 (C++实现)

本文介绍了如何使用C++编写一个程序,模拟多个进程在操作系统中的调度执行。程序使用链表组织进程控制块(PCB),包含自由、就绪和运行三个队列。用户输入进程数量及运行时间,调度算法随机选取就绪进程执行。时间片设为2,当进程执行完毕,其PCB返回自由队列。文章展示了代码片段和运行结果。
摘要由CSDN通过智能技术生成

题目

请编写一个程序,模拟若干进程调度执行的情况。假设进程的状态分为执行和就绪两种。
每个进程以其PCB为代表即可,无需创建真正的进程。
链表的方式组织PCB,分为三个队列:
freeQueue:一个空白PCB队列
readyQueue:一个就绪队列
runningQueue:一个执行队列

程序开始运行时,用户输入进程数量n,以及每个进程需要运行的时间t0/t1/…/tn。
程序从空白PCB队列中取出PCB创建进程,插入readyQueue。
进程的调度采用随机的方式,即从就绪队列中随机选择一个进程投入运行(就是将该PCB中的状态变量赋值为“运行”)。相应的修改其所在队列,并且原来处于运行态的进程需要转变为“就绪”态,插入readyQueue。
假设时间片是2,进程每次调度运行后,其还需运行的时间应该减少2,直至为0,即表示该进程执行完毕。需要回收PCB到freeQueue
每次发生调度的时候,需要打印信息示例:

Sched: P0(Running -> Ready), P3(Ready -> Running)
Running: P3
Ready: P1->P2->P0

上述信息表示调度时P0处于运行态,选择P3运行,P0进程的PCB进入就绪队列,并且在队尾。就绪队列是按照队列节点次序输出进程名称。
示例片段代码:
#define free 0
#define ready 1
#define running 2
#define ts 2 /* time slice /
struct PCB {
int pid; /
进程ID /
int pstate; /
进程状态 */
char pname; / 映象名称 /
int ptime; /
剩余运行时间 */
struct PCB pnext; / 下一个PCB */
}

代码

//
// Created by Jintao on 2019/12/14.
//


// 题目:
// 请编写一个程序,模拟若干进程调度执行的情况。假设进程的状态分为执行和就绪两种。
// 每个进程以其PCB为代表即可,无需创建真正的进程。以链表的方式组织PCB,分为三个队列:
// freeQueue:一个空白PCB队列
// readyQueue:一个就绪队列
// runningQueue:一个执行队列
//
// 程序开始运行时,用户输入进程数量n,以及每个进程需要运行的时间t0/t1/…/tn。
// 程序从空白PCB队列中取出PCB创建进程,插入readyQueue。
//
// 进程的调度采用随机的方式,即从就绪队列中随机选择一个进程投入运行(就是将该PCB中的状态变量赋值为“运行”)。
// 相应的修改其所在队列,并且原来处于运行态的进程需要转变为“就绪”态,插入readyQueue。
// 假设时间片是2,进程每次调度运行后,其还需运行的时间应该减少2,直至为0,即表示该进程执行完毕。需要回收PCB到freeQueue。
// 每次发生调度的时候,需要打印信息示例:
//
// Sched: P0(Running -> Ready), P3(Ready -> Running)
// Running: P3
// Ready: P1->P2->P0
//
// 上述信息表示调度时P0处于运行态,选择P3运行,P0进程的PCB进入就绪队列,并且在队尾。就绪队列是按照队列节点次序输出进程名称。



#include <cstring>
#include<cstdio>
#include<cstdlib>
#include<ctime>

const int timeSlice = 2; // 时间片
/// 进程状态 枚举
enum struct PState {
   
    free, ready, running
};


struct PCB {
   
    int pid;  // 进程id
    PState pstate;  // 进程状态
    char name[20];  // 进程名称 P0, P1, P2...
    int time;  // 剩余运行时间
    PCB *next;  // 下一个PCB

    PCB() : next(nullptr) {
   }

    PCB(int pid, PState pstate, char *name, int time, PCB *next) :
            pid(pid), pstate(pstate), time(time), next(next) {
   
        strcpy(this->name, name);
    }

};

/// PCB链表
struct PCBList {
   
    PCB *head;
    int length;

    PCBList() : length(0) {
   
        head = new PCB;
    }

    ~PCBList() {
   
        __freeAllPCB();
        
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值