Индустрия программирования

Разделяемая память


shmget
создает новый сегмент разделяемой памяти или находит существующий
сегмент с тем же ключом
shmat
подключает сегмент с указанным дескриптором к виртуальной памяти
обращающегося процесса
shmdt
отключает от виртуальной памяти ранее подключенный к ней сегмент
с указанным виртуальным адресом начала
shmctl
служит для управления параметрами, связанными с существующим сегментом
После подключения сегмента разделяемой памяти к виртуальной
памяти процесса, он может обращаться к соответствующим элементам


памяти с использованием обычных машинных команд чтения и записи
shmid = shmget(key, size,
flag);

  • size
    определяет желаемый размер сегмента в байтах
  • если в таблице разделяемой памяти находится элемент, содержащий
    заданный ключ, и права доступа не противоречат текущим характеристикам
    процесса, то значением системного вызова является дескриптор существующего
    сегмента
  • реальный размер сегмента можно узнать с помощью системного
    вызова shmctl
  • иначе создается новый сегмент с размером не меньше установленного
    в системе минимального размера сегмента разделяемой памяти и не
    больше установленного максимального размера
  • создание сегмента не означает немедленного выделения под него
    основной памяти
  • откладывается до выполнения первого системного вызова подключения
    сегмента к виртуальной памяти некоторого процесса
  • при выполнении последнего системного вызова отключения сегмента
    от виртуальной памяти соответствующая основная память освобождается

virtaddr = shmat(id, addr,
flags);

  • id
    - это ранее полученный дескриптор сегмента
  • addr - желаемый
    процессом виртуальный адрес, который должен соответствовать началу
    сегмента в виртуальной памяти
  • virtaddr - реальный
    виртуальный адрес начала сегмента
  • не обязательно совпадает со значением прямого параметра addr
  • если addr ==
    0, ядро выбирает наиболее удобный виртуальный адрес начала сегмента

shmdt(addr);

  • addr
    - виртуальный адрес начала сегмента в виртуальной памяти, ранее
    полученный от системного вызова shmat

shmctl(id, cmd, shsstatbuf);

  • cmd
    идентифицирует требуемое конкретное действие
  • важна функция уничтожения сегмента разделяемой памяти




Содержание раздела