1、什麼是多線程並發伺服器
有多個 CPU 可用。單核機器上多線程的優勢不明顯。
線程間有共享數據。如果沒有共享數據,用模型 3b 就行。雖然我們應該把線程間的共享數據降到最低,但不代表沒有;
共享的數據是可以修改的,而不是靜態的常量表。如果數據不能修改,那麼可以在進程間用 shared memory,模式 3 就能勝任;
提供非均質的服務。即,事件的響應有優先順序差異,我們可以用專門的線程來處理優先順序高的事件。防止優先順序反轉;
latency 和 throughput 同樣重要,不是邏輯簡單的 IO bound 或 CPU bound 程序;
利用非同步操作。比如 logging。無論往磁碟寫 log file,還是往 log server 發送消息都不應該阻塞 critical path;
能 scale up。一個好的多線程程序應該能享受增加 CPU 數目帶來的好處,目前主流是 8 核,很快就會用到 16 核的機器了。
具有可預測的性能。隨著負載增加,性能緩慢下降,超過某個臨界點之後急速下降。線程數目一般不隨負載變化。
多線程能有效地劃分責任與功能,讓每個線程的邏輯比較簡單,任務單一,便於編碼。而不是把所有邏輯都塞到一個 event loop 里,就像 Win32 SDK 程序那樣。
2、集群環境中,多台伺服器之間多線程如何進行數據同步
如何讓所有伺服器之間數據同步
1、採用高可用sureHA軟體鏡像型,一台主伺服器,一台備服回務器,通過網線實時將數據備份答,實現伺服器雙機互備的功能,此方式保證多台伺服器之間數據的一致性。
2、採用高可用sureHA雙機熱備共享型。一台主伺服器,一台備伺服器,鏈接一台存儲,將數據放到存儲裡面,實現數據的共享。此方式保證多台伺服器之間數據的一致性。
3、可實現伺服器虛擬化,把所有的伺服器物理資源都整理成一個大的資源池,數據都存放在磁碟陣列上面,所有應用系統都通過調用磁碟陣列裡面的數據,此方式保證多台伺服器之間數據的一致性。
不管技術怎麼實現,在伺服器方面還是需要人為的進行操作和監督,伺服器同步也成為不可缺少的一部分。所以海騰數據的伺服器的硬體要求和機房的線路穩定是保障以上實現的關鍵。參考海騰數據伺服器租用
3、怎麼理解並發多進程服務和多線程伺服器
1,進程:子進程是父進程的復製品。子進程獲得父進程數據空間、堆和棧的復製品。
2,線程:相對與進程而言,線程是一個更加接近與執行體的概念,它可以與同進程的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
兩者都可以提高程序的並發度,提高程序運行效率和響應時間。
線程和進程在使用上各有優缺點:線程執行開銷小,但不利於資源管理和保護;而進程正相反。同時,線程適合於在SMP機器上運行,而進程則可以跨機器遷移。
答案二:
根本區別就一點:用多進程每個進程有自己的地址空間(address space),線程則共享地址空間。所有其它區別都是由此而來的:
1。速度:線程產生的速度快,線程間的通訊快、切換快等,因為他們在同一個地址空間內。
2。資源利用率:線程的資源利用率比較好也是因為他們在同一個地址空間內。
3。同步問題:線程使用公共變數/內存時需要使用同步機制還是因為他們在同一個地址空間內。
網上的答案的 版本怎麼想怎麼都太學術了。我當時看到過一個比喻特別的好, 我就模仿者把它說下來哈,有錯誤希望支持哈:
多進程的伺服器就好比是
立體的交通系統(立交橋)雖然說建造的時候花費比較大,消耗的資源比較多,但是真要是跑起來不會交通堵塞。但是汽車在上面跑,相互通信就是個很費事兒問題(進程間通信比較麻煩);多線程就好比是平面的交通系統,造價低,但是很容易交通堵塞,
但是也有好處同步的時候方便。
在網路伺服器方面:
單進程 < 多進程(單線程)< 多進程(多線程)
在游戲方面的應用:
I、多線程伺服器,玩家數據緩存和向DB的存儲我們可以開一個線程單獨去做,這樣不會有什麼大的問題。日誌和網路上面說過可以很容易切割出去,主要就是對游戲邏輯的切割。
A:按場景分線程,一個線程管理若干個場景。這樣配置靈活,一個線程可以管理若干個小場影,除非有個場景人多到一個CPU跑不下來,一般的游戲都會滿足需求。缺點則是不在同一線程的Object在做邏輯交互時,必須用非同步,如果用到了腳本,那麼這里的復雜度和性能要值得注意。如果項目中出現單個伺服器解決不鳥的問題(例如戰場伺服器),似乎就成了多線程多進程的龐大架構。
B:將某些功能切割到其它線程,例如Object的管理和查找,NPCAI的尋路,這種方式貌似在做邏輯需要分離到別的線程模塊功能時有點麻煩,如果直接上鎖等待肯定不是最好的方式,所以這些邏輯必須變成非同步。
2、多進程伺服器,其實這里的多進程和場景多線程改成了多進程。這里玩家數據緩存和向DB的存儲我覺得用一個單獨的DB伺服器。多進程伺服器可以在GameServer和GameClient之間加一個Gate,因為在跨服場景不需頻繁斷線連接。多進程伺服器所有的通訊都依靠網路,有些邏輯必須有網路延遲的消耗。優點是配置靈活,在物理機器性能不夠時可以通過擴充物理機器來解決
伺服器還有有一個很蛋疼的問題就是過載: 下面介紹一下產生的原因和解決辦法:
伺服器過載:
原因是高優先順序處理階段對CPU的不公平搶占。所以,如果限制高優先順序處理階段對CPU的佔用率,或者限制處理高優先順序的CPU個數,都可以減輕或者消除收包活鎖現象。具體的可以採用以下的方法:
方法一、採用輪詢機制
為了減少中斷對系統性能的影響,在負載正常的情況下採用「下半處理」的方法就非常有效,而在高負荷情況下,採用這個方法仍然會造成活鎖現象,這時可以採用輪詢機制。雖然這個方法在負載正常的情況下會造成資源的浪費和響應速度降低,但在網路數據頻繁到達伺服器時就要比中斷驅動技術有效的多。
方法二、減低中斷的頻率
這里主要有兩種方法:批中斷和暫時關閉中斷。批中斷可以在超載時有效的抑制活鎖現象,但對伺服器的性能沒有什麼根本性的改進;當系統出現接收活鎖跡象時,可以採用暫時關閉中斷的方法來緩和系統的負擔,當系統緩存再次可用時可以再打開中斷,但這種方法在接收緩存不夠大的情況下會造成數據包丟失。
方法三、減少上下文切換
這種方法不管伺服器在什麼情況下對性能改善都很有效,這時可以採用引入核心級(kerne1—leve1)或硬體級數據流的方法來達到這個目的。核心級數據流是將數據從源通過系統匯流排進行轉發而不需要使數據經過應用程序進程,這個過程中因為數據在內存中,因此需要CPU操作數據。
硬體級數據流則是將數據從源通過私有數據匯流排或是雖等DMA通過系統匯流排進行轉發而不需要使數據經過應用程序進程,這個過程不需要CPU操作數據。這樣在數據傳輸過程中不需要用戶線程的介入,減少了數據被拷貝的次數,減少了上下文切換的開銷。
4、誰推薦個雙u伺服器?多線程處理能力強的,能夠玩游戲,能配顯卡。
如果是純cpu的伺服器,一萬可以配不錯的。
但是加顯卡就立馬不行了。。。一個旗艦顯卡都要4,5000了
5、伺服器,使用多進程 與 多線程 請問有什麼區別
關於多進程和多線程,教科書上最經典的一句話是「進程是資源分配的最小單位,線程是CPU調度的最小單位」,這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這么簡單了,選的不好,會讓你深受其害。
經常在網路上看到有的XDJM問「多進程好還是多線程好?」、「Linux下用多進程還是多線程?」等等期望一勞永逸的問題,我只能說:沒有最好,只有更好。根據實際情況來判斷,哪個更加合適就是哪個好。
我們按照多個不同的維度,來看看多線程和多進程的對比(註:因為是感性的比較,因此都是相對的,不是說一個好得不得了,另外一個差的無法忍受)。
適應於多核、多機分布式;如果一台機器不夠,擴展到多台機器比較簡單
適應於多核分布式
進程占優
1)需要頻繁創建銷毀的優先用線程
原因請看上面的對比。
這種原則最常見的應用就是Web伺服器了,來一個連接建立一個線程,斷了就銷毀線程,要是用進程,創建和銷毀的代價是很難承受的
2)需要進行大量計算的優先使用線程
所謂大量計算,當然就是要耗費很多CPU,切換頻繁了,這種情況下線程是最合適的。
這種原則最常見的是圖像處理、演算法處理。
3)強相關的處理用線程,弱相關的處理用進程
什麼叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。
一般的Server需要完成如下任務:消息收發、消息處理。「消息收發」和「消息處理」就是弱相關的任務,而「消息處理」裡面可能又分為「消息解碼」、「業務處理」,這兩個任務相對來說相關性就要強多了。因此「消息收發」和「消息處理」可以分進程設計,「消息解碼」、「業務處理」可以分線程設計。
當然這種劃分方式不是一成不變的,也可以根據實際情況進行調整。
4)可能要擴展到多機分布的用進程,多核分布的用線程
原因請看上面對比。
5)都滿足需求的情況下,用你最熟悉、最拿手的方式
至於「數據共享、同步」、「編程、調試」、「可靠性」這幾個維度的所謂的「復雜、簡單」應該怎麼取捨,我只能說:沒有明確的選擇方法。但我可以告訴你一個選擇原則:如果多進程和多線程都能夠滿足要求,那麼選擇你最熟悉、最拿手的那個。
需要提醒的是:雖然我給了這么多的選擇原則,但實際應用中基本上都是「進程+線程」的結合方式,千萬不要真的陷入一種非此即彼的誤區。
消耗資源:
從內核的觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。線程是進程的一個執行流,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小於啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小於進程間切換所需要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統上,這個數據可能會有較大的區別。
通訊方式:
進程之間傳遞數據只能是通過通訊的方式,即費時又不方便。線程時間數據大部分共享(線程函數內部不共享),快捷方便。但是數據同步需要鎖對於static變數尤其注意
線程自身優勢:
提高應用程序響應;使多CPU系統更加有效。操作系統會保證當線程數不大於CPU數目時,不同的線程運行於不同的CPU上;
改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利於理解和修改。
6、關於多線程伺服器
你說你綁定和監聽都好了吧
那麼服務就可以這樣寫
while(bWorking)
{
SOCKET sAccept = accept(sListen, NULL, NULL);
if(sAccept != SOCKET_ERROR)
CreateThread(NULL, 0, ThreadProc, (LPVOID)&sAccept, 0, NULL);
}
相應的線程函數可以這樣:
DWORD WINAPI ThreadProc(LPVOID lpPara)
{
SOCKET sComm = *((SOCKET*)lpPara);
//從這里開始讀寫這個socket就可以了
}
這樣就實現了accept一個連接就創建一個線程。
7、游戲的多線程伺服器怎麼如何設計
游戲伺服器多線程是有處理器決定的,一般來說線程越多性能也就越好,當然成本也就越高,你可以參考這款28線程(單CPU)的圖形工作站(用於設計)
產品型號:ZI2TW6-129913DP
產品類型:雙路十二核工作站
處 理 器:Xeon E5-2687W
V4×2
內 存:128G DDR4 REG ECC
硬 盤:SSD PCIe 2.0T
8、游戲伺服器多線程如何設計?
游戲伺服器多線程是有處理器決定的,一般來說線程越多性能也就越好,當然成本也就越高,你可以參考這款28線程(單CPU)的圖形工作站(用於設計)
產品型號:ZI2TW6-129913DP
產品類型:雙路十二核工作站
處 理 器:Xeon E5-2687W
V4×2
內 存:128G DDR4 REG ECC
硬 盤:SSD PCIe 2.0T
產品地址:http://www.zrway.com/server/proct_param/1023/11181.html
9、並發伺服器的實現如何選擇多進程,多線程還是IO復用
產生進程的開銷要比線程的開銷更大。如果你的伺服器連接的客戶端的數量比較少,那麼進程和線程在效率方面的差別感覺並不大。如果數量很大,比如1000,甚至更多,如果你用進程,那麼響應完1000+的客戶端連接就會變得很慢,因為你要把資源復制1000多份;但是用線程,它們共享同一個進程里的資源,就不需要花那麼大的開銷去響應客戶端的連接。