作業系統 程序管理

2021-09-19 16:35:41 字數 4493 閱讀 6883

1. 程序描述

2. 程序狀態

2.2 程序狀態變化模型

2.3 程序掛起模型

2.4 程序控制

3. 執行緒

4.ipc

5. 程序互斥與同步

乙個程式在乙個資料集合上的一次動態執行過程。

程式=演算法+資料結構

與程式的區別:

併發concurrency:一段時間內有多個程序執行;

並行parallelism:乙個時刻有多個程序執行。

剛剛說過,程式=演算法+資料結構,描述程序的資料結構用到了程序資料塊pcb,os為每個程序維護了乙個pcb(os concept 9th p170)。

pcb:os管理控制程序所用的資訊集合,它是程序存在的唯一標識。

pcb包含3類資訊:

pcb的組織形式:

以下為程序切換(或者說上下文切換)圖示。

上下文切換和cpu排程不同,後者是從就緒佇列中挑選cpu下乙個要執行的程序或執行緒,排程程式負責挑選程序或執行緒的核心函式。

核心滿足排程程式條件之一即可:

排程策略有搶占式preemptive和非搶占式non-preemptive。搶占式更靈活高效。

排程演算法:

實時排程,多處理器排程,優先順序反轉暫不整理。

程序建立

程序執行

程序等待

程序喚醒

程序結束

引起程序建立的3個事件:

選擇乙個就緒程序占用cpu。如何選擇要用到排程演算法.

也叫阻塞,有以下觸發條件:

程序只能自己阻塞自己。

喚醒原因:

程序只能被別的程序或os喚醒。

有4種情況:

ready,running,waiting或blocked是3種基本狀態。

掛起(suspend)的程序沒有占用記憶體,程序映像在磁碟中。

程序掛到外存分為這3類:

就緒->就緒掛起:有高優先順序程序存在

執行->就緒掛起:搶先式分時系統中,有高優先順序阻塞掛起程序因事件出現而就緒掛起(下面要說的這種情況)

外存中的狀態轉換:

啟用activate:把程序從外存轉到記憶體。有以下2種情況:

狀態佇列:表示當前os所有程序的狀態。不同狀態用不同佇列表示。

每個程序的pcb根據當前狀態加入相應佇列。

exec()呼叫允許程序載入乙個不同的程式,可指定argcar**。呼叫成功後,仍是相同程序,但執行了不同的程式,pcb會變化,堆疊會重寫。

fork()對子程序分配記憶體,子程序複製父程序的記憶體和cpuj暫存器,開銷大。多數情況下,使用fork()後呼叫exec()再次覆蓋記憶體,所以前面的複製工作是多餘的。優化後的函式有vfork()

vfork()又稱為虛擬fork()、輕量級fork(),它建立乙個子程序,並共享父程序的記憶體資料,而不是複製,之後立即d呼叫exec()

結束子程序要用exit()而不是return,如果你在vfork()return了,那麼,這就意味main()函式return了,注意因為函式棧父子程序共享,所以整個程式的棧就跪了。

wait()被父程序用來接收子程序返回的值,並進行處理。它會使父程序睡眠並等待返回值。子程序呼叫exit()後,os解鎖父程序,並通過exit()的返回值作為wait()的結果。

exit()會以返回值為引數,釋放資源,並檢查父程序是否活著,如果活著,則保留結果知道父程序使用,進入殭屍zombie/defunct狀態;如果父程序沒有或者,則該程序死亡。

如果父程序先退出 ,子程序被init接管,子程序退出後init會**其占用的相關資源,清理殭屍程序。

併發時,程序之間要通訊,還要共享資料。但維護程序的開銷很大:

執行緒thread這種新的實體,滿足以下特性:

thread:程序當中的一條執行流程。

對比程序:

