Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [ 18 ] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

Глава 2

Процессы и нити

Теперь мы детально рассмотрим устройство и работу операционных систем, в частности MINIX. Основным понятием, связанным с операционными системами, является процесс - абстрактное понятие, описывающее работу программы. Все остальное базируется на нем, поэтому представляется крайне важным, чтобы разработчики операционных систем (а также студенты) получили полное представление о концепции процесса как можно раньше.

2.1. Процессы

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

2.1.1. Модель процесса

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



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

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

Один счетчик команд

Переключение между процессами

Четыре счетчика команд


Время

Рис. 2.1. Схема работы с четырьмя программами: а - четыре программы в многозадачном режиме; б - принципиальная модель четырех независимых логически упорядоченных процессов; в - в каждый момент времени активна только одна программа

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

Различие между процессом и программой трудноуловимо, но тем не менее имеет принципиальное значение. Воспользуемся следующей аналогией: пред-



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

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

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

Иерархия процессов

Операционной системе нужен способ, позволяющий удостовериться в наличии всех обслуживаемых процессов. В простейших системах, а также системах, разработанных для выполнения одного-единственного приложения (например контроллер микроволновой печи), нетрудно реализовать такую ситуацию, в которой все процессы, которые когда-либо могут понадобиться, уже присутствуют в системе при ее загрузке. В универсальных системах требуется способ создания и прерывания процессов по мере необходимости. В MINIX процессы создаются при помощи системного вызова fork, создающего точную копию вызвавшего процесса. Дочерние процессы также могут вызывать fork, таким образом, образуется целое дерево процессов. В других операционных системах также существуют системные вызовы для создания процесса, загрузки его в память и запуска. Какова бы ни была природа системного вызова, процессам нужен способ запуска других процессов. Обратите внимание на то, что у каждого процесса есть всего один родительский, но может быть сколько угодно дочерних процессов (в том числе они могут вообще отсутствовать).

Как простой пример использования дерева процессов, мы рассмотрим инициализацию MINIX после ее загрузки. В загрузочном образе имеется специальный процесс под именем init. Когда этот процесс запускается, он сначала узнает из файла конфигурации, сколько имеется терминалов. Затем на каждый терминал при помощи fork создается новый процесс. Каждый из этих процессов ожидает начала сеанса работы пользователя, и, если пользователь успешно вошел



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [ 18 ] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.