Защищенный режим процессоров Intel

       

Синхронизация задач и семафоры


Прежде чем мы приведём конкретный пример простейшей мультизадачной системы, расскажем немного о применении семафоров как средств синхронизации задач.

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

Программа, владеющая ресурсом или создавшая ресурс может создать семафор для управления этим ресурсом. Физически семафор реализуется в оперативной памяти и представляет из себя ячейку памяти (достаточно одного байта или иногда даже одного бита памяти).

В простейшем случае для семафора определяются операции:

  • создание семафора;
  • уничтожение семафора;
  • сброс семафора;
  • сброс семафора;
  • ожидание, пока семафор не будет установлен.

Эти операции выполняются операционной системой по запросам прикладных программ. В примере мультизадачной программы, приведённой ниже в этой главе, мы должны сами реализовать все семафорные операции.

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

Операции сброса и установки семафора заключаются в записи, соответственно, нуля и единицы в ячейки памяти, распределённые семафорам. Единственная особенность выполнения этих операций заключается в том, что они должны быть непрерываемыми, то есть на время выполнения этих операций необходимо запретить переключение задач. Так как в нашем случае задачи переключаются по прерываниям таймера, мы на время выполнения операций сброса и установки семафора запрещаем все прерывания при помощи команды CLI.

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



Содержание раздела