home   contents  previous      next        up

Сопроцессы

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

Сопроцесс описывается так же, как и обычная функция, только она должна иметь первый параметр p типа (*Process), указывающий на Process-структуру(process_h.html), в которой размещается дескриптор сопроцесса (информация о сопроцессе).

Функция ProcAlloc выделяет память под дескриптор и рабочую область (стек) сопроцесса, инициализирует дескриптор сопроцесса (сохраняя в нем указатель на соответствующую функцию, указатель и размер стека), записывает в область стека указанные значения параметров для сопроцесса. Эти значения будут присвоены параметрам функции при создании сопроцесса.

Функции ProcAllocClean и ProcInitClean освобождают память, выделенную под стек и дескриптор, и исключают дескриптор завершившегося сопроцесса из списка инициализированных сопроцессов.

Функции ProcRun, ProcRunHigh и ProcRunLow активируют сопроцесс, который выполняется одновременно с процессом, создавшим его. Процесс, инициировавший выполнение сопроцесса, не может ни определить, ни изменить состояние сопроцесса.

Функции ProcPar, ProcParList и ProcPriPar активируют группы сопроцессов. Сопроцессы выполняются параллельно друг с другом, но создавший их процесс приостанавливается и получит управление только тогда, когда завершатся все сопроцессы группы.

Следующие функции позволяют приостановить или завершить выполнение процесса, изменить его положение в очереди активных процессов. Функция ProcAfter приостанавливает выполнение вызвавшего ее процесса до наступления указанного времени, а функция ProcWait - на указанное число тактов транспьютера. Функция ProcStop завершает выполнение сопроцесса. Функция ProcReschedule помещает процесс в конец очереди активных процессов, ожидающих возобновление выполнения, тем самым, предоставляя процессор другим процессам.

Функции ProcAlt и ProcAltList приостанавливают выполнение вызвавшего их процесса, пока один из указанных каналов не будет готов к вводу данных. Функции возвращают индекс списка параметров для канала готового к приему данных. Функции не осуществляют ввода данных. Функции ProcTimerAlt и ProcTimerAltList аналогичны ProcAlt и ProcAltList за исключением того, что они возобновляют выполнение процесса при наступлении указанного времени.

Функции ProcSkipAlt и ProcSkipAltList проверяют готовность каналов к вводу данных, не останавливая процесс.

Если для взаимодействия сопроцессов используются каналы, то необходимо помнить следующее:

  1. Каналы, используемые для синхронизации сопроцессов, должны быть инициализированы до вызова сопроцессов.
  2. Задача, активировавшая сопроцессы, не должна прекращать работу до их завершения, иначе это приведет к ошибке, поскольку после завершения функции main() исполняющей системой выполняются действия, завершающие функционирование системы ввода/вывода (закрываются файлы, освобождаются буфера и т.д).


home   contents  previous      next        up