Процессорное время и ОП являются ключевыми ресурсами любой ОС, без них не может выполняться ни один процесс. Прочие ресурсы обладают рядом характеристических свойств.
Ресурсы могут быть монопольно используемыми или разделяемыми. Монопольными являются ВУ и некоторые системные структуры данных.
Ресурсы могут быть повторно используемыми или потребляемыми. Примеры первых – тот же ЦП или память; примеры вторых - входные данные и сообщения.
Ресурсы обладают также свойствами дискретности и ограниченности. Первое означает, что ресурсы распределяются некоторыми неделимыми единицами. Второе - то, что число единиц ресурса всегда небесконечно (процессорное время – непрерывно и бесконечно, память всегда конечна, а непрерывность или дискретность ее зависит от принятой модели памяти)
Процесс ни в коем случае не может самостоятельно завладеть ресурсом - а только через посредство ОС. Для предоставления процессам такой возможности в составе API ОС должны быть системные вызовы получения/освобождения ресурса. При запросе на получение ресурса ОС возвращает процессу манипулятор выделенного ресурса или – если выделение ресурса невозможно – блокирует процесс до освобождения требуемого ресурса.
Для каждого класса ресурсов ОС должна поддерживать дескриптор класса, в который должны входить: идентификатор класса; общее число единиц в классе; число свободных единиц; таблица единиц ресурса; список процессов, ожидающих ресурс этого класса; точка входа в менеджер класса; и т.д. Для каждой единицы ресурса имеется запись в таблице единиц, содержащая, как минимум, индикатор занятости ресурса и идентификатор процесса, которому ресурс распределен (если он не свободен).
Информация о ресурсах, выделенных процессу, также хранится в блоке контекста процесса.
Монопольные ресурсы и тупики
При наличии в системе монопольно используемых ресурсов возможно возникновение тупиков – ситуаций, когда два или более процесса требуют одних и тех же ресурсов и не друг другу дают возможности выполняться. Такие системы должны решать задачи:
· предупреждения тупиков - какую стратегию распределения ресурсов выбрать, чтобы тупики не возникали вообще?
· обнаружения тупиков - если не удалось применить стратегию, предупреждающую тупики, то как обнаружить возникший тупик?
· развязки тупиков - если тупик обнаружен, то как от него избавиться?
Решение этих задач достаточно сложно и всегда сопряжено с потерями: если система применяет либеральную политику выделения ресурсов (т.е. выделяет ресурс практически по любому требованию), то тупики становятся возможными и тогда их надо обнаруживать и развязывать; если же применяется консервативная политика (отказ, если выделение ресурса может грозить возникновением тупика), то снижается эффективность использования ресурсов.
Радикальное решение, к которому стремятся современные ОС, – замена реальных монопольных ресурсов виртуальными разделяемыми. Так, например, два процесса одновременно выполняют вывод данных на принтер. Принтер является монопольным ресурсом. Но на самом деле выводимые данные процесса попадают не непосредственно на принтер, а в так называемую область спулинга на диске (разделяемый ресурс) – для каждого процесса своя область. Затем ОС сама организует последовательный вывод данных, накопленных в областях спулинга на реальный принтер.