在伺服器開發中 通常的做法是 把 邏輯處理執行緒和i/o處理執行緒分離。
邏輯處理執行緒:對接收的包進行邏輯處理。
i/0處理執行緒:網路資料的傳送和接收,連線的建立和維護。
通常 邏輯處理執行緒和i/o處理執行緒是通過資料佇列來交換資料,就是生產者--消費者模型。
這個資料佇列是多個執行緒在共享,每次訪問都需要加鎖,因此如何減少 互斥/同步的開銷就顯得尤為重要。
解決方案:雙緩衝佇列
背景知識:
所謂雙緩衝資料就是兩個佇列 乙個負責從裡寫入資料,乙個負責讀取資料,當邏輯執行緒讀完資料後負責將自己的佇列和i/o執行緒的佇列進行交換。
這樣需要加鎖的地方 有兩個從佇列中寫入資料和兩個佇列進行交換時。如果是一塊緩衝區,讀,寫操作是不分離的,雙緩衝區起碼節省了單緩衝區時讀部分操作互斥/同步的開銷。本質是採用空間換時間的優化思路。
緩衝區狀態分析:
兩個緩衝區分別對應著兩個互斥鎖locka,lockb,生產者消費者要控制那個緩衝區先要取得對應的鎖。
1 併發讀寫
大多數情況下,生產者控制著某個佇列進行寫操作,消費者控制著另外乙個佇列進行讀操作。
也就是說,邏輯執行緒和i/o執行緒進行著獨佔操作。這樣就大大降低了互斥/同步的開銷。
2 緩衝區切換
當消費者將自己的佇列(對應locka)讀完,立即釋放對locka的控制,等待控制lockb。一旦生產者釋放lockb,消費者立即控制lockb,開始 讀取lockb對應的佇列資料。同時生產者控制剛才locka,開始寫操作。這樣就完成佇列交換。
這裡注意的操作是無論生產者消費者在完成對自己的佇列操作後一定要先釋放鎖資源再去嘗試控制另外的佇列。
因為如果生產者操作完成 不釋放自己的鎖 去嘗試控制另外的鎖,同時消費者也不釋放資源也去嘗試控制另外的鎖,那麼就會出現「死鎖」。
佇列交換策略分析:
優先保證讀,即消費者完成對佇列的操作後,立即進行交換。
一開始 兩個佇列都為空, 交換執行緒阻塞在生產者的條件變數處,工作執行緒阻塞在消費者條件變數處,生產者佇列資料個數大於1 時 立即發出該條件通知,隨即發生佇列交換,交換完畢後發現,消費者佇列資料個數大於1時 立即發出消費者條件變數通知,此時交換執行緒阻塞在消費者的條件變數處,工作執行緒結束等待開始處理資料,處理完畢等待交換執行緒發出的條件通知,同時發出工作現場結束工作的條件變數,通知交換執行緒繼續進行工作。
要保證:
1 如果工作執行緒在處理資料 確保不進行佇列交換 同時可以正常向生產者佇列放入資料。
2 佇列交換完畢後 交換執行緒 需要立即等待消費者執行緒執行完畢的條件通知,此時同時可以向生產者佇列中放入資料。
3 消費者佇列處理完畢需要做兩個動作: 1 喚醒交換執行緒,傳送對應的條件變數通知 2 等待交換執行緒完成一次佇列交換的條件通知。
伺服器應用 雙緩衝佇列
在伺服器開發中 通常的做法是 把 邏輯處理執行緒和i o處理執行緒分離。邏輯處理執行緒 對接收的包進行邏輯處理。i 0處理執行緒 網路資料的傳送和接收,連線的建立和維護。通常 邏輯處理執行緒和i o處理執行緒是通過資料佇列來交換資料,就是生產者 消費者模型。這個資料佇列是多個執行緒在共享,每次訪問都...
伺服器應用 雙緩衝佇列
在伺服器開發中 通常的做法是 把 邏輯處理執行緒和i o處理執行緒分離。邏輯處理執行緒 對接收的包進行邏輯處理。i 0處理執行緒 網路資料的傳送和接收,連線的建立和維護。通常 邏輯處理執行緒和i o處理執行緒是通過資料佇列來交換資料,就是生產者 消費者模型。這個資料佇列是多個執行緒在共享,每次訪問都...
伺服器雙緩衝訊息佇列方案
雙緩衝訊息佇列 減少鎖競爭 收藏 雙緩衝訊息佇列 減少鎖競爭 在網路應用伺服器端,為了效能和防止阻塞,經常會把邏輯處理和i o處理分離 i o網路執行緒處理i o事件 資料報的接收和傳送,連線的建立和維護等.邏輯執行緒要對收到的資料報進行邏輯處理.通常網路執行緒和邏輯執行緒之間是通過資料報佇列來交換...