Вопрос по linux, python, memory-management – Многопроцессорный модуль показывает память для каждого дочернего процесса так же, как основной процесс.

1

Я использую многопроцессорный модуль Python и у меня возникли некоторые сомнения по поводу того же.

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

Затем выполняется многопроцессорная обработка этих данных и обрабатывается соответственно и по-разному соответственно.

Теперь я вижу, что многопроцессорная обработка происходит, т. Е. Все процессы имеют собственную загрузку ЦП, но память всех процессов по 16 ГБ каждый .. почему так. ?? Разве это не должно использовать ту же память, которую я посылаю через проход по ссылке на глобальные переменные ... Пожалуйста, подумайте.

Вывод команды top выглядит следующим образом.

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13908 admin 20 0 16.7g 16g 848 R 100.0 17.3 0:32.92 python
13429 admin 20 0 16.7g 16g 3336 S 0.0 17.3 15:06.97 python
13910 admin 20 0 16.7g 16g 848 R 100.3 17.3 0:32.94 python
13911 admin 20 0 16.7g 16g 840 R 100.0 17.3 0:33.02 python
13912 admin 20 0 16.7g 16g 836 R 99.6 17.3 0:33.00 python
13907 admin 20 0 16.7g 16g 796 R 100.0 17.3 0:33.06 python
13909 admin 20 0 16.7g 16g 796 R 99.6 17.3 0:32.93 python

ты должен прочитатьman fork. Paulo Scardine

Ваш Ответ

2   ответа
2

Каждый процесс порожденmultiprocessing Модуль находится в отдельном адресном пространстве. Вся физическая и виртуальная память, которую имел исходный процесс, по крайней мереlogically независимо от новых после создания новых, но изначально каждый новый процесс является точной копией (ну, см. сноску) старого. Таким образом, каждый будет иметь тот же виртуальный размер (16,7 ГБ), что и оригинал.

Фактические базовые физические страницы публикуются в максимально возможной степени с использованием «копирования при записи». По мере запуска различных копий и внесения изменений в их виртуальную память ядро будет копировать базовую физическую страницу по мере необходимости. Память, которая никогда не записывается, может быть разделена между всеми копиями. Таким образом, хотя каждый процесс, по-видимому, потребляет много оперативной памяти, на самом деле это не так. Если вы напишете большую его часть, то есть, если каждый отдельный процесс изменит большую часть 16 ГБ данных, то все они будут иметь отдельные копии и использовать гораздо больше физической ОЗУ.

multiprocessing Модуль предлагает некоторые методы совместного использования данных (см. раздел «Общая память» вhttp://docs.python.org/library/multiprocessing.html) если вы хотите, чтобы они делились изменениями (но затем подумайте о том, как работает блокировка; см. документацию).


сноска. Существует одна небольшая разница между оригиналом и клоном после системного вызова fork или clone: оригинал возвращает идентификатор клона, а клон возвращает номер ноль.

2

Подумайте о многопроцессорном модуле как о синтаксисе сахара вокруг os.fork ().

Теперь, что такое вилка? Когда процесс разветвляется, операционная система создает новый дочерний процесс с новым идентификатором процесса, дублируя состояние родительского процесса (память, переменные среды и т. Д.).

Похожие вопросы