Как делает копию на записи в ветвлении (), обрабатывают несколько ветвление?

Это не возможно, по крайней мере, на Linux (другие Нельды могли бы позволить его); думайте об этом, когда Вы запускаете скрипт, оболочка должна считать его для знания, что сделать.

23
01.07.2015, 10:41
3 ответа

Ничего конкретного не происходит. Все процессы совместно используют тот же набор страниц, и каждый получает его собственную частную копию, когда он хочет изменить страницу.

18
27.01.2020, 19:42
  • 1
    Право. Точка, это - дочерний процесс, который является особенным, который имеет задание копирования, если это пытается записать в поделившуюся страницу. Ни родитель, ни другие дети не должны знать об изменении, если это сделано правильно. –  Charles Stewart 11.12.2012, 11:20
  • 2
    дочерний процесс не является настолько особенным. У и ребенка и родительских процессов есть тот же набор страниц, только для чтения после ветвления. Что касается этих страниц, обработка страницы симметрична. –  jlliagre 11.12.2012, 14:22

Когда система формует ветвление, обычно (это может зависеть от реализации), это также отмечает страницы как только для чтения, и отмечает родительский процесс как ведущее устройство этих страниц.
При попытке записать в эти страницы, происходит отсутствие страницы, и ОС вступает во владение, копируя весь список страниц или просто измененных (снова, зависящий от реализации), таким образом, запись будет иметь перезаписываемую копию.
Когда существует несколько процессов, разветвленных от того же, когда "основной" процесс пишет в, он - память, другие процессы скопировали свои эквивалентные страницы.

0
27.01.2020, 19:42
  • 1
    , какая система делает это? Linux использует реализацию –  brauliobo 10.10.2014, 18:32
  • 2
    , Именно так копия на записи работает... –  Didi Kohen 13.10.2014, 16:02
  • 3
    @DavidKohen, который это не то, как копия на записи работает в любой версии его, что я когда-либо слышал о. Нет никакого "основного" процесса. Если какой-либо единственный процесс пишет поделившиеся страницы, его копия ударена к частной, в то время как все другие процессы продолжают совместно использовать его. –  Celada 13.11.2014, 19:13
  • 4
    я думаю David Kohen, является правильным к некоторой точке. Это - один способ реализовать копию на записи. Суть была бы то, что с этой маркировкой, пишущий в ту страницу инициирует обработчик отсутствий страницы, который затем принял бы соответствующие меры, т.е. копию на записи. К сожалению, эта деталь (который был бы определенным для системы) главным образом не важна для вопроса. Следует иметь в виду, что CoW имеет два размера: одно видимое к процессу и тому того, как ядро могло бы реализовать его. –  0xC0000022L 01.07.2015, 10:45

Поведение форка ()зависит от того, есть ли в *nix-системе MMU или нет. В системе без -MMU (, такой как ранний PDP -11s ), системный вызов fork ()копировал всю родительскую память для каждого потомка. В nix-системе *на основе MMU -ядро ​​помечает все не-страницы стека как R/O и разделяет их между родителем и дочерним элементом. Затем, когда какой-либо процесс записывает на какую-либо страницу, MMU перехватывает эту попытку, затем ядро ​​выделяет доступную для записи страницу и обновляет таблицы страниц -MMU, чтобы они указывали на доступную для записи страницу. Такое поведение копирования -на -записи обеспечивает -увеличение скорости, поскольку первоначально для каждого дочернего процесса необходимо выделить и клонировать только частный стек.

Если вы выполняете некоторый родительский код между каждым вызовом fork (), то результирующие дочерние процессы будут отличаться страницами, которые были изменены родителем. С другой стороны, если родитель просто выдает несколько вызовов fork (), например. в цикле, то дочерние процессы будут практически идентичными. Если используется локальная переменная цикла, то она будет отличаться в каждом дочернем стеке.

6
27.01.2020, 19:42

Теги

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