Как обеспечить, чтобы дочерние и родительские процессы имели разное адресное пространство при использовании fork () в QNX - PullRequest
0 голосов
/ 26 октября 2018

Вопрос в особенности о QNX и в значительной степени указан в названии.Я попытался зарегистрировать адреса переменных после их изменения в обоих процессах, предполагая, что копирование при записи больше не работает и они не идентичны, поэтому я ожидал, что адреса будут разными.Но они одинаковы (виртуальные адреса, но все же).

Так как я могу проверить, что один процесс не влияет на другой без вывода значения переменных, может быть, есть более простое решение?

int q;
q = 3;
...
if (pid == 0) {
    // in child
    q = 5;
    printf("%d\n", &q);
} else {
    // in parent
    q = 9;
    printf("%d\n", &q);
}

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Если вы создали новый процесс, а не новый поток, то он по определению имеет собственное адресное пространство процесса.

Каждое адресное пространство процесса будет иметь одинаковый диапазон виртуальных адресов - 0x00000000 - 0xffffffff на 32-разрядной машине. Каждый процесс будет иметь виртуальный адрес n , для чего он будет использоваться и будет ли он отображаться на что-либо, что существует физически. Некоторая часть этого адресного пространства будет использоваться ядром, а другая может использоваться совместно (см. Также man mmap).

После fork() вы не должны удивляться, если виртуальные адреса идентичны в обоих процессах (хотя это не может быть гарантировано для новых операций с памятью после fork) - это не означает, что копирование при записи является не работает, это невидимо для нормального кода.

Страницы не обязательно находятся в ОЗУ (физической памяти), но могут храниться в файле подкачки или подкачки (используемые термины могут различаться) до тех пор, пока это не потребуется. Виртуальный адрес относится к таблице страниц, которая знает, где в действительности находится ее страница. Когда копирование при записи активируется, это означает, что создается новая страница, это не означает, что виртуальный адрес изменяется, он останется прежним, но в таблице страниц будет указано другое физическое местоположение.

Почему вы хотите знать в любом случае? Этот вид операции находится в области операционной системы.

0 голосов
/ 26 октября 2018

Виртуальные адреса, которые вы печатаете, будут идентичны - дочерний процесс является почти точной копией своего родителя. Физические адреса, к которым программы обращаются, будут отдельными, как только один процесс попытается изменить данные на этой странице, но они будут полностью скрыты от двух процессов. В этом красота виртуальной памяти.

Обратите внимание, что вы используете неправильный формат для печати адресов; Вы должны использовать %p и привести адрес к void *:

printf("%p\n", (void *)&q);

или используйте <inttypes.h> и uintptr_t и PRIXPTR (или PRIdPTR, если вы действительно хотите, чтобы адрес был десятичным, а не шестнадцатеричным):

printf("0x%" PRIXPTR "\n", (uintptr_t)&q);

Напечатайте числа тоже - и делайте это несколько раз в цикле с какими-то снами. Вы увидите, что, несмотря на один и тот же логический (виртуальный) адрес, физические адреса разные. Однако вы не сможете легко найти физический адрес.

...