套接字库民意调查vs自定义民意调查
所以我有一些(可以说)与套接字(在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
这样的东西存在,所有这一切,我认为最有可能优越,但我想先找出任何可能的替代方案。
图书馆
poll
/select
有一些优势,我不能从用户空间打败?
C库运行在用户空间,太多,但其select()
和poll()
功能几乎可以肯定是系统调用包装(但细节变化因系统)。他们包装单一的系统调用(实际上他们这样做)确实给他们一个明显的优势,涉及任何涉及多个系统调用的方案,例如我想你会想到的那种方法需要。系统调用的开销很高。
所有这一切都可能是没有实际意义,但是,如果你心里有重复的select()
和poll()
语义:具体而言,当他们返回,他们能提供所有已准备好文件的信息。为了做到这一点,他们必须测试或以某种方式每指定的文件,因此,所以,必须你的假设替代。由于您无论如何都需要扫描每个文件,因此扫描它们的顺序并不重要;线性扫描可能是一个理想的选择,因为它具有非常低的开销。
在编辑中澄清,我并不是说语义必须相同 –
公平的@PserserBy,但你仍然有问题分散在多个系统调用的任务与所有与一个,其中,作为我已经说过,可能杀死你。另外,你现在正在比较苹果和橘子。 –
是的,我的确在比较苹果和橘子。鉴于我明确表示用户知道内核不知道的东西,所以它不完全公平:)我只是试图确保CPU正在进行一些富有成效的工作,而不是寻找工作。是的,我更加确信这个问题可能是一个糟糕的主意,越多的人与我交谈 –
你的链接没有声明他们做了线性*搜索*。显然有一个线性复制步骤进出内核,并且有一个线性扫描来查看哪些套接字将被选中/轮询,但实际的底层机制将会是某种多信号量等待,随后是对* ready-ready *套接字进行线性扫描,将它们映射回原始数据。 – EJP
我知道'poll'和'select'是多平台的...但是使用特定于平台的调用,比如'kqueue'(BDS/macOS)和'epoll'(Linux)对性能更有意义。例如,'kqueue'和'epoll'都是使用注册事件(而不是轮询)的内核级回调来实现的。因此,代替两次轮询大量对象(无论是在内核还是代码中),您的代码基本上轮询单个对象(事件的队列),而不是从该队列中“弹出”事件... – Myst
@EJP The线性处理套接字实际上是我建议避免的,如果应用程序只能同时处理有限数量的套接字,或者想要以特定方式分配工作,扫描所有内容都毫无意义,或者我会这么想。 –