Э. Таненбаум - Архитектура компьютера (1127755), страница 129
Текст из файла (страница 129)
В табл. 6.2 представлены важные свойства системных вызовов цр и бонп. Таблица 6.2. Результаты опер8аций с семафором Команда Семафор = О Семафор > О Семафор = семафор е 1 (если другой процесс пытается теперь выполнить операцию Оовп для этого семафора, он сможет это сделать и продолжить свою работу) Семафор = семафор е1 цр Процесс приостанавливается до тех пор, пока другой Семафор = семафор -! процесс не выполнит операцию цр для этого семафора ооап Как уже отмечалось, проблема гонок может быть решена средствами языка )ача, но мы сейчас обсуждаем операционные системы, следовательно, нам нужно каким-либо образом реализовать механизм семафоров на языке )ача, поскольку стандартного класса для них нет.
Однако мы сможем это сделать, предположив, что два метода, ир и баип, совершающие, соответственно, системные вызовы цр и оп, уже написаны и используя в качестве их параметров обычные целые числа. В листинге 6.2 показано, как можно устранить состояние гонок с помощью семафоров. В класс а добавляются два семафора: семафор ача11аЫе, изначально равный 100 (это размер буфера), и семафор й11еб, изначально равный О.
Производитель начинает работу с оператора Р1, а потребитель — с оператора С1. Вызов 6сип для семафора т111еб сразу же приостанавливает работу потребителя. Когда производитель находит первое число, он вызывает метод доил с переменной ача11аЫе в качестве параметра, присваивая ей значение 99. В операторе Р5 производитель вызывает метод цр с параметром т111еб„присваивая переменной 1111ед значение 1. Это действие освобождает потребителя, который теперь может завершить вызов метода бона.
После этого й11еб принимает значение О, и оба процесса продолжают работу. Давайте еще раз вернемся к состоянию гонок. Пусть в определенный момент 1п = 22, а оц1 = 21, производитель выполняет оператор Р1, а потребитель — оператор С5. Потребитель завершает действие и переходит к оператору С1, в котором вызывается метод боип для семафора й11ет1, до вызова имевшего значение 1, а после вызова получившего значение О. Затем потребитель извлекает последнее число из буфера и вызывает метод цр для семафора ача11аЫе, после чего ача11аЫе принимает значение 100. Потребитель печатает это число и переходит к оператору С1.
Как раз перед тем, как потребитель собирается вызвать метод Осип, производитель формирует следующее число и быстро выполняет операторы Р2, РЗ и Р4. В этот момент т111еб = О. Производитель собирается вызывать для этого семафора метод ир, а потребитель — метод бона. Если потребитель сделает вызов первым, он будет приостановлен до тех пор, пока производитель его не освободит (вызвав метод цр).
Если же первым вызов сделает производитель, то сема- 516 Глава 6. Уровень операционной системы Листинг 6.2. Параллельная работа с использованием семафоров рцб!тс с1азз а [ П па1 рцЫ тс атас!с т пС ВОР 5[7Е - 100; П буфер от 0 до 99 [М па1 рцЫ тс зтаС1с 1оп9 МАХ Рй!МЕ-100000000000Ы П остановиться здесь рцЫсс зтамс тпС тп - О. осК" 0: П указатели на данные рцЫ сс зтаС!с 1опО Ьцттег[ ] = пеш 1оп9[ВОР 5!7Е]: // здесь хранятся числа рцЫтс зтдттс ргобцсег р: // имя производителя рцЫ !с зта(1с сопьцаег с: П имя потребителя рцЫ!с зтаС1с тпС П11еб = О.
ача11аЫе = 100; // семафоры рцЫ тс зтаС1с чотб аатп(5Сг1п9 агрз[ ]) [ р = пен рга)цсег(); с = пеш сопзцаег(): р.зсагС(): с.зсагц ): ) // Это прикладная функция для циклического увеличения тп и оцС рцЫ 1с зтаСтс 1пС пехС(тпС Х) (1Г (Х < ВОР 5[7Е - 1) гетцгп(Х+1); е1зе гетцгп(0);) П основной клласс П создание производителя П создание потребителя // запуск производителя П запуск потребителя с1аьв ргобцсег ехсепбз Тпгеаб ( паС!че чосс1 цр(!пС з); паттче чо1с) бонны пт.
з); рцЫ тс чосб гцп() ( 1оп9 рмае - 2: // класс производителя П методы для сенафоров П код производителя П вреиенная переиенная шл!1е (рг1ае < а.МАХ Рй[МЕ) ( рмае = пехС рг1ае(рг!ае); бошпОв.ача11аЫе): а.бц[тег[а.тп] = ргтае: а !и - а.пехС(а.сп); цр(а.т11)ес!): ) ) П Еуннция. которая вьаисляет следующее число рпч часе 1оп9 пехС рг1ае(1опО рг1ае)( ...) ) П оператор Р) П оператор Р2 П оператор РЗ П оператор Р4 // оператор Р5 П класс потребителя // иетоды для семафоров // код потребителя П временная переменная с1аьв сопьцаег ехсепбз Тпгеаб [ паС1че чо1б цр(1пС з); паС1че чо!б бвсп(!пС з): рцЫ1с чотс) гцп() [ 1оп9 евп'гр - 2; шы1е (евпгр < а.МАХ Рй!МЕ) [ бошп(а.(111еб): еа1гр = а.бцттег[а.оцС]: а.оцС - а.пехС(а.оцС); цр(а, ачат1аЫе): 5узсеа.оцс.рг1пС1п(еяп'гр): ) ) П оператор С) П оператор С2 П оператор СЗ // оператор С4 П оператор С5 Операции с семафорами неделимы.
Если операция с семафором уже началасгн то никакой другой процесс не может использовать этот семафор до тех пор, фор получит значение 1, и потребитель вообще не будет приостановлен. В обоих случаях сигнал запуска не пропадет. Именно для этого мы и ввели в программу семафоры. Примеры операционных систем 517 пока первый процесс не завершит операцию или пока он не будет приостановлен. Более того, при наличии семафоров сигналы запуска не пропадают. А вот операторы 1~ в листинге 6.1 делимы.
Между проверкой условия и выполнением нужного действия другой процесс может послать сигнал запуска. В сущности, проблема синхронизации была решена путем введения неделимых системных вызовов цр и Фвп. Чтобы эти операции были неделимыми, операционная система должна запретить двум и более процессам использовать один и тот же семафор одновременно. То есть если делается системный вызов цр или оп, никакой пользовательский код не может быть запущен, пока вызов не завершится. Как правило, в однопроцессорных системах для этого во время выполнения операций с семафорами вводится запрет на прерывания. В мультипроцессорных системах этот прием не проходит.
Технология семафоров работает для произвольного количества процессов. Несколько процессов могут приостановиться, пытаясь выполнить системный вызов 4оип для одного и того же семафора. Когда какой-нибудь другой процесс выполнит системный вызов цр для этого же семафора, один из приостановленных процессов может завершить вызов Осип и продолжить работу. В этом случае семафор сохранит значение О, и другие процессы останутся приостановленными. Поясним ситуацию на другом примере. Представьте себе 20 волейбольных команд, играющих 10 партий (процессов). Каждая игра проходит на отдельном поле. Имеется большая корзина (семафор) для волейбольных мячей. К сожалению, мячей только 7. В каждый момент в корзине находится от 0 до 7 мячей (семафор принимает значение от 0 до 7). Помещение мяча в корзину — зто операция ир, поскольку она увеличивает значение семафора. Извлечение мяча из корзины — это операция доип, поскольку она уменьшает значение семафора.
В самом начале один игрок от каждого поля посылается к корзине за мячом. Семерым из них удается получить мяч (завершить операцию дсип); оставшиеся трое вынуждены ждать. Их игры временно приостановлены. В конце концов, одна из партий заканчивается, и мяч возвращается в корзину (выполняется операция ир).
Эта операция позволяет одному из трех оставшихся игроков получить мяч (закончить незавершенную операцию боип) и продолжить игру. Оставшиеся две партии остаются приостановленными до тех пор, пока еще два мяча не возвратятся в корзину. Когда зти два мяча попадут в корзину (то есть выполнятся еще две операции цр), можно будет продолжить последние две партии. Примеры операционных систем В этом разделе мы продолжим обсуждать процессоры Репгппп 4 и П)ггаЯРАКС П1 и рассмотрим операционные системы, которые используются в этих процессорах. Для Репгшш 4 мы возьмем тт'1пг)отчз ХР; для ШггаБРАКС П1 — ПХ1Х. А начнем мы наш разговор с (ЗМХ, поскольку эта система гораздо проще Ъ'1пдоч з ХР.
Кроме того, операционная система ()141Х была разработана раньше и значительно повлияла на %'1пооиз ХР, поэтому такой порядок изложения вполне логичен. 818 Глава б. Уровень операционной системы Знакомство с операционными системами Ой!Х и %!пбоме ХР В этом подразделе мы дадим краткий обзор двух операционных систем (111ч1Х и Ъ'1ш!отгз ХР). При этом мы обратим особое внимание на историю, структуру и системные вызовы. вм!х Операционная система 1Л~ПХ была разработана в компании Ве1! 1.аЪз в начале 70-х годов. Первая версия была написана Кеном Томпсоном (Кеп ТЬошрзоп) на ассемблере для мини-компьютера Р1)Р-7. Затем появилась вторая версия для компьютера Р1)Р-11, уже на языке С.
Ее автором был Деннис Ритчи (Репп1з В!гсЬ!е). В 1974 году Ритчи и Томпсон опубликовали очень важную работу о системе ()Ь11Х !1731 За эту работу они были награждены престижной премией Тьюринга Ассоциации вычислительной техники. После публикации многие университеты попросили у Ве!! 1.аЬз копию (Лч1Х. Поскольку материнская компания Ве11 1лЬз, АТе" Т, была в тот момент регулируемой монополией и ей не разрешалось участвовать в компьютерном бизнесе, университеты смогли приобрести операционную систему 1.1Х1Х за небольшую плату. Машины Р1)Р-11 использовались практически во всех компьютерных научных отделах университетов, но операционные системы, которые пришли туда вместе с РПР-11, не нравились ни профессорам, ни студентам.