Архитектура Unix



         

. Операции установки и снятия блокировки (продолжение)



Рисунок 11.14. Операции установки и снятия блокировки (продолжение)



else if (argv[1][0] == 'a') { first = 0; second = 1; } else { first = 1; second = 0; } semid = semget(SEMKEY,2,0777); psembuf.sem_op = -1; psembuf.sem_flg = SEM_UNDO; vsembuf.sem_op = 1; vsembuf.sem_flg = SEM_UNDO; for (count = 0; ; count++) { psembuf.sem_num = first; semop(semid,&psembuf,1); psembuf.sem_num = second; semop(semid,&psembuf,1); printf("процесс %d счетчик %d\n",getpid(),count); vsembuf.sem_num = second; semop(semid,&vsembuf,1); vsembuf.sem_num = first; semop(semid,&vsembuf,1); } } cleanup() { semctl(semid,2,IPC_RMID,0); exit(); }


Ядро считывает список операций oplist из адресного пространства задачи и проверяет корректность номеров семафоров, а также наличие у процесса необходимых разрешений на чтение и корректировку семафоров (Рисунок 11.15). Если таких разрешений не имеется, системная функция завершается неудачно. Если ядру приходится приостанавливать свою работу при обращении к списку операций, оно возвращает семафорам их прежние значения и находится в состоянии приостанова до наступления ожидаемого события, после чего системная функция запускается вновь. Поскольку ядро хранит коды операций над семафорами в глобальном списке, оно вновь считывает этот список из пространства задачи, когда перезапускает системную функцию. Таким образом, операции выполняются комплексно - или все за один сеанс или ни одной.









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