ВУЗ:
3. Каким образом в системе с разделением времени процесс с высоким приоритетом может выполняться быстрее дру-
гих?
4. В системе с разделением времени каждый квант времени равен 50 миллисекундам, а на каждое переключение между
процессами затрачивается 5 миллисекунд. Сколько процессов может обслужить машина за одну секунду?
5. Если каждый процесс в машине с характеристиками, указанными в предыдущем вопросе, использует свой квант
времени полностью, какая часть машинного времени используется для реального выполнения процессов? Какой будет эта
часть в случае, если каждый процесс выполняет запрос на ввод/вывод по истечении 5 миллисекунд от начала каждого выде-
ленного ему кванта времени?
6. Определите, какие взаимосвязи в обществе отвечают модели "клиент/сервер"?
3.4. ОРГАНИЗАЦИЯ КОНКУРЕНЦИИ МЕЖДУ ПРОЦЕССАМИ*
Общей задачей всех компонентов ядра операционной системы является распределение машинных ресурсов между про-
цессами в системе. Здесь понятие ресурсы используется в широком смысле и включает как периферийные устройства, так и
ресурсы самой машины. Программа управления файлами отвечает как за организацию доступа к уже существующим фай-
лам, так и за распределение места на диске при создании новых файлов. Программа управления памятью распределяет сво-
бодные области памяти. Планировщик распределяет место в таблице процессов, а диспетчер – кванты времени. На первый
взгляд задача распределения может показаться несложной. Однако если присмотреться, можно обнаружить несколько про-
блем, способных привести к сбоям в недостаточно тщательно разработанной системе. Не забывайте, что сама по себе маши-
на не думает, а лишь следует имеющимся инструкциям. Поэтому для создания надежной операционной системы следует
разработать алгоритмы, учитывающие все существующие аспекты выполняемой работы, какими бы незначительными они
не казались.
Семафоры. Представим себе операционную систему с разделением времени, управляющую работой машины с одним
принтером. Если процессу требуется напечатать полученные результаты, он должен запросить у операционной системы дос-
туп к драйверу принтера. Получив запрос, операционная система должна решить, следует ли его удовлетворять, исходя из
того, используется ли принтер в данный момент другим процессом. Если принтер свободен, операционная система может
удовлетворить запрос и разрешить процессу продолжить свою работу; в противном случае она должна ответить на запрос
отказом и, возможно, перевести процессе в состояние ожидания, которое будет продолжаться до тех пор, пока принтер вновь
не будет доступен. Если доступ к принтеру будет предоставлен двум процессам одновременно, полученные результаты будут
неудовлетворительны для каждого из них.
Чтобы управлять доступом к принтеру, операционная система должна следить, занят ли принтер в данный момент или
нет. Одним из возможных решений может быть использование флажка, который в данном контексте будет представлять со-
бой бит памяти, состояние которого будет означать занят или свободен, а не просто 1 или 0. Если значение флажка "свобо-
ден", то это означает, что принтер доступен, а если "занят", это указывает на то, что принтер уже предоставлен некоторому
процессу. На первый взгляд использование такого подхода не должно вызывать каких-либо непредвиденных проблем. Опе-
рационная система просто проверяет состояние флажка при каждом поступлении запроса на предоставление доступа к прин-
теру. Если флажок находится в состоянии "свободен", то запрос удовлетворяется и операционная система изменяет значение
флажка на "занят". Если текущее значение флажка "занят", то операционная система переводит процесс, направивший за-
прос, в состояние ожидания. Каждый раз, когда очередной процесс заканчивает работу с принтером, операционная система
или предоставляет принтер ожидающему процессу, или, если ожидающих процессов нет, просто изменяет значение флажка
на "свободен".
Хотя это решение выглядит вполне удовлетворительным, оно заключает в себе проблему. Задача проверки и, возможно,
установки состояния флажка решается операционной системой за несколько машинных шагов. Следовательно, вполне воз-
можно, что выполнение этой задачи будет прервано после того, как будет установлено, что флажок в состоянии "свободен",
но еще до того, как его состояние будет изменено на "занят". В результате возможно возникновение следующей последова-
тельности событий.
Предположим, что в данный момент времени принтер доступен и некоторый процесс запрашивает его использование.
Система проверяет соответствующий флажок и обнаруживает, что он находится в состоянии "свободен", т.е. принтер досту-
пен. Однако в этот момент выполнение процесса прерывается, и другой процесс начинает использовать выделенный ему
квант времени. Он также запрашивает обращение к принтеру. Состояние флажка еще раз проверяется и обнаруживается, что
он по-прежнему имеет значение "свободен", так как выполнение предыдущего процесса было прервано прежде, чем опера-
ционная система успела изменить значение флажка. В результате операционная система разрешает использовать принтер и
второму процессу. Через некоторое время первый процесс возобновляет свою работу с того места, где он был приостанов-
лен, т.е. непосредственно после того, как операционная система обнаружила, что флажок имеет значение "свободен". В ре-
зультате операционная система разрешит первому процессу продолжить работу и предоставит ему доступ к принтеру. В ито-
ге два процесса одновременно будут использовать один и тот же принтер.
Проблема состоит в том, что задача проверки и, возможно, установки значения флажка должна выполняться без преры-
ваний. Одним из решений может быть использование команд запрета прерываний и команд разрешения прерываний, имею-
щихся в большинстве машинных языков. Если операционная система начнет процедуру проверки состояния флажка с ко-
манды, запрещающей выдачу прерываний в системе, и закончит ее командой, вновь разрешающей прерывания, то как только
эта процедура будет начата, выполнение ее уже никогда не сможет быть прервано каким-либо другим процессом.
Другой подход к решению этой проблемы состоит в использовании команды test-and-set (проверить и установить),
имеющейся во многих машинных языках. По этой команде центральному процессору предписывается считать значение
флажка, проанализировать полученное значение, а затем при необходимости установить новое значение – и все это в преде-
лах одной машинной команды. Преимущество этого варианта заключается в том, что центральный процессор, прежде чем
проанализировать наличие прерывания, всегда завершает выполнение текущей команды, и выполнение задачи проверки и
установки флажка не может быть прервано, если она реализована в виде одной команды.
Страницы
- « первая
- ‹ предыдущая
- …
- 59
- 60
- 61
- 62
- 63
- …
- следующая ›
- последняя »
