2017-05-05 88 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正在进行一些富有成效的工作,而不是寻找工作。是的,我更加确信这个问题可能是一个糟糕的主意,越多的人与我交谈 –