Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 632 из 715

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

struct semaphore {

 int val[NUMPROCS]; /* замок 1 элемент на каждый процессор */

 int lastid; /* идентификатор процессора, получившего семафор последним */

};

int procid; /* уникальный идентификатор процессора */

int lastid; /* идентификатор процессора, получившего семафор последним */

INIT(semaphore)

struct semaphore semaphore;

{

 int i;

 for (i = 0; i ‹ NUMPROCS; i++) semaphore.val[i] = 0;

}

Pprim(semaphore)

struct semaphore semaphore;

{

 int i, first;

loop:

 first = lastid;

 semaphore.val[procid] = 1;

forloop:

 for (i = first; i ‹ NUMPROCS; i++) {

  if (i == procid) {

   semaphore.val[i] = 2;

   for (i = 1; i ‹ NUMPROCS; i++) if (i != procid && semaphore.val[i] == 2) goto loop;

   lastid = procid;

   return; /* успешное завершение, ресурс можно использовать */

  }

  else if (semaphore.val[i]) goto loop;

 }

 first = 1;

 goto forloop;

}

Vprim(semaphore)

struct semaphore semaphore;

{

 lastid = (procid + 1) % NUMPROCS;

 /* на следующий процессор */

 semaphore.val[procid] = 0;

}

Рисунок 12.6.

|< Пред. 630 631 632 633 634 След. >|

Java книги

Контакты: [email protected]