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

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

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

Время


Операционная система

Операционная система


Время


Рис. 4.3. Распределение памяти изменяется по мере того, как процессы поступают в память и покидают ее. Заштрихованы неиспользуемые области памяти

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



того, усложняет операции размещения процессов и освобождения памяти, а также отслеживание происходящих изменений.

Когда в результате подкачки процессов с диска в памяти появляется множество неиспользованных фрагментов, их можно объединить в один большой блок, передвинув все процессы в сторону младших адресов настолько, насколько это возможно. Такая операция называется уплотнением или сжатием памяти. Обычно ее не выполняют по причине экономии времени работы процессора. Например, на машине с 256 Мбайт оперативной памяти, которая может копировать 4 байта за 40 не, уплотнение всей памяти займет около 2,7 с.

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

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

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

Если процесс имеет два наращиваемых сегмента, например сегмент данных, используемый как куча для динамически назначаемых и освобождаемых переменных, и сегмент стека для обычных локальных переменных и адресов возврата, предлагается альтернативная схема распределения памяти, показанная на рис. 4.4, б. Здесь мы видим, что у каждого процесса вверху предоставленной ему области памяти находится стек, который расширяется вниз, и сегмент данных.

Кучей (heap) называется область памяти, выделяемая программе д.пя динамически размснаемых структур данных. - Примеч. перев.



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

Операционная система

Место для роста

Действительно используется

Место для роста

Действительно используется

В-стек

4 .

В-данные

В-профамма

А-стек

... 4 .

А-данные

А-прОфамма

Операционная система

Место для роста

Место для роста

Рис. 4.4. а - предоставление пространства для роста области данных; б - предоставление пространства для роста стека и области данных

4.2.1. Управление памятью с помощью битовых массивов

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

При работе с битовым массивом память разделяется на блоки размером от нескольких слов до нескольких килобайтов. В битовой карте каждому свободному блоку соответствует один нулевой бит, а каждому занятому блоку - бит, установленный в 1 (или наоборот). На рис. 4.5 показана часть памяти и соответствующий ей битовый массив.

Размер единичного - мерного - блока весьма важен на стадии разработки системы. Чем он меньше, тем больше битовый массив. Однако даже при маленьком кванте памяти в четыре байта, то есть для 32 битов памяти, потребуется 1 бит в карте. Тогда область размером в 32и будет соответствовать п битам карты, таким образом, битовая карта займет всего лишь 1 /33 часть памяти. Если отдать предпочтение большим блокам, битовый массив становится меньше, но при



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.
Копирование материалов разрешено исключительно при условии цититирования.