Синхронизация процессов и потоков

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

Если вопросы синхронизации не решены, то это может приводить к неправильному решению задач – возникают – гонки процессов или потоков

Рассмотрим пример. Существует база данных клиентов некоторого банка и СУБД по ведению БД. Каждому клиенту отводится одна запись, в которой есть поля «Заказ» и «Оплата». Программа, которая ведет базу данных, оформлена, как единый процесс, имеющих несколько потоков. Поток «А», вносит информацию о заказах клиентов и поток «В», вносит данные об оплате клиента. Оба эти потока совместно работают с общим файлом базы данных, и выполняют три действия:

1. Считать из файла базы данных в буфер запись о клиенте с заданным идентификатором;

2. Внести новое значение в поле «Заказ» (поток А) или в поле «Оплата» (поток в);

3. Вернуть измененную запись в файл базы данных.


  Поток А     БД
А1 Считать запись в буфер    
А2 Внести изменение в поле «Заказ» Критическая секция  
А3 Сохранить запись в файле    
     
    Поток В    
оплата
заказ
 
В1 Считать запись в буфер Критическая секция  
В2 Внести изменение в поле «Оплата»    
В3 Сохранить запись в файле    

Предположим, что в некоторый момент времени, процесс А выполнил шаг А1 и А2, а шаг А3 не успел выполнить, например закончился квант процессорного времени. Потом активизировался поток В, выполнил шаги В1 и В2, и прервался. В буфере у потока В находится запись о клиенте, в которой поле «Заказ» имеет прежнее, не измененное значение. Когда будет активизирован поток «А», он запишет данные в БД с новым значением в поле «Заказ». Когда будет активизирован поток В, он запишет данные с новым значением поля «Оплата», но старым значением поля «Заказ».

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

Для борьбы с этим явлением выделяются критические данные, то есть данные, при несогласованном изменении которых могут возникнуть нежелательные эффекты и критические области в программе, которые работают с этими данными. В примере – это записи БД.

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

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

Если потоки используют пул ресурсов, то есть набор одинаковых по функциональному назначению внешних устройств (принтер, порт), или информационных структур, то используются – семафоры Дейкстры – переменная, которая принимает несколько значений.

Организация ввода – вывода

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

Устройства ввода – вывода

Понятие устройство ввода – вывода включает в себя само физическое устройство и программное обеспечение, которое поддерживает данное устройство. Устройства ввода – вывода делятся на два класса: блочные устройства и символьные устройства .

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

Символьные(байт – ориентированные)устройства принимают или передают данные в виде потока байт без какой-либо блочной структуры. Пример – принтер, плоттер, сетевой адаптер.

Часть устройств имеет свою собственную внутреннюю память, в которую данные поступают блоками, а обрабатываются посимвольно.

Устройства ввода-вывода обычно состоят из механической и электронной части. Электронный компонент называется контролер устройства или адаптер. Контроллер часто имеет вид печатной платы, которая вставляется в слот расширения. В контроллер поступает поток бит (электрических сигналов), биты объединяются в байты. Поток бит имеет заголовок и контрольную сумму.

заголовок данные Конт. сумма

Работа контроллера заключается в преобразовании потока бит в блок байтов, который обычно собирается в буфере контроллера. Затем подсчитывается контрольная сумма, и проверяется с указанной в заголовке потока, если она совпадает, то блок считается считанным без ошибок, и данные передаются далее. Если обнаружена ошибка, то делается попытка исправления ошибки, либо выдается сообщение об ошибке.

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


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

1. Каждому управляющему регистру назначается номер порта ввода – вывода, соответствие устанавливается при инсталляции устройства;

данные

оперативная управл. регистр

память

команды состояние

порты

ввода-вывода

2. Системному регистру назначается адрес в оперативной памяти, как правило, фиксированный – отображаемый на адресное пространство ввод – вывод

ОП

Память устройства регистр


данные

Также существуют гибридные схемы, с отображаемыми на адресное пространство буферами данных и отдельными портами ввода-вывода. Широко применяются в компьютерах на базе процессора Pentium, в которых портов ввода-вывода, адресное пространство от 640кб до 1 мб зарезервировано под буферы устройств ввода-вывода.

