
- •Статические и динамические библиотеки (сборка и использование)
- •Автоматизация сборки приложений с помощью make
- •Создание процессов, системные вызовы fork и exec(см.Файлик)
- •Процессы демоны, создание процессов демонов Демоны и потоки
- •Структуры данных процесса
- •Идентификационные данные процесса
- •Контекст процесса
- •Состояния процессов
- •Другие параметры процесса
- •Режимы выполнения процессов
- •Средства межпроцессорного взаимодействия
- •Методы межпроцессного взаимодействия
- •[Править]Реализации
- •Проблемы межпроцессного взаимодействия
- •Обмен информацией между процессами
- •Сигналы
- •Разделяемая память
- •Семафоры, системные вызовы для работы с семафорами
- •Семафоры
- •3.1. Использование семафоров
- •3.2. Создание множеств семафоров
- •3.3. Управление семафорами
- •3.3.1. Использование semctl
- •Очереди сообщений, системные вызовы для работы с очередями сообщений
- •2.1. Использование очередей сообщений
- •2.2. Создание очередей сообщений
- •2.2.1. Использование msgget
- •Разделяемая память, системные вызовы для работы с разделяемой памятью
- •4.1. Использование разделяемых сегментов памяти
- •4.2. Создание разделяемых сегментов памяти
- •4.3. Управление разделяемыми сегментами памяти
- •4.3.1. Использование shmctl
Режимы выполнения процессов
В каждый момент времени процесс находится в одном из двух режимов выполнения: либо в режиме ядра (kernel mode), либо в режиме задачи или пользовательском режиме (user mode). В режиме задачи выполняются инструкции прикладной программы, допустимые на непривилегированном уровне защиты процессора. Когда процессу требуется выполнить какие-то операции на уровне ядра, он делает системный вызов. Выполнение процесса при этом переходит в режим ядра (но от имени процесса, сделавшего системный вызов). Таким образом система защищает собственное адресное пространство от доступа прикладного процесса, который мог бы иначе нарушить целостность структур данных ядра.
Существуют всего три события, при которых выполнение процесса переходит в режим ядра: аппаратные прерывания, особые ситуации и системные вызовы.
Аппаратные прерывания генерируются периферийными устройствами при наступлении определенных событий (например, завершение дисковой операции ввода/вывода или поступления данных на последовательный порт) и имеют асинхронный характер, то есть в рамках процесса невозможно предсказать, в какой момент поступит то или иное прерывание. Обработка таких прерываний не должна блокироваться, поскольку это может вызвать блокирование выполнения независимого процесса.
Особые ситуации вызваны самим процессом и связаны с выполнением каких-то недопустимых инструкций, например, делением на ноль или обращением к несуществующей странице памяти. Обработка таких ситуаций происходит в контексте процесса, при этом может использоваться его адресное пространство, а сам процесс, при необходимости, блокироваться.
Системные вызовы позволяют процессам воспользоваться базовыми услугами ядра. Обращение к ним изменяет режим выполнения процесса и позволяет выполнить привилегированные инструкции ядра. Выполнение системного вызова происходит в режиме ядра, но в контексте процесса, сделавшего вызов.
Во всех этих случаях ядро получает управление и вызывает соответствующую системную процедуру для обработки события. Перед вызовом этой процедуры ядро сохраняет состояние процесса, а после завершения процедуры состояние процесса восстанавливается, и процесс возвращается в исходный режим выполнения.
Средства межпроцессорного взаимодействия
Хотя процессы изолированы друг от друга, они могут обмениваться данными с помощью предоставляемых системой средств межпроцессорного взаимодействия. К таким средствам относятся каналы (pipes), именованные каналы (FIFO), сообщения (messages), разделяемая память (shared memory), семафоры (semaphores), сигналы (signals) и сокеты (sockets).
Каналы
Канал обеспечивает однонаправленную передачу данных между двумя процессами, причем только между «родственными» процессами. Например, когда выполняется команда
cat myfile | wc
оба процесса cat и wc создаются процессом shell, и являются родственными. Поэтому каналы не могут использоваться в качестве средства межпроцессорного взаимодействия между независимыми процессами.
FIFO
FIFO тоже являются средством однонаправленной передачи данных, но, в отличие от программных каналов, имеют имена (поэтому и называются именованными каналами), которые позволяют независимым процессам получить к этим объектам доступ. FIFO является отдельным типом файла в файловой системе Linux. FIFOсоздаются либо системным вызовом mknod(2), либо командой mknod. После создания FIFO может быть открыт на запись и чтение, причем в разных независимых процессах.