作業系統實驗——實驗1《CPU Scheduling》&&實驗二《Allocation & Reclaim》
作業系統實驗——實驗1《CPU Scheduling》&&實驗二《Allocation & Reclaim》
注:以下程式碼為實驗一和實驗二的結合體,即為實驗二的最後結果
實驗一
實驗目的
多道系統中,當就緒程式數大於處理機數時,須按照某種策略決定哪些程式優先佔用處理機。本實驗模擬實現處理機排程,加深瞭解處理機排程的工作過程。
實驗內容
選擇一個排程演算法,實現處理機排程。
1)設計一個按優先權排程演算法實現處理機排程的程式;
2)設計按時間片輪轉實現處理機排程的程式。
實驗方法
1)構建程式PCB,PCB內容包括:程式名/PID;要求執行時間(單位時間);優先權;狀態:PCB指標;
2)設定後備佇列和掛起佇列,設計作業排程演算法、程式排程演算法,以及掛起、解掛功能;
3)採用圖形介面,動態展示排程過程中各程式及佇列變化。
實驗步驟
需求分析
① 可以手動增加程式,並按優先順序排序;
② 採用動態優先權排程,從就緒佇列選程式執行,執行一個時間單位後,優先權減1,執行時間減1,執行時間為0時,撤銷該程式;
③ 採用圖形介面,動態展示排程過程中各程式及佇列變化;
⑤ 規定一定道數,同時設定後備和掛起;
⑥ 如果記憶體中程式少於規定道數,可自動從後備佇列通過作業排程選擇一作業進入,作業排程演算法可自行選擇;
⑦ 選擇被掛起的程式,進入掛起佇列,並設定解掛的功能用於將被掛起的程式解掛加入就緒佇列;
概要設計
① 設計圖形化介面,整體分為五大區域:後備佇列、就緒佇列、掛起佇列、執行區域、增加程式的區域;
② 增加程式區域:通過20個類比現實應用的按鈕,實現動態增加程式;
③ 當增加的程式數<道數,則直接進入就緒佇列,否則進入後備佇列進行等待;
④ 在就緒佇列中可以選擇程式掛起,被掛起的程式數與就緒佇列中的程式數之和不得大於道數;
⑤ 為實現優先順序排程,對進入各個佇列的程式按照優先順序進行排序,優先順序高者先進入CPU執行;
⑥ 每執行一次,該程式的優先順序減一,執行時間減一,當執行時間為0時,程式結束。當執行時間不為0時,重新根據當前狀態加入佇列之中
⑦ 各種功能的實現主要通過按鈕的點選,每一個程式增加按鈕,實現動態新增,掛起和解掛均通過按鈕實現。執行與結束也是通過按鈕實現。
⑧ 後備佇列、就緒佇列、掛起佇列通過表格來呈現,通過List來實現
詳細設計
① 設計PCB,包含程式名,程式優先順序,執行時間,當前狀態(分為四個狀態:後備、等待、執行、結束)
② 設計介面,初始化介面狀態,共有7個Label,4個控制按鈕,20個增加程式的按鈕,3個顯示當前執行內容的textField
③ 初始化表格initTable(),再每次更新時,方便重寫
④ 初始化20個程式,initPCB();
⑤ 三個更新表格的函式,通過重寫,實時展示結果updateReadyTable(); updateWaitTable();
updateGuaqiTabel();
⑥ 設定判斷該程式進入哪一個佇列的函式,enter(PCB p);
⑦ 對於已經加入的程式,根據優先順序排序的函式QList
listSort(QList l);
⑧ 對於每一個按鈕設定槽函式,20個程式的槽函式基本一致。點選執行時,就緒佇列,後續佇列均會發生改變,點選結束執行,則所有程式結束
⑨ 當選中一個想要掛起的佇列時,點選掛起即可,解掛亦是。
⑩ 介面美化設計,同時兼顧使用者友好互動,設定大量提示語句
執行結果
基礎介面
增加程式
成功加入程式,道數為6,先增加的六個進入就緒佇列,後增加的三個進入後備佇列
此時已經將QQ掛起,選擇PPT和點選掛起後,可以將PPT也掛起
執行過程,掛起佇列不參與執行
wechat執行時間減至0,該程式結束
實驗二
實驗目的
幫助瞭解在不同的儲存管理方式下,應怎樣實現主存空間的分配和回收
實驗內容
在可變分割槽管理方式下,採用最先適應演算法實現主存空間的分配和回收
實驗方法
1、自行假設主存空間大小,預設作業系統所佔大小並構造未分分割槽表;
表目內容:起址、長度、狀態(未分/空表目)
2、結合實驗一,PCB增加為:
{PID,要求執行時間,優先權,狀態,所需主存大小,主存起始位置,PCB指標}
3、採用最先適應演算法分配主存空間;
4、程式完成後,回收主存,並與相鄰空閒分割槽合併。
實驗步驟
需求分析
① 提供固定大小的主存空間
② 當程式進入作業佇列時,首先判斷記憶體是否足夠使其進入
③ 使用連續分配中的可變分割槽分配每一個程式的記憶體
④ 作業系統本身佔據一定的記憶體
⑤ 採用最先適應演算法,即從0開始查詢,只要存在可以進入的空間,就存入此段記憶體
⑥ 在實驗一的基礎上採用圖形化介面表示
⑦ 當程式執行結束後,回收主存,並與相鄰的空閒分割槽合併
概要設計
① 通過一個固定長度的表格表示記憶體空間,並表明使用該段記憶體的程式的名稱,長度,起址等
② 通過在表格上是否呈現來模擬程式是否進入記憶體
③ 點選執行之後,根據動態優先順序排程進行執行,當執行結束時,釋放其佔用的記憶體,將表格中資料清空模擬空間的釋放
④ 當程式結束後,相鄰空間自動合併
⑤ 更新圖形化介面,增加主存管理的顯示部分
詳細設計
① 在實驗一的基礎上,PCB增加主存起始地址和佔用主存大小兩項內容。
② 在初始化PCB中,增加初始化每一個程式的主存大小,主存起始地址無需初始化
③ 增加判斷程式當前能否進入的函式isOk(PCB p);
③ 在增加程式的槽函式中,增加判斷條件通過判斷能否進入而產生不同的效果
④ 增加一個標籤和表格用於在圖形化介面中表現主存管理
⑤ 在初始化表格中增加對於新表格的初始化,同時新表格中的狀態列全部初始化為0,前10個空間初始化給作業系統本身
⑥ 增加更新主存管理表格的函式updateMemoryTable();
執行結果
基礎介面
增加一個程式後,主存發生變化
當一個程式結束後,其主存空間釋放
新增加的程式會根據大小判斷存入的位置和能否存入
當加入的程式主存空間不夠時,不予加入,並給客戶以提示
實驗程式碼
pcb.h
#ifndef PCB_H
#define PCB_H
#include <QString>
class PCB
{
public:
PCB();
QString getName() const;
void setName(const QString &value);
int getPriority() const;
void setPriority(int value);
int getTime() const;
void setTime(int value);
int getStatus() const;
void setStatus(int value);
int getMemorySize() const;
void setMemorySize(int value);
int getMemorylocation() const;
void setMemorylocation(int value);
private:
QString name;//名稱
int priority;//優先順序
int time;//執行時間
int status;//1表示後備,2表示等待,3表示執行,4表示結束
int memorySize;//主存大小
int memorylocation;//主存起始地址
};
#endif // PCB_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QTreeView>
#include <QTableView>
#include <QHeaderView>
#include <QLabel>
#include <QFormLayout>
#include <QLineEdit>
#include <QString>
#include <QIcon>
#include <QMessageBox>
#include <QList>
#include <QModelIndex>
#include <QTimer>
#include <QAbstractItemModel>
#include <QModelIndex>
#include <QHeaderView>
#include "pcb.h"
/*********QPushButton引數********/
const QString button_style="QPushButton{background-color:rgb(255,255,255);border-radius:10px;font-size:30px;color:rgb(105,105,105);}"
"QPushButton:hover{background-color:rgb(105,105,105);border-radius:10px;font-size:30px; color:rgb(255,255,255);}"
"QPushButton:pressed{background-color:black;border-radius:10px;font-size:30px; }";
const QString label_style="QLabel{background-color:rgb(79,79,79);border:0px groove gray;border-radius:10px;padding:2px 4px;font-size:40px;color:rgb(255,255,255)}";
const QString label_style2="QLabel{background-color:rgb(255,255,255);border:0px groove gray;border-radius:10px;padding:2px 4px;font-size:30px;color:black}";
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void CreateView();//圖形化介面
void initTable();//初始化表格
void updateReadyTable();//更新就緒表格
void updateWaitTable();//更新後備表格
void updateGuaqiTable();//更新掛起表格
void updateMemoryTable();//更新主存管理表格
void enter(PCB p);//加入程式
void initPCB();//初始化20個PCB
void refreshBtn();//重現button
QList<PCB> listSort(QList<PCB> l);//按照優先順序排序
PCB returnPCB(QString name);//根據PCB名稱返回PCB
int getReadyIndex(PCB p);//獲取就緒佇列的index
int getGuaqiIndex(PCB p);//獲取掛起佇列的index
int isOk(PCB p);//判斷能否進入記憶體
public slots:
//程式排程
void clickGuaqi();
void clickJiegua();
void clickRun();
void clickFinish();
//增加程式(20個)
void clickAccess();
void clickAmazon();
void clickAndroid();
void clickBaidumap();
void clickBeing();
void clickC();
void clickChrome();
void clickCloud();
void clickExcel();
void clickFirefox();
void clickJava();
void clickOffice();
void clickOnenote();
void clickPPT();
void clickPython();
void clickQQ();
void clickQt();
void clickSafari();
void clickWechat();
void clickWord();
private:
QString finishName;
//佇列
QList<PCB> wait;//後備佇列
QList<PCB> ready;//就緒
QList<PCB> guaqi;//掛起
//總道數
int ways = 6;
int MEMORY = 200;
int OS_SIZE = 10;
//定義20個程式
PCB accessPCB;
PCB amazonPCB;
PCB androidPCB;
PCB baidumapPCB;
PCB beingPCB;
PCB cPCB;
PCB chromePCB;
PCB cloudPCB;
PCB excelPCB;
PCB firefoxPCB;
PCB javaPCB;
PCB officePCB;
PCB onenotePCB;
PCB pptPCB;
PCB pythonPCB;
PCB qqPCB;
PCB qtPCB;
PCB safariPCB;
PCB wechatPCB;
PCB wordPCB;
//六個狀態標籤
QLabel* waitLabel;
QLabel* readyLabel;
QLabel* runningLabel;
QLabel* guaqiLabel;
QLabel* addLabel;
QLabel* memoryLabel;
//表示執行狀態的標籤
QLabel* nameLabel;
QLabel* priorityLabel;
QLabel* timeLabel;
//執行類按鈕
QPushButton* guaqiButton;
QPushButton* jieguaButton;
QPushButton* runButton;
QPushButton* finishButton;
//增加區按鈕
QPushButton* accessBtn;
QPushButton* amazonBtn;
QPushButton* androidBtn;
QPushButton* baidumapBtn;
QPushButton* beingBtn;
QPushButton* cBtn;
QPushButton* chromeBtn;
QPushButton* cloudBtn;
QPushButton* excelBtn;
QPushButton* firefoxBtn;
QPushButton* javaBtn;
QPushButton* officeBtn;
QPushButton* onenoteBtn;
QPushButton* pptBtn;
QPushButton* pythonBtn;
QPushButton* qqBtn;
QPushButton* qtBtn;
QPushButton* safariBtn;
QPushButton* wechatBtn;
QPushButton* wordBtn;
//程式類按鈕
//執行部分顯示資料設計
QLineEdit* nameEdit;
QLineEdit* priorityEdit;
QLineEdit* timeEdit;
//執行區佈局
QFormLayout* formLayout;
QVBoxLayout* vLayout;
QHBoxLayout* buttonLayout;
//表格部分佈局
QGridLayout* gridTotalLayout;
//增加區佈局
QVBoxLayout* addVLayout;
QGridLayout* addGridLayout;
//整體佈局
QGridLayout *mainLayout;
QStandardItemModel *standItemModel;
QStandardItemModel *standItemModel2;
QStandardItemModel *standItemModel3;
QStandardItemModel *standItemModel4;
QTableView *tableView;
QTableView *tableView2;
QTableView *tableView3;
QTableView *tableView4;
};
#endif // WIDGET_H
pcb.cpp
#include "pcb.h"
PCB::PCB()
{
}
//基礎的get,set方法
QString PCB::getName() const
{
return name;
}
void PCB::setName(const QString &value)
{
name = value;
}
int PCB::getPriority() const
{
return priority;
}
void PCB::setPriority(int value)
{
priority = value;
}
int PCB::getTime() const
{
return time;
}
void PCB::setTime(int value)
{
time = value;
}
int PCB::getStatus() const
{
return status;
}
void PCB::setStatus(int value)
{
status = value;
}
int PCB::getMemorySize() const
{
return memorySize;
}
void PCB::setMemorySize(int value)
{
memorySize = value;
}
int PCB::getMemorylocation() const
{
return memorylocation;
}
void PCB::setMemorylocation(int value)
{
memorylocation = value;
}
widget.cpp
#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
initPCB();
CreateView();
initTable();
}
Widget::~Widget()
{
}
void Widget::CreateView()
{
//表格
//後備佇列的表格
//新增QTableView程式碼
tableView = new QTableView;
standItemModel = new QStandardItemModel();
//就緒佇列的表格
//新增QTableView程式碼
tableView2 = new QTableView;
standItemModel2 = new QStandardItemModel();
//掛起佇列的表格
//新增QTableView程式碼
tableView3 = new QTableView;
standItemModel3 = new QStandardItemModel();
//分割槽
tableView4 = new QTableView;
standItemModel4 = new QStandardItemModel();
//主佈局
mainLayout = new QGridLayout; //垂直佈局
mainLayout->setSpacing(10);
mainLayout->setMargin(10);
//執行區佈局
formLayout = new QFormLayout;
formLayout->setSpacing(10);
formLayout->setMargin(10);
vLayout = new QVBoxLayout;
buttonLayout = new QHBoxLayout;
//增加區佈局
addVLayout = new QVBoxLayout;
addGridLayout = new QGridLayout;
addGridLayout->setSpacing(10);
addGridLayout->setMargin(10);
//其他佈局
gridTotalLayout = new QGridLayout;
gridTotalLayout->setSpacing(10);
gridTotalLayout->setMargin(10);
//初始化五個標籤
waitLabel = new QLabel("後備佇列");
waitLabel->setStyleSheet(label_style);
readyLabel = new QLabel("就緒佇列");
readyLabel->setStyleSheet(label_style);
guaqiLabel = new QLabel("掛起佇列");
guaqiLabel->setStyleSheet(label_style);
memoryLabel = new QLabel("主存管理");
memoryLabel->setStyleSheet(label_style);
addLabel = new QLabel("增加程式");
addLabel->setStyleSheet(label_style);
addLabel->setHidden(true);
runningLabel = new QLabel("執行佇列");
runningLabel->setStyleSheet(label_style);
waitLabel->setAlignment(Qt::AlignCenter);
readyLabel->setAlignment(Qt::AlignCenter);
runningLabel->setAlignment(Qt::AlignCenter);
guaqiLabel->setAlignment(Qt::AlignCenter);
addLabel->setAlignment(Qt::AlignCenter);
memoryLabel->setAlignment(Qt::AlignCenter);
//初始化四個按鈕
guaqiButton = new QPushButton("掛起程式");
guaqiButton->setStyleSheet(button_style);
jieguaButton = new QPushButton("解掛程式");
jieguaButton->setStyleSheet(button_style);
runButton = new QPushButton("開始執行");
runButton->setStyleSheet(button_style);
finishButton = new QPushButton("結束執行");
finishButton->setStyleSheet(button_style);
//初始化執行介面
nameLabel = new QLabel("程式名");
priorityLabel = new QLabel("優先權");
timeLabel = new QLabel("執行時間");
nameLabel->setAlignment(Qt::AlignLeft);
priorityLabel->setAlignment(Qt::AlignLeft);
timeLabel->setAlignment(Qt::AlignLeft);
nameLabel->setStyleSheet(label_style2);
priorityLabel->setStyleSheet(label_style2);
timeLabel->setStyleSheet(label_style2);
nameEdit = new QLineEdit;
nameEdit->setReadOnly(true);
nameEdit->setStyleSheet("border-width:2px;border-color:black;border-radius:10px;font-size:30px;border-style:groove");
nameEdit->setGeometry(400,925,190,70);
priorityEdit = new QLineEdit;
priorityEdit->setReadOnly(true);
priorityEdit->setStyleSheet("border-width:2px;border-color:black;border-radius:10px;font-size:30px;border-style:groove");
priorityEdit->setGeometry(400,1025,190,70);
timeEdit = new QLineEdit;
timeEdit->setReadOnly(true);
timeEdit->setStyleSheet("border-width:2px;border-color:black;border-radius:10px;font-size:30px;border-style:groove");
timeEdit->setGeometry(400,1105,190,70);
//初始化20個程式按鈕
accessBtn = new QPushButton();
accessBtn->setFixedSize(96,96);
accessBtn->setStyleSheet(tr("background-image: url(:/image/images/Access.png);"));
accessBtn->setFlat(true);
connect(accessBtn,SIGNAL(clicked(bool)),this,SLOT(clickAccess()));
amazonBtn = new QPushButton();
amazonBtn->setFixedSize(96,96);
amazonBtn->setStyleSheet(tr("background-image: url(:/image/images/Amazon.png);"));
amazonBtn->setFlat(true);
connect(amazonBtn,SIGNAL(clicked(bool)),this,SLOT(clickAmazon()));
androidBtn = new QPushButton();
androidBtn->setFixedSize(96,96);
androidBtn->setStyleSheet(tr("background-image: url(:/image/images/Android.png);"));
androidBtn->setFlat(true);
connect(androidBtn,SIGNAL(clicked(bool)),this,SLOT(clickAndroid()));
baidumapBtn = new QPushButton();
baidumapBtn->setFixedSize(96,96);
baidumapBtn->setStyleSheet(tr("background-image: url(:/image/images/baidumap.png);"));
baidumapBtn->setFlat(true);
connect(baidumapBtn,SIGNAL(clicked(bool)),this,SLOT(clickBaidumap()));
beingBtn = new QPushButton();
beingBtn->setFixedSize(96,96);
beingBtn->setStyleSheet(tr("background-image: url(:/image/images/Being.png);"));
beingBtn->setFlat(true);
connect(beingBtn,SIGNAL(clicked(bool)),this,SLOT(clickBeing()));
cBtn = new QPushButton();
cBtn->setFixedSize(96,96);
cBtn->setStyleSheet(tr("background-image: url(:/image/images/c.png);"));
cBtn->setFlat(true);
connect(cBtn,SIGNAL(clicked(bool)),this,SLOT(clickC()));
chromeBtn = new QPushButton();
chromeBtn->setFixedSize(96,96);
chromeBtn->setStyleSheet(tr("background-image: url(:/image/images/chrome.png);"));
chromeBtn->setFlat(true);
connect(chromeBtn,SIGNAL(clicked(bool)),this,SLOT(clickChrome()));
cloudBtn = new QPushButton();
cloudBtn->setFixedSize(96,96);
cloudBtn->setStyleSheet(tr("background-image: url(:/image/images/Cloud.png);"));
cloudBtn->setFlat(true);
connect(cloudBtn,SIGNAL(clicked(bool)),this,SLOT(clickCloud()));
excelBtn = new QPushButton();
excelBtn->setFixedSize(96,96);
excelBtn->setStyleSheet(tr("background-image: url(:/image/images/Excel.png);"));
excelBtn->setFlat(true);
connect(excelBtn,SIGNAL(clicked(bool)),this,SLOT(clickExcel()));
firefoxBtn = new QPushButton();
firefoxBtn->setFixedSize(96,96);
firefoxBtn->setStyleSheet(tr("background-image: url(:/image/images/firefox.png);"));
firefoxBtn->setFlat(true);
connect(firefoxBtn,SIGNAL(clicked(bool)),this,SLOT(clickFirefox()));
javaBtn = new QPushButton();
javaBtn->setFixedSize(96,96);
javaBtn->setStyleSheet(tr("background-image: url(:/image/images/java.png);"));
javaBtn->setFlat(true);
connect(javaBtn,SIGNAL(clicked(bool)),this,SLOT(clickJava()));
officeBtn = new QPushButton();
officeBtn->setFixedSize(96,96);
officeBtn->setStyleSheet(tr("background-image: url(:/image/images/Office.png);"));
officeBtn->setFlat(true);
connect(officeBtn,SIGNAL(clicked(bool)),this,SLOT(clickOffice()));
onenoteBtn = new QPushButton();
onenoteBtn->setFixedSize(96,96);
onenoteBtn->setStyleSheet(tr("background-image: url(:/image/images/OneNote.png);"));
onenoteBtn->setFlat(true);
connect(onenoteBtn,SIGNAL(clicked(bool)),this,SLOT(clickOnenote()));
pptBtn = new QPushButton();
pptBtn->setFixedSize(96,96);
pptBtn->setStyleSheet(tr("background-image: url(:/image/images/PPT.png);"));
pptBtn->setFlat(true);
connect(pptBtn,SIGNAL(clicked(bool)),this,SLOT(clickPPT()));
pythonBtn = new QPushButton();
pythonBtn->setFixedSize(96,96);
pythonBtn->setStyleSheet(tr("background-image: url(:/image/images/python.png);"));
pythonBtn->setFlat(true);
connect(pythonBtn,SIGNAL(clicked(bool)),this,SLOT(clickPython()));
qqBtn = new QPushButton();
qqBtn->setFixedSize(96,96);
qqBtn->setStyleSheet(tr("background-image: url(:/image/images/qq.png);"));
qqBtn->setFlat(true);
connect(qqBtn,SIGNAL(clicked(bool)),this,SLOT(clickQQ()));
qtBtn = new QPushButton();
qtBtn->setFixedSize(96,96);
qtBtn->setStyleSheet(tr("background-image: url(:/image/images/qt.png);"));
qtBtn->setFlat(true);
connect(qtBtn,SIGNAL(clicked(bool)),this,SLOT(clickQt()));
safariBtn = new QPushButton();
safariBtn->setFixedSize(96,96);
safariBtn->setStyleSheet(tr("background-image: url(:/image/images/safari.png);"));
safariBtn->setFlat(true);
connect(safariBtn,SIGNAL(clicked(bool)),this,SLOT(clickSafari()));
wechatBtn = new QPushButton();
wechatBtn->setFixedSize(96,96);
wechatBtn->setStyleSheet(tr("background-image: url(:/image/images/wechat.png);"));
wechatBtn->setFlat(true);
connect(wechatBtn,SIGNAL(clicked(bool)),this,SLOT(clickWechat()));
wordBtn = new QPushButton();
wordBtn->setFixedSize(96,96);
wordBtn->setStyleSheet(tr("background-image: url(:/image/images/Word.png);"));
wordBtn->setFlat(true);
connect(wordBtn,SIGNAL(clicked(bool)),this,SLOT(clickWord()));
//建立訊號與槽
connect(guaqiButton,SIGNAL(clicked(bool)),this,SLOT(clickGuaqi()));
connect(jieguaButton,SIGNAL(clicked(bool)),this,SLOT(clickJiegua()));
connect(runButton,SIGNAL(clicked(bool)),this,SLOT(clickRun()));
connect(finishButton,SIGNAL(clicked(bool)),this,SLOT(clickFinish()));
//佈局
//執行區
formLayout->addRow(nameLabel,nameEdit);
formLayout->addRow(priorityLabel,priorityEdit);
formLayout->addRow(timeLabel,timeEdit);
buttonLayout->addWidget(runButton);
buttonLayout->addWidget(finishButton);
vLayout->addWidget(runningLabel);
vLayout->addLayout(formLayout);
vLayout->addLayout(buttonLayout);
//其他(後備、就緒、掛起)
gridTotalLayout->addWidget(waitLabel,0,0);
gridTotalLayout->addWidget(tableView,1,0);
gridTotalLayout->addWidget(readyLabel,0,1);
gridTotalLayout->addWidget(tableView2,1,1);
gridTotalLayout->addWidget(guaqiButton,2,1);
gridTotalLayout->addWidget(guaqiLabel,0,2);
gridTotalLayout->addWidget(tableView3,1,2);
gridTotalLayout->addWidget(jieguaButton,2,2);
gridTotalLayout->addWidget(memoryLabel,0,3,1,2);
gridTotalLayout->addWidget(tableView4,1,3,1,2);
//增加區
addGridLayout->addWidget(accessBtn,0,0);
addGridLayout->addWidget(amazonBtn,0,1);
addGridLayout->addWidget(androidBtn,0,2);
addGridLayout->addWidget(baidumapBtn,0,3);
addGridLayout->addWidget(beingBtn,1,0);
addGridLayout->addWidget(cBtn,1,1);
addGridLayout->addWidget(chromeBtn,1,2);
addGridLayout->addWidget(cloudBtn,1,3);
addGridLayout->addWidget(excelBtn,2,0);
addGridLayout->addWidget(firefoxBtn,2,1);
addGridLayout->addWidget(javaBtn,2,2);
addGridLayout->addWidget(officeBtn,2,3);
addGridLayout->addWidget(onenoteBtn,3,0);
addGridLayout->addWidget(pptBtn,3,1);
addGridLayout->addWidget(pythonBtn,3,2);
addGridLayout->addWidget(qqBtn,3,3);
addGridLayout->addWidget(qtBtn,4,0);
addGridLayout->addWidget(safariBtn,4,1);
addGridLayout->addWidget(wechatBtn,4,2);
addGridLayout->addWidget(wordBtn,4,3);
addVLayout->addWidget(addLabel);
addVLayout->addLayout(addGridLayout);
//整體佈局
mainLayout->addLayout(gridTotalLayout,0,0,2,2);
mainLayout->addLayout(vLayout,0,2);
mainLayout->addLayout(addVLayout,1,2);
//顯示佈局
this->setLayout(mainLayout);
}
void Widget::initTable()
{
//後備佇列
//新增表頭
standItemModel->setColumnCount(3);
standItemModel->setHeaderData(0,Qt::Horizontal,QStringLiteral("程式名")); //設定表頭內容
standItemModel->setHeaderData(1,Qt::Horizontal,QStringLiteral("優先順序"));
standItemModel->setHeaderData(2,Qt::Horizontal,QStringLiteral("執行時間"));
//掛載表格模型
tableView->setModel(standItemModel);
//設定表格屬性
tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); //表頭資訊顯示居中
tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Fixed); //設定表頭列寬不可變
tableView->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Fixed);
tableView->horizontalHeader()->setSectionResizeMode(2,QHeaderView::Stretch);//設定第2列表頭彈性拉伸
tableView->setColumnWidth(0,80); //設定表格第0列寬度
tableView->setColumnWidth(1,80);
tableView->setColumnWidth(2,100);
tableView->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(190,190,190);}");
//設定相鄰行顏色交替顯示
tableView->setAlternatingRowColors(true);
tableView->verticalHeader()->hide(); //隱藏預設顯示的行頭
tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //設定選中時整行選中
tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //設定表格屬性只讀,不能編輯
//就緒佇列
//新增表頭
standItemModel2->setColumnCount(3);
standItemModel2->setHeaderData(0,Qt::Horizontal,QStringLiteral("程式名")); //設定表頭內容
standItemModel2->setHeaderData(1,Qt::Horizontal,QStringLiteral("優先順序"));
standItemModel2->setHeaderData(2,Qt::Horizontal,QStringLiteral("執行時間"));
//掛載表格模型
tableView2->setModel(standItemModel2);
//設定表格屬性
tableView2->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); //表頭資訊顯示居中
tableView2->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Fixed); //設定表頭列寬不可變
tableView2->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Fixed);
tableView2->horizontalHeader()->setSectionResizeMode(2,QHeaderView::Stretch);//設定第2列表頭彈性拉伸
tableView2->setColumnWidth(0,80); //設定表格第0列寬度
tableView2->setColumnWidth(1,80);
tableView2->setColumnWidth(2,100);
tableView2->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(190,190,190);}");
//設定相鄰行顏色交替顯示
tableView2->setAlternatingRowColors(true);
tableView2->verticalHeader()->hide(); //隱藏預設顯示的行頭
tableView2->setSelectionBehavior(QAbstractItemView::SelectRows); //設定選中時整行選中
tableView2->setEditTriggers(QAbstractItemView::NoEditTriggers); //設定表格屬性只讀,不能編輯
//掛起佇列
//新增表頭
standItemModel3->setColumnCount(3);
standItemModel3->setHeaderData(0,Qt::Horizontal,QStringLiteral("程式名")); //設定表頭內容
standItemModel3->setHeaderData(1,Qt::Horizontal,QStringLiteral("優先順序"));
standItemModel3->setHeaderData(2,Qt::Horizontal,QStringLiteral("執行時間"));
//掛載表格模型
tableView3->setModel(standItemModel3);
//設定表格屬性
tableView3->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); //表頭資訊顯示居中
tableView3->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Fixed); //設定表頭列寬不可變
tableView3->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Fixed);
tableView3->horizontalHeader()->setSectionResizeMode(2,QHeaderView::Stretch);//設定第2列表頭彈性拉伸
tableView3->setColumnWidth(0,80); //設定表格第0列寬度
tableView3->setColumnWidth(1,80);
tableView3->setColumnWidth(2,100);
tableView3->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(190,190,190);}");
//設定相鄰行顏色交替顯示
tableView3->setAlternatingRowColors(true);
tableView3->verticalHeader()->hide(); //隱藏預設顯示的行頭
tableView3->setSelectionBehavior(QAbstractItemView::SelectRows); //設定選中時整行選中
tableView3->setEditTriggers(QAbstractItemView::NoEditTriggers); //設定表格屬性只讀,不能編輯
//分割槽管理
//新增表頭
standItemModel4->setColumnCount(4);
standItemModel4->setRowCount(200);
standItemModel4->setHeaderData(0,Qt::Horizontal,QStringLiteral("程式名")); //設定表頭內容
standItemModel4->setHeaderData(1,Qt::Horizontal,QStringLiteral("起址"));
standItemModel4->setHeaderData(2,Qt::Horizontal,QStringLiteral("長度"));
standItemModel4->setHeaderData(3,Qt::Horizontal,QStringLiteral("狀態"));
//掛載表格模型
tableView4->setModel(standItemModel4);
//設定表格屬性
tableView4->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); //表頭資訊顯示居中
tableView4->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Fixed); //設定表頭列寬不可變
tableView4->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Fixed);
tableView4->horizontalHeader()->setSectionResizeMode(2,QHeaderView::Fixed);
tableView4->horizontalHeader()->setSectionResizeMode(3,QHeaderView::Fixed);
tableView4->setColumnWidth(0,80); //設定表格第0列寬度
tableView4->setColumnWidth(1,80);
tableView4->setColumnWidth(2,80);
tableView4->setColumnWidth(3,80);
tableView4->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(190,190,190);}");
//設定相鄰行顏色交替顯示
tableView4->setAlternatingRowColors(true);
// tableView4->verticalHeader()->hide(); //隱藏預設顯示的行頭
//初始化
for(int i=0;i< 200;i++)
{
QString z = QString::number(0);
standItemModel4->setItem(i, 0, new QStandardItem(z));
standItemModel4->setItem(i, 1, new QStandardItem(z));
standItemModel4->setItem(i, 2, new QStandardItem(z));
standItemModel4->setItem(i, 3, new QStandardItem(z));
}
for(int i = 0;i<10;i++)
{
QString size = QString::number(i+1);
QString location = QString::number(0);
QString status = QString::number(1);
standItemModel4->setItem(i, 0, new QStandardItem("作業系統"));
standItemModel4->setItem(i, 1, new QStandardItem(location));
standItemModel4->setItem(i, 2, new QStandardItem(size));
standItemModel4->setItem(i, 3, new QStandardItem(status));
}
tableView4->setSelectionBehavior(QAbstractItemView::SelectRows); //設定選中時整行選中
tableView4->setEditTriggers(QAbstractItemView::NoEditTriggers); //設定表格屬性只讀,不能編輯
}
//掛起按鈕的槽
void Widget::clickGuaqi()
{
int curRow = tableView2->currentIndex().row();
if(curRow == -1)
{
QMessageBox::warning(this, "warning", "您沒有選擇程式!");
}
else
{
QAbstractItemModel *modessl = tableView2->model();
QModelIndex index = modessl->index(curRow,0);
QString name = modessl->data(index).toString();
qDebug()<<name;
PCB p;
p = returnPCB(name);
guaqi.append(p);
ready.removeAt(getReadyIndex(p));
updateGuaqiTable();
updateReadyTable();
updateMemoryTable();
}
}
//解掛按鈕的槽
void Widget::clickJiegua()
{
int curRow = tableView3->currentIndex().row();
if(curRow == -1)
{
QMessageBox::warning(this, "warning", "您沒有選擇程式!");
}
else
{
QAbstractItemModel *modessl = tableView3->model();
QModelIndex index = modessl->index(curRow,0);
QString name = modessl->data(index).toString();
PCB p;
p = returnPCB(name);
guaqi.removeAt(getGuaqiIndex(p));
ready.append(p);
updateGuaqiTable();
updateReadyTable();
updateMemoryTable();
}
}
//執行按鈕的槽
void Widget::clickRun()
{
if(ready.isEmpty()&& wait.isEmpty())
{
QMessageBox::warning(this, "warning", "當前沒有程式!");
}
else
{
PCB p = ready[0];
QString str = QString::number(p.getPriority());
QString t = QString::number(p.getTime());
nameEdit->setText(p.getName());
priorityEdit->setText(str);
timeEdit->setText(t);
p.setPriority(p.getPriority()-1);
p.setTime(p.getTime()-1);
p.setStatus(4);
updateMemoryTable();
enter(p);
}
}
//結束按鈕的槽
void Widget::clickFinish()
{
ready.clear();
wait.clear();
guaqi.clear();
for(int i = 0;i < wait.size();i++)
{
wait.removeAt(i);
}
for(int i = 0;i < ready.size();i++)
{
ready.removeAt(i);
}
for(int i = 0;i < guaqi.size();i++)
{
guaqi.removeAt(i);
}
standItemModel->clear();
standItemModel2->clear();
standItemModel3->clear();
initTable();
nameEdit->clear();
priorityEdit->clear();
timeEdit->clear();
accessBtn->setHidden(false);
amazonBtn->setHidden(false);
androidBtn->setHidden(false);
baidumapBtn->setHidden(false);
beingBtn->setHidden(false);
cBtn->setHidden(false);
chromeBtn->setHidden(false);
cloudBtn->setHidden(false);
excelBtn->setHidden(false);
firefoxBtn->setHidden(false);
javaBtn->setHidden(false);
officeBtn->setHidden(false);
onenoteBtn->setHidden(false);
pptBtn->setHidden(false);
pythonBtn->setHidden(false);
qqBtn->setHidden(false);
qtBtn->setHidden(false);
safariBtn->setHidden(false);
wechatBtn->setHidden(false);
wordBtn->setHidden(false);
}
//增加按鈕的槽
void Widget::clickAccess()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(accessPCB);
qDebug()<<"ok="<<a;
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
accessPCB.setMemorylocation(a);
accessBtn->setHidden(true);
enter(accessPCB);
updateMemoryTable();
}
}
}
void Widget::clickAmazon()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(amazonPCB);
qDebug()<<"ok="<<a;
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
amazonPCB.setMemorylocation(a);
amazonBtn->setHidden(true);
enter(amazonPCB);
updateMemoryTable();
}
}
}
void Widget::clickAndroid()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(androidPCB);
qDebug()<<"ok="<<a;
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
androidPCB.setMemorylocation(a);
androidBtn->setHidden(true);
enter(androidPCB);
updateMemoryTable();
}
}
}
void Widget::clickBaidumap()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(baidumapPCB);
qDebug()<<"ok="<<a;
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
baidumapPCB.setMemorylocation(a);
baidumapBtn->setHidden(true);
enter(baidumapPCB);
updateMemoryTable();
}
}
}
void Widget::clickBeing()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(beingPCB);
qDebug()<<"ok="<<a;
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
beingPCB.setMemorylocation(a);
beingBtn->setHidden(true);
enter(beingPCB);
updateMemoryTable();
}
}
}
void Widget::clickC()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(cPCB);
qDebug()<<"ok="<<a;
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
cPCB.setMemorylocation(a);
cBtn->setHidden(true);
enter(cPCB);
updateMemoryTable();
}
}
}
void Widget::clickChrome()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(chromePCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
chromePCB.setMemorylocation(a);
chromeBtn->setHidden(true);
enter(chromePCB);
updateMemoryTable();
}
}
}
void Widget::clickCloud()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(cloudPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
cloudPCB.setMemorylocation(a);
cloudBtn->setHidden(true);
enter(cloudPCB);
updateMemoryTable();
}
}
}
void Widget::clickExcel()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(excelPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
excelPCB.setMemorylocation(a);
excelBtn->setHidden(true);
enter(excelPCB);
updateMemoryTable();
}
}
}
void Widget::clickFirefox()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(firefoxPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
firefoxPCB.setMemorylocation(a);
firefoxBtn->setHidden(true);
enter(firefoxPCB);
updateMemoryTable();
}
}
}
void Widget::clickJava()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(javaPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
javaPCB.setMemorylocation(a);
javaBtn->setHidden(true);
enter(javaPCB);
updateMemoryTable();
}
}
}
void Widget::clickOffice()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(officePCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
officePCB.setMemorylocation(a);
officeBtn->setHidden(true);
enter(officePCB);
updateMemoryTable();
}
}
}
void Widget::clickOnenote()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(onenotePCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
onenotePCB.setMemorylocation(a);
onenoteBtn->setHidden(true);
enter(onenotePCB);
updateMemoryTable();
}
}
}
void Widget::clickPPT()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(pptPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
pptPCB.setMemorylocation(a);
pptBtn->setHidden(true);
enter(pptPCB);
updateMemoryTable();
}
}
}
void Widget::clickPython()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(pythonPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
pythonPCB.setMemorylocation(a);
pythonBtn->setHidden(true);
enter(pythonPCB);
updateMemoryTable();
}
}
}
void Widget::clickQQ()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(qqPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
qqPCB.setMemorylocation(a);
qqBtn->setHidden(true);
enter(qqPCB);
updateMemoryTable();
}
}
}
void Widget::clickQt()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(qtPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
qtPCB.setMemorylocation(a);
qtBtn->setHidden(true);
enter(qtPCB);
updateMemoryTable();
}
}
}
void Widget::clickSafari()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(safariPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
safariPCB.setMemorylocation(a);
safariBtn->setHidden(true);
enter(safariPCB);
updateMemoryTable();
}
}
}
void Widget::clickWechat()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(wechatPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
wechatPCB.setMemorylocation(a);
wechatBtn->setHidden(true);
enter(wechatPCB);
updateMemoryTable();
}
}
}
void Widget::clickWord()
{
int ok = QMessageBox::question(this, "Question", "確定增加這個程式嗎?", QMessageBox::Yes | QMessageBox::No);
if(ok == QMessageBox::Yes)
{
int a = isOk(wordPCB);
if(a == 0)
{
QMessageBox::warning(this, "warning", "記憶體不足!");
}
else
{
wordPCB.setMemorylocation(a);
wordBtn->setHidden(true);
enter(wordPCB);
updateMemoryTable();
}
}
}
//就緒佇列表格
void Widget::updateReadyTable()
{
ready = listSort(ready);
//清空
standItemModel2->clear();
initTable();
updateMemoryTable();
//重寫
for(int i = 0;i < ready.size();i++)
{
QString str = QString::number(ready[i].getPriority());
QString t = QString::number(ready[i].getTime());
standItemModel2->setItem(i, 0, new QStandardItem(ready[i].getName()));
standItemModel2->setItem(i, 1, new QStandardItem(str));
standItemModel2->setItem(i, 2, new QStandardItem(t));
}
}
//後備佇列表格
void Widget::updateWaitTable()
{
wait = listSort(wait);
//清空
standItemModel->clear();
initTable();
updateMemoryTable();
//重寫
for(int i = 0;i < wait.size();i++)
{
QString str = QString::number(wait[i].getPriority());
QString t = QString::number(wait[i].getTime());
standItemModel->setItem(i, 0, new QStandardItem(wait[i].getName()));
standItemModel->setItem(i, 1, new QStandardItem(str));
standItemModel->setItem(i, 2, new QStandardItem(t));
}
}
//掛起表格更新
void Widget::updateGuaqiTable()
{
//清空
standItemModel3->clear();
initTable();
updateMemoryTable();
//重寫
for(int i = 0;i < guaqi.size();i++)
{
QString str = QString::number(guaqi[i].getPriority());
QString t = QString::number(guaqi[i].getTime());
standItemModel3->setItem(i, 0, new QStandardItem(guaqi[i].getName()));
standItemModel3->setItem(i, 1, new QStandardItem(str));
standItemModel3->setItem(i, 2, new QStandardItem(t));
}
}
void Widget::updateMemoryTable()
{
//清空
standItemModel4->clear();
initTable();
int test = ready.size()+wait.size()+guaqi.size();
qDebug()<<"Size = "<<test;
//重寫
if(ready.size()+guaqi.size()+wait.size()<=ways)
{
for(int i = 0;i<ready.size()+guaqi.size();i++)
{
for(int m = 0;m<ready.size();m++)
{
int s = ready[m].getMemorylocation();
for(int j = 0;j < ready[m].getMemorySize();j++)
{
QString location = QString::number(ready[m].getMemorylocation());
QString size = QString::number(j+1);
QString status = QString::number(1);
standItemModel4->setItem(s+j, 0, new QStandardItem(ready[m].getName()));
standItemModel4->setItem(s+j, 1, new QStandardItem(location));
standItemModel4->setItem(s+j, 2, new QStandardItem(size));
standItemModel4->setItem(s+j, 3, new QStandardItem(status));
}
}
for(int m = 0;m<guaqi.size();m++)
{
int s = guaqi[m].getMemorylocation();
for(int j = 0;j < guaqi[m].getMemorySize();j++)
{
QString location = QString::number(guaqi[m].getMemorylocation());
QString size = QString::number(j+1);
QString status = QString::number(1);
standItemModel4->setItem(s+j, 0, new QStandardItem(guaqi[m].getName()));
standItemModel4->setItem(s+j, 1, new QStandardItem(location));
standItemModel4->setItem(s+j, 2, new QStandardItem(size));
standItemModel4->setItem(s+j, 3, new QStandardItem(status));
}
}
}
}
else
{
qDebug()<<"進入成功 ";
for(int i = 0;i < ready.size()+wait.size()+guaqi.size();i++)
{
if(i<ways)
{
for(int m = 0;m<ready.size();m++)
{
int s = ready[m].getMemorylocation();
for(int j = 0;j < ready[m].getMemorySize();j++)
{
QString location = QString::number(ready[m].getMemorylocation());
QString size = QString::number(j+1);
QString status = QString::number(1);
standItemModel4->setItem(s+j, 0, new QStandardItem(ready[m].getName()));
standItemModel4->setItem(s+j, 1, new QStandardItem(location));
standItemModel4->setItem(s+j, 2, new QStandardItem(size));
standItemModel4->setItem(s+j, 3, new QStandardItem(status));
}
}
for(int m = 0;m<guaqi.size();m++)
{
int s = guaqi[m].getMemorylocation();
for(int j = 0;j < guaqi[m].getMemorySize();j++)
{
QString location = QString::number(guaqi[m].getMemorylocation());
QString size = QString::number(j+1);
QString status = QString::number(1);
standItemModel4->setItem(s+j, 0, new QStandardItem(guaqi[m].getName()));
standItemModel4->setItem(s+j, 1, new QStandardItem(location));
standItemModel4->setItem(s+j, 2, new QStandardItem(size));
standItemModel4->setItem(s+j, 3, new QStandardItem(status));
}
}
}
else
{
int m = i-ways;
int s = wait[m].getMemorylocation();
QString status = QString::number(1);
for(int j=0;j<wait[m].getMemorySize();j++)
{
QString location = QString::number(wait[m].getMemorylocation());
QString size = QString::number(j+1);
standItemModel4->setItem(s+j, 0, new QStandardItem(wait[m].getName()));
standItemModel4->setItem(s+j, 1, new QStandardItem(location));
standItemModel4->setItem(s+j, 2, new QStandardItem(size));
standItemModel4->setItem(s+j, 3, new QStandardItem(status));
}
}
}
}
}
void Widget::enter(PCB p)
{
int flag = ready.size() + guaqi.size();
if(p.getStatus() == 1)
{
if(flag< ways && wait.isEmpty())
{
ready.append(p);
updateReadyTable();
}
else
{
wait.append(p);
updateWaitTable();
}
}
else if(p.getStatus() == 4)
{
if(flag == ways && flag >=1 && !wait.isEmpty())
{//如果就緒佇列少一,從後備中加一
ready.removeFirst();
ready.append(wait[0]);
wait.removeFirst();
updateReadyTable();
updateWaitTable();
}
else
{
ready.removeFirst();
updateReadyTable();
}
//時間
if(p.getTime() > 0)
{
p.setStatus(1);
enter(p);
}
else
{
finishName = p.getName();
refreshBtn();
QMessageBox::warning(this,"finish",QString(tr("%1已結束").arg(finishName)));
QString status = QString::number(0);
for(int i = 0;i < 200;i++)
{
QString s = standItemModel4->item(i,0)->text();
// qDebug()<<s;
if(s == finishName)
{
standItemModel4->setItem(i, 0, new QStandardItem(status));
standItemModel4->setItem(i, 1, new QStandardItem(status));
standItemModel4->setItem(i, 2, new QStandardItem(status));
standItemModel4->setItem(i, 3, new QStandardItem(status));
}
}
}
}
}
void Widget::initPCB()
{
//PCB資料
accessPCB.setName("Access");
accessPCB.setPriority(1);
accessPCB.setTime(2);
accessPCB.setStatus(1);
accessPCB.setMemorySize(5);
// accessPCB.setMemorylocation(0);
//PCB資料
amazonPCB.setName("Amazon");
amazonPCB.setPriority(2);
amazonPCB.setTime(3);
amazonPCB.setStatus(1);
amazonPCB.setMemorySize(10);
//PCB資料
androidPCB.setName("Android");
androidPCB.setPriority(3);
androidPCB.setTime(5);
androidPCB.setStatus(1);
androidPCB.setMemorySize(15);
//PCB資料
baidumapPCB.setName("Baidu Map");
baidumapPCB.setPriority(4);
baidumapPCB.setTime(1);
baidumapPCB.setStatus(1);
baidumapPCB.setMemorySize(20);
//PCB資料
beingPCB.setName("Being");
beingPCB.setPriority(1);
beingPCB.setTime(4);
beingPCB.setStatus(1);
beingPCB.setMemorySize(25);
//PCB資料
cPCB.setName("C++");
cPCB.setPriority(2);
cPCB.setTime(6);
cPCB.setStatus(1);
cPCB.setMemorySize(72);
//PCB資料
chromePCB.setName("Chrome");
chromePCB.setPriority(3);
chromePCB.setTime(2);
chromePCB.setStatus(1);
chromePCB.setMemorySize(64);
//PCB資料
cloudPCB.setName("Cloud");
cloudPCB.setPriority(4);
cloudPCB.setTime(3);
cloudPCB.setStatus(1);
cloudPCB.setMemorySize(56);
//PCB資料
excelPCB.setName("Excel");
excelPCB.setPriority(1);
excelPCB.setTime(5);
excelPCB.setStatus(1);
excelPCB.setMemorySize(48);
//PCB資料
firefoxPCB.setName("Fire Fox");
firefoxPCB.setPriority(2);
firefoxPCB.setTime(1);
firefoxPCB.setStatus(1);
firefoxPCB.setMemorySize(40);
//PCB資料
javaPCB.setName("Java");
javaPCB.setPriority(3);
javaPCB.setTime(4);
javaPCB.setStatus(1);
javaPCB.setMemorySize(32);
//PCB資料
officePCB.setName("Office");
officePCB.setPriority(4);
officePCB.setTime(6);
officePCB.setStatus(1);
officePCB.setMemorySize(24);
//PCB資料
onenotePCB.setName("One Note");
onenotePCB.setPriority(1);
onenotePCB.setTime(2);
onenotePCB.setStatus(1);
onenotePCB.setMemorySize(16);
//PCB資料
pptPCB.setName("PPT");
pptPCB.setPriority(2);
pptPCB.setTime(3);
pptPCB.setStatus(1);
pptPCB.setMemorySize(8);
//PCB資料
pythonPCB.setName("Python");
pythonPCB.setPriority(3);
pythonPCB.setTime(5);
pythonPCB.setStatus(1);
pythonPCB.setMemorySize(9);
//PCB資料
qqPCB.setName("QQ");
qqPCB.setPriority(4);
qqPCB.setTime(1);
qqPCB.setStatus(1);
qqPCB.setMemorySize(36);
//PCB資料
qtPCB.setName("QT");
qtPCB.setPriority(1);
qtPCB.setTime(4);
qtPCB.setStatus(1);
qtPCB.setMemorySize(45);
//PCB資料
safariPCB.setName("Safari");
safariPCB.setPriority(2);
safariPCB.setTime(6);
safariPCB.setStatus(1);
safariPCB.setMemorySize(5);
//PCB資料
wechatPCB.setName("WeChat");
wechatPCB.setPriority(3);
wechatPCB.setTime(2);
wechatPCB.setStatus(1);
wechatPCB.setMemorySize(27);
//PCB資料
wordPCB.setName("Word");
wordPCB.setPriority(4);
wordPCB.setTime(3);
wordPCB.setStatus(1);
wordPCB.setMemorySize(54);
}
void Widget::refreshBtn()
{
if(finishName == "Access")
{
accessBtn->setHidden(false);
}
else if(finishName == "Amazon")
{
amazonBtn->setHidden(false);
}
else if(finishName == "Android")
{
androidBtn->setHidden(false);
}
else if(finishName == "Baidu Map")
{
baidumapBtn->setHidden(false);
}
else if(finishName == "Being")
{
beingBtn->setHidden(false);
}
else if(finishName == "C++")
{
cBtn->setHidden(false);
}
else if(finishName == "Chrome")
{
chromeBtn->setHidden(false);
}
else if(finishName == "Cloud")
{
cloudBtn->setHidden(false);
}
else if(finishName == "Excel")
{
excelBtn->setHidden(false);
}
else if(finishName == "Fire Fox")
{
firefoxBtn->setHidden(false);
}
else if(finishName == "Java")
{
javaBtn->setHidden(false);
}
else if(finishName == "Office")
{
officeBtn->setHidden(false);
}
else if(finishName == "One Note")
{
onenoteBtn->setHidden(false);
}
else if(finishName == "PPT")
{
pptBtn->setHidden(false);
}
else if(finishName == "Python")
{
pythonBtn->setHidden(false);
}
else if(finishName == "QQ")
{
qqBtn->setHidden(false);
}
else if(finishName == "QT")
{
qtBtn->setHidden(false);
}
else if(finishName == "Safari")
{
safariBtn->setHidden(false);
}
else if(finishName == "WeChat")
{
wechatBtn->setHidden(false);
}
else if(finishName == "Word")
{
wordBtn->setHidden(false);
}
}
QList<PCB> Widget::listSort(QList<PCB> l)
{
QList<PCB> list;
list = l;
for(int i = list.size()-1;i >0;i--)
{
if(list[i-1].getPriority() < list[i].getPriority())
{
list.swap(i-1,i);
}
}
return list;
}
PCB Widget::returnPCB(QString name)
{
if(name == "Access")
{
return accessPCB;
}
else if(name == "Amazon")
{
return amazonPCB;
}
else if(name == "Android")
{
return androidPCB;
}
else if(name == "Baidu Map")
{
return baidumapPCB;
}
else if(name == "Being")
{
return beingPCB;
}
else if(name == "C++")
{
return cPCB;
}
else if(name == "Chrome")
{
return chromePCB;
}
else if(name == "Cloud")
{
return cloudPCB;
}
else if(name == "Excel")
{
return excelPCB;
}
else if(name == "Fire Fox")
{
return firefoxPCB;
}
else if(name == "Java")
{
return javaPCB;
}
else if(name == "Office")
{
return officePCB;
}
else if(name == "One Note")
{
return onenotePCB;
}
else if(name == "PPT")
{
return pptPCB;
}
else if(name == "Python")
{
return pythonPCB;
}
else if(name == "QQ")
{
return qqPCB;
}
else if(name == "QT")
{
return qtPCB;
}
else if(name == "Safari")
{
return safariPCB;
}
else if(name == "WeChat")
{
return wechatPCB;
}
else if(name == "Word")
{
return wordPCB;
}
}
int Widget::getReadyIndex(PCB p)
{
for(int i = 0;i < ready.size();i++)
{
if(p.getName() == ready[i].getName())
{
return i;
}
}
}
int Widget::getGuaqiIndex(PCB p)
{
for(int i = 0;i < guaqi.size();i++)
{
if(p.getName() == guaqi[i].getName())
{
return i;
}
}
}
int Widget::isOk(PCB p)
{
int flag1 = 0;
int l = 0;
int pSize = p.getMemorySize();
int count = 0;
for(int i = 10 ; i<200-pSize; i++)
{
QString str =standItemModel4->item(i,3)->text();
int s = str.toInt();
if(s == 0)
{
count = 0;
for(int j = 0; j<pSize;j++)
{
QString str1 =standItemModel4->item(j+i,3)->text();
int s1 = str1.toInt();
if(s1 == 0)
{
count++;
}
}
if(count == pSize)
{
flag1 = 1;
l = i;
break;
}
else
{
flag1 = 0;
l=i;
continue;
}
}
}
if(flag1 == 0)
{
qDebug()<<"flag1="<<flag1;
qDebug()<<p.getName()<<" l="<<l;
qDebug()<<"count="<<count;
return 0;
}
else
{
qDebug()<<"flag1="<<flag1;
qDebug()<<p.getName()<<" l="<<l;
qDebug()<<"count="<<count;
return l;
}
}
main.cpp
#include "widget.h"
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QHeaderView>
#include <QPalette>
#include <QString>
#include <QIcon>
#include <QBrush>
#include <QPixmap>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.setAutoFillBackground(true);
w.resize(1800,900);
w.setWindowTitle(QString("程式排程"));
QPalette palette;
QPixmap pixmap("images/sky.jpg");//背景
palette.setBrush(QPalette::Window, QBrush(pixmap));
w.setWindowIcon(QIcon(":/image/images/run.ico"));
w.setPalette(palette);
w.show();
return a.exec();
}
實驗小結
實驗一
① 本次實驗過程中,最重要的是理清楚CPU排程的整個過程,對於程式進入時進入的佇列有一定的瞭解
② 本實驗僅僅是模擬CPU排程,可以在動態的圖形化介面中感受其排程過程,但是內部邏輯方面與真實的CPU排程仍舊略有差距
③ 本實驗的一個優勢為邏輯較為清晰,且每一個功能的實現分割較為明確
④ 在本次實驗過程中,發現Qt的除錯工具不是非常的好用,所以靈活應用qDebug()是檢驗錯誤的一個好方法
實驗二
① 本次實驗過程中,最重要的是理清楚可變分割槽分配的整個過程,對於程式進入時記憶體內容有一定的瞭解
② 本實驗僅僅是模擬可變分割槽分配,可以在動態的圖形化介面中感受過程,但是內部邏輯方面與真實的可變分割槽分配仍舊略有差距
③ 本實驗的一個優勢為邏輯較為清晰,且每一個功能的實現分割較為明確
④ 在本次實驗過程中,發現Qt的除錯工具不是非常的好用,所以靈活應用qDebug()是檢驗錯誤的一個好方法
⑤ 本實驗未實現緊縮功能,可以持續改進
⑥ 本實驗中可用分割槽的合併通過表格可以直接實現
相關文章
- 作業系統實驗——程式控制作業系統
- c語音實驗1作業
- 作業系統實驗 & bochs 環境配置作業系統
- 實驗作業2
- 作業系統概念-程式控制 實驗報告作業系統
- 作業系統實驗(一)-Shell程式設計作業系統程式設計
- 20222420 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222401 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222422 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- # 20222309 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222318 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222321 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222304 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222414 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222418 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222305 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222311 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222413 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222416 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- 20222410 2024-2025-1 《網路與系統攻防技術》實驗二實驗報告
- linux 實驗課作業Linux
- 實驗二
- 實驗1
- 作業系統第二次上機實驗-程式通訊作業系統
- Java實驗二:類程式設計實驗Java程式設計
- 實驗一和實驗二截圖
- C語言實驗作業C語言
- 實驗二 電子傳輸系統安全-進展1
- 第二次作業預備實驗
- 實驗文件1
- 實驗1-
- 小實驗1
- 作業系統實驗6之訊號量的實現與應用作業系統
- 作業系統實驗:銀行家演算法(C語言)作業系統演算法C語言
- 作業系統實驗——讀者寫者模型(寫優先)作業系統模型
- 《網路與系統攻防技術》實驗八實驗報告
- 實驗二 c++C++
- 實驗二-需求分析