Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Программирование на ассемблере в Linux. Взаимодействие процессов. Разделяемая память (книга)

Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня говорим о взаимодействии процессов через общую память. Параграф 7.5 Взаимодействии процессов через общую память в Linux Важным вопросом многозадачности является является взаимодействие процессов. Чаще всего взаимодействие требуются для родительского и дочерних процессов. Кстати используемая выше системная функция wait4 это один из механизмов такого взаимодействия. В параграфе 5.5 мы рассматривали память, которую можно динамически выделить с помощью системной функции mmap. В частности эту память можно сделать разделяемой между процессами. Тогда мы получаем очень удобный механизм для обмена данными между такими процессами. Напоминаю, что при выделении памяти с помощью mmap используется опция MAP_SHARED равная 1. Ниже (см. листинг 70) представлена программа, которая создает дочерний процесс и далее происходит взаимодействие двух процессов через ранее созданную общую

Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня говорим о взаимодействии процессов через общую память.

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer27 мая 2021
Книга "Ассемблер для Linux"
Old Programmer4 июля 2021
Из записок старого программиста. Притчи о компьютерных жителях. Товарищ Комманд Ком, Диггер и отец Виндовс...
Old Programmer31 июля 2020

Параграф 7.5

Взаимодействии процессов через общую память в Linux

Важным вопросом многозадачности является является взаимодействие процессов. Чаще всего взаимодействие требуются для родительского и дочерних процессов. Кстати используемая выше системная функция wait4 это один из механизмов такого взаимодействия.

В параграфе 5.5 мы рассматривали память, которую можно динамически выделить с помощью системной функции mmap. В частности эту память можно сделать разделяемой между процессами. Тогда мы получаем очень удобный механизм для обмена данными между такими процессами. Напоминаю, что при выделении памяти с помощью mmap используется опция MAP_SHARED равная 1.

Ниже (см. листинг 70) представлена программа, которая создает дочерний процесс и далее происходит взаимодействие двух процессов через ранее созданную общую память. При этом общая память выделяется ранее в родительском процессе до создания дочернего. В листинге 71 представлены вспомогательные функции: вывод на консоль и функция задержки на 0.5 секунды.

Пояснение к программе из листинга 70.

1. При выделении общей памяти используется системная функции mmap. При этом используются флаги MAP_SHARED — разделяемая память, MAP_ANONYMOUS — функция работает для выделения памяти, а не для отображения в память файла. Если функция выполнилась успешно, то возвращается адрес памяти. Этот адрес сохраняется в переменной addr, который естественно будет доступен и в дочернем процессе, так как при создании дочернего процесса для создается копия глобальной памяти родительского процесса.

2. Для создания дочернего процесса используем известную уже функцию fork (см. параграф 7.2). А далее родительский и дочерний процесс обмениваются данными.

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

4. После выдачи сообщения родительский процесс ждет, когда в общей памяти появится 1 (до этого там хранится ноль). После того как дочерний процесс поместит в общую память единицу, он ждет ответа, т.е. когда в общей памяти появится число 2. После получения сообщения от дочернего процесса сообщения, родительский процесс делает не большую задержку, чтобы дочерний процесс выдал на консоль второе сообщение. Потом родительский процесс выдает свое сообщение. После чего оба процесса заканчивают свою работу.

Для трансляции программы следует выполнить следующие команды.

as --64l79.s -ol79.o
gcc -cl80.c
gcc -no-pie l79.o l80.o -ol79

При выполнении программы будет выведено

Родительский 1
Дочерний 1
Дочерний 2
Родительский 2

На сегодня все. Подписываемся на мой канал Old Programmer и ставьте "лайки". А я продолжаю заниматься книгой Ассемблер для Linux 64.

Список разделов канала Old Programmer, канала о программировании и программистах

<--Глава 7. Параграф 7.4 --> Глава 7. Параграф 7.6

Фрагмент программы  l89.s
Фрагмент программы l89.s

#программирование #программисты #ассемблер #assembler #языки программирования