天天看點

29、深入了解計算機系統筆記,并發程式設計(concurrent)(1)

1、如果邏輯控制流在時間上重疊,那麼它們就是并發的。這種現象,稱為并發(concurrency)。

2、為了允許伺服器同時為大量用戶端服務,比較好的方法是:建立并發伺服器,為每個用戶端建立各自獨立的邏輯流。現代OS提供的常用構造并發的方法有:

程序和線程。

1)每個邏輯流都是一個程序,由核心來排程維護。每個程序都有獨立的虛拟位址空間,控制流通過IPC機制來進行通信。

2)線程:運作在單一程序上下文中的邏輯流,由核心進行排程,共享同一程序的虛拟位址空間。

由于程序控制和IPC的開銷較高,是以基于程序的設計比基于線程的設計慢。

常見IPC有:管道,FIFO,共享存儲器,信号。

3、基于線程的并發程式設計

線程由核心自動排程,每個線程都有它自己的線程上下文(thread context),包括一個惟一的整數線程ID(Thread ID,TID),棧,棧指針,程式計數器,通用目的寄存器和條件碼。每個線程和其他線程一起共享程序上下文的剩餘部分,包括整個使用者的虛拟位址空間,它是由隻讀文本(代碼),讀/寫資料,堆以及所有的共享庫代碼和資料區域組成的,還有,線程也共享同樣的打開檔案的集合。

1)線程執行模型

29、深入了解計算機系統筆記,并發程式設計(concurrent)(1)
29、深入了解計算機系統筆記,并發程式設計(concurrent)(1)
29、深入了解計算機系統筆記,并發程式設計(concurrent)(1)

    線程不像程序那樣,不是按照嚴格的父子層次來組織的。和一個程序相關的線程組成一個對等線程池(a pool of peers),獨立于其他線程建立的線程(The threads associated with a process form a pool of peers, independent of which threads were created by which other threads.個人了解,這句是說獨立于其他程序的線程池中的線程)。程序中第一個運作的線程稱為主線程。對等(線程)池概念的主要影響是,一個線程可以殺死它的任何對等線程,或者等待它的任意對等線程終止;進一步來說,每個對等線程都能讀寫相同的共享資料。

2)關于posix線程示例,及其相關函數,參見原書13.3.2節中。這部分舉的例子很經典,值得一讀

3)分離線程

    在任何一個時間點上,線程是可結合的(joinable),或者是分離的(detached)。一個可結合的線程能夠被其他線程收回其資源和殺死。在被其他線程回收之前,它的存儲器資源(如棧)是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時由系統自動釋放。

示例程式