作業
用戶在一次解題或一個事務處理過程中要求計算機系統所做工作的集合。它包括用戶程序、所需要的數據及控制命令等。作業是由一系列有序的步驟組成的。
進程
一個程序在一個數據集合上的一次運行過程。所以一個程序在不同數據集合上運行,乃至一個程序在同樣數據集合的多次運行都是不同的進程。
線程
線程是進程中的一個實體,是被系統獨立調度和執行的基本單位。
進程和線程的區別
進程是程序的一次執行。線程可以理解為進程中執行的一段程序片段。
進程是獨立的,這表現在內存空間、上下文環境上;線程運行在進程空間內。一般來講(不適用特殊技術),進程無法突破進程邊界存取其他進程內的存儲空間;而線程由于處于進程空間內,所以同一進程所產生的線程共享同一內存空間。
同一進程中的兩段代碼不能同時執行,除非引入線程。
線程是屬于進程的,當進程退出是該進程所產生的線程都會被強制退出并清除。線程占用的資源要少于進程所占用的資源。進程和線程都可以有優先級。
進程間可以通過IPC通信,但線程不可以。
管程
實際上定義了一個數據結構和在改數據結構上的能為并發進程所執行的一組操作,這組操作能同步進程和改變管程中的數據。
進行間的通信
現在最常用的進程間通信的方式有信號、信號量、消息隊列、共享內存。
所謂進程通信,就是不同進程之間進行一些“接觸”。這種接觸有簡單,也有復雜。機制不同,復雜度也不一樣。通信是一個廣義上的意義,不僅僅指傳遞一些message。它們的使用方法基本是相同的,所以只要掌握了一種使用方法,然后記住其他的使用方法就可以了。
信號和信號量是不同的,它們雖然都可用來實現同步和護士,但前者是使用信號處理器來進行的,后者是采用P、V操作來實現的。消息隊列是比較高級的一種進程間通信方法,因為它真的可以在進程間傳送message,連傳送一個“I seek you”都可以。
一個消息隊列可以被多個進程所共享(IPC就是在這個基礎上進行的),如果一個進程消息太多,一個消息隊列放不下,也可以用多于一個的消息隊列(不過可能管理會比較復雜)。共享消息隊列的進程所發送的消息中除了message本身外還有一個標志,這個標志可以指明該消息將由哪個進程護著是哪類進程接受。每一個共享消息隊列的進程針對這個隊列也有自己的標志,可以用來聲明自己的身份。
死鎖
死鎖是指兩個或兩個以上的進程在執行過程中。因爭奪資源而造成的互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖。
產生死鎖的四個必要條件如下:
- 互斥條件:一個資源每次只能被一個進程使用。
- 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪。
循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
這4個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。死鎖的解除與預防方法:
在系統設計、進程調度等方面注意如何不讓這4個必要條件成立,如何確定資源的合理分配方法,避免進程永久占據系統資源。此外,也要防止進程處于等待狀態的情況下占用資源,在系統運行過程中,對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,并根據檢查結果決定是都分配資源,若分配后系統可能發生死鎖,則不予分配,否則予以分配。因此,對資源的分配要給予合理的規劃。
根據產生死鎖的4個必要條件,只要使其中之一不能成立,死鎖就不會出現。為此,可以采取下列3中預防措施:采用資源靜態分配策略,破壞“部分分配”條件 。
- 允許進程剝奪使用其他進程占有的資源,從而破壞“不可剝奪”條件。
- 采用資源有序分配閥,破壞“環路”條件。
這里注意一點,互斥條件不能被破壞。
避免死鎖的經典算法:銀行家算法。
內存管理
Windows內存管理方式主要分為:頁式管理、段式管理、段頁式管理。
頁式管理的基本原理是將進程的虛擬空間劃分成若干個長度相等的頁;頁式管理把內存空間按也得大小劃分成片或者頁面,然后把頁式虛擬地址與內存地址簡歷一一對應的頁表;并用相應的硬件地址變換機構來解決離散地址變換問題。頁式管理采用請求調頁或預調頁技術來實現內外存存儲器的統一管理。
優點:沒有外碎片,每個內碎片不超過也頁的大小。
缺點:程序全部裝入內存,要求有相應的硬件支持。例如地址變換機構缺頁終端的產生和選擇淘汰頁面等都要求有相應的硬件支持。這增加了機器成本,增加了系統的開銷。
段式管理的基本思想就是把程序按內容或過程函數關系分成算,每段有自己的名字。一個用戶作業或進程所包含的段對應一個二維線性虛擬空間,也就是一個二維虛擬存儲器。段式管理程序以段為單位分配內存,然后通過地址映射機構把算是虛擬地址轉換為實際內存物理地址。
優點:可以分別編寫和編譯,可以針對不同類型的段采取不同的保護,可以按段為單位來進行內存共享,包括動態鏈接進行代碼共享。
缺點:會產生碎片。
段頁式管理:為了實現段頁式管理,系統必須為每個作業或進程簡歷一張段表以管理內存分配與釋放、缺段處理等。另外由于一個段又被劃分成了若干頁。每個段又必須建立一張頁表以把段中的虛頁變換成內存中的實際頁面。顯然與也是管理時相同,頁表中也要有相應的實現缺頁中斷處理和頁面保護等功能的表項。
段頁式管理是段式管理和頁式管理方案相結合,所以具有兩者的優點。
但反過來說,由于管理軟件的增加,復雜性和開銷也就隨之增加了,另外需要的硬件以及占用的內存也有所增加,使得執行速度下降。
動態鏈接庫/靜態鏈接庫
目前以lib為后綴的庫有兩種,一種為靜態鏈接庫,另一種為動態鏈接庫(DLL)的導入庫。雖然靜態鏈接庫和動態鏈接庫的導入庫都是.lib文件,但是區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行代碼、地址符號表等等,而對于導入庫而言,其實際的執行代碼位于動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。
靜態鏈接庫是一個或者多個obj文件的打包,所以有人干脆把從obj文件生成lib的過程稱為Archive,即合并到一起。比如你鏈接一個靜態庫,如果其中有錯,它會準確地找到是哪個obj有錯,即靜態lib只是殼子。當我們的應用工程在使用靜態鏈接庫的時候,靜態鏈接庫要參與編譯,在生成執行文件之前的鏈接過程中,將靜態鏈接庫的全部指令直接連接入可執行文件中,故而,在可執行文件生成以后,靜態鏈接庫.lib文件即可以棄之不用。
動態鏈接庫(DLL)是作為共享函數庫的可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬于其可執行代碼的函數。函數的可執行代碼位于一個.dll文件中,該dll包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數。DLL還有助于共享數據和資源。多個應用程序可同時訪問內存中單個dll副本內容。使用動態鏈接代替靜態鏈接有若干優點。dll節省內存,減少交換操作,節省磁盤空間,更易于升級(不需要重鏈接和長編譯),提供售后支持,提供擴展MFC庫類的機制,支持多語言程序。
靜態鏈接庫和動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,lib中的指令全部被直接包含在最終生成的exe文件中了。但是若使用dll(即動態鏈接庫),該dll不必被包含在最終的exe文件中,exe文件執行時可以“動態”地引用和卸載這個與exe獨立的dll文件,靜態鏈接庫和動態鏈接庫中還可以再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可再包含其他的動態或靜態鏈接庫。動態鏈接庫和靜態鏈接庫的使用不同之處在于它允許可執行模塊(.dll文件或.exe文件)僅包含在運行時定位dll函數的可執行代碼所需的信息。在靜態鏈接庫的使用中,鏈接器從靜態鏈接庫獲取所有被引用的函數,并將庫同代碼一起放到可執行文件中。