URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8815
[ Назад ]

Исходное сообщение
"system и память родительского процесса"

Отправлено dimonna , 22-Июл-10 15:43 
hi знатокам,

Есть процесс (QNX, ~200 нитей съедают примерно 30 мб физической памяти). Если следовать мануалу на вызов system очевидно дочерний процесс будет образован через fork + execv, то-есть создаст в дочернем процессе 200 таких же нитей и займет столько же памяти, правильно?

Однако, так не происходит - свободной физичской памяти не становится меньше на 30 метров при выполнении system. Почему?, и чем чреват вызов system в таких условиях?

С уважением,
Дмитрий


Содержание

Сообщения в этом обсуждении
"system и память родительского процесса"
Отправлено DeadMustdie , 22-Июл-10 19:55 
Я не большой знаток конкретно QNX, но в нормальных (совместимых с POSIX) системах обычно происходит так:

1. При вызове fork() не происходит копирования области памяти процесса. Вместо этого используется механизм Copy-On-Write на основе аппаратной поддержки виртуальной памяти. Виртуальная память, однако же, выделяется ровно на объём виртуальной памяти родительского процесса.

2. При вызове fork() копируется только тот поток (нить), который вызвал fork().


"system и память родительского процесса"
Отправлено dimonna , 22-Июл-10 22:04 
>Я не большой знаток конкретно QNX, но в нормальных (совместимых с POSIX)
>системах обычно происходит так:
>
>1. При вызове fork() не происходит копирования области памяти процесса. Вместо этого
>используется механизм Copy-On-Write на основе аппаратной поддержки виртуальной памяти. Виртуальная память,
>однако же, выделяется ровно на объём виртуальной памяти родительского процесса.
>
>2. При вызове fork() копируется только тот поток (нить), который вызвал fork().
>

Окей, а где это специфицировано (не нашел такого описания в POSIX мане)? Или это платформо-зависимая имплементация?


"system и память родительского процесса"
Отправлено DeadMustdie , 23-Июл-10 09:10 
>Окей, а где это специфицировано (не нашел такого описания в POSIX мане)?
>Или это платформо-зависимая имплементация?

Вот кусок текста из SUSv3 касательно потоков:

A process shall be created with a single thread. If a multi-threaded process calls fork(), the new process shall contain a replica of the calling thread and its entire address space, possibly including the states of mutexes and other resources. Consequently, to avoid errors, the child process may only execute async-signal-safe operations until such time as one of the exec  functions is called.

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


"system и память родительского процесса"
Отправлено dimonna , 23-Июл-10 09:40 
>[оверквотинг удален]
>process calls fork(), the new process shall contain a replica of
>the calling thread and its entire address space, possibly including the
>states of mutexes and other resources. Consequently, to avoid errors, the
>child process may only execute async-signal-safe operations until such time as
>one of the exec  functions is called.
>
>Что касается механизма COW, то это - просто часто применяемая оптимизация, POSIX
>не требует именно такого поведения. Просто на системах, которые реально при
>выполнении fork() копируют область памяти родительского процесса, запуск новой программы оказывается
>безумно дорогой операцией.

Век живи век учись :) . Исчерпывающий ответ.
Спасибо