併發指邏輯控制流在時間上是重疊的
進程:程序員
因爲服務器運行時間長,因此要包括一個SIGCHLD進程程序,用來回收僵死子進程的資源
編程
對於父,子進程:共享文件表,但不共享用戶地址空間數組
基本思路:使用select函數,要求內核掛起進程,只有在一個或多個I/O事件發生後,纔將控制返回應用的程序
例如:
安全
select函數處理類型爲fd_set的集合
被容許對描述符集合作的三件事:服務器
利用select實現一個迭代echo服務器:
多線程
一旦select返回,就用FD_ISSET宏指令來判斷哪一個能夠進行讀了併發
一個狀態機就是一組狀態,輸入事件和轉移,其中轉移就是將狀態和輸入事件映射到狀態
自循環同一個輸入和輸出之間的轉換
函數
服務器使用I/O多用復,藉助select函數檢測輸入事件的發生
clientfd數組表示已鏈接描述符的集合,其中整數-1表示一個可用的槽位
編碼
優勢:操作系統
每一個線程都有它本身的線程上下文,包括一個惟一的整數線程ID,棧,棧指針,程序計數器,通用目的寄存器和條件碼
主線程:每一個進程開始生命週期都是單一線程
某時刻,主線程建立一個對等線程,今後時開始,兩個線程併發運行
線程和進程的區別:
進程是按照嚴格的父子層次來組織的,線程則是對等的池
建立線程
回收已終止線程的資源
pthread_join函數會堵塞,直到線程tid終止,將線程例程返回的(void)指針賦值爲pthread_return指向的位置,而後回收*已終止線程佔用的全部儲存器資源
分離線程
在任意一個時間點上,線程是可結合的或者是分離的
初始化線程
一般,線程的寄存器是從不共享的,而虛擬儲存器老是共享的
若說變量v是共享的,當且僅當它的一個實例被一個以上的線程引用
在共享變量的同時引入了同步錯誤的可能性
通常而言,沒有辦法預測操做系統是否能爲你的線程選擇一個正確的順序
進度圖將n個併發線程的執行模型化爲一條n維笛卡爾空間中的軌跡線
圖的原點對應於沒有任何線程完成一條指令的初始狀態
在進度圖中,兩個臨界區的交集造成的狀態空間區域稱爲不安全區
基本思想:將每一個共享變量與一個信號量s聯繫起來,而後用P(s)和V(s)操做將相應的臨界區包圍起來
生產者-消費者問題
最簡單的方法:將序列劃分紅t個不相交區域,而後給t個不一樣的線程每一個分配一個區域
並行程序的加速比:
四個線程不安全函數類:
當一個程序的正確性一個線程要在另外一個線程到達y點以前到達它的控制流中的x點時,就會發生競爭
避免死鎖的規則:
互斥鎖加鎖順序規則:若是對於程序中每對互斥鎖(s,t),每一個同時佔用s和t的線程都按照相同的順序對它們加鎖,那這個程序是無死鎖的