Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БИЛЕТ- ОТВЕТ.doc
Скачиваний:
7
Добавлен:
24.09.2019
Размер:
417.79 Кб
Скачать

1. Управление процессами и задачами: Генерирование событий, критическая секция.

Критическая секция — часть программы, в которой есть обращение к совместно используемым данным. При нахождении в критической секции двух (или более) процессов, возникает состояние «гонки» («состязания»). Для избежания данной ситуации необходимо выполнение четырех условий:

1.Два процесса не должны одновременно находиться в критических областях.

2.В программе не должно быть предположений о скорости или количестве процессоров.

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

4.Невозможна ситуация, в которой процесс вечно ждет попадания в критическую область.

Критическая секция (англ. critical section) — объект синхронизации потоков, позволяющий предотвратить одновременное выполнение некоторого набора операций (обычно связанных с доступом к данным) несколькими потоками. Критическая секция выполняет те же задачи, что и мьютекс.

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

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

В операционных системах семейства Microsoft Windows разница между мьютексом и критической секцией в том, что мьютекс является объектом ядра и может быть использован несколькими процессами одновременно, критическая секция же принадлежит процессу и служит для синхронизации только его потоков.

Критические секции Windows имеют оптимизацию, заключающуюся в использовании атомарно изменяемой переменной наряду с объектом «событие синхронизации» ядра. Захват критической секции означает атомарное увеличение переменной на 1. Переход к ожиданию на событии ядра осуществляется только в случае, если значение переменной до захвата было уже больше 1, то есть есть реальное «соревнование» двух или более потоков за ресурс.

Таким образом, при отсутствии соревнования захват/освобождение критической секции обходятся без обращений к ядру.

Кроме того, захват уже занятой критической секции до обращения к ядру какое-то небольшое время ждёт в цикле опроса переменной, и, если переменная становится равной 0, то захват происходит без обращений к ядру.

2. Управление вводом-выводом: Буферизация, кэширование, спулинг.

Под буфером обычно понимается некоторая область па­мяти для запоминания данных при обмене данных между двумя устройствами, двумя процессами или процессом и устройством

Существуют три причины буферизации в базовой подсистеме ввода-вывода:

  1. Разные скорости приема и передачи данных, которыми об­ладают участники обмена. Рассмотрим, например, случай передачи потока данных от клавиатуры на модем. Скорость, с которой поставляет данные клавиатура, определяется ско­ростью набора текста человеком и обычно существенно меньше скорости передачи данных модемом. Для того чтобы не занимать модем на все время набора текста, делая его не­доступным для других процессов и устройств, разумно нака­пливать введенные данные в буфере или нескольких буфе­рах достаточного размера и отсылать ее через модем после заполнения буферов.

  2. Разные объемы данных, которые могут быть приняты или по­лучены участниками обмена единовременно. Возьмем другой пример. Пусть данные поставляются модемом и записывается на жесткий диск. Помимо обладания разными скоростями со­вершения операций модем и жесткий диск относятся к раз­ным типам устройств. Модем является символьным устройст­вом и выдает данные байт за байтом, в то время как диск явля­ется блочным устройством и для проведения операции записи для него требуется накопить необходимый блок данных в бу­фере. Здесь также можно применять более одного буфера. По­сле заполнения первого буфера модем начинает заполнять второй одновременно с записью первого на жесткий диск. По­скольку скорость работы жесткого диска в тысячи раз больше, чем скорость работы модема, то к моменту заполнения второ­го буфера операция записи первого будет завершена, и модем снова может заполнять первый буфер одновременно с запи­сью второго на диск.

  3. Третья причина буферизации связана с необходимостью ко­пирования данных из приложений, осуществляющих ввод-вывод, в буфера ядра операционной системы и обратно. До­пустим, что некоторый пользовательский процесс пожелал вывести данные из своего адресного пространства на внешнее устройство. Для этого он должен выполнить системный вызов с обобщенным названием запись, передав в качестве парамет­ров адрес области памяти, где расположены данные, и их объ­ем. Если внешнее устройство временно занято, то возможна ситуация, когда к моменту его освобождения содержимое тре­буемой области окажется испорченным (например, при ис­пользовании асинхронной формы системного вызова). Чтобы избежать возникновения подобных ситуаций, проще всего в начале работы системного вызова откопировать необходимые данные в буфер ядра операционной системы, постоянно на­ходящийся в оперативной памяти, и выводить их на устройст­во из этого буфера.

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

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

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

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

Рассмотрим в качестве внешнего устройства принтер. Хотя принтер не может печатать данные, поступающие одновременно от нескольких процессов, может оказаться желательным разрешить процессам совершать вывод на принтер параллельно. Для этого операционная система вместо передачи данных напрямую на прин­тер накапливает выводимые данные в буферах на диске, организо­ванных в виде отдельного файла (spool) для каждого процесса. По­сле завершения некоторого процесса, соответствующий ему файл ставится в очередь для реальной печати. Механизм, обеспечиваю­щий подобные действия, и получил название спулинг (spooling).