Как системы Unix отслеживают общую память при обработке fork()?

Процесс A создает общую область памяти и использует ее совместно с Процессом B. Затем Процесс A разветвляется и таким образом создается Процесс C. По определению C теперь имеет доступ к тем же областям общей памяти. Если A умирает, C и B по-прежнему имеют доступ к области памяти. Только когда C и B также умирают, физическая память снова освобождается.

Как системы Unix достигают этого? Хранят ли они информацию о том, какая память совместно используется для каждого процесса, или эта информация является глобальной?


person maxdev    schedule 12.11.2014    source источник


Ответы (1)


Область общей памяти имеет счетчик ссылок. Он увеличивается всякий раз, когда процесс открывает разделяемую память или получает ее, разветвляясь от процесса, у которого она была открыта. Он уменьшается, когда процесс закрывает разделяемую память или завершает работу. Когда счетчик становится равным 0, разделяемая область памяти сбрасывается.

person Barmar    schedule 12.11.2014
comment
Спасибо, но эта информация хранится в процессе или информация о существующих областях общей памяти является глобальной? - person maxdev; 12.11.2014
comment
Он глобальный, поскольку для каждой области разделяемой памяти существует один счетчик. Как это могло быть в процессе? - person Barmar; 12.11.2014
comment
Возможно. В моем проекте ядра (ghostkernel.org) я переделываю свою реализацию общей памяти, чтобы реализовать разветвление. В моей текущей реализации процесс создания является физическим владельцем региона, которым он хочет поделиться. Процессы, с которыми используется общая область, не имеют этого флага. Поэтому память освобождается после смерти физического владельца разделяемой памяти. Но, как видите, с форком этого не получится, потому что физический владелец может умереть, а физические страницы все равно должны остаться. - person maxdev; 12.11.2014
comment
Если информация об общей памяти является глобальной, что произойдет, если физическая память за общей областью не является непрерывной? Сохраняет ли система адрес каждой физической страницы в общем регионе? - person maxdev; 12.11.2014
comment
Это для каждой страницы. Это часть таблицы страниц, используемой системой виртуальной памяти. - person Barmar; 12.11.2014
comment
Для каждой страницы - для каждой физической страницы? Где вы нашли эту информацию? Как это вообще возможно при разумных накладных расходах на производительность/память? - person maxdev; 12.11.2014
comment
Почти все, что касается виртуальной памяти, управляется в таблице страниц. - person Barmar; 12.11.2014
comment
Нет. В x86 каталоги страниц и таблицы имеют только 3 бита на запись, которые можно использовать для таких целей. - person maxdev; 12.11.2014
comment
Я говорю об операционной системе, а не о железе. Как что-то, что является подсчетом процессов, может быть в информации для каждого процесса - это по своей сути фрагмент данных между процессами, поэтому он должен быть глобальным. - person Barmar; 12.11.2014
comment
Точные данные будут отличаться в зависимости от ОС. Другой способ сделать это — использовать связанный список, указывающий на информацию о виртуальной машине для каждого процесса для страницы. Когда список становится пустым, разделяемая память может быть удалена. - person Barmar; 12.11.2014