1. 程式人生 > >【Linux】程序

【Linux】程序

程序排程演算法

FCFS

先來先服務(first-come first-served, FCFS)的排程演算法,是按照程序到達的先後次序進行排程,或者說它是優先考慮在就緒佇列中等待時間最長的程序,而不管該程序所需執行的時間長短

SPF

短程序優先(short process first, SPF)的排程演算法,是以程序所要求的執行時間長短來衡量優先順序,時間越短,其優先順序越高

缺點
  • 必須預知程序的執行時間
  • 長程序週轉時間會明顯增長
  • 無法實現人機互動
  • 不能保證緊迫性作業能即時處理

PSA

優先順序排程演算法(priority-scheduling-algorithm, PSA),FCFS與SPF均不能對緊迫性程序進行處理,而PSA則是基於程序的緊迫程度,由外部賦予程序相應的優先順序,排程演算法是根據該優先順序進行排程的。這個分配可以在程序建立時確立,整個執行期間不再改變,這種優先順序成為靜態優先順序;動態優先順序是指在程序建立的時候先賦予一個優先順序,然後其值隨程序的推進或等待時間的增加而改變,以獲得更好的排程效能,比如下面的HRRN。

當然,當CPU正在執行一個程序,此時另一個高優先順序的程序進入就緒佇列,如果此時CPU放棄當下程序,去執行高優先順序程序,這種方式就成為搶佔式優先順序排程演算法;若不進行搶佔,而是等到當前程序執行完再執行高優先順序程序,就被稱為非搶佔優先順序排程演算法

HRRN

高響應比優先排程演算法(Highest Response Ratio Next, HRRN)是結合了FCFS和SPF,平衡了程序的等待時間的程序的執行時間,從而改善了處理機的排程效能

在這裡插入圖片描述

可見該優先順序是動態變化的,長程序的優先順序可以隨著等待時間的增加而提高,當其等待時間足夠長時,也可以獲得處理機。但同時也存在一個缺點,每次進行排程之前都要計算響應比,這無疑增加了系統開銷

RR

基於時間片的輪轉(round robin,RR)排程演算法是先根據FCFS策略將就緒程序排成一個就緒佇列,每隔一定時間產生一次中斷,啟用系統中的程序排程程式完成一次排程。先將CPU分配給隊首程序,當該程序時間片消耗盡或者執行完畢再將CPU分配給新的隊首程序,未執行完的程序再插到隊尾繼續等待執行。

時間片的選擇:

  • 時間片太小,意味著會頻繁的執行程序排程和上下文切換,增加系統開銷
  • 時間片過長,能讓每一個程序都能在一個時間片內完成,RR便退化成為FCFS演算法
  • 一個較為可取的時間片大小是略大於一次典型的互動所需要的時間,使大多數互動式程序能在一個時間片內完成,從而獲得很小的響應時間

多佇列排程演算法

在多處理機系統中,一個就緒佇列無法滿足不同使用者對程序排程策略的不同要求,所以將程序的就緒佇列從一個拆分為若干個,將不同型別或性質的程序固定在不通過的就緒佇列,不同的就緒佇列採用不同的排程演算法,一個就緒佇列中的程序可以設定不同的優先順序,不同的就緒佇列本身也可以設定不同的優先順序

多級反饋佇列排程演算法

多級反饋佇列排程演算法特點在於未指明程序的長度時,依然能高效的實現程序排程

  • 在系統中設定多個就緒佇列,併為每個佇列賦予不同的優先順序。第一個佇列的優先順序最高,第二個次之,其餘佇列的優先順序逐個降低。該演算法為不同佇列中的程序所賦予的執行時間片的大小也各不相同,在優先順序愈高的佇列中,其時間片就愈小
  • 每個佇列都採取FCFS演算法,若一個程序進入到第一個佇列執行,時間片內完成便撤離系統,否則排程程序到第二佇列末尾等待,若在第二佇列仍未完成,繼續下調…當該程序被下調到第N佇列,在該佇列採用RR方式執行
  • 排程程式首先排程最高優先順序佇列中的程序執行,僅當第一佇列空閒時才排程第二佇列中的程序執行

PCB(程序控制塊)

不難發現,在上面程序的排程演算法中,不管是優先順序排程演算法優先順序的確定,還是搶佔式優先順序排程演算法中程序上下文的切換,都需要程序的相關資訊

作業系統管理程序,實則是將程序的有效資訊提取出來然後通過管理這些資訊來管理程序,而所有的程序資訊被存放在一個叫做程序控制塊的資料結構中(可以理解為程序屬性的集合),即PCB(程序控制塊)

每個程序在核心中都有一個程序控制塊(PCB)來維護程序相關的資訊,Linux核心的程序控制塊是task_struct結構體

下面是兩篇大佬關於task_struct各欄位詳細介紹的部落格:

殭屍程序&孤兒程序

殭屍程序

程序退出的時候都會向它的父程序傳送退出狀態碼,如果父程序正常讀取了這個退出狀態碼,子程序退出成功;而一旦子程序的退出狀態碼沒有被父程序讀取,父程序這時候還在執行,子程序將會進入殭屍狀態

通過下面這段程式碼來造成殭屍程序: 在這裡插入圖片描述

一個程序建立了子程序,啟動後子程序睡眠五秒後退出,此時父程序正處於睡眠狀態,無法對子程序的退出狀態碼進行讀取,在父程序睡眠的這段時間裡,子程序就處於殭屍態

在這裡插入圖片描述

孤兒程序

如果一個程序的父程序先於自己退出,該程序就被稱為孤兒程序 用下面這段程式碼來製造孤兒程序: 在這裡插入圖片描述 在這裡插入圖片描述

可以發現,父程序退出後,該程序由前端轉到了後臺 在這裡插入圖片描述

環境變數

環境變數一般是指在作業系統中用來指定作業系統執行環境的一些引數

環境變數相關的命令

  • echo $NAME:NAME表示指定的環境變數名稱
  • export:設定一個新的環境變數
  • env:顯示所有的環境變數
  • set:顯示本地定義的shell變數和環境變數
  • unset:清除環境變數

環境變數的屬性

  • getenv(“NAME”):使用者獲得環境變數NAME的內容
  • putenv(“NAME”):如果該環境變數原先存在,則變數內容會依引數envvar改變,否則此引數內容會成為新的環境變數

全域性變數一般具有全域性屬性,可以被子程序繼承下去 在這裡插入圖片描述 在這裡插入圖片描述

但是在每一個終端上開啟的shell都是獨立的,在一個shell中定義的環境變數,不會在其他shell中有效 在這裡插入圖片描述