Обзор Маха

Фундаментальные службы и примитивы ядра OS X основываются на Махе 3.0. Apple изменил и расширил Маха для лучше встречи функционального OS X и цели производительности.

Мах 3.0 был первоначально задуман как простое, расширяемое, коммуникационное микроядро. Это способно к выполнению как автономное ядро, с другими традиционными службами операционной системы, такими как I/O, файловые системы и сетевые стеки, работающие как серверы непривилегированного режима.

Однако в OS X, Мах соединяется с другими компонентами ядра в единственное адресное пространство ядра. Это прежде всего для производительности; это намного быстрее для совершения прямого вызова между соединенными компонентами, чем это должно отправить сообщения или сделать вызовы удаленной процедуры (RPC) между отдельными задачами. Эта модульная структура результаты в более устойчивой и расширяемой системе, чем монолитное ядро позволила бы без потери производительности чистого микроядра.

Таким образом в OS X, Мах не является прежде всего коммуникационным концентратором между клиентами и серверами. Вместо этого ее значение состоит из ее абстракций, его расширяемости и его гибкости. В частности Мах обеспечивает

Абстракции ядра Маха

Мах обеспечивает маленький набор абстракций, разработанных, чтобы быть и простыми и мощными. Это основные абстракции ядра:

На уровне прерывания интерфейс к большинству абстракций Маха состоит из сообщений, отправленных в и от портов ядра, представляющих те объекты. Интерфейсы уровня прерывания (такой как mach_msg_overwrite_trap) и форматы сообщения самостоятельно абстрагированы в нормальном использовании Mach Interface Generator (MIG). MIG используется для компиляции процедурных интерфейсов в основанный на сообщении APIs, на основе описаний того APIs.

Задачи и потоки

Процессы OS X и потоки POSIX (pthreads) реализованы поверх задач Маха и потоков, соответственно. Поток является точкой потока управления в задаче. Задача существует для обеспечения ресурсов для потоков, которые она содержит. Это разделение сделано предусмотреть параллелизм и разделение ресурсов.

Поток

Задача

Обратите внимание на то, что задача не имеет никакой собственной жизни — только распараллеливает, выполняют инструкции. То, когда сказано, что “задача Y делает X”, что действительно предназначено, - то, что “поток, содержавший в задаче Y, делает X.”

Задачей является довольно дорогой объект. Это существует, чтобы быть набором ресурсов. Все потоки в задаче совместно используют все. Две задачи ничего не совместно используют без явного действия (несмотря на то, что действие часто просто), и некоторые ресурсы (такие как порт получают права), не может быть совместно использован двумя задачами вообще.

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

Поток является основным вычислительным объектом. Поток принадлежит одной и только одной задаче, определяющей ее виртуальное адресное пространство. Чтобы влиять на структуру адресного пространства или сослаться на любой ресурс кроме адресного пространства, поток должен выполнить специальную инструкцию прерывания, заставляющую ядро выполнять операции от имени потока или отправлять сообщение в некоторый агент от имени потока. В целом эти прерывания управляют ресурсами, связанными с задачей, содержащей поток. Запросы могут быть выполнены ядра для управления этими объектами: для создания их удалите их и влияйте на их состояние.

Мах служит гибкой основой для политик планирования потоков. Ранние версии OS X поддерживают и разделение по времени и политики фиксированного приоритета. Приоритет потока разделения по времени повышен и понижен для балансирования его потребления ресурсов относительно других потоков разделения по времени.

Потоки фиксированного приоритета выполняются для определенного кванта времени, и затем помещаются в конце очереди потоков равного приоритета. Установка фиксированного приоритетного квантового уровня потока к бесконечности позволяет потоку работать, пока это не блокирует, или пока это не вытесняется потоком более высокого приоритета. Высокий приоритет потоки в реальном времени является обычно фиксируемым приоритетом.

OS X также обеспечивает планирование ограничения времени для производительности в реальном времени. Это планирование позволяет Вам указывать, что Ваш поток должен получить определенный квант времени в определенном периоде времени.

Мах, планирующий, описан далее в Махе, Планирующем и Интерфейсах Потока.

Порты, права порта, наборы порта и пространства имен порта

