#process #linux-kernel #copy-on-write
#процесс #linux-ядро #копирование при записи
Вопрос:
-
Ранее
copy on write (COW)
, когда говорилось, что родительский и дочерний процессы используют одно и то же адресное пространство, это означало, что они используют один и тот же сегмент кода, сегмент данных, кучу и стек, верно? -
Если родительский и дочерний процессы используют одно и то же адресное пространство до COW, что
the page table entries are copied from parent process to child process
это значит? -
Означает ли дублирование записей таблицы страниц дублирование адресного пространства?
Ответ №1:
допустим, у вашего процесса есть переменное имя X, которое имеет виртуальный адрес 100 и физический адрес 200. PTE поддерживает сопоставление адресов от виртуальных 100 до физических 200.
после форка у каждого процесса (родительского и дочернего) будет свой личный PTE. на этом этапе оба PTE сопоставят виртуальные 100 с физическими 200.
пока оба процесса просто считывают оттуда, они оба будут считывать с физического адреса 200.
когда первый попытается выполнить запись туда, данные с физического адреса будут скопированы в новое физическое пространство, скажем 300, и его (и только его) PTE будет обновлен, так что виртуальный 100 будет сопоставлен с физическим 300. таким образом, это прозрачно для процесса, потому что он все еще использует тот же (виртуальный) адрес.
* Примечание: это всего лишь абстракция, а реальная вещь происходит в разрешении страницы.
Комментарии:
1. Отлично, это снимает мои сомнения. Покойся с миром 🙂
Ответ №2:
-
Да, одна и та же физическая память используется процессами (родительским и дочерним).
-
Это означает, что у каждого есть свой собственный PTE, который преобразует виртуальное адресное пространство в физическое адресное пространство. сразу после форка они в целом одинаковы.
-
Да, это означает, что после форка у каждого будет свое адресное пространство, которое идентично в начале, но может и будет изменено позже. например, в COW, malloc, свободно, в основном для любого изменения использования памяти процессами.
Комментарии:
1. Спасибо, я доволен 1 и 2. Но требуется дополнительное разъяснение по 3
2. Даже если адресное пространство не дублируется (например, перед COW), записи таблицы страниц родительского и дочернего процессов дублируются, я думаю, когда fork выполнен. Правильно ли я понимаю?
Ответ №3:
Таблицы страниц представляют собой структуру данных для каждого процесса, которая сопоставляет линейные адреса с физическими адресами. Записи таблицы страниц копируются из родительской в дочернюю, что означает, что сразу после fork()
оба процесса используют идентичные таблицы страниц, которые сопоставляют одни и те же физические адреса с одинаковыми линейными адресами в адресном пространстве каждого процесса. Однако после этого таблицы страниц начинают расходиться при возникновении каждой ошибки COW и других изменениях адресного пространства.