powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
19 сообщений из 19, страница 1 из 1
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38422503
При использовании fork() из POSIX копируется вся user-space Page-Table родительского процесса в дочерний или просто где-то помечается, что эта часть используется одновременно и родительским и дочерним процессами?

авторThe entire virtual address space of the parent is
replicated in the child, including the states of mutexes,
condition variables, and other pthreads objects; the use of
pthread_atfork(3) may be helpful for dealing with problems that
this can cause.

И какая часть Page-Table копируется, или вся Stack + Heap + BSS + Data + Text?



И если у них общая часть виртуального пространства, то зачем вообще им нужно анонимное отображение разделяемой памяти, ведь можно обмениваться данными просто через память в этом общем виртуальном пространстве?

mmap

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
#include <sys/types.h>
#include <sys/mman.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
int main(void)
{
        const char str1[] = "string 1";
        const char str2[] = "string 2";
        int parpid = getpid(), childpid;
        int fd = -1;
        char *anon, *zero;
 
        if ((fd = open("/dev/zero", O_RDWR, 0)) == -1)
                err(1, "open");
 
        anon = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
        zero = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
 
        if (anon == MAP_FAILED || zero == MAP_FAILED)
                errx(1, "either mmap");
 
        strcpy(anon, str1);
        strcpy(zero, str1);
 
        printf("PID %d:\tanonymous %s, zero-backed %s\n", parpid, anon, zero);
        switch ((childpid = fork())) {
        case -1:
                err(1, "fork");
                /* NOTREACHED */
 
        case 0:
                childpid = getpid();
                printf("PID %d:\tanonymous %s, zero-backed %s\n", childpid, anon, zero);
                sleep(3);
 
                printf("PID %d:\tanonymous %s, zero-backed %s\n", childpid, anon, zero);
                munmap(anon, 4096);
                munmap(zero, 4096);
                close(fd);
                return (EXIT_SUCCESS);
        }
 
        sleep(2);
        strcpy(anon, str2);
        strcpy(zero, str2);
 
        printf("PID %d:\tanonymous %s, zero-backed %s\n", parpid, anon, zero);
        munmap(anon, 4096);
        munmap(zero, 4096);
        close(fd);
        return (EXIT_SUCCESS);
}

...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38422667
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fork() расшаривает,
У них общая часть только read only memory.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38422850
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
C точки зрения прикладного разработчика, fork создает копию всей памяти процесса. С точки зрения разработчика ядра ОС, там могут быть оптимизации - копирование только таблицы страниц и использование механизма copy-on-write.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38422893
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fork() расшариваетИ если у них общая часть виртуального пространства, то зачем вообще им нужно анонимное отображение разделяемой памяти, ведь можно обмениваться данными просто через память в этом общем виртуальном пространстве?
Если не рассматривать оптимизации, то fork создает копию памяти род. процесса, кроме памяти выделенной через mmap - она не копируется, а остается общей.
Вот для этого и нужно анонимное отображение :)
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38423597
Т.е. если с оптимизациями, то сначала копируется вся Page-Table, а затем по мере изменения данных по схеме copy-on-write данные по-странично копируются в новую физическую область и PTE из Page-Table перенаправляются туда?
Исключения составляют mmap(,,,MAP_ANON|MAP_SHARED), но не mmap(,,,MAP_ANON|MAP_PRIVATE), и read-only данные.
Кстати, а какие данные являются read-only на картинке из первого поста?

Просто странно, что если область анонимного mmap() остается общей, то почему её не сделали с краю, а с краю разместили stack.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38423757
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fork() расшариваетПросто странно, что если область анонимного mmap() остается общей, то почему её не сделали с краю, а с краю разместили stack.
А какая разница?
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38433847
А как тогда с помощью mmap() расшарить памяти между двумя уже запущенными процессами, но не через fork()?
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38433853
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но не через fork()А как тогда с помощью mmap() расшарить памяти между двумя уже запущенными процессами, но не через fork()?
Через mmap в файле естественно :)
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38433860
Anatoly Moskovskyно не через fork()А как тогда с помощью mmap() расшарить памяти между двумя уже запущенными процессами, но не через fork()?
Через mmap в файле естественно :)
А он диск не будет использовать по чем зря? :)
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38433963
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но не через fork()Anatoly Moskovskyпропущено...

