現代作業系統之程序與執行緒(上)
阿新 • • 發佈:2019-01-29
程序
基本概念
一個程序就是一個正在執行程式的例項,包括程式計數器、暫存器和變數當前的值。從概念上說,每個程序擁有它自己的虛擬cpu。實際上,每個瞬間CPU只能執行一個程序。 在對程序程式設計時不能對時序做任何確定對假設。
建立程序
常見情況:
- 系統初始化
- 執行政治執行對程序所呼叫的程序建立系統呼叫
- 使用者請求建立一個新程序
- 一個批處理作業的初始化
程序終止
程序推出由一下條件引起:- 正常推出(自願)
- 出錯退出(自願)
- 嚴重錯誤(非自願)
- 被其他程序殺死(非自願)
程序的層次
在UNIX中,程序和它所有子女即後裔足層一個晉城組,訊號將被髮送到相關程序詛的所有成員。每個程序都以分別捕獲、忽略或採取預設行動(被該訊號殺死) win32中所有程序地位相同,唯一的不同在於父程序會獲得一個控制代碼(可轉讓)。 UNIX程序不能剝奪其子程序的繼承權程序的狀態
程序的實現
作業系統維護一張程序表(結構陣列),表中儲存程序資訊。 終端硬體將程式計數器、程式狀態字、有時還有一個或多個暫存器雅茹對戰,計算機隨即跳轉到中斷向量所指示的地址。多道程式設計模型
假設一個程序等待IO操作的時間預期停留在記憶體中的時間比為p,當記憶體中同時由n個程序時,則所有n個程序都在等待IO的概率為p的n次方,所以CPU利用率為1-P的n次方。執行緒
執行緒是輕量級的程序,代價更小,切換速度更快,還可以共享變數。 一種組織伺服器的模型是允許把伺服器編寫為一個順序執行緒的集合。在分派執行緒的程式中包含以後 一個無限迴圈,改虛幻用來獲得工作請求並將工作請求分派給工作執行緒。每個工作執行緒會從阻塞到就緒,處理完成後再次變為阻塞。 多程序是的順序程序的思想被保留下來,這種順序程序阻塞了系統呼叫,但仍舊實現但並行性。而單執行緒雖然保留了阻塞系統呼叫的簡易性,但是放棄了效能。非同步運用了非阻塞和中國年的伏安,通過並行性實現了高效能,但是給程式設計增加了困難。
經典執行緒模型
程序用於把資源集中到一起,而執行緒則是在CPU上被排程執行的實體。
同一個程序中的多個執行緒,是對同一臺計算機上並行執行多個程序的模擬。前者多執行緒共享同一個地址空間和其它資源。而在後一種情形中,多個程序共享實體記憶體,磁碟等資源。
執行緒概念試圖實現的是共享一組資源的多個執行緒的執行能力,以便這些執行緒可以為完成某一個任務共同 工作。
和程序一樣,執行緒有四種狀態——執行,阻塞、就緒或終止。
每個執行緒都有自己的堆疊,其中存放一些響應過程的區域性變數還有完成之後使用的返回地址。
在多執行緒情況下,程序通常會從當前的單個執行緒開始。不論有無層次關係,建立執行緒通常都返回一個執行緒識別符號,該識別符號就是新執行緒的名字。
一個執行緒可以等待一個(特定)的執行緒推出,這個過程阻塞呼叫指導那個特定執行緒退出。
不同於程序,(執行緒庫無法利用始終強制終端執行緒讓出CPU。)
POSIX執行緒
Prhtead是IEEE定義的執行緒標準 每一個都有一個識別符號,一組暫存器(包括程式計數器)和一組儲存在結構中的屬性。
使用者執行緒
整個執行緒報放在使用者空間中,核心對執行緒包一無所知。
使用者及執行緒包可以在不支援執行緒對作業系統上實現。
在使用者空間管理執行緒時,每個程序需要有其專業的執行緒包,用來跟中國年該執行緒表中的執行緒。這些表和核心中國年的程序表類似,不過它僅僅記錄各個執行緒的屬性。
當一個執行緒轉換到就緒狀態或阻塞狀態時,在該縣城表中存放重新啟動該執行緒所需的資訊。
只要堆疊指標和程式計數器一切換,新的執行緒就自動投入執行。
進行類似與這樣的執行緒切換至少要比陷入核心快一個數量級,這也是使用者及執行緒包的優點。
使用者級執行緒的另一個有點是允許每個程序自己訂製的排程演算法,而且還具有很好的擴充套件性。(核心執行緒需要一些固定的表格空間和對戰空間,如果核心級執行緒過多會出問題)
使用者級執行緒確定也很多:
- 如何實現阻塞系統呼叫。
- 如果一個執行緒引起也沒故障,核心由於甚至不知道有執行緒存在,通常會把整個程序阻塞指導磁碟IO完成未知,儘管其它執行緒可以允許
- 如果一個執行緒開始允許,則該程序中的其他執行緒不可允許,除非第一個執行緒自動放棄cpu。