作業系統面試之一——程式、進程、線程
題註:《面試寶典》作業系統部分錯誤、漏洞較多,筆者對此參考相關書籍和自己觀點進行了重寫,供大家參考。
一、程式、進程、線程
1.程式和進程.
進程由兩個部分組成:1)作業系統用來管理進程的核心對象。核心對象也是系統用來存放關於進程的統計資訊的地方。2)地址空間。它包含所有可執行模組或DLL模組的代碼和資料。它還包含動態記憶體分配的空間。如線程堆棧和堆分配空間。
|
定義 |
使用系統運行資源情況 |
程式 |
電腦指令的集合,它以檔案的形式儲存在磁碟上。程式是靜態實體(passive Entity),在多道程式系統中,它是不能獨立啟動並執行,更不能與其他程式並發執行。 |
不使用【程式不能申請系統資源,不能被系統調度,也不能作為獨立啟動並執行單位,因此,它不佔用系統的運行資源】。 |
進程 |
通常被定義為一個正在啟動並執行程式的執行個體,是一個程式在其自身的地址空間中的一次執行活動。 定義:進程是進程實體(包括:程式段、相關的資料區段、進程式控制制塊PCB)的運行過程,是系統進行資源分派和調度的一個獨立單位。 |
使用【進程是資源申請、調度和獨立啟動並執行單位,因此,它使用系統中的運行資源。】 |
2. 進程與線程
如果說作業系統引入進程的目的是為了提高程式並發執行,以提高資源使用率和系統輸送量。那麼作業系統中引入線程的目的,則是為了減少進程並發執行過程中所付出的時空開銷,使作業系統能很好的並發執行。
進程process定義了一個執行環境,包括它自己私人的地址空間、一個控制代碼表,以及一個安全環境;線程則是一個控制流程,有他自己的調用棧call stack,記錄了它的執行曆史。
線程由兩個部分組成:1)線程的核心對象,作業系統用它來對線程實施管理。核心對象也是系統用來存放線程統計資訊的地方。2)線程堆棧,它用於維護線程在執行代碼時需要的所有參數和局部變數。當建立線程時,系統建立一個線程核心對象。該線程核心對象不是線程本身,而是作業系統用來管理線程的較小的資料結構。可以將線程核心對象視為由關於線程的統計資訊組成的一個小型資料結構。
進程與線程的比較如下:
比較 |
進程 |
線程 |
活潑性 |
不活潑(只是線程的容器) |
活潑 |
地址空間 |
系統賦予的獨立的虛擬位址空間(對於32位進程來說,這個地址空間是4GB) |
在進程的地址空間執行代碼。線程只有一個核心對象和一個堆棧,保留的記錄很少,因此所需要的記憶體也很少。因為線程需要的開銷比進程少 |
調度 |
僅是資源分派的基本單位 |
獨立調度、指派的基本單位 |
並發性 |
僅進程間並發(傳統OS) |
進程間、線程間並發 |
擁有資源 |
資源擁有的基本單位 |
基本上不擁有資源 |
系統開銷 |
建立、撤銷、切換開銷大 |
僅儲存少量寄存器內容,開銷小。 |
3. 進程同步
進程同步的主要任務:是對多個相關進程在執行次序上進行協調,以使並發執行的諸進程之間能有效地共用資源和相互合作,從而使程式的執行具有可再現性。
同步機制遵循的原則:
(1) 空閑讓進;
(2) 忙則等待(保證對臨界區的互斥訪問);
(3) 有限等待(有限代表有限的時間,避免死等);
(4) 讓權等待,(當進程不能進入自己的臨界區時,應該釋放處理機,以免陷入忙等狀態)。
由於進程同步產生了一系列經典的同步問題“生產者-消費者”問題,“哲學家進餐”問題,“讀者-寫者”問題。
4. 進程間的通訊是如何?的?
進程通訊,是指進程之間的資訊交換(資訊量少則一個狀態或數值,多者則是成千上萬個位元組)。因此,對於用訊號量進行的進程間的互斥和同步,由於其所交換的資訊量少而被歸結為低級通訊。
所謂進階進程通訊指:使用者可以利用作業系統所提供的一組通訊命令傳送大量資料的一種通訊方式。作業系統隱藏了進程通訊的實現細節。或者說,通訊過程對使用者是透明的。
進階通訊機制可歸結為三大類:
(1) 共用儲存空間系統(儲存空間中劃分的共用儲存區);實際操作中對應的是“剪貼簿”(剪貼簿實際上是系統維護管理的一塊記憶體地區)的通訊方式,比如舉例如下:word進程按下ctrl+c,在ppt進程按下ctrl+v,即完成了word進程和ppt進程之間的通訊,複製時將資料放入到剪貼簿,粘貼時從剪貼簿中取出資料,然後顯示在ppt視窗上。
(2) 訊息傳遞系統(進程間的資料交換以訊息(message)為單位,當今最流行的微核心作業系統中,微核心與伺服器之間的通訊,無一例外地都採用了訊息傳遞機制。應用舉例:郵槽(MailSlot)是基於廣播通訊體系設計出來的,它採用不需連線的不可靠的資料轉送。郵槽是一種單向通訊機制,建立郵槽的伺服器處理序讀取資料,開啟郵槽的客戶機進程寫入資料。
(3) 管道通訊系統(管道即:串連讀寫進程以實現他們之間通訊的共用檔案(pipe檔案,類似先進先出的隊列,由一個進程寫,另一進程讀))。實際操作中,管道分為:匿名管道、具名管道。匿名管道是一個未命名的、單向管道,通過父進程和一個子進程之間傳輸資料。匿名管道只能實現本地機器上兩個進程之間的通訊,而不能實現跨網路的通訊。具名管道不僅可以在本機上實現兩個進程間的通訊,還可以跨網路實現兩個進程間的通訊。
|
同一機器兩個處理序間通訊 |
跨網路通訊 |
剪貼簿Clipboard |
可以 |
不可以 |
匿名管道Pipe |
可以 |
不可以 |
具名管道(點對點單一通訊,資料量可較大)Namedpipe |
可以 |
可以 |
郵槽(一對多,資料量較小,424位元組以下)Mailslot |
可以 |
可以 |
在Win32下提供的處理序間通訊方式有以下幾種:
1)剪貼簿Clipboard:在16位時代常使用的方式,CWnd類中提供了支援。
2)COM/DCOM:通過COM系統的代理存根方式進行進程間資料交換,但只能夠表現在對介面函數的調用時傳送資料,通過DCOM可以在不同主機間傳送資料。
3)Dynamic Data Exchange (DDE):在16位時代常使用的方式。
4)File Mapping:檔案對應,在32位系統中提供的新方法,可用來共用記憶體。
5)Mailslots:郵件槽,在32位系統中提供的新方法,可在不同主機間交換資料,分為伺服器方和客戶方,雙方可以通過其進行資料交換,在Win9X下只支援郵件槽客戶。
6)Pipes:管道,分為無名管道:在父子進程間交換資料;有名管道:可在不同主機間交換資料,分為伺服器方和客戶方,在Win9X下只支援有名管道客戶。
7)RPC:遠端程序呼叫,很少使用,原因有兩個:複雜而且與UNIX系統的RPC並不完全相容。但COM/DCOM的調用是建立在RPC的基礎上的。
8)Windows Sockets:網路套介面,可在不同主機間交換資料,分為伺服器方和客戶方。
9)WM_COPYDATA:通過發送WM_COPYDATA訊息並將資料放在參數中來傳遞資料給其他進程。
5. 線程同步
根據使用者模式及核心模式下的同步方式的不同,分類及對比如下:
|
核心對象/ 非核心對象 |
含義 |
缺點 |
適用 |
關鍵程式碼片段(臨界區)CriticalSection |
非核心對象,工作在使用者方式下,為使用者模式對象 |
從程式碼的角度來控制線程的並發性 |
1.因為在等待進入關鍵程式碼片段時無法設定逾時值,所以其很容易進入死結狀態。2.不能跨進程使用。 |
單個進程中線程間的同步(同步速度快) |
事件對象Event |
核心對象 |
所有核心對象中最基本的。 |
速度較慢(相比使用者模式實現線程同步) |
多個進程間的各個線程間實現同步 |
互斥對象Mutex |
核心對象 |
代表對一個資源的獨佔式訪問 |
訊號量 Semaphore |
核心對象 |
使用計數器來控製程序對一個共用資源的訪問 |