Современные операционные системы UNIX UNIX Linux Linux QNX QNX
Функционирование ОС UNIX Выполнение процессов Выполнение процессов Подсистема ввода/вывода Подсистема ввода/вывода Перенаправление ввода/вывода Перенаправление ввода/вывода Файловая система Файловая система Структура файловой системы Структура файловой системы Защита файлов Защита файлов Межпроцессные коммуникации в UNIX Межпроцессные коммуникации в UNIX
Межпроцессные коммуникации в UNIX Сигналы Сигналы Семафоры Семафоры Программные каналы Программные каналы Очереди сообщений Очереди сообщений Разделяемая память Разделяемая память Вызовы удаленных процедур (RPC) Вызовы удаленных процедур (RPC)
Сигналы Если рассматривать выполнение процесса в виртуальном компьютере, который предоставляется каждому пользователю, то в такой системе должна существовать система прерываний, отвечающая стандартным требованиям: Если рассматривать выполнение процесса в виртуальном компьютере, который предоставляется каждому пользователю, то в такой системе должна существовать система прерываний, отвечающая стандартным требованиям: обработка исключительных ситуаций; обработка исключительных ситуаций; средства обработки внешних и внутренних прерываний; средства обработки внешних и внутренних прерываний; средства управления системой прерываний (маскирование и демаскирование). средства управления системой прерываний (маскирование и демаскирование). Всем этим требованиям в UNIX отвечает техника сигналов, которая может не только воспринимать и обрабатывать сигналы, но и порождать их и посылать на другие машины (процессы). Всем этим требованиям в UNIX отвечает техника сигналов, которая может не только воспринимать и обрабатывать сигналы, но и порождать их и посылать на другие машины (процессы).
Сигналы Сигналы могут быть синхронными, когда инициатор сигнала сам процесс, и асинхронными, когда инициатор возникновения сигнала интерактивный пользователь за терминалом. Источником асинхронных сигналов может быть также ядро, когда оно контролирует определенные состояния аппаратуры, рассматриваемые как ошибочные. Сигналы могут быть синхронными, когда инициатор сигнала сам процесс, и асинхронными, когда инициатор возникновения сигнала интерактивный пользователь за терминалом. Источником асинхронных сигналов может быть также ядро, когда оно контролирует определенные состояния аппаратуры, рассматриваемые как ошибочные. Сигналы можно рассматривать как простейшую форму межпроцессного взаимодействия, которое используется для передачи от одного процесса другому или от ядра ОС какому-либо процессу уведомления о возникновении определенного события. Сигналы можно рассматривать как простейшую форму межпроцессного взаимодействия, которое используется для передачи от одного процесса другому или от ядра ОС какому-либо процессу уведомления о возникновении определенного события.
Семафоры Механизм семафоров, реализованный в ОС UNIX, является обобщением классического механизма семафоров общего вида, предложенного известным голландским специалистом профессором Дейкстрой. Семафор в ОС UNIX состоит из следующих элементов: Механизм семафоров, реализованный в ОС UNIX, является обобщением классического механизма семафоров общего вида, предложенного известным голландским специалистом профессором Дейкстрой. Семафор в ОС UNIX состоит из следующих элементов: значение семафора; значение семафора; идентификатор процесса, который хронологически последним работал с семафором; идентификатор процесса, который хронологически последним работал с семафором; число процессов, ожидающих увеличения значения семафора; число процессов, ожидающих увеличения значения семафора; число процессов, ожидающих нулевого значения семафора. число процессов, ожидающих нулевого значения семафора.
Семафоры Для работы с семафорами имеются следующие три системных вызова: Для работы с семафорами имеются следующие три системных вызова: semget для создания и получения доступа к набору семафоров; semget для создания и получения доступа к набору семафоров; semop для манипулирования значениями семафоров (с помощью именно этого системного вызова осуществляют синхронизацию процессов на основе использования семафоров); semop для манипулирования значениями семафоров (с помощью именно этого системного вызова осуществляют синхронизацию процессов на основе использования семафоров); semctl для выполнения разнообразных управляющих операций над набором семафоров. semctl для выполнения разнообразных управляющих операций над набором семафоров.
Семафоры Системный вызов semget имеет следующий синтаксис: Системный вызов semget имеет следующий синтаксис: id = semget(key, count, flag); где параметры key и flag и возвращаемое значение системного вызова (id) имеют тот же смысл, что для других системных вызовов семейства «get», а параметр count задает число семафоров в наборе семафоров, обладающих одним и тем же ключом. После этого индивидуальный семафор идентифицируется дескриптором набора семафоров и номером семафора в этом наборе.
Семафоры Если к моменту выполнения системного вызова semget набор семафоров с указанным ключом уже существует, то обращающийся процесс получит соответствующий дескриптор, но так и не узнает о реальном числе семафоров в группе (хотя позже это все-таки можно узнать с помощью системного вызова semctl). Если к моменту выполнения системного вызова semget набор семафоров с указанным ключом уже существует, то обращающийся процесс получит соответствующий дескриптор, но так и не узнает о реальном числе семафоров в группе (хотя позже это все-таки можно узнать с помощью системного вызова semctl).
Семафоры Основным системным вызовом для манипулирования семафором является semop: Основным системным вызовом для манипулирования семафором является semop: oldval = semop(id, oplist, count); oldval = semop(id, oplist, count); где id это ранее полученный дескриптор группы семафоров, oplist массив описателей операций над семафорами группы, a count размер этого массива. Значение, возвращаемое системным вызовом, является значением последнего обработанного семафора. где id это ранее полученный дескриптор группы семафоров, oplist массив описателей операций над семафорами группы, a count размер этого массива. Значение, возвращаемое системным вызовом, является значением последнего обработанного семафора.
Семафоры Каждый элемент массива oplist имеет следующую структуру: Каждый элемент массива oplist имеет следующую структуру: номер семафора в указанном наборе семафоров; номер семафора в указанном наборе семафоров; операция; операция; флаги. флаги. Если проверка прав доступа проходит нормально и указанные в массиве oplist номера семафоров не выходят за пределы общего размера набора семафоров, то системный вызов выполняется следующим образом. Если проверка прав доступа проходит нормально и указанные в массиве oplist номера семафоров не выходят за пределы общего размера набора семафоров, то системный вызов выполняется следующим образом.
Семафоры Для каждого элемента массива oplist значение соответствующего семафора изменяется в соответствии со значением поля «операция»: Для каждого элемента массива oplist значение соответствующего семафора изменяется в соответствии со значением поля «операция»: если значение поля операции положительно, то значение семафора увеличивается на единицу, а все процессы, ожидающие увеличения значения семафора, активизируются (пробуждаются в терминологии UNIX); если значение поля операции положительно, то значение семафора увеличивается на единицу, а все процессы, ожидающие увеличения значения семафора, активизируются (пробуждаются в терминологии UNIX); если значение поля операции равно нулю, то если значение семафора также равно нулю, выбирается следующий элемент массива oplist. Если же значение семафора отлично от нуля, то ядро увеличивает на единицу число процессов, ожидающих нулевого значения семафора, а обратившийся процесс переводится в состояние ожидания (усыпляется в терминологии UNIX); если значение поля операции равно нулю, то если значение семафора также равно нулю, выбирается следующий элемент массива oplist. Если же значение семафора отлично от нуля, то ядро увеличивает на единицу число процессов, ожидающих нулевого значения семафора, а обратившийся процесс переводится в состояние ожидания (усыпляется в терминологии UNIX);
Семафоры если значение поля операции отрицательно и его абсолютное значение меньше или равно значению семафора, то ядро прибавляет это отрицательное значение к значению семафора. Если в результате значение семафора стало нулевым, то ядро активизирует (пробуждает) все процессы, ожидающие нулевого значения этого семафора. Если же значение семафора меньше абсолютной величины поля операции, то ядро увеличивает на единицу число процессов, ожидающих увеличения значения семафора, и откладывает (усыпляет) текущий процесс до наступления этого события. если значение поля операции отрицательно и его абсолютное значение меньше или равно значению семафора, то ядро прибавляет это отрицательное значение к значению семафора. Если в результате значение семафора стало нулевым, то ядро активизирует (пробуждает) все процессы, ожидающие нулевого значения этого семафора. Если же значение семафора меньше абсолютной величины поля операции, то ядро увеличивает на единицу число процессов, ожидающих увеличения значения семафора, и откладывает (усыпляет) текущий процесс до наступления этого события.
Семафоры Наконец, среди флагов-параметров системного вызова semop может содержаться флаг с символическим именем IPC_NOWAIT, наличие которого заставляет ядро ОС UNIX не блокировать текущий процесс, а лишь сообщать в ответных параметрах о возникновении ситуации, которая может привести к блокированию процесса при отсутствии флага IPC_NOWAIT. Мы не будем обсуждать здесь возможности корректного завершения работы с семафорами при незапланированном завершении процесса; заметим только, что такие возможности обеспечиваются. Наконец, среди флагов-параметров системного вызова semop может содержаться флаг с символическим именем IPC_NOWAIT, наличие которого заставляет ядро ОС UNIX не блокировать текущий процесс, а лишь сообщать в ответных параметрах о возникновении ситуации, которая может привести к блокированию процесса при отсутствии флага IPC_NOWAIT. Мы не будем обсуждать здесь возможности корректного завершения работы с семафорами при незапланированном завершении процесса; заметим только, что такие возможности обеспечиваются.
Семафоры Системный вызов semctl имеет формат Системный вызов semctl имеет формат semctl(id, number, cmd, arg); semctl(id, number, cmd, arg); где id это дескриптор группы семафоров, number номер семафора в группе, cmd код операции, а arg указатель на структуру, содержимое которой интерпретируется по- разному, в зависимости от операции. В частности, с помощью semctl можно уничтожить индивидуальный семафор в указанной группе. Д етали этого системного вызова громоздки - обращайтесь к технической документации операционной системы. где id это дескриптор группы семафоров, number номер семафора в группе, cmd код операции, а arg указатель на структуру, содержимое которой интерпретируется по- разному, в зависимости от операции. В частности, с помощью semctl можно уничтожить индивидуальный семафор в указанной группе. Д етали этого системного вызова громоздки - обращайтесь к технической документации операционной системы.
Программные каналы Программные каналы (pipes) в ОС UNIX являются важным средством взаимодействия и синхронизации процессов. Теоретически программный канал позволяет взаимодействовать любому числу процессов, обеспечивая дисциплину FIFO (first-in-first-out). Другими словами, процесс, читающий из программного канала, прочитает самые давние записанные в программный канал данные. В традиционной реализации для хранения данных использовались файлы. В современных версиях ОС UNIX для реализации программных каналов применяются другие средства IPC (в частности, очереди сообщений). Программные каналы (pipes) в ОС UNIX являются важным средством взаимодействия и синхронизации процессов. Теоретически программный канал позволяет взаимодействовать любому числу процессов, обеспечивая дисциплину FIFO (first-in-first-out). Другими словами, процесс, читающий из программного канала, прочитает самые давние записанные в программный канал данные. В традиционной реализации для хранения данных использовались файлы. В современных версиях ОС UNIX для реализации программных каналов применяются другие средства IPC (в частности, очереди сообщений).
Программные каналы В UNIX различаются два вида программных каналов именованные и неименованные. Именованный программный канал может служить для общения и синхронизации произвольных процессов, знающих имя данного программного канала и имеющих соответствующие права доступа. Неименованным программным каналом могут пользоваться только создавший его процесс и его потомки (необязательно прямые). В UNIX различаются два вида программных каналов именованные и неименованные. Именованный программный канал может служить для общения и синхронизации произвольных процессов, знающих имя данного программного канала и имеющих соответствующие права доступа. Неименованным программным каналом могут пользоваться только создавший его процесс и его потомки (необязательно прямые).
Программные каналы Для создания именованного программного канала (или получения к нему доступа) используется обычный файловый системный вызов open. Для создания же неименованного программного канала существует специальный системный вызов pipe (исторически более ранний). Однако после получения соответствующих дескрипторов оба вида программных каналов используются единообразно с помощью стандартных файловых системных вызовов read, write и close. Для создания именованного программного канала (или получения к нему доступа) используется обычный файловый системный вызов open. Для создания же неименованного программного канала существует специальный системный вызов pipe (исторически более ранний). Однако после получения соответствующих дескрипторов оба вида программных каналов используются единообразно с помощью стандартных файловых системных вызовов read, write и close.
Программные каналы Системный вызов piре имеет следующий синтаксис: Системный вызов piре имеет следующий синтаксис: pipe(fdptr); pipe(fdptr); где fdptr это указатель на массив из двух целых чисел, в который после создания неименованного программного канала будут помещены дескрипторы, предназначенные для чтения из программного канала (с помощью системного вызова read) и записи в программный канал (с помощью системного вызова write). где fdptr это указатель на массив из двух целых чисел, в который после создания неименованного программного канала будут помещены дескрипторы, предназначенные для чтения из программного канала (с помощью системного вызова read) и записи в программный канал (с помощью системного вызова write).
Программные каналы Дескрипторы неименованного программного канала это обычные дескрипторы файлов, то есть такому программному каналу соответствуют два элемента таблицы открытых файлов процесса. Поэтому при последующем использовании системных вызовов read и write процесс совершенно не обязан отличать случай использования программных каналов от случая использования обычных файлов (собственно, на этом и основана идея перенаправления ввода/вывода и организации конвейеров). Дескрипторы неименованного программного канала это обычные дескрипторы файлов, то есть такому программному каналу соответствуют два элемента таблицы открытых файлов процесса. Поэтому при последующем использовании системных вызовов read и write процесс совершенно не обязан отличать случай использования программных каналов от случая использования обычных файлов (собственно, на этом и основана идея перенаправления ввода/вывода и организации конвейеров).
Программные каналы Для создания именованных программных каналов (или получения доступа к уже существующим каналам) используется обычный системный вызов open. Основным отличием от случая открытия обычного файла является то, что если именованный программный канал открывается на запись и ни один процесс не открыл тот же программный канал для чтения, то обращающийся процесс блокируется до тех пор, пока некоторый процесс не откроет данный программный канал для чтения. Аналогично обрабатывается открытие для чтения. Для создания именованных программных каналов (или получения доступа к уже существующим каналам) используется обычный системный вызов open. Основным отличием от случая открытия обычного файла является то, что если именованный программный канал открывается на запись и ни один процесс не открыл тот же программный канал для чтения, то обращающийся процесс блокируется до тех пор, пока некоторый процесс не откроет данный программный канал для чтения. Аналогично обрабатывается открытие для чтения.
Программные каналы Запись данных в программный канал и чтение данных из программного канала (независимо от того, именованный он или неименованный) выполняются с помощью системных вызовов read и write. Отличие от случая использования обычных файлов состоит лишь в том, что при записи данные помещаются в начало канала, а при чтении выбираются (освобождая соответствующую область памяти) из конца канала. Запись данных в программный канал и чтение данных из программного канала (независимо от того, именованный он или неименованный) выполняются с помощью системных вызовов read и write. Отличие от случая использования обычных файлов состоит лишь в том, что при записи данные помещаются в начало канала, а при чтении выбираются (освобождая соответствующую область памяти) из конца канала. Окончание работы процесса с программным каналом (независимо от того, именованный он или неименованный) производится с помощью системного вызова close. Окончание работы процесса с программным каналом (независимо от того, именованный он или неименованный) производится с помощью системного вызова close.
Очереди сообщений Для обеспечения возможности обмена сообщениями между процессами этот механизм поддерживается следующими системными вызовами: Для обеспечения возможности обмена сообщениями между процессами этот механизм поддерживается следующими системными вызовами: msgget для образования новой очереди сообщений или получения дескриптора существующей очереди; msgget для образования новой очереди сообщений или получения дескриптора существующей очереди; msgsnd для посылки сообщения (вернее, для его постановки в указанную очередь сообщений); msgsnd для посылки сообщения (вернее, для его постановки в указанную очередь сообщений); msgrcv для приема сообщения (вернее, для выборки сообщения из очереди сообщений); msgrcv для приема сообщения (вернее, для выборки сообщения из очереди сообщений); msgctl для выполнения ряда управляющих действий. msgctl для выполнения ряда управляющих действий.
Очереди сообщений Ядро хранит сообщения в виде связного списка (очереди), а дескриптор очереди сообщений является индексом в массиве заголовков очередей сообщений. Ядро хранит сообщения в виде связного списка (очереди), а дескриптор очереди сообщений является индексом в массиве заголовков очередей сообщений. Системный вызов msgget обладает стандартным для семейства «get» системных вызовов синтаксисом: Системный вызов msgget обладает стандартным для семейства «get» системных вызовов синтаксисом: msgqid = msgget(key, flag); msgqid = msgget(key, flag);
Очереди сообщений При выполнении системного вызова msgget ядро ОС UNIX либо создает новую очередь сообщений, помещая ее заголовок в таблицу очередей сообщений и возвращая пользователю дескриптор вновь созданной очереди, либо находит элемент таблицы очередей сообщений, содержащий указанный ключ, и возвращает соответствующий дескриптор очереди. При выполнении системного вызова msgget ядро ОС UNIX либо создает новую очередь сообщений, помещая ее заголовок в таблицу очередей сообщений и возвращая пользователю дескриптор вновь созданной очереди, либо находит элемент таблицы очередей сообщений, содержащий указанный ключ, и возвращает соответствующий дескриптор очереди.
Очереди сообщений Для посылки сообщения используется системный вызов msgsnd: Для посылки сообщения используется системный вызов msgsnd: msgsnd(msgqid, msg, count, flag); msgsnd(msgqid, msg, count, flag); где msg это указатель на структуру, содержащую определяемый пользователем целочисленный тип сообщения и символьный массив собственно сообщение; count задает размер сообщения в байтах, а flag определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти. где msg это указатель на структуру, содержащую определяемый пользователем целочисленный тип сообщения и символьный массив собственно сообщение; count задает размер сообщения в байтах, а flag определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти.
Очереди сообщений Для приема сообщения используется вызов msgrcv: Для приема сообщения используется вызов msgrcv: count = msgrcv(id, msg, maxcount, type, flag); count = msgrcv(id, msg, maxcount, type, flag); Здесь msg указатель на структуру данных в адресном пространстве пользователя, предназначенную для размещения принятого сообщения; maxcount задает размер области данных (массива байтов) в структуре msg; type специфицирует тип сообщения, которое желательно принять; flag указывает ядру, что следует предпринять, если в указанной очереди сообщений отсутствует сообщение с указанным типом. Возвращаемое значение системного вызова задает реальное число байтов, переданных пользователю. Здесь msg указатель на структуру данных в адресном пространстве пользователя, предназначенную для размещения принятого сообщения; maxcount задает размер области данных (массива байтов) в структуре msg; type специфицирует тип сообщения, которое желательно принять; flag указывает ядру, что следует предпринять, если в указанной очереди сообщений отсутствует сообщение с указанным типом. Возвращаемое значение системного вызова задает реальное число байтов, переданных пользователю.
Очереди сообщений Системный вызов Системный вызов msgctl(id, cmd, mstatbuf); msgctl(id, cmd, mstatbuf); служит для опроса состояния описателя очереди сообщений, изменения его состояния (например, изменения прав доступа к очереди) и для уничтожения указанной очереди сообщений. служит для опроса состояния описателя очереди сообщений, изменения его состояния (например, изменения прав доступа к очереди) и для уничтожения указанной очереди сообщений.
Разделяемая память Для работы с разделяемой памятью используются четыре системных вызова: Для работы с разделяемой памятью используются четыре системных вызова: shmget создает новый сегмент разделяемой памяти или находит существующий сегмент с тем же ключом; shmget создает новый сегмент разделяемой памяти или находит существующий сегмент с тем же ключом; shmat подключает сегмент с указанным дескриптором к виртуальной памяти обращающегося процесса; shmat подключает сегмент с указанным дескриптором к виртуальной памяти обращающегося процесса; shmdt отключает от виртуальной памяти ранее подключенный к ней сегмент с указанным виртуальным адресом начала; shmdt отключает от виртуальной памяти ранее подключенный к ней сегмент с указанным виртуальным адресом начала; shmctl служит для управления разнообразными параметрами, связанными с существующим сегментом. shmctl служит для управления разнообразными параметрами, связанными с существующим сегментом.
Разделяемая память После того как сегмент разделяемой памяти подключен к виртуальной памяти процесса, этот процесс может обращаться к соответствующим элементам памяти с использованием обычных машинных команд чтения и записи, не прибегая к использованию дополнительных системных вызовов. После того как сегмент разделяемой памяти подключен к виртуальной памяти процесса, этот процесс может обращаться к соответствующим элементам памяти с использованием обычных машинных команд чтения и записи, не прибегая к использованию дополнительных системных вызовов.
Разделяемая память Синтаксис системного вызова shmget выглядит следующим образом: Синтаксис системного вызова shmget выглядит следующим образом: shmid = shmget(key, size, flag); shmid = shmget(key, size, flag); Параметр size определяет желаемый размер сегмента в байтах. Далее работа происходит по общим правилам. Параметр size определяет желаемый размер сегмента в байтах. Далее работа происходит по общим правилам. Если в таблице разделяемой памяти находится элемент, содержащий заданный ключ, и права доступа не противоречат текущим характеристикам обращающегося процесса, то значением системного вызова является дескриптор существующего сегмента. Если в таблице разделяемой памяти находится элемент, содержащий заданный ключ, и права доступа не противоречат текущим характеристикам обращающегося процесса, то значением системного вызова является дескриптор существующего сегмента.
Разделяемая память В противном случае создается новый сегмент с размером не меньше установленного в системе минимального размера и не больше установленного максимального размера. В противном случае создается новый сегмент с размером не меньше установленного в системе минимального размера и не больше установленного максимального размера. Создание сегмента не означает немедленного выделения под него основной памяти. Это действие откладывается до выполнения первого системного вызова подключения сегмента к виртуальной памяти некоторого процесса. Аналогично, при выполнении последнего системного вызова отключения сегмента от виртуальной памяти соответствующая основная память освобождается. Создание сегмента не означает немедленного выделения под него основной памяти. Это действие откладывается до выполнения первого системного вызова подключения сегмента к виртуальной памяти некоторого процесса. Аналогично, при выполнении последнего системного вызова отключения сегмента от виртуальной памяти соответствующая основная память освобождается.
Разделяемая память Подключение сегмента к виртуальной памяти выполняется путем обращения к системному вызову shmat: Подключение сегмента к виртуальной памяти выполняется путем обращения к системному вызову shmat: virtaddr = shmat(id, addr, flags); virtaddr = shmat(id, addr, flags); Здесь id ранее полученный дескриптор сегмента, a addr желаемый процессом виртуальный адрес, который должен соответствовать началу сегмента в виртуальной памяти. Значением системного вызова является реальный виртуальный адрес начала сегмента. Если значением addr является нуль, ядро выбирает подходящий виртуальный адрес начала сегмента. Здесь id ранее полученный дескриптор сегмента, a addr желаемый процессом виртуальный адрес, который должен соответствовать началу сегмента в виртуальной памяти. Значением системного вызова является реальный виртуальный адрес начала сегмента. Если значением addr является нуль, ядро выбирает подходящий виртуальный адрес начала сегмента.
Разделяемая память Для отключения сегмента от виртуальной памяти используется системный вызов shmdt: Для отключения сегмента от виртуальной памяти используется системный вызов shmdt: shmdt(addr); shmdt(addr); где addr это виртуальный адрес начала сегмента в виртуальной памяти, ранее полученный от системного вызова shmat. При этом система гарантирует (на основе использования таблицы сегментов процесса), что указанный виртуальный адрес действительно является адресом начала разделяемого сегмента в виртуальной памяти данного процесса. где addr это виртуальный адрес начала сегмента в виртуальной памяти, ранее полученный от системного вызова shmat. При этом система гарантирует (на основе использования таблицы сегментов процесса), что указанный виртуальный адрес действительно является адресом начала разделяемого сегмента в виртуальной памяти данного процесса.
Разделяемая память Для управления памятью служит системный вызов shmctl : shmctl(id, cmd, shsstatbuf); Для управления памятью служит системный вызов shmctl : shmctl(id, cmd, shsstatbuf); Он содержит прямой параметр cmd, идентифицирующий требуемое конкретное действие, и предназначен для выполнения различных функций. Наиболее важной является функция уничтожения сегмента разделяемой памяти, которое производится следующим образом. Если к моменту выполнения системного вызова ни один процесс не подключил сегмент к своей виртуальной памяти, то основная память, занимаемая сегментом, освобождается, а соответствующий элемент таблицы разделяемых сегментов объявляется свободным. Он содержит прямой параметр cmd, идентифицирующий требуемое конкретное действие, и предназначен для выполнения различных функций. Наиболее важной является функция уничтожения сегмента разделяемой памяти, которое производится следующим образом. Если к моменту выполнения системного вызова ни один процесс не подключил сегмент к своей виртуальной памяти, то основная память, занимаемая сегментом, освобождается, а соответствующий элемент таблицы разделяемых сегментов объявляется свободным.
Разделяемая память В противном случае в элементе таблицы сегментов выставляется флаг, запрещающий выполнение системного вызова shmget по отношению к этому сегменту, но процессам, успевшим получить дескриптор сегмента, по- прежнему разрешается подключать сегмент к своей виртуальной памяти. При выполнении последнего системного вызова отключения сегмента от виртуальной памяти операция уничтожения сегмента завершается. В противном случае в элементе таблицы сегментов выставляется флаг, запрещающий выполнение системного вызова shmget по отношению к этому сегменту, но процессам, успевшим получить дескриптор сегмента, по- прежнему разрешается подключать сегмент к своей виртуальной памяти. При выполнении последнего системного вызова отключения сегмента от виртуальной памяти операция уничтожения сегмента завершается.
Вызовы удаленных процедур (RPC) Во многих случаях взаимодействие процессов носит характер «клиент сервер». Один из процессов («клиент») запрашивает у другого процесса («сервера») некоторую услугу (сервис) и не продолжает свое выполнение до тех пор, пока эта услуга не будет выполнена (и пока процесс-клиент не получит соответствующие результаты). Видно, что семантически такой режим взаимодействия эквивалентен вызову процедуры. Отсюда и соответствующее название. Во многих случаях взаимодействие процессов носит характер «клиент сервер». Один из процессов («клиент») запрашивает у другого процесса («сервера») некоторую услугу (сервис) и не продолжает свое выполнение до тех пор, пока эта услуга не будет выполнена (и пока процесс-клиент не получит соответствующие результаты). Видно, что семантически такой режим взаимодействия эквивалентен вызову процедуры. Отсюда и соответствующее название.
Вызовы удаленных процедур (RPC) ОС UNIX по своей идеологии идеально подходит для того, чтобы быть сетевой операционной системой. И на ее основе можно создавать распределенные системы и организовывать распределенные вычисления. Свойства переносимости позволяют создавать «операционно однородные» сети, включающие разнородные компьютеры. Однако остается проблема разного представления данных в компьютерах разной архитектуры. Поэтому одной из основных идей RPC является автоматическое обеспечение преобразования форматов данных при взаимодействии процессов, выполняющихся на разнородных компьютерах. ОС UNIX по своей идеологии идеально подходит для того, чтобы быть сетевой операционной системой. И на ее основе можно создавать распределенные системы и организовывать распределенные вычисления. Свойства переносимости позволяют создавать «операционно однородные» сети, включающие разнородные компьютеры. Однако остается проблема разного представления данных в компьютерах разной архитектуры. Поэтому одной из основных идей RPC является автоматическое обеспечение преобразования форматов данных при взаимодействии процессов, выполняющихся на разнородных компьютерах.
Вызовы удаленных процедур (RPC) Реализация технологии вызовов удаленных процедур (remote procedure call RPC) достаточно сложна, поскольку этот механизм должен обеспечить работу взаимодействующих процессов, которые находятся на разных компьютерах. Если в случае обращения к процедуре, расположенной на том же компьютере, процесс общается с ней через стек или общие области памяти, то в случае удаленного вызова передача параметров процедуре превращается в передачу запроса по сети. Соответственно, и получение результата так же осуществляется посредством использования сетевых механизмов. Реализация технологии вызовов удаленных процедур (remote procedure call RPC) достаточно сложна, поскольку этот механизм должен обеспечить работу взаимодействующих процессов, которые находятся на разных компьютерах. Если в случае обращения к процедуре, расположенной на том же компьютере, процесс общается с ней через стек или общие области памяти, то в случае удаленного вызова передача параметров процедуре превращается в передачу запроса по сети. Соответственно, и получение результата так же осуществляется посредством использования сетевых механизмов.
Вызовы удаленных процедур (RPC) Удаленный вызов процедур включает следующие шаги: Удаленный вызов процедур включает следующие шаги: процесс-клиент осуществляет локальный вызов процедуры, которую называют «заглушкой» (stub). Задача этого модуля-заглушки принять аргументы, преобразовать их в стандартную форму и сформировать сетевой запрос. Упаковка аргументов и создание сетевого запроса называется сборкой (marshalling); процесс-клиент осуществляет локальный вызов процедуры, которую называют «заглушкой» (stub). Задача этого модуля-заглушки принять аргументы, преобразовать их в стандартную форму и сформировать сетевой запрос. Упаковка аргументов и создание сетевого запроса называется сборкой (marshalling); сетевой запрос пересылается на удаленную систему, где соответствующий модуль ожидает такой запрос и при его получении извлекает параметры вызова процедуры (unmarshalling), а затем передает их серверу удаленной процедуры. После выполнения осуществляется обратная передача. сетевой запрос пересылается на удаленную систему, где соответствующий модуль ожидает такой запрос и при его получении извлекает параметры вызова процедуры (unmarshalling), а затем передает их серверу удаленной процедуры. После выполнения осуществляется обратная передача.