Главная страница
qrcode

Староверова - Операционные системы. Учебник Н. А. Староверова 1 40


Скачать 10.33 Mb.
НазваниеУчебник Н. А. Староверова 1 40
Дата13.06.2021
Размер10.33 Mb.
Формат файлаpdf
Имя файлаСтароверова - Операционные системы.pdf
оригинальный pdf просмотр
ТипУчебник
#47222
страница3 из 46
Каталог
1   2   3   4   5   6   7   8   9   ...   46
Управление памятью низкого уровня. В микроядре должен обеспечиваться контроль над аппаратным представлением адресного пространства для того, чтобы в нем было возможно осуществление защиты на уровне процессов.
В случае если микроядро станет отвечать за отображение каждой виртуальной страницы в физический страничный блок, то блок управления памятью, охватывая систему защиты адресного пространства одного процесса от другого, а также способ замены страниц и другие логические схемы страничной организации памяти, можно реализовать за пределами ядра.
Взаимодействие между процессами. Взаимодействие между процессами и потоками в микроядерной операционной системе осуществляется при помощи сообщений. Такие сообщения состоят из заголовка с указанием идентификатора процесса, который будет являться отправителем, и процесса, который будет являться адресатом, то есть получателем, а также из тела с передаваемыми данными, указателем на блок данных или некоторыми управляющими сведениями о процессе. Чаще всего взаимодействие между процессами основано на портах, которые относятся к этим процессам. В данном случае порт будет выступать очередью сообщений, которые предназначены для какого-то определенного процесса. С портом связан список возможностей, указывающий, с какими процессами у данного процесса возможен обмен информацией. После того, как процесс разрешает доступ к себе, он отправляет сообщение ядру, в котором указана новая возможность порта.
Одна область памяти копируется в другую при передаче сообщения от одного процесса другому, если выполняется следующее условие: адресные пространства двух этих процессов не должны перекрываться. Отсюда следует, что скорость такой передачи сообщения будет связана со скоростью работы памяти, которая несоизмеримо меньше, чем скорость процессора. Вследствие чего в современных исследованиях наблюдается интерес к межпроцессному взаимодействию, основанному на потоках, и к таким схемам разделения памяти, как многократное отображение страниц.
Управление вводом-выводом и прерываниями. В архитектуре микроядра возможна обработка аппаратных прерываний аналогично сообщениям, а также возможно включение портов ввода-вывода в адресное пространство. Такое микроядро распознает прерывания, но не обрабатывает их. Оно создает сообщение процессу, который совершает работу на пользовательском уровне и связан с данным прерыванием. Отсюда следует, что ядром поддерживается такое отображение, когда разрешенное прерывание сопоставляется с процессом на пользовательском уровне. Микроядром должно выполняться превращение прерываний в сообщения, однако ядро не принимает участия в обработке аппаратно-зависимых прерываний.
16 / 40
17
Проекты NICTA Group
NICTA Group — Information and Communications Technology (ICT) Research Centre of Excellence в Австралии. Nicta это есть государственная организация, объединяющая ведущие вузы Австралии и специализирующаяся на узком направлении исследований. Сюда входят научные проекты в области системного программирования, управления, искусственного интеллекта и распознавания образов, оптики и наноэлектроники — наиболее перспективных направлений начала XXI-го века. Была создана компания OKL (Open Kernel Lab), занимавшаяся разработкой коммерческих продуктов на основе микроядра
Pistachio-embedded. В 2007 г. компания OKL анонсировала собственно микроядро OKL4, и это микроядро получило большое распространение в коммерческих продуктах в партнерстве с Qualcomm. В 2012 г. OKL4 продали компании
General Dynamics.
L4.verified — верифицированное ядро на архитектуре L4. Научная разработка NICTA Group, трек у этого проекта аналогичен проекту OKL. Идея данного проекта есть в математическом доказательстве корректности реализации ядра. Микроядерные операционные системы, имеющие минимальный размер, могут быть верифицированы. По каждой строчке кода можно будет написать выражение, функции перевести в теоремы, и дальше идет доказательство. Для
L4.verified было доказано соответствие реализации модели и отсутствие вечных циклов. Стоимость данного проекта была $ 6 млн, продолжительность — 7 лет.
Объем работы оценили в 25 человеческих лет.
seL4 — еще один проект NICTA, и он является ОС для систем безопасности. Информации мало, но есть возможность скачать данные образы.
Проекты Technische Universitat Dresden (TUD)
Группа под руководством Hermann Hartig в TUD участвовала в разработке микроядерных ОС совместно с Йохеном Лидтке. Данной группой была создана собственная реализация архитектуры L4 в микроядрах L4.Sec, Fiasco/L4.Fiasco и
Fiasco.OC. Ими была разработана ОС реального времени DROPS (Dresden RealTime Operating System Project).
Современные микроядра
Fiasco.OC микроядро, написанное на языке программирования C. Поддерживает архитектуры ARM, x86, ppc, sparc v8, современные отладочные средства и платформы Pandaboard и Beagleboard. Самостоятельно микроядро действовать не может, значит, у него должно быть окружение — набор прикладных программ и модулей, реализующих полезный функционал. Его окружением является L4Re (L4 Runtime Environment). В его состав входят паравиртуализированный L4Linux, который позволяет использовать скомпилированное для Linux прикладное ПО, DDEKit — набор исходного кода (wrapper), который позволяет использовать драйверы ОС Linux, большой набор библиотек и прикладных программ, адаптированных для запуска поверх микроядра. Стоит выделить TCP/IP Стек LwIP, Nitpicker и Mag. Они позволяют создавать на основе микроядра Fiasco.OC современные аппаратно-программные комплексы.
17 / 40
18
Genode Framework является Open Source проектом выпускников TUD.
Перед разработчиками стояла задача создания унифицированного окружения для множества разных микроядерных проектов. Важными качествами являются наличие доверенного графического интерфейса пользователя (GUI), поддержка
Qt. Аналогично присутствует поддержка L4Linux для ядра OKL4. Оно содержит собственное ядро с минимальным функционалом, называемым base-hw.
Genode стал способен совершать сборку и отладку окружения. Genode поддерживает механизмы аппаратной виртуализации ARM TrustZone, это позволяет использовать этот фреймворк для создания доверенных решений.
Микрогипервизор NOVA (NOVA OS Virtualization Architecture) является гипервизором первого порядка, запускается напрямую на аппаратной платформе. Разработан выпускниками TUD и развивается в Intel. В его основе находится микроядерная ОС архитектуры L4. Архитектура системы такова, что позволяет исполнять прикладное ПО параллельно с виртуальными машинами. На основе гипервизора NOVA можно создавать доверенные решения, в которых доверенное ПО будет исполняться в отдельном окружении. Genode NOVA поддерживает собственное окружение NOVA User Land (NUL).
Проект MINIX3. MINIX3 являлся учебным проектом по разработке ОС.
Эндрю Таненбаум, разработчик системы, является автором множества учебников по архитектуре вычислительных и ОС. Особое внимание в микроядре
MINIX3 сделан на отказоустойчивости и безопасности. Данная система обладает многофункциональным графическим интерфейсом пользователя (GUI) и может быть использована в качестве настольной (Desktop) системы. Сейчас
MINIX3 продолжает свое развитие.
Принцип уровней абстракций
при разработке операционных систем
В современном мире происходит интенсивная разработка программного обеспечения, что повышает требования к подготовке будущих инженеровпрограммистов. Один из аспектов, который требует пристального внимания, это изучение рефлексивных и абстрактных способов мышления, особенно в курсах, посвященных гуманитарным аспектам программирования. В предлагаемой статье рассматривается уровень абстракций, который достаточно широко применяется в программировании.
Один из путей приучения будущих специалистов к абстрактному мышлению — это изучение конкретных примеров программного обеспечения с целью понимания имеющихся там уровней абстракции.
Рассмотрим первоначально общие понятия, а затем, конкретный пример использования данного механизма в разработке операционных систем.
Уровень абстракции представляет собой способ сокрытия деталей реализации определенного набора функциональных возможностей, который применяется для управления сложной проектируемой системы. При этом система подразделяется на несколько уровней. Детали нижних уровней скрываются, дабы обеспечить верхним уровням более простые модели [4].
18 / 40
19
На самом нижнем уровне общение программиста с машиной осуществляется с помощью нулей и единиц. Так как это не совсем удобно, был изобретен более высокий уровень абстракции — язык ассемблера [5]. Но и этот язык оказался не совсем удобным в использовании, так как представлял собой символическую форму двоичного языка компьютера. Поэтому был создан еще более высокий уровень абстракции — язык программирования высокого уровня
(ЯВУ). Сейчас уже насчитывается около сотни таких языков. К примеру, Basic,
C, C++, Cobol и RPG.
И все-таки, первые языки программирования позволяли программисту абстрагироваться от конкретных машинных деталей и уменьшить количество уровней абстракции. Именно в этом причина их успеха. Фактически эти языки позволяли программисту работать почти на том же уровне абстракции, какой был в прикладной задаче. Дело в том, что задачи решались хорошо математически определенные, сложные в основном по логике, а математические объекты были самые элементарные — переменная, вектор, матрица. Для тех времен такой абстракции было вполне достаточно — и достаточно сейчас для решения большинства вычислительных задач.
При таком подходе программирование — это перенесение логики алгоритма на язык программирования, не более того. Все сводится к логике.
Крупным достижением тех времен были подпрограммы [6]. Вызывая подпрограммы, программист абстрагируется от логики их выполнения. Если удачно разбить программу на подпрограммы, в каждой из них есть возможность работать на одном уровне абстракции — скажем, подпрограмма перемножения матриц имеет дело только с элементами. В головной же программе программист работает уже с матрицами, не опускаясь до уровня элементов, т. е. количество уровней абстракции уменьшается (точнее говоря, уменьшается не само количество этих уровней, а количество уровней, с которыми работает в данный момент программист). Именно в этом главное преимущество подпрограмм, но не все это понимают, и потому выделяют в подпрограмму обычно просто повторяющиеся действия, не связывая их с понятием абстракции. Возможно, это тоже преимущество подпрограмм, но экономия сил в данном случае — не главный выигрыш. Если не выделен абстрактный объект, который
«прячется» за подпрограммой, то эту подпрограмму ждет нелегкое будущее — она либо не будет использоваться, либо будет бесконечно переделываться.
Если же понимать подпрограмму с точки зрения абстрагирования, то мы неизбежно приходим к иерархическому построению программы, соответствующему последовательному раскрытию абстрактных объектов. Майерс приводит следующие свойства этих уровней [7]:
1. На каждом уровне не известно о свойствах и даже о существовании более высоких уровней.
2. На каждом уровне ничего не известно о внутреннем строении других уровней.
3. Каждый уровень представляется группой модулей.
4. Каждый уровень располагает определенными ресурсами, которые скрывает от других уровней или представляет им некоторые их абстракции.
19 / 40
20 5. Каждый уровень может обеспечивать некоторую абстракцию данных в системе.
6. Предположения, которые на каждом уровне делаются относительно других уровней, должны быть минимальны.
7. Связи между уровнями ограничены явными аргументами.
8. Каждый уровень должен иметь высокую прочность и слабое сцепление.
Таким образом, прежде чем проектировать систему, нужно представить ее иерархически. Это прямо вытекает из организации человеческого мозга. Он может манипулировать ограниченным количеством объектов (не более семи) и к тому же способен эффективно понимать одновременно не более двух уровней абстракции — текущий и предыдущий. Поэтому, если при написании программы углубиться в детали, чтобы реализовать некий сегмент, то потом, выйдя из него, с трудом можно вспомнить, зачем это было нужно. Нисходящий подход родился именно из этих соображений — нужно было найти путь такой, чтобы во время всего процесса проектирования находиться на одном уровне абстракции и манипулировать, возможно, меньшим количеством объектов. Подход хорош, но не идеален, так как выделять абстрактные объекты человек по природе не способен, и потому уровни абстракции распределяются в соответствии с логикой программы. Человек по-прежнему абстрагируется от логики программы, но, как правило, вынужден точно определять данные, проходящие через несколько сегментов программы. Поэтому уровни абстракции не получаются, получаются просто уровни подпрограмм. И, если в хорошо определенных математических задачах этот фокус проходит, так как там абстракция идет в основном по логике, то для других задач — нет. В области численных задач был даже такой период, когда намечалось написание универсальных подпрограмм, которые останется только вызывать в определенном порядке.
Однако в целом этот метод не оправдался, так как программирование ушло от вычислительных задач и шагнуло к информационным, а тут уже на первое место вышли не логика, а данные. И если раньше задача была — при бедном наборе типов данных реализовать как можно больше функций над ними, то теперь — при довольно бедном наборе функций охватить как можно больше типов данных.
Все усилия в основном направлены на то, чтобы одну и ту же функцию распространить на разные типы данных, например, посчитать одномерную таблицу не только по дискретным предположениям, но и по непрерывным, и по символьным, причем уметь задавать какие-то структуры внутри этих данных
(интервалы, автоматические и ручные) — вот теперь группировка альтернатив и разные классы эквивалентности; при всем при этом функция остается та же — напечатать таблицу распределения частот.
На этом пути создаются всяческие языки, ориентированные на данные.
Понятно, что используя достижения предыдущего этапа — от логики человек привычно абстрагируется подпрограммами. Однако и тут не предел развития, потому что на самом деле (без машины) человек (разработчик) работает не в терминах логики и/или данных — он оперирует с объектами, имеющими определенные свойства.
20 / 40
21
Можно предположить, что современное программирование идет именно к этому. Уже достаточно очевидно, что фактически речь идет об абстрактных типах данных, но предпочтительнее говорить о более широком понятии — объектно-ориентированном подходе к программированию. Это значительно шире, так как, кроме технических средств (языков и т. д.), здесь речь идет и об изменении мышления программиста.
Разработка программы на языке высокого уровня является наглядной иллюстрацией многоуровневой абстракции. Компилятор преобразует программы на ЯВУ в язык ассемблера, который затем переводит команды в двоичный код, понятный для процессора. Необходимо заметить, что некоторые компиляторы генерируют команды уже непосредственно на машинном языке, минуя уровень ассемблера.
Перед выполнением программы на ЯВУ компилятор и ассемблер транслируют ее в команды машинного языка. Эта операция выполняется всего раз, и нет необходимости ее повторять при очередном запуске, если только исходный текст программы не был изменен. Наличие нескольких уровней позволяет скрыть детали нижележащего машинного языка от программиста, что уже было сказано ранее, и обеспечить более производительный и простой интерфейс.
Примерами моделей программного обеспечения, использующих уровни абстракции, являются семиуровневая модель OSI для протоколов передачи данных компьютерных сетей, библиотека графических примитивов OpenGL, модель ввода-вывода на основе потоков байтов из Unix, адаптированная MS
DOS, Linux и многие другие современные операционные системы [8].
К примеру, в сетевой модели OSI содержится семь уровней абстракции:
Физический — самый нижний уровень абстракции этой модели, который отвечает за передачу данных, которые представлены в двоичном коде, от устройства к устройству. К нему относятся физические, механические и электрические интерфейсы между двумя системами. Все функции этого уровня реализуются на устройствах, подключенных к сети.
Канальный — уровень, предназначенный для обеспечения взаимодействия сетей на физическом уровне, а также выявления и исправления ошибок, которые могут возникнуть при этом. Полученные с нижнего (физического) уровня данные упаковываются в кадры, проверяются на целостность, исправляются, если это необходимо, и только потом отправляются на уровень выше, на сетевой уровень.
Сетевой — уровень, необходимый для определения пути передачи данных, т. е. определения кратчайшего маршрута передачи данных от источника к получателю, отслеживания ошибок и «заторов» в сети, а также коммутацию и маршрутизацию.
Транспортный — уровень абстракции, необходимый для обеспечения надежной передачи данных. Но при этом необходимо учитывать, что уровень этой надежности может находиться в широких пределах. К примеру, существуют протоколы, осуществляющие только основные транспортные функции, например, без подтверждения приема данных, и протоколы, осуществляющие не только основные, но и дополнительные функции, такие как доставка не
21 / 40
22 скольких пакетов данных в определенной последовательности, достоверность принятых данных и управление этими потоками данных.
Сеансовый — уровень, обеспечивающий поддержание сеанса связи и позволяющий приложениям взаимодействовать друг с другом длительное время.
Также на этом уровне создается/завершается сеанс, осуществляется синхронизация задач, определяются права на передачу данных и поддержание неактивного сеанса.
Представительский — уровень, обеспечивающий преобразование протоколов и кодирование/декодирование данных. Этот уровень представляется как промежуточный протокол для преобразования информации, полученной из соседних уровней. То есть запросы приложений с прикладного уровня здесь преобразуются в формат для передачи по сети, а данные, полученные из сети, преобразуются в формат приложений. Также этот уровень абстракции форматирует и преобразовывает код, чтобы обеспечить приложению ту информацию, с которой он мог бы работать и которая имела бы смысл, переводит данные из одного формата в другой. Еще одной функцией этого уровня является защита информации от несанкционированного доступа при пересылке. Для этого на этом уровне существуют подпрограммы, сжимающие текст и преобразовывающие графические файлы в битовые потоки для дальнейшей передачи по сети. Соответственно, уровень представления отвечает за организацию и защиту данных при пересылке.
Прикладной — самый верхний уровень абстракции модели, который обеспечивает взаимодействие пользователя с сетью:
– осуществляет удаленный доступ к файлам и базам данных и пересылку электронной почты;
– отвечает за передачу служебной информации;
– предоставляет приложениям информацию об ошибках;
– формирует запросы к представительскому уровню.
Этот уровень содержит набор популярных протоколов, необходимых пользователям, к примеру протокол, передачи гипертекста HTTP.
Типичное представление с точки зрения архитектуры компьютера системы в виде последовательности уровней абстракции:
– компьютерная техника;
– прошивка;
– язык ассемблера;
– ядро операционной системы;
– приложения.
При этом необходимо упомянуть, что любой из протоколов модели OSI может взаимодействовать только с протоколами своего уровня и с протоколами на единицу выше и/или ниже своего уровня. Также любой протокол модели OSI может выполнять только функции своего уровня и никакого другого больше.
Причин, по которым модель OSI не была реализована, не так уж и мало:
– в связи с затянувшейся разработкой протоколов OSI, основным используемым стеком протоколов стал TCP/IP, разработанный еще до принятия моде
22 / 40
23 ли OSI, и вне связи с ней ни одна из компаний не стала поддерживать очередной стек протокол, ожидая, что это сделает кто-то другой;
– несовершенство разработанной модели, в том числе и ее протоколов.
В результате этого два уровня (сеансовый и уровень представления) оказались пусты, в то время как два других перегружены (сетевой и передачи данных);
– сложность модели и протоколов, а также медлительность первых и последующих реализаций;
– неудачная политика тоже сыграла свою роль, так как разработчики пытались навязать исследователям и программистам неудавшийся в техническом отношении стандарт, что не способствовало продвижению этой модели.
Проанализировав вышесказанное, можно сделать вывод, что использование уровней абстракции в разработке операционных систем имеет особое место, так как декомпозиция системы весьма удобна для обработки и восприятия.
В первую очередь, восприятия разработчика. Также необходимо учесть, что число уровней не должно превышать семи, так как на примере модели OSI можно убедиться, насколько усложнится задача при увеличении числа уровней абстракции.
Но все-таки, несмотря на все свои недостатки, модель OSI (кроме сеансового уровня и уровня представления) показала себя исключительно полезной для теоретических дискуссий о компьютерных сетях.
Таким образом мы вновь возвращаемся к утверждению, что уровни абстракции, как было сказано ранее, подталкивают нас к более обширному понятию как ООП (объектно-ориентированное программирование), где необходимо не только объектное мышление, но и верно выбранные уровни абстракции. Сделав это, разработчик уже может свободно представлять вещи в виде объектов и их взаимодействия, будь то реализация протокола, бизнес-процесса или слоя доступа к базе данных. Соответственно, уровни абстракции весьма полезны для правильного представления и последующего решения поставленной задачи.
23 / 40
24
1   2   3   4   5   6   7   8   9   ...   46

перейти в каталог файлов


связь с админом