併發編程編程
1、基於進程的併發編程服務器
構造併發進程最簡單的方法是用進程,使用像fork,exec和waitpid等函數。多線程
例:一個構造併發服務器的天然方法就是在父進程中接受客戶端鏈接請求,而後建立一個新的子進程來爲每一個新客戶端提供服務。併發
一、 一般服務器運行很長的時間,因此咱們必需要包括一個SIGCHLD處理程序,來回收僵死子進程的資源。函數
二、 其次父進程必須關閉他們各自的connfd拷貝。spa
三、 最後,由於套接字的文件表選項中的引用計數,直到父子進程的connfd都關閉了,到客戶端的鏈接纔會終止。線程
2、基於I/O多路複用的併發進程指針
基本的思路就是使用select函數,要求內核掛起進程,只有在一個或多個I/O事件發生後,纔將控制返回給應用程序。接口
Select函數處理類型爲fd_set的集合,也叫作描述符集合。邏輯上,咱們將描述符集合當作一個大小爲n的位向量生命週期
I/O多路複用能夠用做併發事件驅動程序的基礎,在事件驅動程序中,流是由於某種事件而前進的。通常概念是將邏輯流模型轉換爲狀態機。
狀態機:就是一組狀態、輸入事件和轉移。
3、基於線程的併發編程
線程就是運行在進程上下文中的邏輯流。
多線程的執行模型在某些方面和多進程的執行模型是類似的。
每一個進程開始生命週期時都是單一線程,這個線程爲主線程。在某一時刻,主線程建立一個對等線程,從這個時間點開始,兩個線程就併發地與運行。
Posix線程是在C程序中處理線程的一個標準接口。
終止進程:
一、 當頂層的線程例程返回時,線程會隱式地終止
二、 經過調用pthread_exit函數,線程會顯示地終止。
三、 某個對等線程調用Unix的exit函數,該函數終止進程以及全部與該進程相關的線程
四、 另外一個對等線程經過以當前線程ID做爲參數調用pthread_cancle函數來終止當前線程
4、多線程程序中的共享變量
一組併發線程運行在一個進程的上下文中。每一個線程都有它本身獨立的線程上下文,包括線程ID、棧、棧指針、程序計數器、條件碼和通用目的寄存器值。每一個進程和其餘進程一塊兒分享線程上下文的剩餘部分。
將變量映射到存儲器:
線程化的C程序中變量根據它們的存儲類型被映射到虛擬存儲器:全局變量、本地自動變量和本地靜態變量。
----------------------------------------------------------------------------------
參考資料:
深刻理解計算機系統