The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
system и память родительского процесса, !*! dimonna, 22-Июл-10, 15:43  [смотреть все]
hi знатокам,

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

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

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

  • system и память родительского процесса, !*! DeadMustdie, 19:55 , 22-Июл-10 (1) +1
    Я не большой знаток конкретно QNX, но в нормальных (совместимых с POSIX) системах обычно происходит так:

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

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

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

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

      • system и память родительского процесса, !*! DeadMustdie, 09:10 , 23-Июл-10 (3)
        >Окей, а где это специфицировано (не нашел такого описания в 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, 09:40 , 23-Июл-10 (4)
          >[оверквотинг удален]
          >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() копируют область памяти родительского процесса, запуск новой программы оказывается
          >безумно дорогой операцией.

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




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

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