За исключением виртуального адресного пространства задачи, ко всем другим ресурсам Маха получают доступ через уровень абстракции, известный как порт. Порт является конечной точкой однонаправленного канала передачи между клиентом, запрашивающим службу и сервер, кто предоставляет услугу. Если ответ должен быть предоставлен для такого запроса на обслуживание, второй порт должен использоваться. Это сопоставимо с (однонаправленным) каналом в языке UNIX.

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

Служба, которая будет предоставлена объектом, определяется менеджером, получающим запрос, отправленный к объекту. Из этого следует, что ядро является получателем для портов, связанных с предоставленными ядром объектами и что получатель для портов, связанных с предоставленными задачей объектами, является задачей, обеспечивающей те объекты.

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

Задачи имеют полномочия к портам доступа определенными способами (отправьте, получите, отправьте один раз); их вызывают правами порта. К порту можно получить доступ только через право. Порты часто используются для предоставления клиентского доступа к объектам в Махе. Имение права отправить к порту IPC объекта обозначает право управлять объектом предписанными способами. Также, владение права порта является фундаментальным механизмом защиты в Махе. Имение права на объект должно иметь возможность получить доступ или управлять тем объектом.

Права порта могут быть скопированы и перемещены между задачами через IPC. Выполнение так, в действительности, передает возможности некоторому объекту или серверу.

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

Традиционно в Махе, канал передачи, обозначенный портом, всегда был очередью сообщений. Однако OS X поддерживает дополнительные типы каналов передачи, и эти новые типы объекта IPC также представлены правами порта и портами. Посмотрите раздел Interprocess Communication (IPC) для большего количества подробных данных о сообщениях и других типах IPC.

Порты и права порта не имеют имен в масштабе всей системы, позволяющих произвольным портам или правам управляться непосредственно. Портами может управлять задача, только если задача имеет право порта в своем пространстве имен порта. Право порта указано именем порта, целочисленным индексом в 32-разрядное пространство имен порта. Каждая задача связала с ним единственное пространство имен порта.

Задачи получают права порта, когда другая задача явно вставляет их в свое пространство имен, когда они получают права в сообщениях путем создания объектов, возвращающих право на объект, и через требования Маха определенных специальных портов (mach_thread_self, mach_task_self, и mach_reply_port.)

Управление памятью

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

Когда объект памяти отображается в тот диапазон, диапазон виртуального адресного пространства заполняется с данными. Все данные в адресном пространстве в конечном счете предоставлены через объекты памяти. Мах спрашивает владельца объекта памяти (пейджер) для содержания страницы при установлении его в физической памяти и возвращает возможно измененные данные пейджеру прежде, чем предъявить претензии в отношении страницы. OS X включает два встроенных пейджера — пейджер по умолчанию и vnode пейджер.

Пейджер по умолчанию обрабатывает нестойкую память, известную как анонимная память. Анонимная память инициализируется нулем, и она существует только во время жизни задачи. vnode пейджер отображает файлы в объекты памяти. Мах экспортирует интерфейс в объекты памяти позволить их содержанию быть внесенным задачами непривилегированного режима. Этот интерфейс известен как Интерфейс управления Внешней памяти или EMMI.

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

Начинаясь в OS X v10.1, система EMMI была улучшена для поддержки «portless» EMMI. В традиционном EMMI два порта Маха создавались для каждой области памяти, и аналогично два порта для каждого кэшировали vnode. Portless EMMI, в его начальном внедрении, заменяет это ссылками непосредственной памяти (в основном указатели). В будущем выпуске порты будут использоваться для связи с пейджерами вне ядра при использовании прямых ссылок для связи с пейджерами, находящимися в пространстве ядра. Конечный результат этих изменений состоит в том, что ранние версии portless EMMI не поддерживают пейджеры, работающие за пределами пространства ядра. Эта поддержка, как ожидают, будет восстановлена в будущем выпуске.

Диапазоны адресов пространства виртуальной памяти могут также быть заполнены посредством прямого выделения (использование vm_allocate). Базовый объект виртуальной памяти является анонимным и отступает пейджером по умолчанию. Совместно используемые диапазоны адресного пространства могут также быть установлены через наследование. Когда новые задачи создаются, они клонированы от родителя. Это клонирование принадлежит базовому пространству адреса памяти также. Отображенные части объектов могут быть наследованы как копия, или, как совместно использовано, или нисколько, на основе атрибутов, связанных с отображениями. Методы Маха форма задержанной копии, которая, как известно как копия на записи, оптимизировала производительность наследованных копий на создании задачи.

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

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

