Главная страница Межпроцессное взаимодействие (состязание) ется в память. Так как теперь процесс А расположен в другом месте, его адреса должны быть перенастроены или программно во время загрузки в память, или (более заманчивый вариант) аппаратно во время выполнения программы. Время Операционная система Операционная система Время Рис. 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 часть памяти. Если отдать предпочтение большим блокам, битовый массив становится меньше, но при
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |