3 Аналогичная проблема—бесконечное откладывание
В системе, где процессам приходится ждать, пока она принимает решения по распределению ресурсов и планированию, возможно возникновение ситуации, при которой предоставление процессора некоторому процессу будет откладываться на неопределенно долгий срок, в то время как система будет уделять внимание другим процессам. Такая ситуация, называемая бесконечным откладыванием, часто может приводить к столь же неприятным последствиям, как и тупик.
Бесконечное откладывание процесса может происходить из-за «дискриминационной» политики планировщика ресурсов системы. Когда ресурсы распределяются по приоритетному принципу, может случиться, что данный процесс будет бесконечно долго ожидать выделения нужного ему ресурса, поскольку будут постоянно приходить процессы с более высокими приоритетами. Ожидание — непременный факт нашей жизни и безусловно важный аспект внутренней работы вычислительных машин. При разработке операционных систем необходимо предусматривать справедливое, а также эффективное управление процессами, находящимися в состоянии ожидания. В некоторых системах бесконечное откладывание предотвращается благодаря тому, что приоритет процесса увеличивается по мере того, как он ожидает выделения нужного ему ресурса. Это называется старением процесса. В конце концов, ожидающий процесс получит более высокое значение приоритета, чем у всех приходящих процессов, и будет обслужен.
4 Концепции ресурсов
Операционная система выполняет по преимуществу функции администратора ресурсов. Она отвечает за распределение обширных наборов ресурсов различных типов. Отчасти именно благодаря такому разнообразию типов ресурсов разработка операционных систем является столь интересной темой. Рассмотрим ресурсы, которые являются «оперативно перераспределяемыми», такие, как центральный процессор и основная память; программа, занимающая в данный момент некоторую область основной памяти, может быть вытеснена или передана другой программе. Программа пользователя, которая выдала запрос на ввод-вывод, практически не может работать с основной памятью в течение длительного периода ожидания завершения данной операции ввода-вывода. В вычислительной машине самым динамичным ресурсом является, по-видимому, центральный процессор. Центральный процессор должен работать в режиме быстрого переключения (мультиплексирования), обслуживая большое число конкурирующих процессов, чтобы все эти процессы могли продвигаться с приемлемой скоростью. Если конкретный процесс достигает точки, когда он не может эффективно использовать центральный процессор (как это бывает в течение длительного периода ожидания завершения операций ввода-вывода), право управления центральным процессором отбирается у этого процесса и предоставляется другому процессу. Таким образом, организация динамического переключения ресурсов является исключительно важным фактором для обеспечения эффективной работы мультипрограммных вычислительных систем.
Определенные виды ресурсов являются оперативно неперераспределяемыми в том смысле, что их нельзя произвольно отбирать у процессов, за которыми они закреплены. Например, лентопротяжные устройства, как правило, выделяются конкретным процессам на периоды от нескольких минут до нескольких часов. Лентопротяжный механизм, закрепленный за одним процессом, нельзя просто отобрать у этого процесса и передать другому.
Некоторые виды ресурсов допускают разделение между несколькими процессами, а некоторые предусматривают лишь монопольное использование индивидуальными процессами. Накопители на магнитных дисках иногда закрепляются за индивидуальными процессами, однако чаще содержат файлы, принадлежащие многим процессам. Основная память и центральный процессор коллективно используются многими процессами.
Данные и программы — это также ресурсы, которые требуют соответствующей организации управления и распределения. Так, в мультипрограммных системах многим пользователям может одновременно понадобиться прибегнуть к услугам программы-редактора. Однако иметь собственную копию редактора в основной памяти для каждого пользователя было бы неэкономично. Поэтому в память записывается одна копия кода подобной программы и несколько копий соответствующих данных, по одной для каждого пользователя. Поскольку с таким кодом могут одновременно работать многие пользователи, он не должен изменяться. Код программы, который не может изменяться во время выполнения, называется реентерабельным, или многократно входимым. Код, который может изменяться, но предусматривает повторную инициализацию при каждом выполнении, называется кодом последовательного (многократного) использования. С реентерабельным кодом могут коллективно работать несколько процессов одновременно, а с кодом последовательного использования — только один процесс в каждый конкретный момент времени.
Когда речь идет о конкретных разделяемых ресурсах, мы должны четко представлять себе, могут ли они реально использоваться несколькими процессами одновременно или несколькими процессами, но только одним из них в каждый момент времени. Именно с ресурсами второго вида чаще всего оказывается связанным возникновение тупиков.
