linux--幾種常見的進程調度算法

進程調度:在操作系統中調度是指一種資源分配,因而調度算法是指:根據系統的資源分配策略所規定的資源分配算法。操作系統管理了系統的有限資源,當有多個進程(或多個進程發出的請求)要使用這些資源時,因為資源的有限性,必須按照一定的原則選擇進程(請求)來占用資源。這就是調度。目的是控制資源使用者的數量,選取資源使用者許可占用資源或占用資源。

1 先來先服務(隊列)

? ? 先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用于作業調度,也可用于進程調度。當在作業調度中采用該算法時,每次調度都是從后備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,為它們分配資源、創建進程,然后放入就緒隊列。在進程調度中采用FCFS算法時,則每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞后才放棄處理機。算法總是把處理機分配給最先進入就緒隊列的進程,一個進程一旦分得處理機,便一直執行下去,直到該進程完成或阻塞時,才釋放處理機。
缺點:比較有利于長作業,而不利于短作業。 有利于CPU繁忙的作業,而不利于I/O繁忙的作業。

2 最短優先(優先隊列)

? ? 最短優先調度算法是指對短作業或短進程優先調度的算法。它們可以分別用于作業調度和進程調度。短作業優先(SJF)的調度算法是從后備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。而短進程優先(SPF)調度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執行并一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新調度。

缺點:長作業的運行得不到保證。


3 輪轉法(RoundRobin)

將系統中所有的就緒進程按照FCFS原則,排成一個隊列。每次調度時將CPU分派給隊首進程,讓其執行一個時間片。時間片的長度從幾個ms到幾百ms。在一個時間片結束時,發生時鐘中斷調度程序據此暫停當前進程的執行,將其送到就緒隊列的末尾,并通過上下文切換執行當前的隊首進程。 進程可以未使用完一個時間片,就出讓CPU(如阻塞)。

4 多級反饋隊列算法

設置多個就緒隊列,分別賦予不同的優先級,如逐級降低,隊列1的優先級最高。每個隊列執行時間片的長度也不同,規定優先級越低則時間片越長,如逐級加倍。2 新進程進入內存后,先投入隊列1的末尾,按FCFS算法調度;若按隊列1一個時間片未能執行完,則降低投入到隊列2的末尾,同樣按FCFS算法調度;如此下去,降低到最后的隊列,則"時間片輪轉"算法調度直到完成。僅當較高優先級的隊列為空,才調度較低優先級的隊列中的進程執行。如果進程執行時有新進程進入較高優先級的隊列,則搶先執行新進程,并把被搶先的進程投入原隊列的末尾。


進程調度的性能評價:

進程調度雖然是在系統內部的低級調度,但進程調度的優劣直接影響作業調度的性能。那么,怎樣評價進程調度的優劣呢?反映作業調度優劣的周轉時間和平均周轉時間只在某種程度上反映了進程調度的性能,例如,其執行時間部分中實際上包含有進程等待(包括就緒狀態時的等待)時間,而進程等待時間的多少是要依靠進程調度策略和等待事件何時發生等來決定的。因此,進程調度性能的商量是操作系統設計的一個重要指標。我們說進程調度性能的衡量方法可分為定形和定量兩種。在定形衡量方面,首先是調度的可靠住。包括一次進程調度是否可能引起數據結構的破壞等。這要求我們對調度時機的選擇和保存CPU現場十分謹慎。另外,簡潔性也是衡量進程調度的一個重要指標,由于調度程序的執行涉及到多個進程和必須進行上下文切換,如果調度程序過于繁瑣和復雜,將會耗去較大的系統開銷。這在用戶進程調用系統調用較多的情況下,將會造成響應時間大幅度增加。進程調度的定量評價包括CPU的利用率評價、進程在就緒隊列中的等待時間與執行時間之比等。實際上由于進程進入就緒隊列的隨機模型很難確定,而且進程上下文切換等也將影響進程的執行效率,LL而對進程調度進行解析是很困難的。一般情況下,大多利用模擬或測試系統響應時間的方法來評價進程調度的性能。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382873.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

指針數組和數組指針和函數指針

