操作系统实验——处理机调度模拟(C++)
一、实验目的
本实验模拟实现处理机调度及内存回收机制,以对处理机调度的工作原理以及内存管理的工作过程进行更深的了解。
二、实验基本思想
实验采用C++与Qt来实现处理机的调度模拟。
需求分析
本次处理机调度模拟程序主要分为以下模块:
① 输入模块:在任意时间片可以添加新进程。
② 挂起模块:在任意时间片可以对内存中进程进行挂起,转移至外存。
③ 运行模块:程序核心模块,从当前就绪队列中选取优先级最高的进程运行。当就绪队列存在空闲时从后背队列/解挂程序中调取适当程序加入就绪队列;当有进程运行完成时,需释放内存,同时调取合适进程加入就绪队列。
④ 显示模块:界面设计,显示当前各进程信息。
对于进程运行状态,分别设置四个队列进行存储:
ReadyQueue:就绪队列,已分配内存进程。
BackQueue:后备队列,由于道数限制等原因未加入内存进程。
SuspendQueue:挂起队列,存储挂起进程,位于外存。
UnsuspendQueue:解挂对接,进程已解挂,但由于道数限制等原因未加入就绪队列。
此外利用freeMemory记录空闲页表,totalMemory数组模拟内存空间。
总体设计
流程图

三、具体实现
(1)基本数据结构
1、PCB类,表示进程
class PCB {
public:
int pid; //进程pid
int time; //运行时间
int priority; //优先级
string state; //进程状态
int base; //分配内存基址
int memory; //占用内存
PCB(int p=0,int t=0,int pri=0,int m=0):
pid(p),time(t),priority(pri),state("后备状态"),base(-1),memory(m){}
string output(); //带基址输出,用于进程在内存中的信息显示
string output2(); //无基址输出,用于进程不在内存中的信息显示
};
2、 处理机运行类,用于模拟处理机对进程的调度运行
class QtWidgetsApplication : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication(QWidget *parent = Q_NULLPTR);
int checkMemory(PCB&); //检查是否有足够内存满足当前进程,有则返回空闲表序号
void outputTextBrowser(); //进程详细信息输出
void refreshFreeMemory(PCB&); //刷新空闲页表
void paintEvent(QPaintEvent*); //刷新示意图区域
private slots:
void InitWidget(); //窗口清洗和按键激活
void activeInputButton(); //激活InputButton按钮
void NextClock(); //运行,进入下一时间片
void Input(); //进程输入
void SuspendButton(); //进程挂起
void UnsuspendButton(); //进程解挂
void Single_processor(); //单处理机
void Dual_processor(); //双处理机
private:
Ui::QtWidgetsApplicationClass ui;
int current_time=0;
int readyLimit = 5; //就绪队列道数限制
int proSign=0; //处理机选择
int nextSign = 0; //表示已经开始执行调度
QVector<int> TotalMemory; //模拟内存,限制100,默认OS已占据0~20(其实实验中这个不设置也没什么关系,只要空闲表就够了)
QVector<QVector<int>> freeMemory; //空闲页表,[i][0]基址,[i][1]长度
QVector<PCB> ReadyQueue; //就绪队列,限制5
QVector<PCB> BackQueue; //后备队列
QVector<PCB> SuspendQueue; //挂起队列
QVector<PCB> UnsuspendQueue; //用于记录已解挂进程
};
(2)输入函数(Input)设计
基本思路:流程图

(3)运行函数(NextClock)设计
基本思路:程序框图

(4)进程挂起函数(SuspendButton)
基本思路:流程图

(5)进程解挂函数(UnsuspendButton)
流程图

(6)内存检测函数(checkMemory)
流程图

(7)内存释放函数(refreshFreeMemory)
基本思路:通过返还的基址,找到在空闲表中的位置,并判断是否会与上下空闲段相连,相连则合并。
流程图

剩下函数的流程都比较简单,就不画流程图了。
四、运行结果
运行界面如下:

五、代码链接
如有问题,望指出。
代码地址:
https://download.csdn.net/download/qq_44117953/12547278
网盘自提: 链接
提取码: ntd8

3565

被折叠的 条评论
为什么被折叠?



