客戶 伺服器程式設計正規化

2021-09-17 01:13:18 字數 1851 閱讀 6577

unix 網路程式設計第30章讀書筆記, 這裡只記錄大致實現方式, 具體**實現還請閱讀此書

tcp 迭代伺服器

完全同步方式, 完全處理某個客戶的請求之後才專向下乙個客戶,優點是**簡單,並且沒有程序控制所需的時間

tcp 併發伺服器程式, 每個客戶乙個子程序

傳統上併發伺服器呼叫fork 派生乙個子程序來處理每個客戶。 這使得伺服器能夠同時為多個客戶服務, 每個程序乙個客戶

tcp 預先派生子程序伺服器程式, accept 無上鎖保護

優點是無需引入父程序執行fork的開銷就能處理新的客戶, 缺點是父程序必須在伺服器啟動階段猜測預先派生多少

子程序。 如果某個時刻客戶數恰好等於子程序總數, 那麼新到的客戶將被忽略, 直到至少有乙個子程序重新可用

但是這些客戶並沒有被完全忽略, 核心將為每個新到的客戶完成三次握手, 直到達到相應的套接字上listen 呼叫的

backlog(已建立連線但是尚未被accept 返回,固定大小的緩衝區)數為止, 當有程序呼叫accept的時候,將

backlog裡面的鏈結返回。這麼一來客戶就能覺察到伺服器在相應時間上的惡化, 儘管呼叫connect可以立即返回,

但是它的第乙個請求可能會在一段時間之後才被伺服器處理

具體的實現方式,是將 主socketfd 在建立子程序之前建立出來, 這樣fork的時候就會自動複製 socketfd,(其實就是增加socket上的引用計數)

每個程序都對這個socketfd 呼叫accept。 通過這種方式來多程序同時監聽乙個埠。

但是這有乙個問題,就是當某個鏈結進來,所有n個子程序都會被喚醒, 因為所有n個子程序所用的監聽描述符(他們有相同的值)指向同乙個socket結構

致使他們在同乙個等待通道(wait channel)即這個socket結構的so_timeo 成員上進入睡眠, 儘管所有n個子程序均會被喚醒, 其中只有最先執行的子程序

獲得那個客戶鏈結,其餘n-1個子程序繼續恢復睡眠

tcp預先派生子程序伺服器程式, accept使用檔案上鎖保護

讓應用程序在呼叫accept 前後安置某種形式的鎖, 這樣任意時刻只有乙個子程序阻塞在accept呼叫中, 其他子程序則阻塞在試圖獲取用於保護accept的鎖上

上鎖通過呼叫 fcntl(lock_fd, f_setlkw, &lock_it)

解鎖 通過使用 fcntl(lock_fd, f_set, &unlock_it)

tcp 預先派生子程序伺服器程式, accept 使用 執行緒上鎖保護

這種方法不涉及檔案系統的操作(比上一中方法省時),並且不僅適用於 同一程序內各執行緒之間的上鎖, 而且適用於不同程序之間的上鎖

需要滿足以下兩個需求

tcp 預先派生子程序伺服器程式, 傳遞描述符

對預先派生子程序伺服器程式的最後乙個修改版本是只讓父程序呼叫accept, 然後把所接受的已連線套接字傳遞給某個子程序

這麼做是為了繞過為所有子程序上鎖的需求,不過從父程序傳遞給子程序描述符,會使得**多少有寫複雜, 因為父程序必須跟蹤

子程序的忙閒狀態, 以便給空閒子程序傳遞新的套接字

tcp 併發伺服器程式, 每個客戶乙個執行緒

使用子執行緒來代替子程序

tcp預先建立執行緒伺服器程式, 每個執行緒各自accept

建立子執行緒執行緒池, 使用互斥鎖(這裡沒有必要使用檔案上鎖的方式, 互斥鎖足夠)

tcp 預先 建立執行緒伺服器程式, 主線程統一accept

這個的主要問題同使用程序一樣, 就是如何把已連線的socketfd傳遞到子執行緒,這裡就沒有必要使用上面的方式了

因為是在同乙個程序內, 我們可以通過共享 陣列的方式將socket分配給各個執行緒

總結:

客戶 伺服器程式設計正規化

本篇從基於tcp ip協議出發,現代流行的應對高併發請求網路服務端設計架構 1.tcp ip 模型 首先回顧一下tcp ip模型,並知道各個層次在作業系統的哪乙個層次 看上圖,osi模型的底下兩層是隨系統提供的裝置驅動程式和網路硬體。通常情況下,除需知道資料鏈路的某些特性外,我們不用關心這兩層的情況...

主題 客戶 伺服器程式設計正規化

原文出處 本篇從基於tcp ip協議出發,現代流行的應對高併發請求網路服務端設計架構 1.tcp ip 模型 看上圖,osi模型的底下兩層是隨系統提供的裝置驅動程式和網路硬體。通常情況下,除需知道資料鏈路的某些特性外,我們不用關心這兩層的情況。網路層由ipv4和ipv6兩個協議處理,可以選擇的傳輸層...

網路程式設計 客戶 伺服器程式設計正規化

迭代tcp伺服器總是在完全處理某個客戶的請求之後才開始下乙個客戶的請求處理。這樣的伺服器實際中比較少見。基於udp的大多伺服器卻是這樣實現。傳統併發伺服器呼叫fork派生乙個子程序來處理每個客戶,這使得伺服器能夠同時為多個客戶服務,每個程序乙個客戶。客戶數目的唯一限制是作業系統對其能夠同時擁有多少子...