Читайте также:
|
|
У каждого процесса в системе linux есть адресное пространство, разделенное на 3 логических сегмента
1. text segment
Содержит машинные команды, образующие исполняемый код программы. Он создается компилятором и ассемблером при трансляции программы в машинный код (только для чтения).
2. data segment
Содержит переменные, строки, массивы и другие данные программы. Он состоит из 2-х частей: инициализированные данные и неинициализированные данные. Инициализированная часть сегмента данных содержит переменные и константы компилятора, значения которых должны быть заданы при запуске. Все переменные в неинициализированной части должны быть сброшены в 0.
3. stack segment
На большинстве компьютеров он начинается около старших адресов виртуального адресного пространства и растет вниз к 0. Если указатель стека оказывается ниже нижней границы стека, то происходит аппаратное прерывание, при котором операционная система понижает границу сегмента стека на одну страницу. Когда программа запускается, ее стек не пуст, он содержит все переменные окружения, а также командную строку, введенную оболочке для вызова этой программы. Рассмотрим случай, когда два пользователя запускают одну и ту же программу (или один пользователь два раза одну и ту же программу). Здесь возможно 2 подхода:
1. Хранить в оперативной памяти две копии исходного текста программы
2. Оба процесса ссылаются на один и тот же участок памяти, где находится текст программы.
Во втором случае используется так называемый текстовый сегмент совместного использования. Сегменты данных и стека никогда не бывают общими. Процессы в linux могут обращаться к данным файлов при помощи отображения файлов на адресное пространство (memory mapped files). Эта функция позволяет отображать файл на часть адресного пространства процесса, чтобы можно было читать из файла и писать в файл так, как если бы это был массив байтов, хранящийся в памяти. Запись в этот файл одним из процессов мгновенно становится видимой всем остальным. Отображения на адресное пространство памяти временного файла представляет собой механизм реализации общей памяти для нескольких процессов. Сегмент данных может изменяться в отличие от сегмента текста. Linux разрешает сегменту данных расти при выделении памяти и уменьшаться при ее освобождению. С помощью системного вызова bkr процесс может установить размер своего сегмента данных. Этим системным вызовом активно пользуются malloc.
Дата добавления: 2014-12-19; просмотров: 54 | Поможем написать вашу работу | Нарушение авторских прав |