Язык Форт и его реализации


         

Многозадачный режим - часть 6


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

: FREE ( A:СЕМАФОР -> A,F:ПРИЗНАК СВОБОДНОСТИ ) @ DUP 0= SWAP U0 = OR ; : GET ( A:СЕМАФОР-> ) BEGIN PAUSE FREE UNTIL U0 SWAP ! ; : RELEASE ( A:СЕМАФОР ->) FREE IF 0 SWAP ! ELSE DROP THEN ;

В приведенных определениях слово U0 возвращает адрес начала пользовательской области текущей задачи. Слово GET проверяет, свободен ли ресурс в каждом цикле передач управления по кольцу задач, и занимает его, как только обнаружит, что ресурс свободен. Слово RELEASE освобождает ресурс, если он был занят данной задачей.

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

VARIABLE ДИСК VARIABLE ЛЕНТА : ШАГ1 ДИСК GET ЛЕНТА GET ... ; : ШАГ2 ЛЕНТА GET ДИСК GET ... ;

Если слова ШАГ1 и ШАГ2 исполняются в разных задачах, то это может привести к их взаимной блокировке. Наилучший способ избежать такой ситуации — не запрашивать более одного ресурса единовременно. Например, в случае работы с диском и лентой, задача может запросить ресурс ДИСК, выполнить слово BLOCK для получения данных, затем переслать эти данные в свою локальную область и, освободив ДИСК, запросить ресурс ЛЕНТА.




Содержание  Назад  Вперед