小编ddo*_*man的帖子

epoll()在O(1)中完成它的工作吗?

维基百科说

与在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)?

linux network-programming epoll

55
推荐指数
1
解决办法
2496
查看次数

gcc原子内置函数

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)

我将上述代码理解为以下逻辑:

  1. 加载变量var的地址
  2. 将数字1写入变量var原子 - 通过寄存器/缓存,以某种方式

但是,我怀疑以下是否也是原子的

volatile int var = 0;
volatile int num = 1;
__sync_fetch_and_add( &var, num )
Run Code Online (Sandbox Code Playgroud)

因为它可能被解释为

  1. 加载变量var的地址
  2. 将变量num的值加载到寄存器中
  3. 将值写入变量var.

执行#2之后,但在#3之前,CPU /线程被中断,另一个CPU /线程更新变量num的值.

换句话说,当使用gcc的_ sync*()时,我可以使用变量而不是常量作为第二个参数吗?

它不会破坏原子性吗?

c gcc atomic

23
推荐指数
1
解决办法
3万
查看次数

具有共享内存的进程之间的通信结果是零拷贝?

我正在使用内核2.6在Linux上编写一个网络守护程序,它有 一个生产者进程和N个消费者进程,它们不会对数据进行任何更改,也不会向生产者创建任何响应.

每当生产者进程生成一个数据对象,其长度从几个10字节变化到几十个K字节时,就必须将数据对象传递给一个可用的消费者进程.

第一次,我考虑使用命名/未命名的PIPE.但是,它们将是内存复制开销.

  1. 生产者的用户空间缓冲区--copy - >内核空间PIPE缓冲区
  2. kernel-space PIPE buffer --copy - > consumer的用户空间缓冲区

由于该程序可能与大量具有低延迟的对等端一起工作,因此复制开销可能是有害的.因此,我决定使用POSIX共享内存和mmap().

我只是想知道使用POSIX共享内存和mmap()的进程之间的共享数据是否不会导致任何内存复制,这与PIPE不同.

此外,还有其他方法可以在进程之间共享数据,但结果是零拷贝吗?该程序将在具有最新版本内核的Linux上运行,并且可能不具备跨平台能力.

我决定不为每个消费者/产品生成/运行一个线程,而是由于设计问题而产生一个过程.

谢谢你的答复.

linux ipc mmap shared-memory zero-copy

9
推荐指数
1
解决办法
5672
查看次数

标签 统计

linux ×2

atomic ×1

c ×1

epoll ×1

gcc ×1

ipc ×1

mmap ×1

network-programming ×1

shared-memory ×1

zero-copy ×1