1. 程式人生 > >作業系統:模擬程序排程管理系統

作業系統:模擬程序排程管理系統

目錄

1 基本資訊

l  專案名稱: 模擬程序排程管理系統

l  完成人姓名:

l  學號:

l  完成日期: 2017年5月20日

2 實驗內容與目的

2.1 實驗內容:

     編寫程式完成單處理器系統的程序排程,要求採用基於時間片多佇列反饋式排程策略排程策略。具體內容:

l  確定PCB內容及其組織方式。

l  要求模擬程序空閒(新)、就緒、執行、阻塞和完成5個狀態。

l  實現程序建立、程序排程、程序阻塞、程序喚醒和程序撤銷5個原語。

l  能夠模擬程序從生到滅的完整過程。

2.2 實驗目的

l  加深程序概念理解,明確程序與程式區別。

l  理解作業系統中程序的組織、建立和排程等方法。

3 主要設計思路和流程圖

3.1 演算法流程圖

圖1 多級反饋佇列排程演算法流程圖

3.2 系統設計架構

圖2 系統設計包圖

3.3 主要UI設計

3.3.1 就緒佇列引數配置

3 就緒引數配置

3.3.2 輸入引數及容錯提示

4 輸入程序及容錯提示

4 主要資料結構及其說明

4 .1 PCB

圖5 PCB類圖

  ProQueueBase 是封裝好的佇列,NewQueue(新建佇列)、ReadyQueue(就緒佇列)、BlockQueue(掛起佇列)都繼承了它。

圖6 佇列基類類圖

5 程式執行時的初值和執行結果

5.1 系統隨機生成初值測試

圖7 系統隨機生成程序

圖8 系統隨機生成測試結果

總執行時間:36

5.2 手動輸入測試

圖9 手動輸入程序

圖10 手動輸入程序掛起展示

圖11 手動輸入測試結果

總執行時間:57

5.3 檔案輸入測試

檔案輸入中,資料格式為:程序名、優先順序、總需時間、是否傳送掛起、到達時間

圖12 檔案輸入資料

圖13 檔案輸入程序

圖14 檔案輸入測試結果

總執行時間:103

附錄

由於原始碼較多隻放了重要程式碼

/src/business/ ScheduProcessByMF

packagebusiness;

importjava.2awt.event.Mo3useEvent;

im4portjava.awt.event.MouseListener;

importjava.util.Queue;

importjavax.swing.JTable;

importorg.omg.CORBA.PRIVATE_MEMBER;

importdata.BlockQueue;

importdata.NewQueue;

importdata.PCB;

importdata.ReadyQueue;

