作業系統實驗——實驗1《CPU Scheduling》&&實驗二《Allocation & Reclaim》

GeometricObject發表於2020-12-08


注:以下程式碼為實驗一和實驗二的結合體,即為實驗二的最後結果

實驗一

實驗目的

多道系統中,當就緒程式數大於處理機數時,須按照某種策略決定哪些程式優先佔用處理機。本實驗模擬實現處理機排程,加深瞭解處理機排程的工作過程。

實驗內容

選擇一個排程演算法,實現處理機排程。

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()是檢驗錯誤的一個好方法

⑤ 本實驗未實現緊縮功能,可以持續改進

⑥ 本實驗中可用分割槽的合併通過表格可以直接實現

相關文章