相同點:都有[5種狀態](#2.2 程序狀態變化模型)。

執行緒有自己的組織結構tcb.

執行緒優點:

缺點:

現代瀏覽器開啟網頁是用程序,崩潰後不影響其它程序。

早期ms-dos是單程序、單執行緒的;unix是多程序、單執行緒的。

3種實現:

使用者執行緒與核心執行緒的對應關係(os concept 9th p170):

不依賴核心,由使用者級執行緒庫管理,包括建立、終止、同步和排程,可用於不支援執行緒技術的多程序os。

每個程序都有tcb列表,由執行緒庫函式維護。

使用者執行緒切換也由執行緒庫函式完成,無需使用者態和核心態切換,所以快。

允許每個程序有自定義的執行緒排程演算法。

缺點:pcb和tcb都由核心維護。建立、終止和切換都通過系統呼叫或核心函式進行,所以開銷大。

乙個程序中,若某執行緒發起系統呼叫而阻塞,不會影響其它執行緒。

獲得更多cpu時間。

乙個程序可有多個輕量級程序,每個輕量級程序由乙個單獨的核心執行緒支援。

ipc兩個原語:

兩種方式:

間接通訊:通過核心

直接通訊:共享記憶體

訊息傳遞可以阻塞或非阻塞。阻塞被認為是同步的,非阻塞被認為是非同步的,

race condition,具有不確定性,難以重現。

避免方法:原子操作atomic operation,使指令不被打斷。

starvation,乙個可執行的程序,被排程器持續忽略,導致雖處於可執行狀態卻不被執行。

critical section,指程序中一段需要訪問共享資源並且當另乙個程序處於相應**區域時便不會被執行的的**區域。

至此,我們引入鎖的概念。

lock.

acquire()

//在鎖被釋放前一直等待,然後獲得鎖。

//critical section

lock.

release()

//釋放鎖並喚醒等待中的程序

臨界區的一些屬性:

互斥,mutual exclusion,當乙個程序處於臨界區並訪問共享資源時,沒有其它程序會處於臨界區並且訪問任何相同的共享資源。

臨界區只能用於物件在同一程序裡執行緒間的互斥訪問;互斥量是可以命名的,可以跨越程序使用

mutex是核心物件,慢;critical section非核心物件,快。

臨界區**保護的方法:

兩個或以上的程序,互相等待完成特定任務,沒法將自身任務進行下去。

一組阻塞的程序各持有一種資源,並彼此等待獲取另乙個程序所占有的乙個資源。本質是併發共享問題。

死鎖4個必要條件:

處理方法:

資源分配圖、銀行家演算法等內容查閱《os concept》死鎖一章。

semaphare,對於乙個整型資料sem,有兩個原子操作:

這兩個操作是早期unix主要的同步原語,現在很少用。

兩種訊號量:

訊號量可用在兩個方面:

monitor,也稱監視器

管程的目的:分離互斥和條件同步的關注。

管程包含:

管程把共享變數和對它進行操作的若干個操作封裝起來。在管程入口處可能有多個等待佇列,而程序只能互斥使用管程。

管程使用了條件變數這種同步機制。條件變數是在管程內部的資料結構,且只有在管程內才能被訪問,它對管程內所有過程是全域性的,只能通過wait(),signal()兩個操作訪問。

幾個經典同步問題:

作業系統 程序管理

程序 申請資源和排程資源的基本單位,乙個程序就是乙個程式的乙個執行過程。是乙個動態的概念,在不同的作業系統中,會有不同的程序出現。程式 靜態概念,是指令和資料的集合,可長期儲存。程序與程式對應關係 乙個程式可以對應乙個程序或者多個程序 乙個程序可以對應乙個程式,或者一段程式 程序由程式,資料集合,程...

作業系統 程序管理

當多個作業並處於記憶體中時,同乙個作業中沒有前趨關係的程式段或者不同作業的程式段可以並行執行。程式併發執行的特徵 程式併發導致的不可再現性 由於程式的併發執行,失去了封閉性,其計算結果與併發程式推進的速度有關,從而失去了程式的可再現性,也就是說,程式經過多次執行後,雖然執行時的環境和初始條件相同,但...

作業系統 程序管理

程序 申請資源和排程資源的基本單位,乙個程序就是乙個程式的乙個執行過程。是乙個動態的概念,在不同的作業系統中,會有不同的程序出現。程式 靜態概念,是指令和資料的集合,可長期儲存。程序與程式對應關係 乙個程式可以對應乙個程序或者多個程序 乙個程序可以對應乙個程式,或者一段程式 程序由程式,資料集合,程...