Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 87
Текст из файла (страница 87)
Возвращаемое значение системного вызова задает реальное число байтов,переданных пользователю.Следующий системный вызов служит для опроса состояния описателя очередисообщений, изменения его состояния (например, изменения прав доступа к очереди) и для уничтожения указанной очереди сообщений:msgctl(id.
cmd, mstatbuf);334Глава 10, Краткий обзор современных операционных системРазделяемая памятьДля работы с разделяемой памятью используются четыре системных вызова:Q shmget — создает новый сегмент разделяемой памяти или находит существующий сегмент с тем же ключом;Q shmat — подключает сегмент с указанным дескриптором к виртуальной памятиобращающегося процесса;Q shmdt — отключает от виртуальной памяти ранее подключенный к ней сегментс указанным виртуальным адресом начала;• shmctl — служит для управления разнообразными параметрами, связанными ссуществующим сегментом.После того как сегмент разделяемой памяти подключен к виртуальной памятипроцесса, процесс может обращаться к соответствующим элементам памяти с использованием обычных машинных команд чтения и записи, не прибегая к дополнительным системным вызовам.Синтаксис системного вызова shmget выглядит следующим образом:shmid = shmget(key, size, flag):Параметр size определяет желаемый размер сегмента в байтах.
Далее работа происходит по общим правилам. Если в таблице разделяемой памяти находится элемент, содержащий заданный ключ, и права доступа не противоречат текущим характеристикам обращающегося процесса, то значением системного вызова являетсядескриптор существующего сегмента (и обратившийся процесс так и не узнаетреального размера сегмента, хотя впоследствии его можно узнать с помощью системного вызова shmctl). В противном случае создается новый сегмент, размер которого не меньше, чем установленный в системе минимальный размер сегментаразделяемой памяти, и не больше, чем установленный максимальный размер. Создание сегмента не означает немедленного выделения для него основной памяти.Это действие откладывается до первого системного вызова подключения сегментак виртуальной памяти некоторого процесса.
Аналогично, при выполнении последнего системного вызова отключения сегмента от виртуальной памяти соответствующая основная память освобождается.Подключение сегмента к виртуальной памяти выполняется путем обращения Ксистемному вызову shmat:virtaddr = shmatdd, addr. flags):Здесь id — ранее полученный дескриптор сегмента; addr — требуемый процессувиртуальный адрес, который должен соответствовать началу сегмента в виртуальной памяти. Значением системного вызова является реальный виртуальный адресначала сегмента (его значение не обязательно совпадает со значением параметраaddr). Если значением addr является нуль, ядро выбирает подходящий виртуальный адрес начала сегмента.Для отключения сегмента от виртуальной памяти используется системный вызовshmdt:shmdt(addr);Семейство операционных с и с т е м UNIX335Здесь addr — виртуальный адрес начала сегмента в виртуальной памяти, ранее полученный с помощью системного вызова shmat.
При этом система гарантирует (опираясь на данные таблицы сегментов процесса), что указанный виртуальный адресдействительно является адресом начала разделяемого сегмента в виртуальной памяти данного процесса.Для управления памятью служит системный вызов shmctl:shmctKid, cmd, shsstatbuf):Параметр cmd идентифицирует требуемое конкретное действие, то есть ту или инуюфункцию. Наиболее важной является функция уничтожения сегмента разделяемойпамяти, которое производится следующим образом. Если к моменту выполнениясистемного вызова ни один процесс не подключил сегмент к своей виртуальнойпамяти, то основная память, занимаемая сегментом, освобождается, а соответствующий элемент таблицы разделяемых сегментов объявляется свободным. В противном случае в элементе таблицы сегментов выставляется флаг, запрещающийвыполнение системного вызова shmget по отношению к этому сегменту, но процессам, успевшим получить дескриптор сегмента, по-прежнему разрешается подключать сегмент к своей виртуальной памяти.
При выполнении последнего системного вызова отключения сегмента от виртуальной памяти операция уничтожениясегмента завершается.Вызовы удаленных процедурВо многих случаях взаимодействие процессов соответствует отношениям клиентсервер. Один из процессов (клиент) запрашивает у другого процесса (сервера)некоторую услугу (сервис) и не продолжает свое выполнение до тех пор, пока этауслуга не будет выполнена (то есть пока процесс-клиент не получит соответствующие результаты). Видно, что семантически такой режим взаимодействия эквивалентен вызову процедуры.
Отсюда и соответствующее название — вызов удаленной процедуры (Remote Procedure Call, RPC). Другими словами, процессобращается к процедуре, которая не принадлежит данному процессу. Она можетнаходиться даже на другом компьютере. Операционная система UNIX по своей«идеологии» идеально подходит для того, чтобы быть сетевой операционной системой, на основе которой можно создавать распределенные системы и организовывать распределенные вычисления.
Свойства переносимости позволяют создавать «операционно-однородные» сети, включающие разнородные компьютеры.Однако остается проблема разного представления данных в компьютерах разнойархитектуры. Поэтому одной из основных идей RPC является автоматическое обеспечение преобразования форматов данных при взаимодействии процессов, выполняющихся на разнородных компьютерах.Реализация механизма вызовов удаленных процедур (RPC) достаточно сложна,поскольку этот механизм должен обеспечить работу взаимодействующих процессов, находящихся на разных компьютерах.
Если в случае обращения к процедуре,расположенной на том же компьютере, процесс общается с ней через стек или общие области памяти, то в случае удаленного вызова передача параметров процедуре превращается в передачу запроса по сети. Соответственно, и получение результата также осуществляется с помощью сетевых механизмов.336Глава 10. Краткий обзор современных операционных системВызов удаленных процедур включает следующие шаги [39].1.
Процесс-клиент осуществляет вызов локальной процедуры, которую называют заглушкой (stub). Задача этого модуля-заглушки — принять аргументы, преобразовать их в стандартную форму и сформировать сетевой запрос. Упаковкааргументов и создание сетевого запроса называется сборкой (marshalling).2. Сетевой запрос пересылается на удаленную систему, где соответствующий модуль ожидает такой запрос и при его получении извлекает параметры вызовапроцедуры, то есть выполняет разборку (unmarshalling), а затем передает ихсерверу удаленной процедуры.
После выполнения осуществляется обратнаяпередача.Операционная система LinuxLinux — это современная UNIX-подобная операционная система для персональных компьютеров и рабочих станций, удовлетворяющая стандарту POSIX.Как известно, Linux — это свободно распространяемая версия UNIX-систем, которая первоначально разрабатывалась Линусом Торвальдсом (torvalds@kruuna.helsinki.fi) в университете Хельсинки (Финляндия). Он предложил разрабатывать еесовместно и выдвинул условие, согласно которому исходные коды являются открытыми, любой может их использовать и изменять, но при этом обязан оставитьоткрытым и свой код, внесенный в тот или иной модуль системы.
Все компонентысистемы, включая исходные тексты, распространяются с лицензией на свободноекопирование и установку для неограниченного числа пользователей.Таким образом, система Linux была создана с помощью многих программистов и энтузиастов UNIX-систем, общающихся между собой через Интернет. К данномупроекту добровольно подключились те, кто имеет достаточно навыков и способностей развивать систему. Большинство программ Linux разработаны в рамкахпроекта GNU из Free Software Foundation (Кембридж, штат Массачусетс). Но в неговнесли свою лепту и многие программисты со всего мира.Изначально система Linux создавалась как «самодельная» UNIX-подобная реализация для машин типа IBM PC с процессором i80386.
Однако вскоре Linux сталанастолько популярна и ее поддержало такое большое число компаний, что в настоящее время имеются реализации этой операционной системы практически для всехтипов процессоров и компьютеров на их основе. На базе Linux создаются и встроенные системы, и суперкомпьютеры. Система поддерживает кластеризацию и большинство современных интерфейсов и технологий.Большинство свойств Linux присущи другим реализациям UNIX, кроме того, имеются некоторые уникальные свойства. Этот раздел представляет собой лишь краткий обзор этих свойств.Linux — это полноценная многозадачная многопользовательская операционнаясистема (точно так же, как и все другие версии UNIX).
Это означает, что одновременно много пользователей могут работать на одной машине, параллельно выполняя множество программ. Поскольку при работе за персональным компьютеромпрактически никто не подключает к нему дополнительные терминалы (хотя это вСемейство операционных систем UNIX337принципе возможно), пользователь просто имитирует работу за несколькими терминалами. В этом смысле можно говорить о виртуальных терминалах. По умолчанию пользователь регистрируется на первом терминале. При этом он получаетпримерно следующее сообщение:Mandrake Linux release 9.0 (dolphin) for i586Kernel 2.4.16-16mdk on an 1686 /ttylVienna login:Здесь во второй строке слово ttyl означает, что пользователь сейчас взаимодействует с системой через первый виртуальный терминал.
Собственно работа на немвозможна только после аутентификации — ввода своих учетного имени и пароля.При желании открыть второй или последующий сеанс работы на соответствующем терминале, пользователь должен нажать комбинацию клавиш Alt+Fi, где iобозначает номер функциональной клавиши и одновременно номер соответствующего виртуального терминала. Всего Linux поддерживает до семи терминалов,причем седьмой терминал связан с графическим режимом работы и использованием одного из оконных менеджеров.
Однако если пользователь работает в графическом режиме, то для перехода в один из алфавитно-цифровых терминалов следует воспользоваться комбинацией клавиш CtrL+Alt+Fi. В каждом сеансепользователь может запускать свои задачи.Система Linux достаточно хорошо совместима с рядом стандартов для UNIX (насколько можно говорить о стандартизации UNIX) на уровне исходных текстов,включая IEEE POSIX.l, System V и BSD. Она и создавалась с расчетом на такуюсовместимость. Большинство свободно распространяемых через Интернет программ для UNIX может быть откомпилировано для Linux практически без особыхизменений 1 . Кроме того, все исходные тексты для Linux, включая ядро, драйверыустройств, библиотеки, пользовательские программы и инструментальные средства распространяются свободно. Другие специфические внутренние черты Linuxвключают контроль работ по стандарту POSIX (используемый оболочками, такими как csh и bash), псевдотерминалы (pty), поддержку национальных и стандартных раскладок клавиатур динамически загружаемыми драйверами клавиатур.Linux поддерживает различные типы файловых систем для хранения данных.