5.1.3. Выделение сегментов памяти
5.1.3. Выделение сегментов памяти
Процесс выделяет сегмент памяти с помощью функции shmget(). Первым аргументом функции является целочисленный ключ, идентифицирующий создаваемый сегмент. Если несвязанные процессы хотят получить доступ к одному и тому же сегменту, они должны указать одинаковый ключ. К сожалению, ничто не мешает посторонним процессам выбрать тот же самый ключ сегмента, а это приведет к системному конфликту. Указание специальной константы IPC_PRIVATE в качестве ключа позволяет гарантировать, что будет создан совершенно новый сегмент.
Во втором аргументе функции задается размер сегмента в байтах. Это значение округляется, чтобы быть кратным размеру страницы ВП.
Третий параметр содержит набор битовых флагов. Перечислим наиболее важные из них.
? IPC_CREAT. Указывает на то, что создается новый сегмент, которому присваивается заданный ключ.
? IPC_EXCL. Всегда используется совместно с флагом IPC_CREAT и заставляет функцию shmget() выдать ошибку в случае, когда сегмент с указанным ключом уже существует. Если флаг не указан и возникает описанная ситуация, функция shmget() возвращает идентификатор существующего сегмента, не создавая новый сегмент.
? Флаги режима. В эту группу входят 9 флагов, задающих права доступа к сегменту для владельца, группы и остальных пользователей. Биты выполнения игнорируются. Проще всего задавать права доступа с помощью констант, определенных в файле <sys/stat.h> (они описаны на man-странице функции stat()).[15] Например, флаги S_IRUSR и S_IWUSR предоставляют право чтения и записи владельцу сегмента, а флаги S_IROTH и S_IWOTH предоставляют аналогичные права остальным пользователям.
В следующем фрагменте программы функция shmget() создает новый совместно используемый сегмент памяти (или возвращает идентификатор существующего, если значение shm_key уже зарегистрировано в системе), доступный для чтения/записи только его владельцу:
int segment_id = shmget(shm_key, getpagesize(),
IPC_CREAT | S_IRUSR | S_IWUSR);
В случае успешного завершения функция возвращает идентификатор сегмента. Если сегмент уже существует, проверяются нрава доступа к нему.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
3.2. Выделение памяти
3.2. Выделение памяти Четыре библиотечные функции образуют основу управления динамической памятью С Мы опишем сначала их, затем последуют описания двух системных вызовов, поверх которых построены эти библиотечные функции. Библиотечные функции С, в свою очередь, обычно
14.1. Выделение выровненной памяти: posix_memalign() и memalign()
14.1. Выделение выровненной памяти: posix_memalign() и memalign() Для большинства задач отлично подходят стандартные процедуры выделения памяти — malloc(), realloc() и т.д. Но иногда может понадобиться память, которая выровнена тем или иным способом. Другими словами, адрес первого выделенного
Статическое выделение памяти в стеке
Статическое выделение памяти в стеке В пространстве пользователя многие операции выделения памяти, в частности некоторые рассмотренные ранее примеры, могут быть выполнены с использованием стека, потому что априори известен размер выделяемой области памяти. В
Выделение памяти, связанной с определенным процессором
Выделение памяти, связанной с определенным процессором В современных операционных системах широко используются данные, связанные с определенными процессорами (per-CPU data). Это данные, которые являются уникальными для каждого процессора. Данные, связанные с процессорами,
Выделение дескриптора памяти
Выделение дескриптора памяти Указатель на дескриптор памяти, выделенный для какой-либо задачи, хранится в поле mm дескриптора процесса этой задачи. Следовательно, выражение current->mm позволяет получить дескриптор памяти текущего процесса. Функция copy_mm() используется для
Выделение памяти
Выделение памяти При обсуждении формата исполняемых файлов и образа программы в памяти мы отметили, что сегменты данных и стека могут изменять свои размеры. Если для стека операцию выделения памяти операционная система производит автоматически, то приложение имеет
18.6.5 Выделение оперативной памяти для VMware
18.6.5 Выделение оперативной памяти для VMware Система VMware позволяет пользователям задавать как объем оперативной памяти, выделяемой каждому виртуальному компьютеру, так и общее количество ОП, зарезервированное для использования виртуальными машинами. Правильная настройка
Объединение сегментов
Объединение сегментов Команда JOIN осуществляет объединение отдельных сегментов объектов для формирования одного целого объекта. Команда вызывается из падающего меню Modify ? Join или щелчком на пиктограмме Join на панели инструментов Modify.Запросы команды JOIN: Select source object: –
Редактирование на уровне сегментов
Редактирование на уровне сегментов Редактирование сплайнов на уровне сегментов позволяет выполнить следующие операции:• Detach (Отделить) – отделяет сегменты, преобразуя их в самостоятельные формы;• Delete (Удалить) – удаляет сегменты;• Divide (Разделить) – добавляет
Выделение памяти
Выделение памяти Сначала следует определить место для размещения строки при вводе. Как было отмечено раньше, это значит, выделить память, достаточную для размещения любых строк, которые мы предполагаем читать. Не следует надеяться, что компьютер подсчитает длину
5.1.4. Подключение и отключение сегментов
5.1.4. Подключение и отключение сегментов Чтобы сделать сегмент памяти общедоступным, процесс должен подключить его с помощью функции shmat(). В первом ее аргументе передается идентификатор сегмента, возвращенный функцией shmget(). Второй аргумент — это указатель, определяющий,
Объединение сегментов
Объединение сегментов Команда JOIN осуществляет объединение отдельных сегментов объектов для формирования одного целого объекта. Команда вызывается из падающего меню Modify ? Join или щелчком на пиктограмме Join на панели инструментов Modify.Запросы команды JOIN:Select source object: –
2.2. Динамическое выделение памяти и указатели
2.2. Динамическое выделение памяти и указатели Прежде чем углубиться в объектно-ориентированную разработку, нам придется сделать небольшое отступление о работе с памятью в программе на С++. Мы не сможем написать сколько-нибудь сложную программу, не умея выделять память
Объединение сегментов
Объединение сегментов Команда JOIN осуществляет объединение отдельных сегментов объектов для формирования одного целого объекта. Команда вызывается из падающего меню Modify ? Join или щелчком на пиктограмме Join на панели инструментов Modify.Запросы команды
Ошибка 0x000000C2: неправильное выделение памяти
Ошибка 0x000000C2: неправильное выделение памяти Некорректное выделение памяти. Причина – некорректно работающий