Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Comment.docx
Скачиваний:
0
Добавлен:
20.06.2023
Размер:
86.25 Кб
Скачать

Мьютексы.

Это средство ОС обеспечивающее режим взаимного исключения. Средство принадлежит системной библиотеке PTHREAD.

Средство имеет две операции

pthread_mutex_lock() – вход в критический участок

pthread_mutex_unlock() – выход из критического участка.

Схема потока выглядит следующим образом

pthread_mutex_lock() // вход в критический участок

работа в критическом участке (для примера – выполнение всех трех операций)

pthread_mutex_unlock() // выход из критического участка.

Средство работает так:

если один поток прошел через свою операцию pthread_mutex_lock() и вошел в критический участок, то второй поток, вызывая функцию pthread_mutex_lock(), будет приостановлен до тех пор пока первый поток не выйдет из критического участка и не вызовет операцию pthread_mutex_unlock().

Семафоры

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

Семафоры – это не средство библиотеки PTHREAD, а средство самой ОС.

Семафор имеет две операции

sem_wait() – вход в критический участок

sem_post() – выход из критического участка.

Схема потока выглядит следующим образом

sem_wait() // вход в критический участок

работа в критическом участке (для примера – выполнение всех трех операций)

sem_post() // выход из критического участка.

Семафор работает так:

если один поток прошел через свою операцию sem_wait() и вошел в критический участок, то второй поток, вызывая функцию sem_wait(), будет приостановлен до тех пор пока первый поток не выйдет из критического участка и не вызовет операцию sem_post().

Комментарии к работе 3

В работе 2 мы рассматривали работу потоков с общим ресурсом. При этом потоки выполняли одни и те же действия с этим общим ресурсом, то есть потоки были равноправны, и было безразлично, какой из потоков первым войдет в критический участок, а какой – вторым.

Есть еще и другой вид взаимодействия, когда потоки неравноправны. Это происходит, когда один поток записывает данные, а другой поток их читает.

Схема такого взаимодействия выглядит примерно так:

поток, записывает данные в ячейку А:

while (1) {

создать данные;

записать данные в А;

}

поток, читающий данные из ячейки А:

while (1) {

прочитать данные из А;

обработать данные;

}

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

Поэтому нет гарантии в последовательной очередности действий «записать данные в А» и «прочитать данные из А».

Представим себе такую ситуацию:

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

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

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

Противоположная ситуация.

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

а читающий поток подошел к операции «прочитать данные из А», когда в А ничего еще не записано. И так тоже может происходить многократно.

То есть читающий поток читает данные из ячейки, в которую ничего не записано.

Как избежать подобных ситуаций.

Необходимо выдержать правильную очередность действий:

  1. не записывать данные в ячейку, если не прочитаны ранее записанные данные.

  2. не читать данные из ячейки, если в нее не записаны данные.

Работа 3 посвящена именно такому средству, которое поддерживает перечисленные выше ограничения.

Это средство называется pipe или неименованный канал.

Отличие этого неименованного канала от рассмотренного примера состоит в том, что в нем не одна ячейка, а массив байтов.

Как правило, один поток пишет данные в pipe, а второй поток читает данные из pipe.

Если pipe пустой (данные не записаны), то поток, читающий данные, блокируется, пока второй поток не запишет данные.

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

Соседние файлы в предмете Операционные системы