簡體   English   中英

Linux Networking IO Noob:Select()和Recvfrom,是阻塞還是非阻塞?

[英]Linux Networking IO Noob: Select() and Recvfrom, Blocking or Non-blocking?

我繼承了一段從UDP套接字讀取數據的代碼。 我需要一些幫助來弄清楚這里發生了什么,以及是否可以提高整個性能。

該代碼首先調用select(),然后調用recvfrom()。 根據我的研究,看來只有在select()返回有可用數據的事實時才調用recvfrom()。 這段代碼基本上由一個連續偵聽多播消息的線程組成。 結果,它基本上位於select()例程中,直到它接收數據或超時。

我想知道是否有更好的方法來改善此代碼的性能。 首先,select()是否必要? 基於此線程: 為UDP套接字的recv fcn設置超時,看來我可以直接設置recvfrom()命令本身的超時。 這會給我買什么嗎? 另外,基於一些研究,我看到了很多沒有select()的實現。 為什么是這樣?

另外,理想情況下,我想釋放盡可能多的CPU。 有沒有辦法讓我的進程進入休眠狀態,直到它收到一個數據包? 話雖如此,為簡單起見,我想一次接收一個完整的數據包。

先謝謝您的幫助。

recvfrom塊或select正在等待事件時,該過程實際上處於睡眠狀態。 也就是說,它沒有計划運行。 因此,您現有的代碼(至少在我正確解釋了您的描述的情況下)已經滿足您的第一個要求。

有沒有辦法讓我的進程進入休眠狀態,直到它收到一個數據包?

UDP是一種“數據報包服務”。 (引自man 7 udp )。 也就是說,它總是發送和接收完整的數據包。 因此,使用UDP,您不必擔心第二個要求:

為了簡單起見,我希望一次接收一個完整的數據包。

總而言之,我想你沒問題。

但是,您可能能夠刪除的select()調用,如果只在一個單一的描述等,假設你是能夠setsocketopt() SO_RCVTIMEO (你也許可以做到,雖然Posix的允許個人實施不允許選項設置,因此沒有絕對的保證。)我懷疑您是否會注意到這樣做帶來的性能改進,但是應該節省幾微秒。

有沒有辦法讓我的進程進入休眠狀態,直到它收到一個數據包?

您已經在這樣做了。 那就是select()所做的,或者是在阻塞模式下的recvfrom()。

為了簡單起見,我希望一次接收一個完整的數據包。

這就是UDP已經為您完成的工作。

可能會有所幫助: 10k問題

I can just set the timeout of the recvfrom() command itself

如果select僅在一個文件描述符(例如套接字)上等待,則與您的建議沒有太大區別。 但是,如果這管理多個,則實際上沒有更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM