维基百科说
与在O(n)下运行的旧系统调用不同,epoll在O(1)[2]中运行.
http://en.wikipedia.org/wiki/Epoll
但是,Linux-2.6.38上fs/eventpoll.c的源代码似乎是用RB树实现搜索的,它有O(logN)
/*
* Search the file inside the eventpoll tree. The RB tree operations
* are protected by the "mtx" mutex, and ep_find() must be called with
* "mtx" held.
*/
static struct epitem *ep_find(struct eventpoll *ep, struct file *file, int fd)
{
Run Code Online (Sandbox Code Playgroud)
事实上,我看不到任何手册页说epoll()的复杂性是O(1).为什么它被称为O(1)?
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Atomic-Builtins.html
我相信以下代码会原子地增加var的值.
volatile int var = 0;
__sync_fetch_and_add( &var, 1 )
Run Code Online (Sandbox Code Playgroud)
我将上述代码理解为以下逻辑:
但是,我怀疑以下是否也是原子的
volatile int var = 0;
volatile int num = 1;
__sync_fetch_and_add( &var, num )
Run Code Online (Sandbox Code Playgroud)
因为它可能被解释为
执行#2之后,但在#3之前,CPU /线程被中断,另一个CPU /线程更新变量num的值.
换句话说,当使用gcc的_ sync*()时,我可以使用变量而不是常量作为第二个参数吗?
它不会破坏原子性吗?
我正在使用内核2.6在Linux上编写一个网络守护程序,它有 一个生产者进程和N个消费者进程,它们不会对数据进行任何更改,也不会向生产者创建任何响应.
每当生产者进程生成一个数据对象,其长度从几个10字节变化到几十个K字节时,就必须将数据对象传递给一个可用的消费者进程.
第一次,我考虑使用命名/未命名的PIPE.但是,它们将是内存复制开销.
由于该程序可能与大量具有低延迟的对等端一起工作,因此复制开销可能是有害的.因此,我决定使用POSIX共享内存和mmap().
我只是想知道使用POSIX共享内存和mmap()的进程之间的共享数据是否不会导致任何内存复制,这与PIPE不同.
此外,还有其他方法可以在进程之间共享数据,但结果是零拷贝吗?该程序将在具有最新版本内核的Linux上运行,并且可能不具备跨平台能力.
我决定不为每个消费者/产品生成/运行一个线程,而是由于设计问题而产生一个过程.
谢谢你的答复.