Найти в Дзене
Old Programmer

Многозадачность в Linux. Язык C. Статья 12. Разделяемая память (shared memory)

Это мой канал Old Programmer программировании и программистах. Тематическое оглавление канала здесь. А тут собраны все ссылки по C/C++. Здесь перечень ссылок на ресурсы, посвященные многозадачности в Linux. Что такое разделяемая память Продолжаем рассматривать вопросы, cвязанные с многозадачностью, процессами и их взаимодействием. Сегодня вопрос о разделяемой памяти (shared memory). Как и ранее, мы программируем на C и в операционной системе Linux. Если кратко, то суть этой технологии такова: Для того, чтобы удобно было разбираться с технологией, я разбил всю задачу на четыре подзадачи и написал, соответственно 4 программы (mem4000.c, mem4010.c, mem4020.c, mem4030.c). Будем разбираться. Программа mem4000.c Программа создает объект, устанавливает его размер (размер памяти), закрывает объект и заканчивает работу. Объект при этом не уничтожается! Его можно удалить (см. ниже) или он будет удален после перезагрузки системы. При создании объекта мы используем функцию shm_open: Функция
Оглавление

Это мой канал Old Programmer программировании и программистах. Тематическое оглавление канала здесь. А тут собраны все ссылки по C/C++. Здесь перечень ссылок на ресурсы, посвященные многозадачности в Linux.

Что такое разделяемая память

Продолжаем рассматривать вопросы, cвязанные с многозадачностью, процессами и их взаимодействием. Сегодня вопрос о разделяемой памяти (shared memory). Как и ранее, мы программируем на C и в операционной системе Linux.

Если кратко, то суть этой технологии такова:

  • Разделяемая память это объект ядра.
  • Объект может быть создан и удален.
  • Объект создается с некоторым именем, которое может быть использовано другими процессами для доступа к нему.
  • Объект можно открыть записать туда и прочесть оттуда. При этом обращение осуществляется по адресу этой области данных.

Для того, чтобы удобно было разбираться с технологией, я разбил всю задачу на четыре подзадачи и написал, соответственно 4 программы (mem4000.c, mem4010.c, mem4020.c, mem4030.c).

Будем разбираться.

Программа mem4000.c

Программа создает объект, устанавливает его размер (размер памяти), закрывает объект и заканчивает работу. Объект при этом не уничтожается! Его можно удалить (см. ниже) или он будет удален после перезагрузки системы.

При создании объекта мы используем функцию shm_open:

  • 1 - й параметр - имя объекта.
  • 2 - й параметр - битовая маска. Она подобрана так, что если объекта нет то он создается для чтения и записи. Если объект есть, то возвращается -1.
  • 3 - й параметр - режим открытия. Он определяет, кто будет иметь право доступа к объекту. Значение это 0777 в числовом выражении и предполагает доступ для всех.

Функция возвращает дескриптор созданного объекта.

Далее используется функция ftruncate, которая устанавливает размер памяти. Первым параметром идет дескриптор объекта, второй параметр - устанавливаемый размер памяти.

Трансляция программы

gcc mem4000.c -o mem4000 -lrt

Программа mem4010.c очень короткая. По имени объекта разделяемая память функция shm_unlink удаляет этот объект.

Трансляция программы

gcc mem4010.c -o mem4010 -lrt

В программе mem4020.c объект открывается, получается адрес памяти и пишется туда строка. Обращаю внимание, что у функции shm_open изменилось значение второго параметра. Это и понятно, предполагается, что объект уже создан и его нужно просто открыть, чтобы его использовать.

Функция mmap позволяет получить адрес этой памяти. Она имеет следующие параметры:

  • 1-й параметр - обычно всегда 0, что означает, что система сама выбирает адрес памяти
  • 2-й параметр - длина области памяти, желаемый режим защиты памяти.
  • 3-й параметр. Описывает желаемый режим защиты памяти. Мы предполагаем чтение и запись.
  • 4-й параметр - задает тип объекта, принадлежат ли отраженные данные только этому процессу или их могут читать другие. Мы предполагаем, что данные буду читать и другие.
  • 5-й параметр - дескриптор объекта.
  • 6-й параметр - смещение в разделяемой памяти, т.е. откуда будем читать или куда будем писать.

Если функция выполнилась успешно, то она возвращает адрес куда можно писать или откуда можно читать. В данном случае мы пишем в память.

Трансляция программы

gcc mem4020.c -o mem4020 -lrt

Программа mem4030.c. Она очень похожа на программу mem4020.c, но читает из разделяемой памяти и сразу выводит на консоль.

Трансляция программы

gcc mem4030.c -o mem4030 -lrt

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

Не забывайте подписываться на мой канал Old Programmer.

Я вижу, что вы забыли поставить 'ЛАЙК', не так ли?

Фрагмент программы mem4020.c
Фрагмент программы mem4020.c