Через mmap в файле естественно :)
А он диск не будет использовать по чем зря? :)
Необязательно. Есть shm_open
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38434305
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле практически всегда (если рассматривать обычные программы, без извращений) память процесса, хоть приватная хоть разделяемая, отображается на диск.
Это либо исполняемые модули, либо явно отображенные файлы, ну и в остальных случаях это своп.
Совсем другое дело, когда именно происходит доступ к диску (и вообще происходит ли) при работе с такой памятью.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38434333
А обычно всё-таки оставляют возможность сохранять данные на диск для разделяемой памяти и если да то зачем?
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38434357
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fork() расшариваетА обычно всё-таки оставляют возможность сохранять данные на диск для разделяемой памяти и если да то зачем?Ну собственно говоря, своп это и есть сохранение разделяемой памяти на диске.
Обычно этим занимается сама ОС и приложению такой уровень контроля над памятью не нужен. Но для задач жадных до памяти (например базы данных) это может быть полезно.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38434631
White Owlfork() расшариваетА обычно всё-таки оставляют возможность сохранять данные на диск для разделяемой памяти и если да то зачем?Ну собственно говоря, своп это и есть сохранение разделяемой памяти на диске.
Обычно этим занимается сама ОС и приложению такой уровень контроля над памятью не нужен. Но для задач жадных до памяти (например базы данных) это может быть полезно.
Ну если с обычной памятью я могу сделать mlock() чтобы не свопилась. То как этого же добиться для разделяемой памяти между процессами, обязательно использовать shm_open или есть и другие варианты?

Все таки не хотелось бы чтобы из-за диска это влияло на скорость IPC.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38434660
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fork() расшариваетТо как этого же добиться для разделяемой памяти между процессами, обязательно использовать shm_open или есть и другие варианты?
Память shm_open тоже свопится :)

И вообще, непонятно чего вы боитесь так этого свопинга. Он влияет на производительность только при нехватке физической памяти.
В большинстве случаев при отображении файла в память до записи в файл не доходит пока явно не будет вызван msync() или закрыто отображение. Для свопинга (как частного случая отображения файлов) эти две операции недоступны для юзера.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38434661
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fork() расшариваетпропущено...
Ну если с обычной памятью я могу сделать mlock() чтобы не свопилась. То как этого же добиться для разделяемой памяти между процессами, обязательно использовать shm_open или есть и другие варианты?

Все таки не хотелось бы чтобы из-за диска это влияло на скорость IPC.
mmap с флагами MAP_LOCKED или MAP_HUGETLB.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38460585
OoCcfork() расшариваетпропущено...
Ну если с обычной памятью я могу сделать mlock() чтобы не свопилась. То как этого же добиться для разделяемой памяти между процессами, обязательно использовать shm_open или есть и другие варианты?

Все таки не хотелось бы чтобы из-за диска это влияло на скорость IPC.
mmap с флагами MAP_LOCKED или MAP_HUGETLB.
А для этого надо скомпилировать ядро линукса с опцией HugeTLB fs?
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38461127
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с опцией HugeTLBOoCcпропущено...

mmap с флагами MAP_LOCKED или MAP_HUGETLB.
А для этого надо скомпилировать ядро линукса с опцией HugeTLB fs?
В общем случае зависит от ядра. В дистрибутивах с ядрами 3.XX достаточно установить параметр конфигурации ядра vm.nr_hugepages=<количество зарезервированных 2мб страничек>.
...
Рейтинг: 0 / 0
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
    #38471470
Anatoly Moskovskyfork() расшариваетТо как этого же добиться для разделяемой памяти между процессами, обязательно использовать shm_open или есть и другие варианты?
Память shm_open тоже свопится :)

И вообще, непонятно чего вы боитесь так этого свопинга. Он влияет на производительность только при нехватке физической памяти.
В большинстве случаев при отображении файла в память до записи в файл не доходит пока явно не будет вызван msync() или закрыто отображение. Для свопинга (как частного случая отображения файлов) эти две операции недоступны для юзера.
А кстати, если мы делаем msync(), то он всю буферезованную часть сваливает в файл, или у него где-то отмечается какие страницы менялись, а какие нет?
Допустим если мы открыли файл в 1ГБ через mmap(), весь его прочитали, т.е. через множество page-fault подняли в память, теперь изменили только 1 байт, и вызвали msync(), то он весь 1ГБ начнет сваливать в файл или как-то определит ту страницу которую меняли и сохранит только её, и как он это определит?
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]