publicclass ScheduProcessByMF extends Thread{

private ReadyQueue[] readyQueue;//多就緒佇列

private NewQueue newQueue;//新建佇列

private BlockQueue blockQueue;//掛起佇列

private JTable statusTable;//程序顯示條

private int SYS_TIME;//模擬系統時

private int current_i;// 當前就緒佇列

PCB pcb_run_tp = null;// 就緒佇列中的程序臨時變數

public boolean exit =false;//使用者執行緒管理

public ScheduProcessByMF(JTablestatusTable,ReadyQueue[] readyQueue,NewQueue newQueue) {

// TODO Auto-generatedconstructor stub

this.readyQueue = readyQueue;

this.statusTable =statusTable;

this.newQueue = newQueue;

this.blockQueue = new BlockQueue(30);

System.out.println("gouzao....."+newQueue.getSize()+"/"+newQueue.getCap());

}

@Override

public void run() {

while(!exit)

{

SYS_TIME = 0;// 系統時初始化

//PCB pcb_new_tp = null;// 新建佇列中的程序臨時變數

PCBpcb_ready_tp = null;// 就緒佇列中的程序臨時變數

inttime_round = -1;// 時間片

booleanhasFinished = false;// 程序是否執行完

//boolean hasweak = false;// 程序是否喚醒

while (true){

try {// 模擬系統執行1S

Thread.sleep(1000);

}catch (InterruptedException ex) {

System.out

.println("InterruptedExceptionin ProgressBarThread");

}

SYS_TIME++;//系統時+1

System.out.println("SYS_TIME....."+SYS_TIME);

/**

* new -> ready

*/

NewQueueToReadyQueue();// 加入就緒佇列

/**

* ready->run

*/

if(pcb_run_tp==null)// 如果當前執行的程序為空

{

pcb_run_tp = getNextPCB();// 獲取下一個要執行的程序

//System.out.println("獲取下一個要執行的程序....."+pcb_run_tp.getName());

if(pcb_run_tp!=null)

{

time_round = getTimeRound(pcb_run_tp);// 獲取時間片大小

statusTable.setValueAt("執行",pcb_run_tp.local , 1);

hasFinished = false;

}

else// 所有程序執行完畢

{}

}

else

{

pcb_run_tp.r_time++;// 已執行時間+1

time_round--;//時間片-1

System.out.println("時間片....."+time_round);

statusTable.setValueAt("執行",pcb_run_tp.local , 1);

statusTable.setValueAt(pcb_run_tp.getR_time(), pcb_run_tp.local,4);//動態更改顯示已執行時間

statusTable.setValueAt((pcb_run_tp.r_time)//動態更改執行狀態條

*100

/pcb_run_tp.need_time, pcb_run_tp.local,5);

current_i = pcb_run_tp.queue;

}

System.out.println("出來時間片....."+time_round);

/**

* run->ready

*/

if(time_round==0 && !hasFinished)//時間片用完但程序沒執行完

{

time_round = -1;

RunningToReady(pcb_run_tp);//將程序放入就緒佇列

continue;

}

/**

* run->block

* 可能掛起的程序以一個較大的概率掛起

*/

if(!hasFinished)

{

if(requestForBlock(pcb_run_tp)&&!pcb_run_tp.hasblocked)//是否發起掛起

{

time_round = -1;

RunningToBlock(pcb_run_tp);//將程序新增至掛起佇列

continue;

}

}

statusTable.addMouseListener(newMyMouseListener(pcb_run_tp)); //通過滑鼠雙擊掛起程序

if(pcb_run_tp == null) continue;

/**

* block->ready

*/

BlockToReady();// 將掛起程序新增至就緒佇列

/**

* run->exit

*/

if((pcb_run_tp!=null)&&pcb_run_tp.getR_time()>=pcb_run_tp.getNeed_time())//已執行時間==總需時間

{

hasFinished = true;

time_round = -1;

RunningToFinish(pcb_run_tp);// 程序結束

}

}

}

}

@Override

@Deprecated

public void destroy() {

// TODO Auto-generated methodstub

super.destroy();

}

private void RunningToFinish(PCBpcb_tp) {

// TODO Auto-generated methodstub

statusTable.setValueAt("結束",pcb_tp.local , 1);

pcb_run_tp = null;

}

private void BlockToReady() {

// TODO Auto-generated methodstub

PCB pcb_tp=null;

while((pcb_tp =blockQueue.readHead())!=null && hasRoom()&& pcb_tp.block_time<= SYS_TIME)

{

readyQueue[0].add(blockQueue.getHead());

pcb_tp.queue = 0;

statusTable.setValueAt("就緒",pcb_tp.local , 1);

}

}

private boolean hasRoom() {

// TODO Auto-generated methodstub

if(readyQueue[0].getSize()< readyQueue[0].getCap())

return true;

return false;

}

private void RunningToBlock(PCB pcb_tp){

// TODO Auto-generated methodstub

statusTable.setValueAt("掛起",pcb_tp.local , 1);

pcb_tp.hasblocked = true;

blockQueue.add(pcb_tp);

pcb_run_tp=null;

}

/**

* 產生一個基於總需時間的隨機概率

* @param pcb_tp

* @return

*/

private boolean requestForBlock(PCBpcb_tp) {

// TODO Auto-generated methodstub

int gailv =(int) (Math.random() *pcb_tp.getNeed_time());//隨機發起

if(pcb_tp.block &&gailv>pcb_tp.getNeed_time()/3)

{

pcb_tp.block_time = SYS_TIME+(int)(Math.random() * 6);//產生一個隨機掛起時間

return true;

}

else

return false;

}

private void RunningToReady(PCB pcb_tp){

// TODO Auto-generated methodstub

if(pcb_tp.queue ==readyQueue.length-1)// 如果程序在最低階佇列

{

readyQueue[pcb_tp.queue].add(pcb_tp);// 則加在本佇列

}

else// 否則加在下一級佇列

{

readyQueue[pcb_tp.queue+1].add(pcb_tp);

pcb_tp.queue =pcb_tp.queue+1;

}

statusTable.setValueAt("就緒",pcb_tp.local , 1);

pcb_run_tp = null;

}

private int getTimeRound(PCB pcb_tp) {

// TODO Auto-generated methodstub

returnreadyQueue[pcb_tp.queue].getTime_round();

}

private PCB getNextPCB() {

// TODO Auto-generated methodstub

PCB pcb_tp=null;

for(inti=0;i<readyQueue.length;i++)

{

if((pcb_tp=readyQueue[i].getHead())!=null)

{

returnpcb_tp;

}

}

return null;

}

private void NewQueueToReadyQueue() {

// TODO Auto-generated methodstub

while(true)

{

PCB pcb_new_tp = newQueue.readHead();// 讀新建佇列第一個程序但不彈出

System.out.println("newto....."+newQueue.getSize()+"/"+newQueue.getCap());

if(pcb_new_tp == null)

{

System.out.println(".......新建為空");

break;

}

else if(pcb_new_tp.arr_time <= SYS_TIME&& hasRoom()){// 如果程序到達時間等於當前系統時且就緒佇列有空間

readyQueue[0].add(pcb_new_tp);// 加入就緒佇列

newQueue.getHead();// 彈出新建佇列

statusTable.setValueAt("就緒",pcb_new_tp.local , 1);

pcb_new_tp.queue = 0;

}

else if(pcb_new_tp.arr_time <= SYS_TIME )

{

statusTable.setValueAt("新建",pcb_new_tp.local , 1);

}

else{

break;

}

}

}

class MyMouseListener implementsMouseListener{

PCB pcb_tp;

public MyMouseListener(PCB pcb_tp) {

// TODO Auto-generatedconstructor stub

this.pcb_tp = pcb_tp;

}

public void mouseClicked(MouseEvent e){

// TODO Auto-generated methodstub

if(e.getClickCount() == 2){

int row =statusTable.rowAtPoint(e.getPoint());

RunningToBlock(pcb_run_tp);//將程序新增至掛起佇列

pcb_run_tp=null;

}

}

public void mouseEntered(MouseEventarg0) {

// TODO Auto-generated methodstub

}

public void mouseExited(MouseEventarg0) {

// TODO Auto-generated methodstub

}

public void mousePressed(MouseEventarg0) {

// TODO Auto-generated methodstub

}

public void mouseReleased(MouseEventarg0) {

// TODO Auto-generated methodstub

}

}

}

