1、多線程並發伺服器的缺點是什麼?可採用什麼克服
多線程處理的優點
同步應用程序的開發比較容易,但由於需要在上一個任務完成後才能開始新的任務,所以其效率通常比多線程應用程序低。如果完成同步任務所用的時間比預計時間長,應用程序可能會不響應。多線程處理可以同時運行多個過程。例如,文字處理器應用程序在您處理文檔的同時,可以檢查拼寫(作為單獨的任務)。由於多線程應用程序將程序劃分成獨立的任務,因此可以在以下方面顯著提高性能:
多線程技術使程序的響應速度更快,因為用戶界面可以在進行其他工作的同時一直處於活動狀態。
當前沒有進行處理的任務可以將處理器時間讓給其他任務。
佔用大量處理時間的任務可以定期將處理器時間讓給其他任務。
可以隨時停止任務。
可以分別設置各個任務的優先順序以優化性能。
是否需要創建多線程應用程序取決於多個因素。在以下情況下,最適合採用多線程處理:
耗時或大量佔用處理器的任務阻塞用戶界面操作。
各個任務必須等待外部資源(如遠程文件或 Internet 連接)。
例如,用於跟蹤 Web 頁上的鏈接並下載滿足特定條件的文件的 Internet 應用程序「robot」。這種應用程序可以依次同步下載各個文件,也可以使用多線程同時下載多個文件。多線程方法比同步方法的效率高很多,因為即使在某些線程中遠程 Web 伺服器的響應非常慢,也可以下載文件。
http://cache.網路.com/c?word=%B6%E0%3B%CF%DF%B3%CC%3B%B5%C4%3B%D3%C5%B5%E3&url=http%3A//www%2Edaima%2Ecom%2Ecn/Info/94/Info31410/&b=0&a=4&user=網路#0
下面是多線程的例子
還在Dos時代,人們就在尋求一種多任務的實現。於是出現了TSR類型的後台駐留程序,比較有代表性的有Side Kick、Vsafe等優秀的TSR程序,這類程序的出現和應用確實給用戶使用計算機帶來了極大的方便,比如Side Kick,我們編程可以在不用進編輯程序的狀態下,一邊編輯源程序,一邊編譯運行,非常方便。但是,Dos單任務操作系統的致命缺陷註定了在Dos下不可能開發出真正的多任務程序。進入Windows3.1時代,這種情況依然沒有根本的改變,一次應用只能做一件事。比如資料庫查詢,除非應用編得很好,在查詢期間整個系統將不響應用戶的輸入。
進入了Windows NT和Windows 9x時代,情況就有了徹底的改觀,操作系統從真正意義上實現了多任務(嚴格地說,Win9x還算不上)。一個應用程序,在需要的時候可以有許多個執行線程,每個線程就是一個小的執行程序,操作系統自動使各個線程共享CPU資源,確保任一線程都不能使系統死鎖。這樣,在編程的時候,可以把費時間的任務移到後台,在前台用另一個線程接受用戶的輸入。對那些對實時性要求比較高的編程任務,如網路客戶服務、串列通信等應用時,多線程的實現無疑大大地增強了程序的可用性和穩固性。
2、伺服器CPU是不是線程數越多越好?另外並發訪問量最多1000的伺服器用什麼CPU比較好?
你好.我來解答下你的問題
線程數只是衡量CPU性能的參數之一.並不完全由線程數量來決定CPU的性能.當然.在同等平台和同一級別的處理器.線程數越多性能越強.一般情況下.一台普通配置的伺服器最大並發數可以達到幾千.一台至強高配置的伺服器的最大並發數可以達到上萬.你所要求的並發數達到一千.基本上隨便一個普通配置就可以滿足了.除了配置以外.也要帶寬夠用才可以保障訪問速度.
海騰數據楊闖為你解答.若有伺服器問題需要幫忙的可以來找我
3、關於多線程伺服器
你說你綁定和監聽都好了吧
那麼服務就可以這樣寫
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一個連接就創建一個線程。
4、怎麼理解並發多進程服務和多線程伺服器
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操作數據。這樣在數據傳輸過程中不需要用戶線程的介入,減少了數據被拷貝的次數,減少了上下文切換的開銷。
5、如何用socket與多線程實現在伺服器端並發處理多客戶端的請求
你至少說一下你用什麼語言吧?給你個偽代碼,C、C++,java或其他語言的處理過程基本相似:
//創建服務端Socket,指定地址族,連接地址,傳輸協議
ServerSocket servSocket = new ServerSocket (AF_INET,"127.0.0.1",STREAM);
//指定服務端啟用埠
bind(servSocket ,port);
//把服務端socket轉化為監聽socket
listene(servSocket );
//監聽客戶端的請求
for(;;) {
ClientSocket cliSocket =new ClientSocket ();
//此處沒有連接請求的時候會產生阻塞,會把主線程掛起,有連接請求由操作系統或運行環境通知主線程,繼續處理
accept(servSocket,cliSocket);
//執行到此處說明有客戶端請求,創建線程處理客戶端請求,此處耗費的時間僅僅是各語言的線程創建時間,不處理任何其他工作,具體工作寫到線程回調代碼中執行。
(cliSocket);
//到此循環回去,等待下一次客戶端請求
}
6、伺服器一般支持多少線程
這個是根據伺服器配置(處理器)來的,主流的都是核心數* 2。你可以去伺服器廠商(正睿)的網上找找伺服器產品,查看一下參數和配置,幾分鍾就清楚了!
7、什麼是多線程並發伺服器
有多個 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 程序那樣。
8、伺服器說的「路、通道、線程」是什麼意思?
首先你要明白一點:路、核、線程三者的區別。
路:獨立的CPU的個數。
核:單個CPU的物理核心(也叫真實核心)數量。
線程:程序中順序控制流程的數量。
舉個例子,雙路四核八線程伺服器指的就是該伺服器有2個獨立的CPU,每個CPU有2個物理核心(2x2=4核),每個核心擁有2條線程(4x2=8線程)。個人PC平台上很少出現「路」這個術語,以前奔騰時代英特爾公司面向桌面級用戶倒是做過一些高端的雙CPU平台,就是說一塊主板上裝了兩個獨立的CPU,和現在的雙核CPU不是一個概念。多核CPU是由於後期技術發展後,晶元集成度越來越高,可以把多個物理核心集成在一個CPU上。打個比喻(雖然不恰當),如果把雙路看做一對健康的雙胞胎的話,那麼雙核就是一對連體雙胞胎。
而所謂的四核八線程(注意:這里沒有「路」定義)就是說,一顆獨立的CPU上的真實核心數量為4,但是通過超線程技術又模擬出4個核心,看上去像8個核心了,但有4個是模擬出來的,不是真實的,以此類推。這就是所謂的超線程,目前是英特爾公司獨有的技術。
至於「幾通道」,它指的是伺服器進行資源共享操作時的信道數量,它表現的是伺服器的網路共享通信那一塊的性能,和上面的三個術語面向的對象不同,他們仨表現的是伺服器的數據處理那一塊的性能,數量越高,伺服器多任務處理能力越強。當然,這四個傢伙一起展現了一台伺服器的綜合性能。