Процесс можно рассматривать как способ объединения в группу родственных ресурсов (адресное пространство, файлы, устройства ввода/вывода). С другой стороны, процесс можно рассматривать как поток исполняемых команд. Поток - последовательность исполняемых команд. У потока есть счетчик команд, регистры, локальные переменные и стек, содержащий протокол выполнения процесса. В стеке хранится по одному фрейму на каждую вызванную, но не завершенную функцию. Концепция многопоточности дает возможность одновременного выполнения в одной и той же среде нескольких достаточно независимых команд. В многопоточном процессе потоки работают поочередно. Псевдопараллельность создается за счет быстрого переключения процессора между разными потоками.
Различные потоки одного процесса независимы в меньшей степени, чем различные процессы. Они используют одно адресное пространство, и любой поток может считывать, записывать или стирать данные либо стек другого потока. Защиты от таких ситуаций не существует, поскольку это невозможно и не нужно. Один процесс запущен всегда одним пользователем, и потоки создаются таким образом, чтобы не мешать друг другу.
|
|
|Элементы процесса: |Элементы потока: |
|1)адресное пространство; |1)счетчик команд; |
|2)глобальные переменные; |2)регистры; |
|3)открытые файлы; |3)стек функций; |
|4)дочерние процессы; |4)состояния. |
|5)информация об | |
|использовании ресурсов. | |
Поток может находится в одном из состояний:
- готовность;
- выполнение;
- блокировка;
- завершение.
Состояния "создания" не сущетсвует, поскольку потоку не надо выделять ресурсы. У каждого потока существует свой собственный стек выполнения, в котором содержится по одному фрейму для каждой вызванной, но не вернувшей управление функцией. Во фрейме хранятся локальные переменные функции и адрес возврата.
3. Потоки. Основные функции. Достоинства потоков.
Для реализации многопоточности необходим минимальный набор специальных функций. Поскольку процессы запускаются с одним потоком, необходима функция создания нового потока.
thread_create
Параметром функции обычно является имя процедуры, которое представляет собой новый поток.
Завершить работу потока можно с помощью функции thread_exit. С помощью функции thread_wait один поток может ожидать окончания выполнения другого потока. С помощью функции thread_yield поток может добровольно передать управление другому потоку. Если не указан поток, которому передается управление, запускается планировщик потоков, который выбирает один из находящихся в состоянии готовности потоков текущего процесса. Реализация этой функции очень важна для повышения эффективности многопоточных систем, поскольку, в случае потоков, не существует прерывания по таймеру, позволяющему переключаться между процессами через определенные промежутки времени.