Кто такие Зомби и что вызывает их? Есть ли Процессы-зомби и объекты Зомби?

Я могу найти вопросы о зомби, но ни один, что непосредственно обращается к тому, что они и почему и как они происходят. Существует пара того адреса, какие процессы-зомби находятся в контексте ответа на конкретный вопрос, но не обращаются к причине.

Существуют также вопросы относительно процессов-зомби и вопросы об объектах зомби Objective-C/Cocoa-related. Каковы различия или как они связаны? "EXEC_BAD_ACCESS" на Mac/iPhone (или подобная ошибка на других платформах) синонимичен с зомби?

Как можно предотвратить зомби и является там какими-либо лучшими практиками, которые помогут избежать их?

Было бы полезно иметь эту информацию в одном месте. Этот вопрос предназначается, чтобы быть агностиком платформы/языка, если это возможно.

35
задан yabada 10 July 2010 в 20:07
поделиться

2 ответа

Зомби-процессы и зомби-объекты совершенно не связаны. Зомби-процессы - это когда родительский процесс запускает дочерний процесс, а дочерний процесс завершается, но родитель не принимает код выхода дочернего процесса. Объект процесса должен оставаться, пока это не произойдет - он не потребляет ресурсов и мертв, но все еще существует - отсюда и «зомби».

Зомби объекты - это функция отладки Cocoa / CoreFoundation, которая помогает вам обнаруживать ошибки памяти - обычно, когда счетчик ссылок объекта падает до нуля, он немедленно освобождается, но это затрудняет отладку. Вместо этого, если объекты-зомби включены, память объекта не освобождается мгновенно, он просто помечается как зомби, и любые дальнейшие попытки его использования будут регистрироваться, и вы можете отследить, где в коде объект использовался за время его существования. .

EXEC_BAD_ACCESS - это обычное исключение «Вы использовали неправильный указатель», как если бы я:

(*(0x42)) = 5;
34
ответ дан 27 November 2019 в 15:39
поделиться

Когда процесс завершается, большая часть его состояния все еще существует в ядре, потому что его родитель может все еще хотеть посмотреть на некоторые вещи, например на возвращаемое значение, которое нужно где-то сохранить. Когда родитель вызывает wait () или waitpid (), он говорит ядру выбросить все это, потому что с ним покончено. Пока это не произойдет, дочерний элемент сохраняет идентификатор pid и использует ресурсы.Эти невыполненные дочерние процессы называются зомби. Даже убийство зомби не устранит его, его должен пожать (подождать) его родитель. Если родитель умирает, они передаются в "init" в системах unix, единственная задача которого - ждать, пока что-то их очистит.

Я никогда не слышал о «объектах зомби», но предполагаю, что это относится к вещам, которые либо не были очищены сборщиком мусора, либо имеют циклические ссылки или что-то в этом роде, так что они не собираются быть очищенным сборщиком мусора. Метафора очень похожа: fork () == malloc (), wait () == free () на определенном уровне. (Конечно, не идеальная метафора.)

8
ответ дан 27 November 2019 в 15:39
поделиться