所以我有一些(可以说)与套接字(在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线性处理套接字实际上是我建议避免的,如果应用程序只能同时处理有限数量的套接字,或者想要以特定方式分配工作,扫描所有内容都毫无意义,或者我会这么想。 –