Для управления устройствами ввода-вывода (внешними) устройствами в состав ОС входит подсистема программного обеспечения ввода-вывода.

При создании программного обеспечения ввода-вывода учитывались следующие принципы:

1. Независимость устройств – означает возможность создания программы, в которой можно получить доступ к устройству ввода-вывода без предварительного указания конкретного устройства. Например, программа, которая читает данные из файла, должна работать с файлом на дискете, жестком диске или компакт-диске.

2. Единообразное именование –имя файла или устройства должно быть просто текстовой строкой или целым числом и никоим образом не зависеть от физического устройства.

3. Обработка ошибок – ошибки должны обрабатывать либо контроллер, либо драйвер.

4. Способ передачи данных – синхронный (блокирующий) или асинхронный (управляемый прерыванием). Большинство операций ввода-вывода на физическом уровне являются асинхронными - центральный процессор запускает передачу данных и занимается другой задачей. Тем, чтобы операции ввода-вывода, выполняющиеся как асинхронные, выглядели как блокирующие в программах пользователя, занимается ОС.

5. Буферизация – данные, которые поступают с устройства, часто сохраняются в буфере, а затем направляются программе – получателю. Применяется для согласования скоростей, например при воспроизведении звука, или получения данных по сети.

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

Состав подсистемы программного обеспечения ввода – вывода

Программное обеспечение ввода – вода на уровне пользователя
 
Устройство – независимое программное обеспечение (менеджер ввода – вывода)
 
Драйверы устройств
 
Обработчик прерываний
 
Аппаратура    

Работа подсистемы ПО ввода – вывода

В приложении сформирован запрос на выполнение операции ввода – вывода, происходит обращение к системным вызовам для выполнения операции. Системные вызовы, обычно оформлены как библиотечные процедуры, доступ к которым осуществляется с помощью функций программирования. Библиотечные процедуры работают в пользовательском режиме. Кроме того, в многозадачных ОС применяется система спулинга. Спулинг(spooling - подкачка, предварительное накопление данных) представляет собой способ работы с такими устройствами, как принтер. Для того, чтобы распечатать файл, программа создает специальный файл, предназначенный для печати, который помещается в каталог спулинга. Затем процесс, который отвечает за печать, работает с этим файлом. Если есть несколько программ, которые печатают данные, то будет образована «очередь печати»Таким образом, пользовательский процесс не может занять надолго принтер.

Устройство – независимое программное обеспечение (менеджер ввода – вывода). Определяется тип операции ввода – вывода, определяется устройство, для которого поступил запрос, системные имена данных, проверяет защиту.

Для управления каждым устройством ввода-вывода, подключенным к компьютеру, требуется специальная программа – драйвер устройства. Драйвер устройства обычно пишется производителем устройства и распространяется вместе с устройством. Очевидно, что драйверы для разных устройств будут сильно различаться. Различают драйверы: аппаратные, низкоуровневые и драйверы устройств (высокоуровневые или ПО устройства).

Драйвер обеспечивает:

- взаимодействие с контроллером, то есть передачу и прием данных;

- обработку прерываний от контроллера;

- предоставление пользователю удобного интерфейса, который скрывает низкоуровневые детали обмена данными, как правило, одинаковый для всех устройств;

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

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

приложение запрос драйвер   контроллер   аппаратура

Драйвер выполняет подготовку к выполнению операции ввода – вывода, установку управляющих регистров, проверку готовности устройства, формирует прерывание, определяет тип и номер прерывания.

Обработчик прерываний - обрабатывает прерывание по номеру (вектору) или опрашивает устройства.

Аппаратура - выполняет операцию ввода - вывода

Функции ОС по управлению устройствами ввода - вывода:

1. Проверять готовность устройства – выполняется драйвером;

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

3. Согласовывать скорости обмена- используются буферная память в ОП или на жестком диске (спул-файл) и память устройства;

4. Поддерживать драйверы устройств с возможностью включения новых;

5. Динамически загружать и выгружать драйверы.Набор поддерживаемых данной ОС устройств (набор драйверов) всегда шире, чем набор устройств установленных на конкретном компьютере. ОС должна динамически загружать в ОП нужный драйвер и выгружать его, когда устройство не используется.