совместное использование адресного пространства вместо дублирования записей таблицы страниц

#process #linux-kernel #copy-on-write

#процесс #linux-ядро #копирование при записи

Вопрос:

  1. Ранее copy on write (COW) , когда говорилось, что родительский и дочерний процессы используют одно и то же адресное пространство, это означало, что они используют один и тот же сегмент кода, сегмент данных, кучу и стек, верно?

  2. Если родительский и дочерний процессы используют одно и то же адресное пространство до COW, что the page table entries are copied from parent process to child process это значит?

  3. Означает ли дублирование записей таблицы страниц дублирование адресного пространства?

Ответ №1:

допустим, у вашего процесса есть переменное имя X, которое имеет виртуальный адрес 100 и физический адрес 200. PTE поддерживает сопоставление адресов от виртуальных 100 до физических 200.

после форка у каждого процесса (родительского и дочернего) будет свой личный PTE. на этом этапе оба PTE сопоставят виртуальные 100 с физическими 200.

пока оба процесса просто считывают оттуда, они оба будут считывать с физического адреса 200.

когда первый попытается выполнить запись туда, данные с физического адреса будут скопированы в новое физическое пространство, скажем 300, и его (и только его) PTE будет обновлен, так что виртуальный 100 будет сопоставлен с физическим 300. таким образом, это прозрачно для процесса, потому что он все еще использует тот же (виртуальный) адрес.

* Примечание: это всего лишь абстракция, а реальная вещь происходит в разрешении страницы.

Комментарии:

1. Отлично, это снимает мои сомнения. Покойся с миром 🙂

Ответ №2:

  1. Да, одна и та же физическая память используется процессами (родительским и дочерним).

  2. Это означает, что у каждого есть свой собственный PTE, который преобразует виртуальное адресное пространство в физическое адресное пространство. сразу после форка они в целом одинаковы.

  3. Да, это означает, что после форка у каждого будет свое адресное пространство, которое идентично в начале, но может и будет изменено позже. например, в COW, malloc, свободно, в основном для любого изменения использования памяти процессами.

Комментарии:

1. Спасибо, я доволен 1 и 2. Но требуется дополнительное разъяснение по 3

2. Даже если адресное пространство не дублируется (например, перед COW), записи таблицы страниц родительского и дочернего процессов дублируются, я думаю, когда fork выполнен. Правильно ли я понимаю?

Ответ №3:

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