Процессы и потоки

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

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

В C++ работать с процессами можно посредством подключения различных специализированных библиотек, к примеру Toolhelp. Для примера, вызвать список всех процессов с помощью Toolhelp можно одной строкой

Сама функция просто просматривает все процессы в системе, и добавляет список согласно 2-ому параметру функции, означающий условия для добавления (т.к. стоит 0, то все процессы включаются).

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

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

В C++ для работы с потоками надо подключить файл <thread.h>. После этого простейшая программа с потоками будет выглядеть так:

thread thr – это объект потока, в его параметрах мы записали функцию tFunc, что означает, что поток будет выполнять ее при активации. После этого командой join блокируем текущий поток (main) до конца выполнения thr. Список команд для потоков довольно обширен: sleep() – приостановка на время, interrupt() –прервать работу потока и многие другие. Так же у потока как объекта есть много различных свойств, которые так же  можно модифицировать, например, Priority показывающий приоритет потока.

Опубликовано

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Капча загружается...