2015-03-14 3 views
1

I mmap() анонимный VMA. Как pthreads обрабатывают этот VMA? Я хочу, чтобы vma с его памятью копировался для каждого потока. Какие флаги мне нужны для этой цели?mmap() и pthreads - копия VMA

ответ

2

I mmap() анонимный VMA. Как pthreads обрабатывают этот VMA?

«pthreads» (библиотека пользовательского пространства для потоков в Linux) не имеет специальной обработки новых VMA от mmap.

Я хочу, чтобы vma с его памятью копировался для каждого потока.

Вы не можете, поскольку каждая нить одного процесса имеет один и тот же VMA.

По умолчанию реализации потоковой в Glibc - NPTL, использует clone системный вызов с CLONE_VM флагом: http://code.metager.de/source/xref/gnu/glibc/sysdeps/unix/sysv/linux/createthread.c

47 static int 
48 create_thread (struct pthread *pd, const struct pthread_attr *attr, 
49   bool stopped_start, STACK_VARIABLES_PARMS, bool *thread_ran) 
50 { 
66 /* We rely heavily on various flags the CLONE function understands: 
67 
68  CLONE_VM, CLONE_FS, CLONE_FILES 
69 These flags select semantics with shared address space and 
70 file descriptors according to what POSIX requires. 

94 const int clone_flags = (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SYSVSEM 
95    | CLONE_SIGHAND | CLONE_THREAD 
96    | CLONE_SETTLS | CLONE_PARENT_SETTID 
97    | CLONE_CHILD_CLEARTID 
98    | 0); 
99 

102 if (__glibc_unlikely (ARCH_CLONE (&start_thread, STACK_VARIABLES_ARGS, 
103     clone_flags, pd, &pd->tid, tp, &pd->tid) 

И man page of clone говорит:

CLONE_VM (since Linux 2.0) 
      If CLONE_VM is set, the calling process and the child process 
      run in the same memory space. In particular, memory writes 
      performed by the calling process or by the child process are 
      also visible in the other process. Moreover, any memory 
      mapping or unmapping performed with mmap(2) or munmap(2) by 
      the child or calling process also affects the other process. 

Таким образом, любого отображения памяти или unmapping выполняется с mmap (2) или munmap (2) на один поток рассматривается всеми процессами процесса в linux glibc pthreads. Нет необходимости в дополнительном флаге для mmap; Флаг CLONE_VM уже задан для клонирования.

+0

Спасибо за ваш ответ. Это питти, я думал, что есть флаг, который скопировал бы память. Так же, как и скопированный стек. – tobawo

+0

Вам не нужно копировать память между потоками; все они имеют общее пространство памяти. Существует MMAP_SHARED для обмена данными между различными процессами ... – osgx

+2

@tobawo: стек не копируется - новый стек (на новый виртуальный адрес) создается для каждого нового pthread. – caf