作業系統:程式狀態轉換模擬,C語言實現
編寫並除錯一個模擬的程式排程和程式狀態轉換過程,採用“基於時間片輪轉法”排程演算法對N(N不小於5)個程式進行排程。要求使用C/C++程式設計實現(如有難度也可酌情使用Java或C#實現)。首先繪製流程圖,然後將程式原始碼和執行效果放入實驗報告中。
簡單輪轉法的基本思想是:所有就緒程式按先來先服務的方式排成一個佇列,總是把處理機分配給隊頭的程式,各程式佔用CPU的時間片長度相同(如1個CPU時間單位)。當把處理機分配給隊頭的程式後,該程式出就緒佇列,並將程式狀態從就緒態變化為執行態。如果執行程式用完它的時間片後還未完成,就把它送回到就緒佇列的末尾,同時將程式狀態從執行態變換為就緒態,把處理機重新分配給就緒隊頭的程式。當程式所需的CPU時間全部被滿足後,將該程式加入已完成執行程式佇列,並記錄其完成時間(第幾個CPU時間片單位時完成)。直至所有的程式執行完畢。
程式原始碼中必須顯著註釋標明PCB的資料結構(用於記錄模擬的程式的狀態、完成時間和連結資訊等)。需要在程式執行時列印輸出版權資訊:如姓名、班級、學號。
隨機生成N>3個程式(也可以手動順序錄入程式個數和每個程式,按生成/錄入順序組成就緒佇列),並生成/錄入每個程式的時間片需求,模擬各個程式執行過程。比如錄入3個程式分別為P1、P2、P3,需求的CPU時間分別為5、3、4個時間片單位,那麼程式模擬該3個程式的執行及狀態轉換過程,輸出為:
T1時刻:P1使用了1個CPU時間片,P1需求剩餘時間片為4,就緒佇列為P2(3個時間片)->P3(4個時間片),執行完成的程式為:空。
T2時刻:P2使用了1個CPU時間片,P2需求剩餘時間片為2,就緒佇列為P3(4個時間片)->P1(4個時間片),執行完成的程式為:空。
T3時刻:P3使用了1個CPU時間片,P3需求剩餘時間片為3,就緒佇列為P1(4個時間片)->P2(2個時間片),執行完成的程式為:空。
T4時刻:P1使用了1個CPU時間片,P1需求剩餘時間片為3,就緒佇列為P2(2個時間片)->P3(3個時間片),執行完成的程式為:空。
C程式碼如下(VS2019):
#include<stdio.h>
#include<stdlib.h>
struct ProcessOfMy
{//定義程式
int name;
int timeRequire;
//1為就緒態,0為執行態,-1為已經完成
int currentState;
ProcessOfMy* next;
};
typedef struct ProcessOfMy PCB;
struct PCBQueue
{//定義PCB佇列
int numOfProcess=0;
ProcessOfMy *front, *rear;
};
typedef struct PCBQueue PCBQueue;
PCB* InitPCBQuee(PCB* process)
{
PCB*queue = (PCB*)malloc(sizeof(PCB));
if (queue == NULL)
{
return NULL;
}
queue->next=NULL;
process = queue;
return process;
}
PCB* EnProcess(PCB*rear,int a)
{//加入佇列
PCB* p = (PCB*)malloc(sizeof(PCB));
if (p == NULL)
{
return NULL;
}
int timeRequire = rand()%15;
p->currentState = 1;
p->timeRequire = timeRequire;
p->name = a;
p->next = NULL;
rear->next = p;
rear = p;
return rear;
}
PCB* DeProcess(PCB* front, PCB* rear)
{//從佇列中刪除
PCB* p;
p = front;
front = front->next;
p->next = NULL;
rear->next = front;
return front;
}
PCB* SchProcess(PCB*front, PCB*rear)
{//將完成一個時間片的程式加入隊尾
rear->next = front;
return rear;
}
void ChangeCurrentState(PCBQueue *PCB)
{//若隊頭程式完成,改變該程式的狀態
PCB->front->currentState = -1;
}
void PrintReadyProcess(PCBQueue *pcbQueue)
{//列印出就緒佇列中的程式
printf("就緒佇列有%d個程式:\n", pcbQueue->numOfProcess);
PCB* p;
int i;
for (p = pcbQueue->front,i=0;i!=pcbQueue->numOfProcess;i++,p = p->next)
{
printf("程式%d(剩餘%d單位時間片)\n", p->name, p->timeRequire);
}
printf("\n");
}
int main()
{
printf("2018015276 軟體18-2 張政威");
PCB process, * front, * rear,*cpFront,*cpRear,cpProcess,*p,*p1;
//建立PCB
PCBQueue pcbQueue;
//初始化就緒佇列
front = rear = InitPCBQuee(&process);
//初始化已完成佇列
cpFront=cpRear= InitPCBQuee(&cpProcess);
int i;
for (i = 0;i < 5;i++)
{//初始化程式
rear = EnProcess(rear, i);
if (i == 0)
{
front = rear;
}
pcbQueue.rear = rear;
pcbQueue.numOfProcess++;
printf("程式%d 時間片要求%d\n", rear->name, rear->timeRequire);
}
//隊尾指向隊頭形成迴圈佇列
rear->next = front;
pcbQueue.front = front;
pcbQueue.rear = rear;
printf("\n");
while (pcbQueue.numOfProcess!=0)
{
//對第一個程式操作並且操作完之後判斷
pcbQueue.front->timeRequire--;
printf("程式%d使用了一個CPU時間片,還需要%d個時間片\n", pcbQueue.front->name, pcbQueue.front->timeRequire);
if (pcbQueue.front->timeRequire == 0)
{//判斷第一個程式是否完成,若完成則釋放並且程式數減一
printf("程式%d完成,出隊\n", pcbQueue.front->name);
ChangeCurrentState(&pcbQueue);
p = pcbQueue.front;
//從佇列中刪除隊頭已完成的程式
pcbQueue.front=DeProcess(pcbQueue.front, pcbQueue.rear);
p->next = NULL;
//將刪除的程式加入已完成佇列,並且輸出整個已完成佇列的名單
cpRear->next = p;
cpRear = p;
printf("已完成的程式有:");
for (p1 = cpFront->next;p1 != NULL;p1 = p1->next)
{
printf("%d ", p1->name);
}
printf("\n");
//PCB中就緒程式數減一
pcbQueue.numOfProcess--;
PrintReadyProcess(&pcbQueue);
continue;
}
//隊頭,隊尾前進
pcbQueue.rear = pcbQueue.rear->next;
pcbQueue.front = pcbQueue.front->next;
PrintReadyProcess(&pcbQueue);
}
printf("作者資訊C語言實現\n");
return 1;
}
相關文章
- C語言實戰!!!:商城系統模擬C語言
- 用java語言,模擬實現作業系統的銀行家演算法。Java作業系統演算法
- 【作業系統】銀行家演算法實現(C語言)作業系統演算法C語言
- 【作業系統】頁面置換演算法(最佳置換演算法)(C語言實現)作業系統演算法C語言
- C語言實驗作業C語言
- 作業系統實驗:銀行家演算法(C語言)作業系統演算法C語言
- 初識程式(一)——作業系統,程式管理,程式狀態作業系統
- Java作業系統課設之模擬程式管理系統Java作業系統
- C語言動態陣列小作業C語言陣列
- c語言作業C語言
- 用java語言,模擬實現作業系統的程式排程演算法,先來先服務,高優先順序、高響應比、時間片輪轉和短作業Java作業系統演算法
- 作業系統——c++實現頁式虛擬儲存管理作業系統C++
- 語法糖甜不甜?巧用列舉實現“狀態”轉換限制
- 程式的狀態與轉換
- C語言作業2C語言
- C語言作業1。C語言
- C語言程式設計B作業04C語言程式設計
- C語言,實現數字譜到簡譜的轉換(二)C語言
- C語言編寫作業系統有什麼好處C語言作業系統
- SkyEye:助力飛行器狀態控制系統模擬
- 寫作業系統之實現程式作業系統
- 模擬實現不受限制的字串函式--C語言版字串函式C語言
- c語言與字串相關的庫函式的模擬實現C語言字串函式
- 手機寫作業系統之 使用C語言編寫核心作業系統C語言
- Linux作業系統中如何檢視當前程式的狀態?Linux作業系統
- c語言模擬Python的命名引數C語言Python
- 數字樣機:飛行器狀態控制系統模擬
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- “c語言+結構體+連結串列”實現名片系統C語言結構體
- 狀態模式(c++實現)模式C++
- C語言的隱式型別轉換C語言型別
- C語言進位制轉換與列印C語言
- 原生 JavaScript 實現 state 狀態管理系統JavaScript
- PAT-B 1059 C語言競賽【模擬】C語言
- C語言I部落格作業03C語言
- C語言I博課作業04C語言
- C語言I部落格作業04C語言
- C語言I部落格作業05C語言