Чем отличается Process от Thread?

Oct 28, 2009 17:50

Ответ на очередной из вопросов конкурса #msplatforma, проводимый в Твиттере Гайдаром Магдануровым
Вопрос звучал так: чем отличается Process от Thread?


Многопоточное программирование прикольная тема...
Сейчас, когда многоядерные процессоры едва ли не в каждом компьютере нормально писать многопоточные программы - это плюс, особенно для тех кто занимается "кровавым энтерпрайзом" (приветbelnetmon'у :) )

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

С другой стороны, процесс можно рассматривать как поток исполняемых команд или просто поток. У потока есть счетчик команд, отслеживающий порядок выполнения действий. У него есть регистры, в которых хранятся текущие переменные. У него есть стек, содержащий протокол выполнения процесса, где на каждую процедуру, вызванную, но еще не вернувшуюся, отведен отдельный фрейм. Хотя поток должен исполняться внутри процесса, следует различать концепции потока и процесса. Процессы используются для группирования ресурсов, а потоки являются объектами, поочередно исполняющимися на центральном процессоре.

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

Любой поток состоит из двух компонентов:
- объекта ядра, через который операционная система управляет потоком. Там же хранится статистическая информация о потоке(дополнительные потоки создаются также ядром);
- стека потока, который содержит параметры всех функций и локальные переменные, необходимые потоку для выполнения кода.

Если подытожить все что сказано (и недосказанно тоже) выше в виде тезисов:
1. Поток определяет последовательность исполнения кода в процессе.
2. Процесс ничего не исполняет, он просто служит контейнером потоков.
3. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах.
4. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах.
5. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.

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

P.S. В процессе написания этого поста консультировался со своей памятью, MSDN'ом и Bing'ом :)

twitter конкурс Платформа 2010 Microsoft

Previous post Next post
Up