четверг, 10 июня 2010 г.

Почему привязка к процессорам наследуется дочерними процессами?

Это перевод Why is processor affinity inherited by child processes? Автор: Реймонд Чен.

Посмотрите, почему типичная программа (программы-оболочки вроде Проводника не являются типичными программами) может запускать дочерние процессы. Потому что её текущая задача разбивается на подзадачи, некоторые из которых по каким-то причинам помещаются в отдельный (дочерний) процесс. Пример? Ну, скажем, многопроходный компилятор/линкёр, где каждый проход реализуется дочерним процессом.

А теперь посмотрите, почему обычно вы хотите ограничить процесс, привязав его к процессору. Первая причина: программа может иметь баг, который приводит к её вылету при параллельном выполнении потоков программы. Это было частой причиной вылетов старых программ, которые писались для однопроцессорных версий Windows или когда многопроцессорные машины были относительно дороги и мало распространены. В этом случае, вы запускаете программу на паузе, передавая флаг CREATE_SUSPENDED в функцию CreateProcess, после чего устанавливаете привязку процесса к процессорам и возобновляете процесс.

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

Другой причиной, почему вы хотели бы ограничить выполнение процесса одним процессором, является ограничение использования процессора (например, если приложение полностью загружает оба процессора, вы можете ограничить его одним процессором, чтобы второй процессор был свободен для чтения почты и просмотра картинок). И снова, если этот процесс запускает вспомогательные дочерние процессы, вы бы хотели, чтобы они тоже имели это же ограничение на один процессор, так что вся задача в целом была бы ограничена только одним процессором.

Вот почему привязка к процессору наследуется дочерними процессами. Потому что почти всегда это то, что вы хотите.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.