2011-06-13 20 views
3

當我們進行網絡編程時,無論你使用多進程,多線程還是select/poll(epoll),只有一個進程/線程處理接受同一端口上的連接。如果你想利用多核心,你需要創建工作進程/線程。但是,綁定是如何處理網絡連接?處理網絡連接時有沒有辦法利用多核?在處理網絡連接時,有沒有辦法利用多核?

我發現了一些材料。看起來這很難完成。內核會隱式完成三次手抖動。而在smp結構中操作系統將分成幾個關鍵區域。同一關鍵區域不能同時在多個核心上運行。

回答

0

只有網絡流量,這幾乎是由網卡完成的(即不是計算機的CPU)。與網卡的通信通常是單線程的(由OS排隊,因此您可以在多個線程上發送/接收數據),因爲NIC只能一次一個地按下/彈出相關內容。

這取決於您的流程,以滿足收到的數據所需。這可以在一個線程上完成,並且可以在接收到主線程上的數據時產生其他線程,並以此方式劃分工作。如果你有一種支持異步通信的語言,我會試着讓它去完成大部分使用多線程的工作。

1

在PC硬件上運行的所有現代操作系統都已經針對多核CPU優化了其網絡堆棧。例如,將數據傳入和傳出網卡的數據包處理代碼將獨立於TCP/IP堆棧代碼,因此硬件中斷可以在不干擾TCP代碼的情況下運行完成。

儘管對於大多數真實世界的應用程序來說,大部分工作都在數據包之間。必須處理進入的數據,並且必須生成出去的數據。這取決於應用程序代碼,並且該代碼可以通過使用多個線程或多個進程來利用多個內核。你如何做到最好,就是特定的應用程序和操作系統。例如,Windows有I/O completion ports,它將作業發現與多線程作業調度結合在一起。 Linux有epoll

+0

硬件中斷可能發生在多cpu上嗎?我的意思是,如果有些數據包來自網絡並導致硬件中斷,那麼cpu應該保存其狀態並執行中斷句柄。幾乎在同一時間,讓我們只是說執行沒有完成,另一個數據包來了,應該有其他硬件中斷?如果會有另一箇中斷,它是否會被其他cpus並行處理? – easy 2011-09-15 06:55:18

+0

你不希望它由另一個CPU處理。該CPU已經具有處理網卡在其緩存中熱的代碼,並且可以比中斷正在進行有用工作的核心並強制仍在使用的代碼從緩存中逐出的代碼更有效地處理分組。不要將快速入門與快速完成混淆! – 2011-09-15 06:56:33

+0

我知道你的觀點,但我的意思是OS可以使用多CPU同時處理網絡流量。比方說,如果我有一個4核心cpu,我的應用程序非常簡單,它什麼都沒做,只等待tcp流量,所以我的cpus會一直閒置。在這種情況下,操作系統會使用multi-cpu來並行處理網絡流量嗎? – easy 2011-09-15 07:03:44

相關問題