Межпроцессное взаимодействие (IPC)

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

В то время как права порта обозначают разрешение использовать канал, конечные точки этих каналов передачи в Махе вызывают портами. Формы IPC, предоставленного Махом, включают

Тип объекта IPC, обозначенного портом, определяет операции, допустимые на том порту, и как (и ли) происходит передача данных.

Существует два существенно различного Маха APIs для необработанного манипулирования портами — mach_ipc семья и mach_msg семья. В причине обе семьи могут использоваться с любым объектом IPC; однако, mach_ipc вызовы предпочтены в новом коде. mach_ipc вызовы поддерживают информацию состояния, где это необходимо, для поддержки понятия транзакции. mach_msg вызовы поддерживаются для устаревшего кода, но осуждаются; они являются не сохраняющими состояние.

Транзакции IPC и диспетчеризация события

Когда поток вызывает mach_ipc_dispatch, это неоднократно обрабатывает события, входящие на наборе зарегистрированного порта. Эти события могли быть блоком параметра от объекта RPC (как результаты вызова клиента), взятый объект блокирования (в результате выпуска некоторого другого потока блокировка), уведомление или семафор, отправляемый, или сообщение, входящее от традиционной очереди сообщений.

Эти события обрабатываются через выноски от mach_msg_dispatch. Некоторые события подразумевают транзакцию во время времени жизни выноски. В случае блокировки состояние является владением блокировки. Когда выноска возвращается, блокировка выпущена. В случае вызовов удаленной процедуры состояние является идентификационными данными клиента, блоком параметра и портом ответа. Когда выноска возвращается, ответ отправляется.

Когда выноска возвращается, транзакция (если таковые имеются) завершается, и поток ожидает следующего события. mach_ipc_dispatch средство предназначается для поддержки циклов работы.

Очереди сообщений

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

Задача связывается с другой задачей путем создания структуры данных, содержащей ряд элементов данных, и затем выполнение сообщения - отправляют работу на порту, для которого это содержит, отправляют права. В некоторое более позднее время задача с получает права на тот порт, выполнит сообщение - получают работу.

Сообщение может состоять из некоторых или всего следующего:

  • чистые данные

  • копии диапазонов памяти

  • права порта

  • ядро неявные атрибуты, такие как маркер безопасности отправителя

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

Семафоры

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

Уведомления

Как семафоры, объекты уведомления также поддерживают сообщение и ожидают операции, но с добавлением поля состояния. Состояние является фиксированным размером, поле фиксированного формата, определяющееся, когда создается объект уведомления. Каждое сообщение обновляет поле состояния; существует единственное состояние, перезаписывающееся каждым сообщением.

Блокировки

Блокировка является объектом, обеспечивающим взаимоисключающий доступ к критическому разделу. Основные интерфейсы к блокировкам являются ориентированной транзакцией (см. Транзакции IPC и Диспетчеризацию События). Во время транзакции поток содержит блокировку. Когда это возвращается из транзакции, блокировка выпущена.

Объекты вызова удаленной процедуры (RPC)

Поскольку имя подразумевает, объект RPC разработан, чтобы упростить и оптимизировать вызовы удаленной процедуры. Основные интерфейсы к объектам RPC являются ориентированной транзакцией (см. Транзакции IPC и Диспетчеризацию События),

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

Управление временем

Традиционная абстракция времени в Махе является часами, обеспечивающими ряд асинхронных служб аварийных сигналов на основе mach_timespec_t. Существуют один или несколько объектов часов, каждый определяющий монотонно увеличивающуюся временную стоимость выразил в наносекундах. Часы реального времени встроены и самые важные, но могут быть другие часы для других понятий времени в системе. Операции поддержки часов для получения текущего времени, сна в течение установленного срока, поставили будильник (уведомление, отправляющееся в установленный срок), и т.д.

mach_timespec_t API осуждается в OS X. Более новый и предпочтительный API основывается на объектах таймера, которые это поочередно использует AbsoluteTime как тип исходных данных. AbsoluteTime машинно-зависимый тип, обычно основанный на собственной платформой основе времени. Подпрограммы предоставлены для преобразования AbsoluteTime значения к и от других типов данных, таких как наносекунды. Таймер возражает поддержке асинхронное, уведомление без смещений, отмена и преждевременные предупреждения. Они более эффективны и разрешают более высокое разрешение, чем часы.