The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"system и память родительского процесса"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"system и память родительского процесса"  +/
Сообщение от dimonna email(ok) on 22-Июл-10, 15:43 
hi знатокам,

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

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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "system и память родительского процесса"  +/
Сообщение от DeadMustdie email(??) on 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() копируют область памяти родительского процесса, запуск новой программы оказывается безумно дорогой операцией.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "system и память родительского процесса"  +/
Сообщение от dimonna email(ok) on 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() копируют область памяти родительского процесса, запуск новой программы оказывается
>безумно дорогой операцией.

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру