Современные операционные системы

Современные операционные системы
Что такое операционная система / Библиотечная процедура

Библиотечная процедура




Библиотечная процедура, возможно написанная на ассемблере, обычно помещает номер системного вызова туда, где его ожидает операционная система, например в регистр (шаг 5). Затем она выполняет команду TRAP для переключения из пользовательского режима в режим ядра, и выполнение продолжается с фиксированного адреса, находящегося внутри ядра операционной системы (шаг 6). Фактически команда TRAP очень похожа на команду вызова процедуры, в том смысле, что следующая за ней команда берется из удаленного места, а адрес возврата сохраняется в стеке для последующего использования.

Тем не менее у команды TRAP и команды вызова процедуры есть два основных отличия. Во-первых, побочный эффект, заключающийся в переключении в режим ядра. Команда вызова процедуры не меняет используемый режим. А во-вторых, команда TRAP не может получить относительный или абсолютный адрес местонахождения процедуры, поскольку она не может осуществить переход на произвольный адрес.

Начавшая работу после команды TRAP часть ядра проверяет номер системного вызова, а затем передает управление нужному обработчику. Обычно передача управления осуществляется посредством таблицы указателей на обработчики системных вызовов, которая индексирована по номерам этих вызовов (шаг 7). После этого вступает в действие обработчик конкретного системного вызова (шаг 8). Как только обработчик закончит работу, управление может быть возвращено библиотечной процедуре, находящейся в пользовательской области памяти, той самой команде, которая следует за командой TRAP (шаг 9). В свою очередь эта процедура вернет управление пользовательской программе по обычной схеме возврата из процедуры (шаг 10).

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

При рассмотрении шага 9 было специально отмечено, что «управление может быть возвращено библиотечной процедуре, находящейся в пользовательской области памяти». Системный вызов может заблокировать вызывающую программу, препятствуя продолжению ее работы. Например, вызывающая программа должна быть заблокирована при попытке чтения с клавиатуры, когда на ней еще ничего не набрано. В этом случае операционная система ищет другой процесс, который может быть запущен. Позже, когда станут доступны требуемые входные данные, система вспомнит о заблокированном процессе и будут выполнены шаги с 9-го по 11-й.

В следующих разделах мы рассмотрим некоторые из наиболее востребованных системных вызовов стандарта POSIX, или, точнее, библиотечных процедур, осуществляющих эти системные вызовы. В стандарте POSIX определено более 100 процедур, обеспечивающих обращение к системным вызовам. Некоторые наиболее важные из них и сгруппированные для удобства по категориям перечислены в табл. 1.1. Далее мы кратко опишем каждый вызов и его назначение.

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

Отдельно стоит упомянуть, что отображение процедурных вызовов POSIX на системные вызовы не является взаимно однозначным. В стандарте POSIX определены процедуры, которые должна предоставить совместимая с ним система, но он не указывает, чем именно они должны быть реализованы: системными, библиотечными вызовами или чем-нибудь еще. Если процедура может быть выполнена без системного вызова (то есть без переключения в режим ядра), то она из соображений производительности обычно выполняется в пользовательском пространстве. Однако большинство процедур POSIX осуществляют системные вызовы, при этом обычно одна процедура непосредственно отображается на один системный вызов. В некоторых случаях, особенно когда несколько необходимых системе процедур мало чем отличаются друг от друга, один системный вызов обрабатывает более одного вызова библиотечных процедур. Крылышки в чили-лимонном маринаде



Полное описание: Библиотечная процедура




С этим описанием рассматриваются следующие темы:


Монолитные системы
Несомненно, такая организация операционной системы является самой распространенной. Здесь вся операционная система работает как единая программа в режиме ядра. Операционная система написана в виде набора процедур, связанных вместе в одну большую исполняемую программу. При использовании этой технологии каждая процедура может свободно вызвать любую другую процедуру, если та выполняет какое-нибудь полезное действие, в котором нуждается первая процедура. Наличие нескольких тысяч процедур, которые мо ... Читать

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

Процессоры
Центральный процессор (ЦП) — это «мозг» компьютера. Он выбирает команды из памяти и выполняет их. Обычный цикл работы центрального процессора выглядит так: выборка из памяти первой команды, ее декодирование для определения ее типа и операндов, выполнение этой команды, а затем выборка, декодирование и выполнение последующих команд. Этот цикл повторяется до тех пор, пока не закончится программа. Таким образом осуществляется выполнение программ.

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

Windows Win32 API
До сих пор мы ориентировались в основном на UNIX. Теперь настало время взглянуть и на Windows. Операционные системы Windows и UNIX фундаментально отличаются друг от друга в соответствующих моделях программирования. Программы UNIX состоят из кода, который выполняет те или иные действия, при необходимости обращаясь к системе с системными вызовами для получения конкретных услуг. В отличие от этого программа Windows управляется, как правило, событиями. Основная программа ждет, пока возникнет какое-н ... Читать