I mmap()
анонимный VMA. Как pthreads обрабатывают этот VMA? Я хочу, чтобы vma с его памятью копировался для каждого потока. Какие флаги мне нужны для этой цели?mmap() и pthreads - копия VMA
ответ
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 уже задан для клонирования.
Спасибо за ваш ответ. Это питти, я думал, что есть флаг, который скопировал бы память. Так же, как и скопированный стек. – tobawo
Вам не нужно копировать память между потоками; все они имеют общее пространство памяти. Существует MMAP_SHARED для обмена данными между различными процессами ... – osgx
@tobawo: стек не копируется - новый стек (на новый виртуальный адрес) создается для каждого нового pthread. – caf