深入理解計算機系統 第十二章 併發程式設計 (1)

2022-08-05 10:48:15 字數 1618 閱讀 1470

現代作業系統提供了三種基本的構造併發程式的方法:

程序。用這種方法,每個邏輯控制流都是乙個程序,由核心來排程和維護,因為程序有獨立的虛擬位址空間,想要和其他流通信,控制流必須使用某種顯式的程序間通訊(interprocess communication,ipc)機制。

i/o多路復用。在這種形式的併發程式設計中,應用程式在乙個程序的上下文中顯式的排程它們自己的邏輯流。邏輯流被模型化為狀態機,資料到達檔案描述符後,主程式顯式的從乙個狀態轉換到另乙個狀態。因為程式是乙個單獨的程序,所以所有的流都共享同乙個位址空間。

執行緒。執行緒是執行在乙個單一程序上下文中的邏輯流,由核心進行排程。你可以把執行緒看成是其他兩種方式的混合體,像程序流一樣由核心進行排程,而像i/o多路復用流一樣共享同乙個虛擬位址空間。

基於i/o多路復用的併發程式設計

i/o多路復用(i/o multiplexing)技術,基本的思路就是使用select函式,要求核心掛起程序,只有在乙個或多個i/o事件發生後,才將控制返回給應用程式。

select是乙個複雜的函式,有許多不同的使用場景。我們只討論第一種場景:等待一組描述符準備好讀。

select函式處理型別為fd_set的集合,也叫做描述符集合。邏輯上,我們將描述符集合看成乙個大小為n的位向量:bn-1,...,b1,b0。

每個位bk對應於描述符k。當且僅當bk=1,描述符k才表明是描述符集合的乙個元素。只允許你對描述符集合做三件事:1)分配它們,2)將乙個此種型別的變數賦值給另乙個變數,3)用fd_zero、fd_set、fd_clr和fd_isset巨集來修改和檢查它們。

針對我們的目的,select函式有兩個輸入:乙個稱為讀集合的描述符集合(fdset)和該讀集合的基數(n)(實際上是任何描述符集合的最大基數)。select函式會一直阻塞,直到讀集合中至少有乙個描述符準備好可以讀。當且僅當乙個從該描述符讀取乙個位元組的請求不會阻塞時,描述符k就表示準備好可以讀了。select有乙個***,它修改引數fdset指向的fd_set,指明讀集合的乙個子集,稱為準備好集合(ready set),這個集合是由讀集合中準備好可以讀了的描述符組成的。該函式返回的值指明了準備好集合的基數。注意,由於這個***,我們必須在每次呼叫select時都更新讀集合。

基於執行緒的併發程式設計

到目前為止,我們已經看到了兩種建立併發邏輯流的方法。在第一種方法中,我們為每個流使用了單獨的程序。核心會自動排程每個程序,而每個程序有它自己的私有位址空間,這使得流共享資料很困難。在第二種方法中,我們建立自己的邏輯流,並利用i/o多路復用來顯式的排程流。因為只有乙個程序,所有的流共享整個位址空間。第三種方法---基於執行緒,它是這兩種方法的混合。

執行緒(thread)就是執行在程序上下文中的邏輯流。在本書裡迄今為止,程式都是由每個程序中乙個執行緒組成的。但是現代系統也允許我們編寫乙個程序裡同時執行多個執行緒的程式。執行緒由核心自動排程。每個執行緒都有它自己的執行緒上下文(thread context),包括乙個唯一的整數執行緒id(thread id,tid)、棧、棧指標、程式計數器、通用目的暫存器和條件碼。所有的執行在乙個程序裡的執行緒共享該程序的整個虛擬位址空間。

基於執行緒的邏輯流結合了基於程序和基於i/o多路復用的流的特性。同程序一樣,執行緒由核心自動排程,並且核心通過乙個整數id來識別執行緒。同基於i/o多路復用的流一樣,多個執行緒執行在單一程序的上下文中,因此共享這個程序虛擬位址空間的所有內容,包括它的**、資料、堆、共享庫和開啟的檔案。

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...

《深入理解計算機系統》

知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...

深入理解計算機系統

系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...