先進先出調(diào)度算法,改進后的時間片輪轉(zhuǎn)調(diào)度算法更易操控進程調(diào)度

時間片輪轉(zhuǎn)調(diào)度算法(Round Robin Scheduling Algorithm)是一種操作系統(tǒng)進程調(diào)度算法。它是先進先出(FIFO)調(diào)度算法的一種改進版本。

該算法的工作方式如下:

系統(tǒng)維護一個有限長的隊列,該隊列包含所有就緒的進程。

每個進程都有一個時間片,指定了該進程在處理機上的最大運行時間。

在處理機上,每次進程運行的時間不超過其時間片。

如果一個進程的運行時間小于其時間片,則該進程在運行完后等待。

如果一個進程的運行時間等于其時間片,則該進程在運行完后被調(diào)度器替換為下一個進程。

優(yōu)點:

每個進程都有機會在處理機上運行,從而避免饑餓。

由于每個進程都只能在處理機上運行一段固定的時間,因此不會存在占用太長時間的進程。

缺點:

由于每次切換都需要花費額外的時間,因此速度較慢。

可能存在因等待時間太長而導致進程失去響應(yīng)的情況。

時間片輪轉(zhuǎn)調(diào)度算法適用于多任務(wù)環(huán)境,特別是在處理大量小任務(wù)時,效率比較高。然而,對于大任務(wù)或長時間運行的任務(wù),效率較低,因為它需要頻繁地切換。

該算法在不同的編程語言中的代碼實現(xiàn)可能有所差異,但基本思路和流程相似。在 Java 中,通過使用線程和循環(huán)實現(xiàn)該算法是很常見的。

以下是一個 Java 代碼示例,模擬了時間片輪轉(zhuǎn)調(diào)度算法:

import java.util.*;

public class RoundRobin {

static void findWaitingTime(int processes[], int n, int bt[], int wt[], int quantum) {

int rem_bt[] = new int[n];

for (int i = 0 ; i < n ; i++)

rem_bt[i] = bt[i];

int t = 0;

while(true) {

boolean done = true;

for (int i = 0 ; i < n; i++) {

if (rem_bt[i] > 0) {

done = false;

if (rem_bt[i] > quantum) {

t += quantum;

rem_bt[i] -= quantum;

}

else {

t = t + rem_bt[i];

wt[i] = t – bt[i];

rem_bt[i] = 0;

}

}

}

if (done == true)

break;

}

}

static void findTurnAroundTime(int processes[], int n, int bt[], int wt[], int tat[]) {

for (int i = 0; i < n ; i++)

tat[i] = bt[i] + wt[i];

}

static void findavgTime(int processes[], int n, int bt[], int quantum) {

int wt[] = new int[n], tat[] = new int[n];

int total_wt = 0, total_tat = 0;

findWaitingTime(processes, n, bt, wt, quantum);

findTurnAroundTime(processes, n, bt, wt, tat);

System.out.println(“Processes ” + ” Burst time ” + ” Waiting time ” + ” Turn around time”);

for (int i=0; i<n; i++) {

total_wt = total_wt + wt[i];

total_tat = total_tat + tat[i];

System.out.println(” ” + (i+1) + “\t\t” + bt[i] + “\t\t” + wt[i] + “\t\t” + tat[i]);

}

System.out.println(“Average waiting time = ” + (float)total_wt / (float)n);

System.out.println(“Average turn around time = ” + (float)total_tat / (float)n);

}

public static void main(String[] args) {

int processes[] = { 1, 2, 3};

int n = processes.length;

int burst_time[] = {10, 5, 8};

int quantum = 2;

findavgTime(processes, n, burst_time, quantum);

}

}

該代碼中定義了三個方法:

findWaitingTime:計算每個進程的等待時間。

findTurnAroundTime:計算每個進程的周轉(zhuǎn)時間。

findavgTime:計算平均等待時間和平均周轉(zhuǎn)時間。

在?main?方法中,首先定義了三個進程的編號,以及每個進程的爆發(fā)時間。接下來設(shè)置時間片為 2,最后調(diào)用?findavgTime?方法,計算平均等待時間和平均周轉(zhuǎn)時間。



轉(zhuǎn)載說明:本文部分內(nèi)容引用自電腦監(jiān)控軟件https://www.vipshare.com/archives/40156,
轉(zhuǎn)載請?zhí)峁┏鎏?/h4>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容