Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс? / 19 сообщений из 19, страница 1 из 1
10.10.2013, 10:36
    #38422503
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
При использовании 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
10.10.2013, 11:44
    #38422667
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
fork() расшаривает,
У них общая часть только read only memory.
...
Рейтинг: 0 / 0
10.10.2013, 13:13
    #38422850
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
C точки зрения прикладного разработчика, fork создает копию всей памяти процесса. С точки зрения разработчика ядра ОС, там могут быть оптимизации - копирование только таблицы страниц и использование механизма copy-on-write.
...
Рейтинг: 0 / 0
10.10.2013, 13:38
    #38422893
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
fork() расшариваетИ если у них общая часть виртуального пространства, то зачем вообще им нужно анонимное отображение разделяемой памяти, ведь можно обмениваться данными просто через память в этом общем виртуальном пространстве?
Если не рассматривать оптимизации, то fork создает копию памяти род. процесса, кроме памяти выделенной через mmap - она не копируется, а остается общей.
Вот для этого и нужно анонимное отображение :)
...
Рейтинг: 0 / 0
10.10.2013, 20:48
    #38423597
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
Т.е. если с оптимизациями, то сначала копируется вся 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
10.10.2013, 23:53
    #38423757
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
fork() расшариваетПросто странно, что если область анонимного mmap() остается общей, то почему её не сделали с краю, а с краю разместили stack.
А какая разница?
...
Рейтинг: 0 / 0
19.10.2013, 13:17
    #38433847
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
А как тогда с помощью mmap() расшарить памяти между двумя уже запущенными процессами, но не через fork()?
...
Рейтинг: 0 / 0
19.10.2013, 13:25
    #38433853
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
но не через fork()А как тогда с помощью mmap() расшарить памяти между двумя уже запущенными процессами, но не через fork()?
Через mmap в файле естественно :)
...
Рейтинг: 0 / 0
19.10.2013, 13:34
    #38433860
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
Anatoly Moskovskyно не через fork()А как тогда с помощью mmap() расшарить памяти между двумя уже запущенными процессами, но не через fork()?
Через mmap в файле естественно :)
А он диск не будет использовать по чем зря? :)
...
Рейтинг: 0 / 0
19.10.2013, 15:56
    #38433963
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fork() расшаривает или копирует всю user-space Page-Table в дочерний процесс?
но не через fork()Anatoly Moskovskyпропущено...

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

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

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

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

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

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

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


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