文章目錄1.指針數組和數組指針1.int *p1[10];2.int (*p2)[10];2.函數指針char *(*fun1)(char * p1,char *p2)函數指針的概念函數指針的作用:例子1 .調用方式例子2:(帶注釋)例子33.做題的小技巧1.指針數組和數組指針 1.int *p1[10…

使用虛擬環境virtualenv 創建虛擬環境出現PermissionError: [Errno 13] Permission denied:

使用虛擬環境virtualenv 創建虛擬環境出現PermissionError: [Errno 13] Permission denied: 原因:虛擬環境安裝的目錄所屬用戶非當前用戶 解決辦法:將目錄及其文件的所有者改為當前用戶 解決命令:sudo chown -R 當前用戶 待更改用戶的目錄/ …

linux之父子進程的輸出

首先,我們來回憶一下父進程與子進程,前幾節講了如何創建子進程,像這樣的,pid_t id fork(); 這樣我們就創建好了一個子進程,然而fork()函數的返回值是什么呢?這里要記住:子進程返回0&#xff0c…

linux---談談vfork和fork的區別及exit與return

fork():創建子進程的函數,是大家比較熟悉的吧。pid_t id fork(); 這里的vfork();也是創建子進程的函數。現在我們來剖析一下它們吧。 第一例: 先看一個fork()的例子哦。 對于fork()而言,創建子進程成功后直接打印出父子進程執…

在MySQL數據庫建立多對多的數據表關系

轉載自 https://blog.51cto.com/13145200724/1370753

C語言模擬實現標準庫函數之qsort()

qsort 編譯器函數庫自帶的快速排序函數。 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 參數解釋: void*base-待排序數組首地址size_t num-數組中待排序元素數量size_t width-各元素的占用空間大小int(__cde…

django contrib 包簡介

轉自 https://www.cnblogs.com/tianboblog/p/6955297.html

linux之管道

管道(PIPE)是linux中一個重要的通信方式,在進程中,我們通過從一個進程中讀取到的數據轉到另一個進程中的寫數據中,這時就要有不同的進程之間共享同一份資源,就是所謂的進程間通信。由于進程的特點是資源獨占…

把student a am i 變成 i am a student(兩種方法)

文章目錄#student a am i 變成 i am a student##方法1&#xff1a;指針#include <stdlib.h> #include <stdio.h> #include <string.h>void fanw(char *l, char *r) {char* left l;char* right r;char temp;while (left < right){temp *left;*left *ri…

關掉占用 某端口的進程

sudo fuser -k 8000/tcp 這樣和端口8000相關的進程就都關了。

linux之多線程(1)

我們之前講了進程&#xff0c;今天我們重新認識另外一個概念---線程。我們首先會想到的是進程和線程有什么區別和聯系&#xff0c;對吧&#xff1f;進程是由程序執行起來&#xff0c;跑在操作系統的&#xff0c;是系統進行資源分配和調度的基本單位。進程具有資源獨占性&#x…

C語言typedef與#define的區別

typedef和#define define 沒有參加編譯&#xff0c;在預處理的時候就被替換掉了。 typedef參加編譯和鏈接。typedef是重命名&#xff0c;可以為枚舉結構體等等重新命名&#xff0c;提高代碼整潔。 一、typedef的用法 C語言中&#xff0c;typedef常用來定義一個標識符及關鍵…

django models模型 內部類 class Meta 簡介

class Meta: #這個屬性是定義當前的模型類是不是一個抽象類。所謂抽象類是不會相應數據庫表的。一般我們用它來歸納一些公共屬性字段&#xff0c;然后繼承它的子類能夠繼承這些字段。abstractTrue #db_table是用于指定自己定義數據庫表名的db_table test#因為Django的管理方法…

阻斷血緣關系以及checkpoint文件清理

spark-sql讀寫同一張表&#xff0c;報錯Cannot overwrite a path that is also being read from 1. 增加checkpoint&#xff0c;設置檢查點阻斷血緣關系 sparkSession.sparkContext.setCheckpointDir("/tmp/spark/job/OrderOnlineSparkJob")val oldOneIdTagSql s&…

linux之睡眠函數(my_sleep)

我們在程序中&#xff0c;很多次用到sleep()函數&#xff0c;讓它睡眠幾秒后再執行該進程。今天呢&#xff0c;我要給大家實現一下sleep函數。 看看代碼哦&#xff1a; 運行結果&#xff1a; 結果中每隔三秒鐘&#xff0c;打印一條語句。實現了sleep(3)的功能。 關于sleep函數…

C語言 防止頭文件被多次引用

comm.h和comm.c是公共模塊。 test1.h和test1.c使用了公共模塊。 test2.h和test2.c使用了了公共模塊。 test.h和test.c使?用了了test1模塊和test2模塊。 這樣最終程序中就會出現兩份comm.h的內容。這樣就造成了了文件內容的重復。 1.方法1 文件開頭加上這一句就ok #prag…

python字符串切片操作

name abcdefghijk name[2:-1] cdefghijname[2:] cdefghijk # 第三個參數是步長 name[2:-1:2] cegi# 字符串反轉 name[::-1] name[-1::-1] kjihgfedcba kjihgfedcba

機器思維。一些讓我眼前一亮的算法。

用人腦相處了計算機處理數據的方式。而不是 人腦處理的方式—>用計算機的語言表達 人腦處理的方式—>計算機處理的方式—>用計算機的語言表達

python 之 __new__ 方法理解

python的new方法 使用場景不同效果也不一樣 一種是指定元類時候&#xff0c; metaclassMyType 類型 這種方式 在解釋器執行到 metaclassCrawlerProxyMetaclass 的時候&#xff0c; __new__方法就開始執行&#xff01; 這里的 __new__方法是用來創建類對象的 class CrawlerProx…

詳解強制類型轉換

今天談談類型轉換的問題吧&#xff0c;之前我們也遇到過類型轉換&#xff0c;比如c語言中這樣的賦值&#xff1a; 顯然&#xff0c;i和j是不同類型的變量&#xff0c;但是卻可以完成賦值&#xff0c;結果是這樣的&#xff1a; 其實它們是做了隱式的類型轉換&#xff0c;相當于&…