2017-05-05 104 views
1

所以我有一些(可以說)與套接字(在c)的樂趣,然後我遇到了異步接收的問題。套接字庫民意調查vs自定義民意調查

如上所述,here,selectpoll在套接字之間進行了線性搜索,這種搜索不能很好地進行縮放。然後我想,我能更好地瞭解套接字的應用程序特定行爲嗎?

例如,如果

  • X Ñ:第n個數據報到達套接字X的時間(爲簡單起見讓我們假設時間是離散的)
  • 鐠(X Ñ = X ñ | X n-1個 = X n-1個,X N-2 = X 的n-2 ...):在X的概率Ñ = X Ñ給出的以前的到達時間

通過統計或假定或任何已知的。然後,我可以實現一個按最大概率順序輪詢套接字的算法。

問題是,這是一個瘋狂的嘗試?庫poll/select有一些優勢,我不能從用戶空間擊敗?

編輯:澄清,我的意思並不是要複製的pollselect語義,我只是想找到至少一個插座是準備接受的工作方式。
此外,像epoll這樣的東西存在,所有這一切,我認爲最有可能優越,但我想先找出任何可能的替代方案。

+0

你的鏈接沒有聲明他們做了線性*搜索*。顯然有一個線性複製步驟進出內核,並且有一個線性掃描來查看哪些套接字將被選中/輪詢,但實際的底層機制將會是某種多信號量等待,隨後是對* ready-ready *套接字進行線性掃描,將它們映射回原始數據。 – EJP

+0

我知道'poll'和'select'是多平臺的...但是使用特定於平臺的調用,比如'kqueue'(BDS/macOS)和'epoll'(Linux)對性能更有意義。例如,'kqueue'和'epoll'都是使用註冊事件(而不是輪詢)的內核級回調來實現的。因此,代替兩次輪詢大量對象(無論是在內核還是代碼中),您的代碼基本上輪詢單個對象(事件的隊列),而不是從該隊列中「彈出」事件... – Myst

+0

@EJP The線性處理套接字實際上是我建議避免的,如果應用程序只能同時處理有限數量的套接字,或者想要以特定方式分配工作,掃描所有內容都毫無意義,或者我會這麼想。 –

回答

3

圖書館poll/select有一些優勢,我不能從用戶空間打敗?

C庫運行在用戶空間,太多,但其select()poll()功能幾乎可以肯定是系統調用包裝(但細節變化因系統)。他們包裝單一的系統調用(實際上他們這樣做)確實給他們一個明顯的優勢,涉及任何涉及多個系統調用的方案,例如我想你會想到的那種方法需要。系統調用的開銷很高。

所有這一切都可能是沒有實際意義,但是,如果你心裏有重複的select()poll()語義:具體而言,當他們返回,他們能提供所有已準備好文件的信息。爲了做到這一點,他們必須測試或以某種方式每指定的文件,因此,所以,必須你的假設替代。由於您無論如何都需要掃描每個文件,因此掃描它們的順序並不重要;線性掃描可能是一個理想的選擇,因爲它具有非常低的開銷。

+0

在編輯中澄清,我並不是說語義必須相同 –

+0

公平的@PserserBy,但你仍然有問題分散在多個系統調用的任務與所有與一個,其中,作爲我已經說過,可能殺死你。另外,你現在正在比較蘋果和橘子。 –

+0

是的,我的確在比較蘋果和橘子。鑑於我明確表示用戶知道內核不知道的東西,所以它不完全公平:)我只是試圖確保CPU正在進行一些富有成效的工作,而不是尋找工作。是的,我更加確信這個問題可能是一個糟糕的主意,越多的人與我交談 –