所以我有一些(可以說)與套接字(在c)的樂趣,然後我遇到了異步接收的問題。套接字庫民意調查vs自定義民意調查
如上所述,here,select
和poll
在套接字之間進行了線性搜索,這種搜索不能很好地進行縮放。然後我想,我能更好地瞭解套接字的應用程序特定行爲嗎?
例如,如果
- X Ñ:第n個數據報到達套接字X的時間(爲簡單起見讓我們假設時間是離散的)
- 鐠(X Ñ = X ñ | X n-1個 = X n-1個,X N-2 = X 的n-2 ...):在X的概率Ñ = X Ñ給出的以前的到達時間
通過統計或假定或任何已知的。然後,我可以實現一個按最大概率順序輪詢套接字的算法。
問題是,這是一個瘋狂的嘗試?庫poll
/select
有一些優勢,我不能從用戶空間擊敗?
編輯:澄清,我的意思並不是要複製的poll
和select
語義,我只是想找到至少一個插座是準備接受的工作方式。
此外,像epoll
這樣的東西存在,所有這一切,我認爲最有可能優越,但我想先找出任何可能的替代方案。
你的鏈接沒有聲明他們做了線性*搜索*。顯然有一個線性複製步驟進出內核,並且有一個線性掃描來查看哪些套接字將被選中/輪詢,但實際的底層機制將會是某種多信號量等待,隨後是對* ready-ready *套接字進行線性掃描,將它們映射回原始數據。 – EJP
我知道'poll'和'select'是多平臺的...但是使用特定於平臺的調用,比如'kqueue'(BDS/macOS)和'epoll'(Linux)對性能更有意義。例如,'kqueue'和'epoll'都是使用註冊事件(而不是輪詢)的內核級回調來實現的。因此,代替兩次輪詢大量對象(無論是在內核還是代碼中),您的代碼基本上輪詢單個對象(事件的隊列),而不是從該隊列中「彈出」事件... – Myst
@EJP The線性處理套接字實際上是我建議避免的,如果應用程序只能同時處理有限數量的套接字,或者想要以特定方式分配工作,掃描所有內容都毫無意義,或者我會這麼想。 –