/src/data/PCB

package data;

import javax.swing.JProgressBar;

publicclass PCB {

publicstaticfinalintNEW=0;

publicstaticfinalintREADY=1;

publicstaticfinalintBLOCK=2;

publicstaticfinalintRUNNING=3;

publicstaticfinalintEXIT=4;

publicintname;// 程序識別符號

publicintstatus;// 程序狀態NEW-新建,READY-就緒RUNNING-執行,EXIT-完成, BLOCK-阻塞

publicintpri;// 程序優先順序

publicintneed_time;// 程序總時間

publicintr_time;// 已執行時間,以時間片為單位,當減至 0 時該程序終止

public PCB next;// 下一個程序控制塊

publicintlocal;// 該程序在顯示板上的位置

publicbooleanblock;//是否會出現時間等待

public JProgressBar bar;// 進度條

publicintarr_time;//到達時間

publicintqueue;//程序當前所在就緒佇列

publicintblock_time = 0;//掛起時間

publicbooleanhasblocked =false; //是否掛起掛起過

public PCB(int name, int status, int pri, int need_time, int r_time,JProgressBar bar,int local,boolean block) {

this.name = name;

this.status = status;

this.pri = pri;

this.need_time = need_time;

this.r_time = r_time;

this.bar=bar;

this.local=local;

this.block=block;

this.hasblocked=false;

}

public PCB(int name, int status, int pri, int need_time, int r_time,JProgressBar bar,int local,boolean block,int arr_time){

this.name = name;

this.status = status;

this.pri = pri;

this.need_time = need_time;

this.r_time = r_time;

this.bar=bar;

this.local=local;

this.block=block;

this.arr_time = arr_time;

this.hasblocked=false;

}

public PCB(int name, int status, int pri, int need_time, int r_time,boolean block,int arr_time) {

this.name = name;

this.status = status;

this.pri = pri;

this.need_time = need_time;

this.r_time = r_time;

this.block = block;

this.hasblocked=false;

this.arr_time = arr_time;

}

publicint getName() {

return

相關推薦

作業系統模擬程序排程管理系統

目錄 1 基本資訊 l  專案名稱: 模擬程序排程管理系統 l  完成人姓名: l  學號:

345---程序管理程序排程系統呼叫

程序的定義是什麼? 程序是處於執行期的程式以及相關資源的總稱,是正在執行的程式程式碼的實時結果,也稱任務。對作業系統來說是程式執行狀態的表現形式。 程序相關資源有哪些? 掛起的訊號、核心內部資料、處理器狀態和開啟的檔案都是程序的資源。  什麼執行緒? 執行緒是在程序中活

作業系統 單處理器程序排程模擬實驗(c++)

本實驗模擬了時間片輪轉排程演算法下的單處理機程序排程。 資料結構以程序控制塊PCB為基本單位。 邏輯結構簡單描述為,存在一個準備就緒的佇列,用來組織PCB。 程式開始,需要輸入執行時間片長度,再錄入程式。程式需要數字編號和執行長度。 位於佇列頭的PCB出隊,變為執行態,執行

c++ 計算機作業系統虛擬頁式儲存管理系統模擬實現

本系統裸機上模擬硬體開始,進行了對計算機虛擬頁式儲存管理系統的模擬,通過對記憶體、外存、儲存管理部件、缺頁中斷機構等硬體的模擬,以及對程序的PCB,頁表等軟體結構的模擬,以請求分頁的方式,實現了先來先服

Linux學習筆記rpm程序管理

源代碼 rpm 程序包 以CentOS為例,rpm程序包管理器的相關內容如下:CentOS的程序包管理器: 程序包的命名規則: 源代碼包: software_name-VERSION.tar.gz VERSION:major.mino

模擬交通燈管理系統

專案需求 模擬實現十字路口的交通燈管理系統邏輯。 非同步隨機產生各個路線上行走的車輛。例如,由南向北的直行車輛,由南向西的左轉車輛,由南向東的右轉車輛。 訊號燈忽略黃燈,只考慮紅燈和綠燈。 需考慮左轉車輛受訊號燈控制,右轉車輛不受訊號燈控制。 訊號燈的具體的控制邏

Python中字典列表的使用實現名片資訊管理系統

直接附上程式碼: # 名片資訊管理系統 字典列表的使用 # 輸出列印資訊 print(" 名片管理系統 ") print("="*50) print("1:新增名片") print("2:修改名片") print("3:查詢名片") print("4:刪除名片") print("5:列印

現代作業系統 第四章 檔案系統

在多程式多使用者的系統上,讀取資料有以下問題: 如何找到資訊? 如何防止一個使用者讀取另一個使用者的資料 如何知道哪些塊是空閒的? 通過前面的學習, 我們知道 作業系統對處理器進行抽象 建立了程序這個概念; 通過對物理儲存器的抽象建立了 虛擬地址空間的概念,

用python寫完成一個員工管理系統 要求儲存員工的工號、姓名、年齡、性別、工資 1、員工錄入 2、查詢員工資訊 3、修改員工資訊 4、刪除 5、根據工號檢視 6、退出

   完成一個員工管理系統    要求儲存員工的工號、姓名、年齡、性別、工資    1、員工錄入    2、查詢員工資訊    3、修改員工資訊    4、刪除  &nb

部隊車隊排程管理系統

    為什麼要直接說部隊車隊排程管理系統呢?因為我們目前大部分接觸的相關車隊排程系統的都是為部隊提供的,因為部隊對軟體功能要求較高,一般都會通過同一個平臺管理多個子系統,比如說和車牌識別系統的結合以及訪客登記系統的結合。     部隊車隊排程管理系統用於

暢行智慧營院車輛門禁管理系統

    車輛門禁管理系統設計通過科學、智慧的新式管理手段,提高營院管理的資訊化水平。同時,應用成熟先進的科技技術,簡化工作流程,提高處理效率,實現車輛進出車庫自動化管理。     車輛門禁管理系統軟、硬體均採用模組化結構設計,充分考慮需求的變化,保證

Python Web框架Django寫圖書管理系統(LMS)

Django檔案配置 Django模版檔案配置 檔案路徑 test_site – test_site – settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.Dja

Java 模擬磁碟排程管理

老師佈置的實習題目如下:設計目的:加深對請求磁碟排程管理實現原理的理解,掌握磁碟排程演算法。設計內容:通過程式設計實現不同磁碟排程演算法。設定開始磁軌號尋道範圍,依據起始掃描磁軌號和最大磁軌號數,隨機產生要進行尋道的磁軌號序列。選擇磁碟排程演算法,顯示該演算法的磁軌訪問順序,

GacUI Demo模擬Windows7資源管理

    GacUI的ListView支援Windows 7資源管理器的六種View,並且在預設的面板下表現的跟資源管理器十分類似。這個Demo也使用了一些Shell API來獲得資源管理器使用的檔案的圖示、檔案型別的字串等等。完整的程式碼可以在http://www.gaclib.net/Demos/Contr

後臺經驗分享如何做許可權管理系統設計?

作者:橘子洲頭 全文共 2210 字 5 圖,閱讀需要 6 分鐘 ———— / BEGIN / ———— 在人人都是產品經理的網站上蟄居了4年,學習了四年,由於最近的工作方向偏向於後臺,在設計後臺時時常會查閱後臺的相關資料,但是關於後臺的文章等內容分享的太少了。 正好這一段時間在調整,想嘗試撰寫一系

python基礎案例學生名片資訊管理系統

功能: 1.能迴圈輸入內容 2.展示功能 -1.新增名片 -2.顯示全部 -3.查詢名片 -0.退出系統 3.讓使用者輸入希望執行的操作 例如輸入1,2,3,0 4.新增列表 提示使用者輸入姓名, 輸入電話 輸入qq號 輸入郵箱 提示新增名片成功。 5.顯

最課程階段大作業04毫無用處的學生管理系統

前面幾期就業班學生知道,我在做簡歷指導時說過:如果你的簡歷中專案經歷寫的是“學生管理系統”、“**辦公自動化”這樣的系統,那麼就等於告訴面試官:你沒有專案經驗。 對於面試找工作,學生管理系統這樣的專案簡直毫無用處,甚至是減分項。如果你一定要說你實現了一個NB的學生管理系統,那麼就需要拿出你在GITHUB上的

開源專案1某大學校友管理系統

========================大家可以建議我需要分享點什麼,我會盡自己能力=================================== 申明:所有的本人開源專案僅供學習交流用。 本專案適合物件:入門級別 為支援開源,我會慢慢將私有的專案開源(由於web為主,輔以android

FFmpeg原始碼簡單分析結構體成員管理系統-AVClass

=====================================================FFmpeg的庫函式原始碼分析文章列表:【架構圖】【通用】【解碼】【編碼】【其它】【指令碼】【H.264】================================

暢行智慧營院北京門禁管理系統

    北京門禁管理系統這個關鍵詞已經是行業里人們必搜的關鍵詞,今天想和大家分享的是,門禁管理系統其實還可以確切分為車輛門禁管理系統和人員門禁管理系統。     車輛門禁主要是通過識別進出車輛的車牌。當車輛通行時,系統會自動對車輛進行識別並在介面上顯示車輛資訊,如果車輛具備