Саратовский государственный технический университет Учебное пособие ОПЕРАЦИОННЫЕ СИСТЕМЫ ОС общего назначения САРАТОВ 2011 РЕФЕРАТ Рассматривается назначение и функции операционных систем, их классификация, особенности операционных систем реального времени, управление процессами и потоками в операционных системах Windows NT и QNX Neutrino, диспетчеризации и синхронизации протоков, межпроцессное взаимодействие, многопроцессорный режим работы вычислительных систем, принципы управления памятью, организация локальных сетей, принципы построения и защиты от сбоев и несанкционированного доступа. Учебное пособие разработано на основе курса лекций по дисциплине «Операционные системы» для бакалавров направления 230700.62, читаемой на кафедре «Системотехника» Саратовского государственного технического университета. Учебное пособие содержит 236 с., Ил. 70 , табл. 14, библиогр.: 33 назв. Заказ 902/88 Петров Дмитрий Юрьевич 2 СОДЕРЖАНИЕ ВВЕДЕНИЕ .............................................................................................................. 5 1. ОСНОВНЫЕ ПОНЯТИЯ В ОПЕРАЦИОННЫХ СИСТЕМАХ ..................... 7 1.1. Классификация и функции операционных систем .................................... 7 1.2. Выполнение команд в вычислительной системе ..................................... 19 1.3. Прерывания .................................................................................................. 25 1.4 Архитектуры операционных систем .......................................................... 29 1.5. Управление оперативной памятью вычислительной системы ............... 33 1.6. Общие сведения о процессах и потоках ................................................... 42 2. ОПЕРАЦИОННАЯ СИСТЕМА WINDOWS ................................................. 48 2.1. Версии операционной системы Windows ................................................. 48 2.2. Архитектура операционной системы WINDOWS ................................. 52 2.3. Процессы и потоки в Windows.................................................................. 57 2.4. Взаимодействие процессов ........................................................................ 61 2.5. Управление потоками в Windows .............................................................. 65 2.6. Файловые системы Windows ..................................................................... 69 2.7. Установка и последовательность загрузки Windows .............................. 80 2.8. Интерпретатор команд и пакетные файлы ............................................... 85 2.9. Конфигурирование Windows...................................................................... 90 3. ОПЕРАЦИОННАЯ СИСТЕМА QNX NEUTRINO...................................... 100 3.1. Версии операционной системы QNX Neutrino....................................... 100 3.2. Архитектура операционной системы QNX Neutrino ............................ 105 3.3. Процессы в QNX6 ..................................................................................... 113 3.4. Потоки в QNX6 .......................................................................................... 128 3.5. Управление потоками и процессами в QNX6 ........................................ 142 3.6. Файловые системы QNX ......................................................................... 156 3.7. Инсталляция и последовательность загрузки QNX ............................... 161 3.8. Интерпретаторы команд и пакетные файлы в QNX .............................. 164 3.9. Конфигурирование QNX .......................................................................... 168 3 4. ВИРТУАЛЬНЫЕ МАШИНЫ ........................................................................ 171 4.1. Общие сведения о виртуальных машинах .............................................. 171 4.2. Работа с виртуальной машиной VmWare ............................................... 174 5. ЗАЩИТА ОТ СБОЕВ И НЕСАНКЦИОНИРОВАННОГО ДОСТУПА .... 180 5.1. Принципы построения систем безопасности ......................................... 180 5.2. Безопасность операционной системы WINDOWS ................................ 189 6. СЕТЕВЫЕ ВОЗМОЖНОСТИ ОПЕРАЦИОННЫХ СИСТЕМ ................... 197 6.1. Аппратаное обеспечение локальных сетей ........................................... 197 6.2. Сети Windows ........................................................................................... 207 6.3. Локальная сеть на основе QNET............................................................. 213 6.4. Глобальные сети ........................................................................................ 219 7. МНОГОПРОЦЕССОРНЫЕ СИСТЕМЫ ...................................................... 225 7.1. Архитектуры многопроцессорных операционных систем ................. 225 7.2. Принципы функционирования SMP........................................................ 229 7.3. Принципы функционирования кластеров............................................... 232 СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ ........................................... 235 4 ВВЕДЕНИЕ Учебное пособие посвящено описанию концепций, структуры и механизмов различных операционных систем. В настоящее время в различных областях деятельности человека используется огромное количество и разнообразие компьютеров от сотовых телефонов до бортовых компьютеров транспортных средств и от ноутбуков до центров обработки данных. Все они управляются операционными системами, которые непрерывно совершенствуются. Несмотря на такое разнообразие систем и постоянно происходящие изменения, многие фундаментальные положения остаются неизменными. Большинство пользователей, в том числе и студенты, не эффективно используют персональные компьютеры. Это связано со сложностью изучения и запоминания огромного количества частных рецептов для улучшения работы компьютера. В тоже время знание некоторых принципов может повысить эффективность эксплуатации вычислительной техники. Поэтому основной целью учебного пособия является рассмотрение основополагающих принципов устройства операционных систем, их взаимосвязей с различными новациями в этой области, а также с современными направлениями развития операционных систем. В учебное пособие построено на сравнении особенностей операционных система общего назначения и реального времени. При этом в начале рассматриваются общие аспекты операционных систем, такие как назначение, функции, понятия процессов и потоков и их состояний на этапах жизненного цикла, а затем демонстрация их особенностей на примерах программного кода и профилей их выполнения. Такой подход улучшает освоение материала. Данное учебное пособие может использоваться для самостоятельного и дистанционного обучения. Большое внимание уделено принципам управления процессами и потоками в операционных системах Windows NT и QNX Neutrino, диспетчериза5 ции и синхронизации протоков, межпроцессному взаимодействию и принципам управления памятью. Рассмотрение особенностей виртуальных машин, многопроцессорных режимов работы вычислительных систем, организации локальных сетей и принципы построения и защиты от сбоев и несанкционированного доступа позволяет студентам понять функциональные возможности и перспективы развития операционных систем выполнено. В каждой главе содержатся практические рекомендации, которые помогут студентам повысить эффективность функционирования своих вычислительных систем. Учебное пособие разработано на основе курса лекций по дисциплине «Операционные системы» читаемой на кафедре «Информационные системы и технологии» Саратовского государственного аграрного университета для бакалавров направления «Информатика и вычислительная техника» 230700.62. В предлагаемом учебном пособии найдено эффективное соотношение теоретического материала и конкретных практических рекомендаций по применению операционных систем в организационно-технических системах. 6 1. ОСНОВНЫЕ ПОНЯТИЯ В ОПЕРАЦИОННЫХ СИСТЕМАХ 1.1. Классификация и функции операционных систем Операционная система (ОС) (англ. operating system) — базовый комплекс компьютерных программ, обеспечивающий интерфейс с пользователем, управление аппаратными средствами компьютера, работу с файлами, ввод и вывод данных, а также выполнение прикладных программ и утилит. ОС позволяет абстрагироваться от деталей реализации аппаратного обеспечения вычислительной системы (ВС), предоставляя разработчикам программного обеспечения минимально необходимый набор функций. С точки зрения обычных пользователей компьютерной техники ОС включает в себя и программы пользовательского интерфейса. Вычислительные системы состоят из аппаратного и программного обеспечения. Программное состоит из системного и прикладного. Системное программное обеспечение - программы и комплексы программ, являющиеся общими для всех, кто использует совместно технические средства компьютера и применяемые как для разработки новых программ, так и для организации выполнения существующих программ [2]. В этом смысле системное программное обеспечение может быть разделено на 5 групп (рис.1): 1. операционные системы (ОС); 2. системы программирования; 3. утилиты (специальные системные программы, с помощью кото- рых обслуживается сама ОС); 4. интерфейсные оболочки для взаимодействия с пользователем; 5. системы управления файлами Под операционной системой понимают комплекс управляющих и обрабатывающих программ, которые с одной стороны, выступают как интерфейс между аппаратными средствами компьютера и пользователем с его задачами, а с другой, предназначен для более эффективного использования ресурсов вычислительной системы и организации надёжных вычислений. 7 Рис. 1. Структура системного программного обеспечения Наиболее общей является следующая классификация ОС: 1. однозадачные (однопрограммные) (MS-DOS) и многозадачные (QNX, Windows); 2. однопользовательские (Windows) и многопользовательские (один центральный процессор и блок оперативной памяти соединялся с многочисленными терминалами (UNIX)); 3. однопроцессорные (Windows 98) и многопроцессорные (Windows NT, Linux); 4. общего назначения (Windows) и реального времени (QNX Neutrino, LynxOS-178). ОС общего назначения - системы, где время реализации функций не критично и не определяет качества функционирования ВС. В ОС жёсткого реального времени (QNX Neutrino) невыполнение тех или иных функций за определённый промежуток времени приводит к отказу всей ВС. ОС мягкого реального времени близки к ОС общего назначения, но в оценке их качества функционирования фигурирует время выполнения функций, но их несвоевременное выполнение не приводит к отказу ВС (Linux). На рис.2. представлено распределение наиболее известных ОС в пространстве категорий: 8 1. максимально эффективное использование ВС при ограниченном удобстве пользователя (ОС жесткого реального времени), 2. максимальное удобство пользователя при не эффективном использовании ВС (ОС общего назначения), 3. возможность адаптации ОС к ограниченным аппаратным средствам ВС (встраиваемость ОС) ОС общего назначения Рис.2. Классификация ОС Выделяют следующие основные функции операционных систем [2]: 1. приём от пользователя заданий или команд, сформированных на соответствующем языке и их обработка; 2. приём и исполнение программных запросов на запуск, приостановку и остановку других программ; 3. загрузка в оперативную память подлежащих исполнению программ; 4. инициализация программ (передача управления программе, в результате чего процессор начинает исполнение команд программы); 5. идентификация всех программ и данных; 6. обеспечение работы системы управления файлами и базами данных, что обеспечивает увеличение эффективности работы всего программного обеспечения; 9 7. обеспечение режима многозадачности (мультизадачности), т. е. исполнение двух и более программ на одном процессоре; 8. обеспечение функций по организации и управлению всеми операциями ввода/вывода; 9. удовлетворение жёстким ограничениям на время ответа (тайм-аут) в режиме реального времени; 10. распределение оперативной памяти и организация виртуальной памяти; 11. планирование и диспетчеризация задач в соответствии с заданной стратегией дисциплиной обслуживания; 12. организация механизмов обмена сообщениями и данными между выполняющимися программами; 13. защита одной программы от влияния другой, обеспечение сохранности данных; 14. предоставление услуг на случай частичного сбоя системы; 15. обеспечение работы систем программирования, с помощью которых пользователь разрабатывает свои прикладные программы; 16. обеспечение сетевых функций. ОС выполняет функцию управления вычислительными процессами (ВП) в ВС, распределяет ресурсы ВС между различными вычислительными процессами. Совокупность ВП образует программную среду, в которой выполняются программы пользователей. Такая среда называется операционной. Параллельное существование терминов «ОС» и «операционная среда» вызвано тем, что ОС может поддерживать несколько операционных сред. Например, ОС Windows XP может выполнять следующие программы: 1. Родные программы, созданные с помощью 32-битного программного интерфейса этой ОС; 2. Родные программы, созданные с помощью 64-битного программного интерфейса этой ОС; 3. 16-битные приложения для MS-DOS; 4. 16-битные приложения для Windows 3x. 10 ОС может включать в себя несколько пользовательских и программных интерфейсов. Например, Linux имеет три пользовательских интерфейса: 1. командная строка; 2. файловый менеджер Midnight commander - аналог Norton commander; 3. графический интерфейс – X-Windows. Вычислительный процесс – выполнение отдельной программы с ее данными на процессоре. Далее термину ВП будет соответствовать термин задача. Вычислительный ресурс – повторно используемый относительно стабильный и часто недостающий объект, который запрашивается, используется и освобождается ВП в период их активности. Ресурс – всякий объект, который может распределяться внутри системы. Выделяют ресурсы делимые и неделимые. Ресурсами ВС являются: оперативная память, процессорное время, дисковое пространство, порты ввода-вывода, файлы, каналы ввода/вывода, периферийные устройства, программные и информационные объекты, сообщения и синхросигналы, которыми обмениваются процессы. Схема состояний задачи в ВС показана на рис.3. ВП могут быть в активном состоянии, участвуя в конкуренции за ресурсы, и в пассивном, не участвуя в нем [2]. Пассивное Активное Выполнение Бездействие Готовность Блокирование Рис.3. Схема состояния задачи в вычислительной системе Активное состояние: выполнение – все затребованные ресурсы выделены, в каждый момент времени в нем находится только один процесс (в компьютере с одним процессором); готовность к выполнению – все ресурсы предоставлены за исключением процессорного времени; блокирование (ожидание) – не все ресурсы предоставлены или не завершены операции ввода-вывода. 11 Суть многозадачности заключается в том, что пока один вычислительный процесс ожидает завершения очередной операции ввода-вывода (IO), другой вычислительный процесс может быть запущен на выполнение в процессоре (рис.4) [3]. Программа А Работа А Ожидание Работа А Ожидание время ЦП для ВП А А) Однозадачность Программа А Программа B Совместная работа A, B Работа А Ожидание Ожида- Работа ние B Работа Работа А B Работа А Ожидание Ожидание Ожидание Работа Работа А B Программа B Работа А Работа А Ожидание Ожида- Работа ние B время ЦП для ВП В Ожидание Ожидание Работа B Ожидание Ожидание время ЦП для ВП А и В Б) Многозадачность – две программы Программа А время ЦП для ВП А Работа B время ЦП для ВП А Ожидание время ЦП для ВП В Программа C Совместная работа A, B, C Ожидание Работа C Ожидание Работа Ожидание C время ЦП для ВП С Работа Работа Работа Ожидание А B C Работа Работа Работа Ожидание А B C В) Многозадачность – три программы время ЦП для ВП А, В, С Рис.4. Пример однозадачного и многозадачного исполнения ВП При многозадачности повышается производительность системы, но отдельные процессы никогда не смогут быть выполнены быстрее, чем в однопрограммной ОС, из-за время ожидания освобождения ресурсов. ОС поддерживающая многозадачность стремится эффективно использовать вычислительные ресурсы путём организации к ним очередей запросов, организованных тем или иным способом. В современной ОС выделяют уровни [3]: 12 В 1 уровень входят электронные схемы, объектами уровня являются регистры, ячейки памяти, логические элементы, над ними выполняются различные действия, например, очистка содержимого регистра или считывание ячейки памяти. 2 уровень: набор команд (инструкций) процессора; в число операций, выполняемых на этом уровне входят те, которые допускаются набором команд машинного языка (add, sub, mov, jmp). 3 уровень: содержит концепцию процедуры (подпрограмму), а так же операции вызова и возврата (call, push, pop). 4 уровень: уровень прерывания, который заставляет процессор сохранить текущий контекст и выполнить подпрограмму обработку прерывания. Первые 4 уровня не являются частью ОС, они составляют аппаратное обеспечение процессора, однако на этих уровнях уже появляются некоторые элементы ОС, такие как подпрограммы обработки прерываний. С 5-ого уровня начинается собственно ОС и здесь используются концепции, связанные с многозадачностью. 5 уровень: здесь вводится понятие процесса под которым понимается работающая программа, для реализации многозадачности нужно сохранить значения регистров аппаратного обеспечения, чтобы можно было переключиться с одного процесса на другой, кроме того, эти процессы должны взаимодействовать между собой, для этого необходим механизм синхронизации. Простейшим способом передачи сигнала между процессами является семафор. 6 уровень: компоненты этого уровня взаимодействуют со вспомогательными ЗУ компьютера, на этом уровне происходит позиционирование считывающих головок и физическая передача блоков данных. Для планирования работы и уведомления процесса о завершении запрошенной операции этот уровень использует компоненты предыдущего уровня. 7 уровень: создаёт логическое адресное пространство процессов, виртуальное адресное пространство в виде блоков, которые могут перемещаться между ОП и вспомогательными ЗУ. Здесь используют схемы: использование 13 страниц фиксированного размера, использование страниц переменного размера и их комбинация. Если нужный блок отсутствует в ОП, то этот уровень передаёт запрос предыдущему уровню о передаче этого блока. Описанные выше уровни обеспечивают взаимодействие ОС с процессором, компоненты ОС, начиная с 8 уровня, обеспечивают взаимодействие с внешними объектами (ПУ, сети компьютеров). Объектами этих уровней являются логически именованные объекты, которые смогут совместно использоваться несколькими процессами, использующимися на одном или нескольких компьютерах. 8 уровень: отвечает за обмен информацией и сообщениями между процессами, здесь обмен более богатый, чем на 5 уровне, он обеспечивает работу первичного сигнального механизма для синхронизации процессов. Одним из наиболее мощных инструментов такого типа является конвейер, который представляет собой логический канал передачи данных между процессами. Конвейер определяется как канал передающий выход одного процесса на вход другого, кроме того, он может быть использован для связи с процессом внешних устройств или файлов. 9 уровень: обеспечивает долгосрочное хранение файлов, на этом уровне данные, хранящиеся на вспомогательных ЗУ рассматриваются как абстрактные объекты переменной длинны, в противоположность аппаратнозависимому рассмотрению вторичной памяти, как набора дорожек, секторов и блоков фиксированного размера присущему 6 уровню. 10 уровень: предоставляет доступ к внешним устройствам с помощью стандартных интерфейсов. 11 уровень: поддерживает связь между внешними и внутренними идентификаторами системных ресурсов и объектов. Внешний идентификатор – это имя, которое может использоваться приложением или пользователем. Внутренний идентификатор – это адрес или другой идентификатор, используемый нижними уровнями ОС для обнаружения объекта и управления им, эта связь поддерживается с помощью каталога, который включает в себя не 14 только взаимное отображение внешних и внутренних идентификаторов, но и другие характеристики (например, пространство доступа). 12 уровень: предоставляет полнофункциональные средства поддержки процессов, возможности этого уровня на много больше уровня 5 на котором, поддерживается только содержимое регистров процессора, имеющее отношение к процессу и логика диспетчеризации процессов. Сюда же относится и виртуальное адресное пространство процессов, список объектов и процессов с которыми они могут взаимодействовать и правила, ограничивающие это взаимодействие, параметры передаваемые процессом при их создании и прочие характеристики, которые могут быть использованы ОС для управления. 13 уровень: обеспечивает взаимодействие ОС с пользователем, обычно называется оболочкой, т. к. он отделяет пользователей от деталей внутреннего устройства ОС и предоставляет её пользователю как набор сервисов. Оболочка принимает команды пользователя или инструкцию управления зданиями, интерпретирует их, создаёт необходимые процессы и управляет ими. На этом уровне, например, может быть реализован графический интерфейс, предоставляющий пользователю возможность выбора команды с помощью меню и отображающий результаты работы на экране. 1.2. ОС общего назначения и реального времени Аппаратными средствами современных вычислительных систем управляют программные комплексы называемые операционными системами. Они обеспечивают взаимодействие компьютера с пользователем и другими компьютерами. Это взаимодействие основано на двух противоречивых критериях: повышение эффективности работы пользователя за счет неэффективного использования аппаратных средств и повышение надежности вычислений за счет ограничения эффективности работы пользователя. Первому критерию соответствуют операционные системы общего назначения (Windows, Linux), второму – операционные системы реального времени (QNX, VxWorks). 15 Существует множество определений термина операционная система реального времени взаимодополняющих друг друга [1]. Самыми распространёнными из них являются: 1. Операционная система, в которой успешность работы любой программы зависит не только от её логической правильности, но и от времени, за которое получается результат. Если система не может удовлетворить временным ограничениям, должен быть зафиксирован сбой в её работе. 2. В соответствии со стандартом POSIX 1003.1: «Реальное время в операционных системах — это способность операционной системы обеспечить требуемый уровень сервиса в определённый промежуток времени». 3. Операционная система, реагирующая в предсказуемое время на непредсказуемое появление внешних событий. 4. Интерактивные системы постоянной готовности. В категорию ОСРВ интерактивные системы постоянной готовности относят, исходя из маркетинговых соображений, и если интерактивную программу называют «работающей в РВ», то это означает, что запросы от пользователя обрабатываются с задержкой, незаметной для человека. В табл. 1 приведен сравнительный анализ ОСРВ и систем общего назначения. Сравнительный анализ ОС РВ и общего назначения Характеристики Основная задача На что ориентирована Как позиционируется Кому предназначена ОС реального времени Успеть среагировать на события, происходящие на оборудовании Обработка внешних событий Инструмент для создания конкретного аппаратнопрограммного комплекса реального времени Квалифицированный разработчик Таблица 1 ОС общего назначения Оптимально распределить ресурсы компьютера между пользователями и задачами Обработка действий пользователя Воспринимается пользователем как набор приложений, готовых к использованию Пользователь средней квалификации ОС РВ бывают двух типов — системы жесткого и мягкого РВ. 16 Операционная система, которая может обеспечить требуемое время выполнения задачи РВ даже в худших случаях, называется операционной системой жёсткого РВ. Операционная система, которая может обеспечить требуемое время выполнения задачи реального времени в среднем, называется операционной системой мягкого РВ. Системы жёсткого реального времени не допускают задержек реакции системы, так как это может привести: к потере актуальности результатов; к большим финансовым потерям; к авариям и катастрофам. Если не выполняется обработка критических ситуаций, либо она происходит недостаточно быстро, система жёсткого реального времени прерывает операцию и блокирует её, чтобы не пострадала надёжность и готовность остальной части системы. Примерами систем жёсткого РВ могут быть — системы управления бортового оборудования, системы аварийной защиты, регистраторы аварийных событий. Системы мягкого реального времени характеризуются возможностью задержки реакции, что может привести к увеличению стоимости результатов и снижению производительности системы в целом. Примером может служить работа компьютерной сети. Если система не успела обработать очередной принятый пакет, это приведет к остановке на передающей стороне и повторной посылке (в зависимости от протокола). Данные при этом не теряются, но производительность сети снижается. Основное отличие системам жёсткого и мягкого РВ можно охарактеризовать так: система жёсткого реального времени никогда не опоздает с реакцией на событие, система мягкого реального времени — не должна опаздывать с реакцией на событие. Обозначим операционной системой реального времени такую систему, которая может быть использована для построения систем жёсткого реального времени. Это определение выражает отношение к ОСРВ как к объекту, со- 17 держащему необходимые инструменты, но также означает, что эти инструменты ещё необходимо правильно использовать. Большинство программного обеспечения ориентировано на «мягкое» реальное время. Для подобных систем характерно: гарантированное время реакции на внешние события (прерывания от оборудования); жёсткая подсистема планирования процессов (высокоприоритет- ные задачи не должны вытесняться низкоприоритетными, за некоторыми исключениями); повышенные требования к времени реакции на внешние события или реактивности (задержка вызова обработчика прерывания не более десятков микросекунд, задержка при переключении задач не более 100 микросекунд). Классическим примером задачи, где требуется ОСРВ, является управление роботом, берущим деталь с ленты конвейера. Деталь движется, и робот имеет лишь маленький промежуток времени, когда он может её взять. Если он опоздает, то деталь не будет на нужном участке конвейера и, следовательно, работа не будет сделана, несмотря на то, что робот находится в правильном месте. Если он подготовится раньше, то деталь ещё не успеет подъехать, и он заблокирует ей путь. В своем развитии ОСРВ строились на основе следующих архитектур. Монолитная архитектура ОС определяется как набор модулей, взаимодействующих между собой внутри ядра системы и предоставляющих прикладному ПО входные интерфейсы для обращений к аппаратуре. Их основной недостаток заключается в плохой предсказуемости ее поведения, вызванной сложным взаимодействием модулей между собой. Уровневая (слоевая) архитектура (например, MS-DOS). Прикладное ПО имеет возможность получить доступ к аппаратуре не только через ядро системы и ее сервисы, но и напрямую. По сравнению с монолитной такая архитектура обеспечивает значительно большую степень предсказуемости реакций системы, а также позволяет осуществлять быстрый доступ прикладных 18 приложений к аппаратуре. Главным недостатком таких систем является отсутствие многозадачности. Основной принцип микроядерной архитектуры или «клиент– серверной» заключается в вынесении сервисов ОС в виде серверов на уровень пользователя и выполнении микроядром функций диспетчера сообщений между клиентскими пользовательскими программами и серверами – системными сервисами. Преимущества микродероной архитектуры: 1. Повышенная надежность, так как каждый сервис является, по сути, самостоятельным приложением и его легче отладить и отследить ошибки. 2. Улучшенная масштабируемость, т.к. ненужные сервисы могут быть исключены из системы без ущерба для ее работоспособности. 3. Повышенная отказоустойчивость, так как «зависший» сервис может быть перезапущен без перезагрузки системы. Ядро ОСРВ обеспечивает функционирование промежуточного абстрактного уровня ОС, который скрывает от прикладного ПО специфику технического устройства процессора и связанного с ним аппаратного обеспечения. Например, ОС QNX Neutrino поддерживает нескольких аппаратных платформ (MIPS, PowerPC, StrongARM/xScale, SH-4, x86). 1.3. Выполнение команд в вычислительной системе На макроуровне компьютер состоит из процессора, оперативной памяти и устройств ввода/вывода, при этом каждый из этих объектов может быть представлен одним или несколькими модулями. Для взаимодействия между собой они используют системную шину [3]. Можно выделить четыре структурных компоненты компьютера (рис.5): процессор – осуществляет контроль за действиями компьютера, а так же выполняет функции обработки данных; 19 основная память – здесь хранятся данные и код программы, как правило она является временной, часто её называют реальной, оперативной или первичной памятью; устройства ввода/вывода – служат для передачи данных между ВС и внешним миром, они состоят из различных переферийных устройств (ПУ) (вторичная память, коммуникационное оборудование, терминалы, принтеры, сканеры, клавиатуры, звуковая карта и т. д.); системная шина – определяет структуры и механизмы, обеспечивающие взаимодействие между процессором, ОП и устройствами ввода/вывода. PC MAR IR MBR Оперативная память 0 Процессор 1 I/OAR … I/OBR 2 команды Исполнительный модуль Контроллер I/O … Буферы I/O данные … N-2 N-1 стек N Рис. 5. Общая структура ВС Для выполнения команд процессор использует два регистра: PC – программный счётчик (из него считывается адрес следующей команды для выполнения на процессоре) и IR – регистр команды (в него помещается из памяти код выбранной на исполнение команды). В состав всех процессоров входит регистр флагов, устанавливаемых и сбрасываемых в зависимости от результата выполнения команд на процессоре. Одной из функций процессора является обмен данными с памятью, для этого он обычно использует 2 внутренних (по отношению к процессорному регистра) регистра: MAR – регистр адреса памяти, куда заносится адрес ячейки памяти с которой будет производится операция чтения/записи и 20 MBR - регистр буфера памяти, куда заносятся данные, предназначенные для записи в память или те, которые были прочитаны из неё. Аналогично номер устройства ввода/вывода задаётся в регистре адреса IOAR, а регистр IOBR, служит для обмена данными между устройствами ввода/вывода и процессором. Модуль основной памяти состоит из пронумерованных ячеек, в каждую из которых может быть записано двоичное число, которое интерпретируется либо как команда, либо как данные. Модуль ввода/вывода служит для передачи данных от внешних устройств к процессору и памяти так и в обратном направлении. Регистры процессора представляют собой область памяти быстрого доступа внутри процессора и делятся на 2 группы: 1) доступные пользователю – они позволяют программисту сократить число обращений к памяти и этим повысить быстродействие программы. Существуют оптимизирующие компиляторы, распределяющие данные между памятью и регистрами, к этим регистрам имеют доступ все программы, как приложения пользователя, так и системные, к этим регистрам относят регистры данных, адресные регистры (индексный, сегментный, стековый) и регистр кода условия (флага). 2) управляющие регистры и регистры состояния – они используются в процессоре для контроля над выполняемыми операциями, с их помощью привилегированные программы ОС могут контролировать ход выполнения других программ, к ним относят: PC, IR, MAR, MBR, IOAR, IOBR, RSW (слово состояния), который управляет режимом прерывания и режимами «системный» и «пользовательский», регистр флагов, регистр управления прерываниями, регистр аппаратного управления памятью, регистры управления операциями ввода/вывода. Программа, которую выполняет CPU, состоит из набора хранящихся в памяти команд, в простейшем случае, обработка команд проходит в 2 стадии: процессор считывает (выбирает) из памяти команду и затем запускает её на выполнение (рис.6) [3]. 21 Цикл выборки Запуск Цикл исполнения Выборка следующей команды Исполнение команды Остановка Рис.6. Исполнение команд процессором Выполнение команды сводится к процессу выборки команды и её исполнения. Для исполнения одной команды может потребоваться несколько операций, их число определяется природой самой команды. Например, для исполнения команды ассемблера Loop (цикл Until) необходимо выполнить следующие действия: 1) проверить условие завершения цикла, 2) изменить значение регистра счетчика, 3) выполнить переход на начало цикла. Набор действий, требующихся для реализации одной команды называется её циклом. На рис.6 два цикла необходимых для выполнения одной команды: циклы выборки и исполнения. Прекращение работы программы происходит при выключении машины, возникновении неисправимой ошибки или если в программе есть команда-остановки. В начале каждого цикла процессор выбирает из памяти команду, обычно адрес ячейки, из которой нужно извлечь очередную команду хранится в РС. После извлечения очередной команды процессор увеличивает значение программного счетчика РС на 1, если не указано иное значение (например команда условного или безусловного перехода). Таким образом, команды выполняются в порядке возрастания номеров ячеек памяти, в которых они хранятся. Пусть значение регистра РС равно 30016 – это значит, что следующая команда, которую должен извлечь процессор находится в 30016-ой ячейке. При успешном завершении цикла команды процессор перейдёт к извлечению команды из ячейки 30116. Извлечённая команда загружается в регистр IR. Команда состоит из последовательности бит, указывающих процессору, какие именно действия он должен выполнить, процессор интерпретирует команду и выполняет требуемые действия. 22 Все действия процессора можно разделить на 4 категории [3]: процессор и память – здесь данные пересылаются из процессора в память и обратно; процессор и устройства ввода/вывода – данные из процессора поступают на ПУ через устройства (контроллер) ввода/вывода и наоборот; обработка данных – процессор выполняет над данными арифметические и логические операции; управление – операция может задать последовательность выполнения команд. Для выполнения команды может потребоваться последовательность, состоящая из комбинации вышеперечисленных действий. Рассмотрим гипотетический (упрощённый) компьютер (рис.7). В его процессоре есть один регистр данных, называемый аккумулятором (accumulator – AC), регистр команды (IR) и программный счетчик (PC) [3]. Каждая команда и данное имеет длину 16 бит (одно слово). При такой структуре данных удобно организовать память (адресовать) как в виде 16-битных ячеек. Формат команды предусматривает выделение 4 бит для кода операции и 12 бит для адреса ячейки памяти, со значением которой выполняется операция. Таким образом, всего может быть 24 = 16 различных кодов операций (каждый из которых можно представить одной шестнадцатеричной цифрой). Адресоваться можно к 212 = 4096 слов памяти (8 Кбайт) (которые можно представить трехзначным шестнадцатеричным числом). Формат команды Код 0 операции (команды) 3 4 Знак 0 1 Адрес 15 Формат данных (целого числа) Число 15 Рис. 7. Характеристики гипотетического компьютера Пусть процессор поддерживает следующие команды (операции): 00012 (116) – загрузить значение из памяти в аккумулятор (AC); 00102 (216) – сохранить содержимое аккумулятора (AC) в памяти; 23 01012 (516) – добавить к аккумулятору (AC) значение ячейки памяти; 01102 (616) – вычесть из аккумулятора (AC) значение ячейки памяти; 10102 (A16) – инвертировать значение ячейки памяти. На рис. 8 показаны шесть шагов необходимых для выполнения трех команд (116 , 216 , 516). Каждый шаг описывают три регистра (PC, AC, IR,) и два фрагмента памяти, где в ячейках с адреса 300 записаны команды программы, с адреса 940 данные программы. Каждый нечетный шаг это цикл считывания команды, а каждый четный – цикл исполнения выбранной команды. Память 300 1940 Регистры процессора 300 301 5941 … 302 2941 … 1940 Память PC 300 1940 AC IR 300 1940 301 5941 … 302 2941 PC 301 5941 301 0003 … 302 2941 1 940 IR 940 0003 941 0002 Память Шаг 1 Регистры процессора 301 0003 5941 PC 300 1940 AC 301 5941 IR … 302 2941 … … 940 0003 941 0002 Память 940 0003 941 0002 Память 300 1940 301 5941 … 302 2941 AC … 940 0003 941 0002 Память Регистры процессора Шаг 3 Регистры процессора 302 0005 2941 PC 300 1940 AC 301 5941 IR … 302 2941 … … 940 0003 941 0002 940 0003 941 0005 Шаг 5 Шаг 2 Регистры процессора 302 0005 5 941 PC AC IR 3+2=5 Шаг 4 Регистры процессора 303 0005 2 941 PC AC IR Шаг 6 Рис.8. Пример выполнения трех двухбайтных одноадресных команд Выполнение программы на рис.8 осуществляется следующим образом: 24 1. Адрес первой команды (300) хранится в программном счетчике PC. Эта команда (она представлена шестнадцатеричным числом 1940) загружается в регистр команд (IR), а показание программного счетчика увеличивается на 1. Следует отметить, что в этом процессе участвуют регистры адреса и буфера памяти, однако для упрощения они игнорируются. 2. Значние первых 4 бит (первая шестнадцатеричная цифра) регистра команд указывают на то, что нужно загрузить значение в аккумулятор. Остальные 12 бит ( три шестнадцатеричные цифры) указывают адрес 940 откуда загрузить данные. 3. Из ячейки 301 извлекается следующая команда (5941), после чего значение программного счетчика увеличивается на 1. 4. К содержимому аккумулятора прибавляется содержимое ячейки 941, и результат снова заносится в аккумулятор. 5. Из ячейки 302 извлекается следующая команда (2941), затем значение программного счетчика увеличивается на 1. 6. Содержимое аккумулятора заносится в ячейку 941. Этот пример показывает, что для сложения содержимого ячеек 940 и 941 необходимы три цикла команд. При более сложном наборе команд циклов понадобилось бы меньше. Современные процессоры выполняют команды, в состав которых может входить несколько адресов. При этом во время цикла исполнения некоторых команд иногда выполняется несколько обращений к памяти. Вместо обращений к памяти в команде может быть задана операция ввода-вывода. 1.4. Прерывания Прерывание представляет собой механизм, позволяющий координировать параллельное функционирование отдельных устройств ВС и реагировать на особые состояния, возникающие при работе процессора, таким образом, 25 прерывание – это принудительная передача управления от выполняемой программы к системе, происходящее при возникновении определённого события. Механизм прерывания реализуется аппаратно-программными средствами и включает в себя следующие этапы: 1. установка факта прерывания и его идентификация; 2. запоминание контекста (состояния) прерванного процесса; состо- яние процесса определяют: счетчик команд (PС), содержимое регистров процессора (АС), а также может включать спецификацию режима (пользовательский или привилегированный) и др. информацию хранящуюся в регистре флага; 3. управление аппаратно передаётся подпрограмме обработки иден- тифицированного прерывания, в простейшем случае в регистр счетчика команд заносится начальный адрес обработки, а в соответствующие регистры - информация словосостояния; 4. сохраняется информация о прерванной программе, если это не было сделано аппаратно; 5. обработка прерывания может быть выполнена обработчиком ап- паратного прерывания, но чаще используется обработчик ОС; 6. восстанавливается информация, относящаяся к прерванному процессу; 7. возврат управления прерванной программы. При этом этапы 1-3 реализуются аппаратно, а 4-7 программно. При возникновении запроса на прерывание естественный ход вычислений нарушается, и управление передаётся программе обработчика возникшего прерывания. При этом средствами аппаратуры (с помощью механизмов стековой памяти) сохраняется адрес той команды, с которой следует продолжить выполнение прерванной программы. После выполнения программы обработки прерывания управление возвращается прерванной ранее программе посредством занесения в указатель команд сохранённого адреса команды из стека (рис.9). Такая схема используется для простейших ОС, для более сложных ОС при обработке прерываний используется супервизор прерываний [3]. 26 В данном случае нет непосредственного возврата в прерванную ранее программу, прямо из подпрограммы обработки прерываний. Такая схема используется для многозадачных и многопользовательских ОС. Таким образом, главными функциями механизма прерываний являются: распознавание или классификация прерываний; передача управления соответствующему обработчику прерываний; корректное возвращение к прерванной программе. Цикл выборки Запуск Выборка следующей команды Цикл исполнения Цикл прерывания Запрет прерываний Проверка наличия Исполнение прерываний команды и их обработка Остановка Рис.9 . Исполнение процессором команд с прерыванием Прерывание, возникающее при работе ВС можно разделить: на внешние (асинхронные), внутренние (синхронные) и программные. Внешние прерывания вызываются асинхронными событиями, которые происходят вне прерываемого процесса (программы) (например, прерывание таймера, внешних устройств, по нарушению питания, с пульта оператора ВС, от другого процессора или ВС). Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями (например, при нарушении адресации (в адресной части выполняемой команды указан запрещённый или несуществующий адрес, обращение к отсутствующей странице или сегменту при организации механизма витруальной памяти), при наличии в поле кода операции не используемой двоичной комбинации, при делении на 0, при переполнении или исчезновении порядка, при обнаружении ошибки чётности и ошибок в работе различных устройств аппаратуры средствами контроля. 27 Существуют программные прерывания, которые возникают при выполнении процессором соответствующей команды (INT). По этой команде процессор осуществляет те же действия, что и при обработке внутренних прерываний (рис.10). Этот механизм введён для переключения на системные программные модули по правилам прерываний, а не подпрограмм, это обеспечивает автоматическое переключение процессора в привилегированный режим с возможностью выполнения любых команд [3]. Аппаратное обеспечение Программное обеспечение Контроллер устройства или другой элемент АО генерирует запрос на прерывание Сохранение остальной информации о состоянии процессора Процессор прекращает исполнение текущей программы Обработка прерывания Процессор сигнализирует о получении прерывания Восстановление информации о состоянии процессора Процессор заносит слово состояния и программный счетчик в стек управления Восстановление старого слова состояния программы и содержимого программного счетчика В программный счетчик загружается новое значение, определяемое прерыванием Рис.10. Схема обработки прерывания В многопользовательских и многозадачных ОС применяется концепция реентерабельности. Реентерабельной называется процедура, последовательность команд которой может одновременно использоваться несколькими приложениями. Для обеспечения этой концепции необходимо, чтобы программный код не был самомодифицирующимся, а локальные данные каждого пользователя должны храниться отдельно друг от друга. Исполнение реентерабельной процедуры может быть приостановлено с помощью прерывания, а после возврата из него корректно продолжиться. В многопользова28 тельских и многозадачных ОС реентерабельность позволяет более эффективно использовать ОП. В ней хранится только одна копия программного кода процедуры, даже если к ней обращаются несколько различных приложений. Стек — это специальным образом организованный участок памяти, используемый для временного хранения переменных, для передачи параметров вызываемым подпрограммам и для сохранения адреса возврата при вызове процедур и прерываний. Легче всего представить стек в виде стопки листов бумаги (это одно из значений слова «stack» в английском языке) — вы можете класть и забирать листы бумаги только с вершины стопки. Таким образом, если записать в стек числа 1, 2, 3, то при чтении они будут получаться в обратном порядке — 3, 2, 1. Для процессоров Intel x86 стек располагается в сегменте памяти, описываемом регистром SS, а текущее смещение вершины стека записано в регистре ESP, причем при записи в стек значение этого смещения уменьшается, то есть стек растет вниз от максимально возможного адреса. Такое расположение стека «вверх ногами» необходимо в бессегментной модели памяти, когда все сегменты, включая сегмент стека и сегмент кода, занимают одну и ту же область — всю память. Тогда программа исполняется в нижней области памяти, в области малых адресов, и EIP растет, а стек располагается в верхней области памяти, и ESP уменьшается. 1.5 Архитектуры операционных систем 29 Архитектуру первых ОС принято называть монолитной. В вычислительных системах того времени количество оперативной памяти исчислялось килобайтами и монолитные ОС загрузившись, оставляли еще и часть свободной оперативной памяти для работы прикладных программ, написанных в машинных кодах. Однако модификация таких ОС была затруднительна из-за сильного взаимного влияния (иногда не предсказуемого) функций ОС. На принципе модульного программирования в 1970-80-х годах были разработаны слоистые ОС с иерархической организацией функций, взаимодействие которых возможно только между функциями находящимися на соседних уровнях. Управление этими функциями выполнялось в режиме ядра. Позднее появилась микроядерная архитектура. Основа идеологии микроядра, что в ядре должно быть самым главным функции ОС. Работа служб и приложений (не являющиеся критическими) хотя и основана на работе микроядра, но выполняются они в пользовательском режиме. К таким приложениям относятся драйверы устройств, ФС, менеджер виртуальной памяти, система управления безопасностью. В архитектуре с микроядром уровни расположены вертикально, а в слоистой горизонтально (рис.11). Внешние по отношению к ядру компоненты реализуются как обслуживаемые процессы. Между собой они взаимодействуют как равноправные партнёры. Обычно взаимодействие реализуется с помощью обмена сообщениями, которые передаются через микроядро. Таким образом, микроядро вступает в роль посредника. Оно подтверждает правильность сообщений, передаёт их от одного компонента к другому и предоставляет доступ к аппаратному обеспечению [4]. Микроядро выполняет защитные функции, оно не пропускает сообщения, если такой обмен не разрешён. Например, если приложению нужно открыть файл, то оно отправляет сообщение администратору ФС, если ему нужно создать новый поток в процессе, то оно отправляет сообщение администратору процессов. Каждый из администраторов может отправлять сообщения другим администраторам (серверам, супервизорам, менеджерам) и обращаться к элементарным функ30 циям микроядра и т.о. в одном компьютере реализуется архитектура клиентсервер. Достоинством архитектуры микроядра является [3]: единообразный интерфейс; расширяемость; гибкость; переносимость; надёжность; поддержка распределённых вычислительных систем; поддержка объектно-ориентированных систем на основе исполь- Управление I/O и устройствами Режим ядра Виртуальная память Управление элементарными процессами Админ-р виртуальной памяти Обмен информацией между процессами Администратор процессов ФС .. . Администратор ФС Приложения пользователей Драйверы устройств I/O Пользовательский режим Приложения пользователей зования компонентов. Микроядро Аппаратное обеспечение Аппаратное обеспечение Многослойное ядро Микроядро Рис. 11.Структуры многослойного ядра и микроядра Основными функциями микроядра, которые непосредственно зависят от аппаратного обеспечения, являются: низкоуровневое управление памятью; взаимодействие между процессами; управление вводом/выводом и прерываниями. Вначале ядро определяет свою физическую память как единое адресное пространство, которым управляет основной системный процесс. При создании новых процессов страницы первоначального адресного пространства мо31 гут передаваться или отображаться в эти новые процессы. Такая технология позволяет одновременно поддерживать несколько схем организации виртуальной памяти. Основной формой взаимодействия между процессами и потоками в ОС с микроядром являются сообщения. Сообщение включает в себя заголовок, в котором указаны идентификаторы процесса отправителя и процесса адресата, а также тело с представленными данными. Взаимодействия между процессами основано на относящихся к этим процессам портам. Порт – это очередь сообщений, предназначенных для определённого процесса, с которым связан список возможностей, в котором указано, с какими процессами данный процесс может обмениваться информацией. Так микроядро может распознавать прерывания, но не обрабатывать их, вместо этого оно генерирует сообщения процессу, функционирующему на пользовательском уровне, связанному с данным прерыванием. В микроядре можно вынести за его пределы системы страничной организации памяти и управления виртуальной памятью. Когда поток приложения обращается к странице, которая отсутствует в основной памяти, возникает прерывание из-за отсутствия страницы, и управление перехватывается ядром (рис.12). После этого ядро отправляет системе страничной организации памяти сообщение, в котором указывается запрашиваемая страница. ССОП и ядро должны взаимодействовать между собой, чтобы выполнить действия по переносу требуемой страницы в основную память. Как только страница станет доступна, ССОП отправляет приложению сообщение о том, что оно может продолжить работу. Такая стратегия позволяет внешнему по отношению к ядру процессу отображать файлы БД в пользовательском адресном пространстве без участия ядра [3]. Система страничной организации памяти Приложение 3. Возобновление работы 1. Ошибка из-за отсутствия страницы 2. Вызов функции для работы с адресным пространством Микроядро Рис. 12 Принцип работы структуры с микроядром 32 Для поддержания внешних ССОП и системы управления виртуальной памятью микроядру достаточно трех операций. 1) Предоставление. Владелец адресного пространства может предоставить некоторые свои страницы другим процессам. 2) Отображение. Процесс может отображать любые свои страницы в адресном пространстве другого процесса, после чего оба процесса будут иметь доступ к этим страницам. При этом создается общая область памяти, совместно используемая двумя процессами. 3) Восстановление. Процесс может восстановить любые страницы, предоставленные другим процессам или отображенные в их адресном пространстве. 1.6. Управление оперативной памятью вычислительной системы Оперативная память (оперативное запоминающее устройство, ОЗУ) — часть памяти ЭВМ, в которую процессор может обратиться за одну операцию (jump, move и т. п.). Она предназначена для временного хранения данных и команд, необходимых процессору для выполнения им операций. Оперативная память передаёт процессору данные непосредственно, либо через кешпамять. Каждая ячейка оперативной памяти имеет свой индивидуальный адрес. Система управления оперативной памятью должна поддерживать [3]: 1. перемещение программ из одной области памяти в другую (под- держка относительности адреса); 2. защиту одного процесса от влияния других; 3. совместное использование процессами памяти для взаимодействия (обратная защита) – механизмы межпроцессного взаимодействия (IPC); 4. поддержка логических операций с адресацией; 5. поддержка физических операций с адресацией. 33 Пусть процесс занимает непрерывную область основной памяти. ОС необходимо знать местоположение управляющей информации процесса и стека исполнения, а также точки входа для начала выполнения процесса. Поскольку управлением памятью занимается ОС и она же размещает процесс в основной памяти, соответствующие адреса она получает автоматически. Однако помимо получения ОС указанной информации, процесс должен иметь возможность обращаться к памяти в самой программе. Так команды ветвления содержат адреса, указывающие на команды, которые должны быть выполнены после них; команды обращения к данным – адреса байтов и слов, с которыми они работают. ОС переводит ссылки в коде программы (логические адлеса) в реальные физические адреса, соответствующие текущему расположению процесса в основной памяти рис. 13. Управляющая информация процесса Входная точка программы Управляющий блок процесса 00000000 h Команда ветвления Код программа Увеличение адресов Ссылка на данные Данные программы Текущая вершина стека Стек FFFFFFFF h Рис. 13.Образ процесса в оперативной памяти Система управления памятью характеризуется : 1. Стратегией выборки. Страница загружается в оперативную память, как по требованию процесса, так и с использованием стратегии предварительной выборки, при которой происходит загрузка страниц кластерами [3]. 2. Стратегией размещения. При использовани сегментации все вновь загруженные сегменты должны быть размещены в доступном адресном пространстве. 34 3. Стратегией замещения. При заполнении памяти следует принимать решение о том, какая страница будет замещена загружаемой в оперативную память новой страницей. 4. Стратегией очистки. Изменённые страницы процесса должны быть записаны (сохранены) при их замещении. 5. Управление загрузкой: заключается в определении количества процессов, которые должны быть резидентны в оперативной памяти в данный момент. 6. Управление резидентным множеством процессов. ОС определяет сколько памяти отводить процессу при загрузке его в оперативную память. Память может быть выделена статически в момент создания процесса, либо изменяться динамически в процессе работы [3]. Рассмотрим случай, когда основная память разделена на одинаковые блоки относительно небольшого фиксированного размера. Тогда блоки процесса, известные как страницы (pages), могут быть связны со свободными блоками памяти, известными как кадры (frames) или фрэймы. Каждый кадр оперативной памяти может содержать одну страницу процесса. В каждый момент времени некоторые из кадров памяти используются, а некотрые свободны. ОС содержит список свободных кадров (рис.14 а). Кадр Осн.Пам. Кадр Осн.Пам. Кадр Осн.Пам. Кадр Осн.Пам. Кадр Осн.Пам. Кадр Осн.Пам. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 а) A.0 A.1 A.2 A.3 б) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 A.0 A.1 A.2 A.3 B.0 B.1 B.2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 в) A.0 A.1 A.2 A.3 B.0 B.1 B.2 C.0 C.1 C.2 C.3 г) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 A.0 A.1 A.2 A.3 C.0 C.1 C.2 C.3 Д) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 A.0 A.1 A.2 A.3 D.0 D.1 D.2 C.0 C.1 C.2 C.3 D.3 D.4 е) Рис. 14 Распределение страниц процессов по свободным кадрам: 35 а) 15 доступных кадров, б) загрузка процесса А, в) загрузка процесса В, г) загрузка порцесса С, д) выгрузка процесса В, е) загрузка процесса D. Процесс А, хранящийся на диске, сотоит из четырех страниц. Когда приходит время загрузить его в память, ОС находит четыре свободных кадра и загружает страницы процесса А в эти кадры (рис. 14 б). Затем загружается процесс В, состоящий из трех страниц, и процесс С, сотоящий из четырех страниц. После этого процесс В приостанавливается и выгружается из основной памяти. Затем наступает момент, когда все процессы в памяти оказываются заблокированными, и ОС загружает в память новый процесс D, состящий из пяти сраниц. Но непрерывной области кадров в памяти нет и ОС используя таблицу сраниц процесса (она есть у каждого процесса) размещает страницы процесса D в кадрах 4,5,6,11,12 (рис. 14 е). 0 1 2 3 Таблица страниц процесса А 0 1 2 3 Таблица страниц процесса B 0 1 2 - 0 1 2 3 Таблица страниц процесса C 7 8 9 10 0 1 2 3 4 Таблица страниц процесса D 4 5 6 11 12 Список свободных кадров 13 14 Рис. 15. Структуры данных процессов рис. 14е Размеры оперативной памяти персональных компьютеров сегодняшнего дня постоянно отстают от запросов прикладного программного обеспечения. В имеющийся объем оперативной памяти не всегда удается загрузить операционную систему и несколько прикладных программ, особенно если их много и они громоздкие. Выход из этой ситуации в использовании концепции виртуальной памяти. Виртуальная память — это логический ресурс, эмулирующий оперативную память путем использования как физической оперативной, так и дисковой памяти. Благодаря этому емкость виртуальной памяти получается больше реальной. Активный программный код должен находиться в физической оперативной памяти, остальной же код может временно храниться в ее «продолжении» на жестком диске. Когда управление передается фрагменту 36 кода, хранящемуся на жестком диске, он загружается в физическую память. Если места в ней недостаточно, это приведет к выгрузке на диск пассивного кода. Процесс загрузки и выгрузки программного кода называется свопингом, или подкачкой. Его размер файла подкачки может динамически изменяется в зависимости от нужд системы, он не обязательно должен быть непрерывным и может находиться на сжатом диске. Виртуальная память имеет страничную организацию, поддерживаемую процессором. Страницей является блок памяти фиксированной длины. Процесс может занимать одну или несколько страниц памяти. Страничная организация памяти. Каждый процесс имеет свою собственную таблицу страниц, которая создается при загрузке всех страниц процесса в основную память. Каждая запись в таблице страниц содержит номер кадра соответствующей страницы в памяти (рис.15). Поскольку в основной памяти могут находиться только некоторые из страниц процесса, в каждой записи таблицы должен иметься бит Р, указывающий на присутствие соответствующей страницы в основной памяти. Если данная страница располагается в основной памяти, то в записи таблицы содержится номер ее кадра. Запись таблицы страниц Виртуальный адрес Номер страницы Смещение Р M Др. управляющие биты Номер кадра А) страничная организация Запись таблицы сегментов Виртуальный адрес Номер сегмента Смещение Р M Др. упр. биты Длина Начальный адрес сегмента Б) сегментация организация Запись таблицы страниц Виртуальный адрес Номер сегмента Номер страницы Смещение Р М Др. упр. биты Номер кадра Запись таблицы сегментов Др. управляющие биты Длина Начальный адрес сегмента В) комбинирование страничной организации и сегментации 37 Рис. 15. Типичные форматы систем управления памятью Другим управляющим битом в записи таблицы страниц является бит модификации — М, который указывает, было ли изменено содержимое данной страницы со времени последней загрузки в основную память. Если изменений не было, то когда наступит время замены страницы в занимаемом ею в данный момент кадре, записывать эту страницу на диск не следует, так как на диске уже имеется ее точная копия. В записи таблицы страниц могут быть и другие управляющие биты, например, служащие для целей защиты или совместного использования памяти на уровне страниц. Базовый механизм чтения слова из памяти включает в себя трансляцию логического, адреса, состоящего из номера страницы и смещения, в физический адрес, который представляет собой номер кадра и смещение, с использованием таблицы страниц (рис.16). Таблица страниц должна располагаться в основной памяти. При выполнении процесса стартовый адрес его таблицы страниц хранится в регистре, а номер страницы из виртуального адреса используется в качестве индекса элемента, в котором ищется соответствующий номер кадра. Виртуальный адрес Номер Смещение страницы Регистр Указатель на таблицу страниц Программа Таблица страниц Номер страницы + Смещение Номер кадра Механизм страниц 38 Кадр страницы Номер кадра Смещение от начала кадра Физический адрес Основная память Рис. 16. Страничная организация памяти Затем этот номер объединяется со смещением из виртуального адреса для получения реального физического адреса интересующей нас ячейки памяти. Большинство схем виртуальной памяти хранят таблицы страниц не в реальной, а в виртуальной памяти. Это означает, что сами таблицы страниц становятся объектами страничной организации, как и любые другие страницы. При работе процесса как минимум часть его таблицы страниц должна располагаться в основной памяти, в том числе запись о странице, выполняющейся в настоящий момент [3]. Некоторые процессоры используют двухуровневую схему для больших таблиц страниц. При такой схеме имеется каталог таблиц страниц, в котором каждая запись указывает на таблицу страниц. Каждый виртуальный адрес вызывает обращение к двум физическим адресам: для выборки соответствующей записи из таблицы страниц и для обращения к адресуемым данным. Для преодоления этой проблемы большинство реально использующихся схем виртуальной памяти использует специальный кэш для записей таблицы страниц, который обычно называют буфером быстрого преобразования адреса TLB. Этот кэш содержит те записи таблицы страниц, которые использовались последними. Сегментная модель оперативной памяти. Сегментация позволяет рассматривать память как область, состоящую из множества адресных пространств, или сегментов. Сегменты могут иметь динамические размеры. Обращения к памяти используют адреса, представляющие собой пары (номер сегмента, смещение). Каждый процесс имеет собственную таблицу сегментов, и при загрузке всех сегментов процесса в основную память создается таблица сегментов процесса, которая также загружается в основную память. В каждой записи таблицы сегментов указан начальный адрес соответствующего сегмента в основной памяти и его длина. Та же таблица сегментов нужна и при схеме виртуальной памяти, основанной на сегментации. Типичным 39 приемом является использование отдельной таблицы сегментов для каждого процесса. Поскольку в основной памяти могут находится, не все сегменты процесса, в каждой записи требуется наличие бита присутствия, указывающего, располагается ли данный сегмент в основной памяти. Если сегмент расположен в основной памяти, то запись включает его начальный адрес и длину. Еще один бит, необходимый в данной схеме, — бит модификации, указывающий, было ли изменено содержимое сегмента со времени его последней загрузки в основную память (рис.15). Основной механизм чтения слова из памяти включает преобразование логического, адреса, состоящего из номера сегмента и смещения, в физический адрес с использованием таблицы сегментов (рис.17). Когда запускается определенный процесс, в регистре хранится стартовый адрес его таблицы сегментов. Номер сегмента из виртуального адреса используется в качестве индекса таблицы, позволяющего определить начальный адрес сегмента. Для получения физического адреса к начальному адресу сегмента добавляется смещение из виртуального адреса. Таблица сегментов Таблица сегментов d Номер сегмента + Программа Начальный адрес + d + Регистр Указатель на таблицу сегментов Физический адрес Длина Начальный адрес Механизм сегментации Основная память Рис. 17. Сегментная организация памяти 40 Сегмент Виртуальный адрес Номер Смещение сегмента =d Комбинация сегментации и страничной организации памяти. Страничная организация устраняет внешнюю фрагментацию и обеспечивает эффективное использование основной памяти. Поскольку перемещаемые в основную память и из нее блоки имеют фиксированный размер, облегчается создание эффективных алгоритмов управления памятью. Сегментация имеет возможность обработки растущих структур данных, поддержку совместного использования и защиты памяти. В комбинированной системе адресное пространство пользователя разбивается на ряд сегментов по усмотрению. Каждый сегмент в свою очередь разбивается на ряд страниц фиксированного размера, соответствующего размеру кадра основной памяти. Если размер сегмента меньше размера страницы, он занимает страницу целиком. Логический адрес в этом случае состоит из номера сегмента и смещения в нем (рис.18). Смещение в сегменте следует рассматривать как номер страницы определенного сегмента и смещение в ней. С каждым процессом связана одна таблица сегментов и несколько (по одной на сегмент) таблиц страниц [3]. Физический адрес Номер страницы Смещение Регистр + 41 Программа Механизм Таблица страниц Номер страницы + Номер сегмента Указатель на таблицу Таблица страниц сегментов Кадр страницы Номер Смещение кадра Смещение от начала кадра Номер сегмента Виртуальный адрес Механизм страничной Основная память Рис. 18. Трансляция адреса при сегментной и страничной организации При работе определенного процесса в регистре процессора хранится начальный адрес соответствующей таблицы сегментов. Получив виртуальный адрес, процессор использует его часть, представляющую номер сегмента, в качестве индекса в таблице сегментов. 1.7. Общие сведения о процессах и потоках ОС имеет объектно-ориентированную структуру и поддерживает два типа объектов, связанных с выполнением приложений: процесс и поток. Поток – это единица работы, используемая для распределения процессорного времени, которая включает контекст процесса, куда входит содержимое программного счётчика и указатель вершины стека, а так же свою собственную область стека для организации вызова подпрограмм и сохранения локальных данных. Поток может использовать общие участки кода и данных в рамках своего процесса. Команды потока выполняются последовательно. Поток может быть прерван при переключении процессора на обработку другого потока. Процесс – это набор из одного или нескольких потоков, а также связанных с этими потоками системными ресурсами. Под системными ресурсами понимается область памяти и данные, открытые файлы и различные устройства. Процесс является владельцем ресурсов и предоставляет их своим потокам. Процесс это контейнер для потоков. 42 Разбивая приложение на несколько потоков программист получает все преимущества модульности приложения и возможность управления связанными с приложением временными событиями. Приложение – это набор из одного или нескольких динамически загружаемых процессов. Хотя на первый взгляд, кажется, что программа и процесс понятия практически одинаковые, они фундаментально отличаются друг от друга. Программа представляет собой статический набор команд в файле на диске, а процесс это набор ресурсов и данных, использующихся при выполнении потоков. ОС поддерживает особенность процессов для защиты их от взаимного влияния, т. к. они совместно используют все ресурсы ВС конкурируя друг с другом за них. У каждого процесса имеется своё собственное внутреннее адресное пространство для кода и данных и каждому процессу назначаются свои ресурсы. Процесс можно разделить на 3 компоненты: выполняющиеся программы (подпрограммы); данные, необходимые для её работы (переменные, рабочее пространство, буферы); контекст выполнения программы. Потоки имеют следующие преимущества по сравнению с процессами: 1. множество потоков способно реализоваться внутри одного ис- полнительного модуля – это позволяет экономить ресурсы ВС; 2. использование потоками общей области памяти позволяет эф- фективно организовывать межпоточный обмен сообщениями (достаточно передать указатель на сообщение), процессы не имеют общей области памяти, поэтому ОС должна либо целиком скопировать сообщение из области памяти одного процесса в область памяти другого (что для больших сообщений весьма накладно), либо предусмотреть специальные механизмы, которые 43 позволили бы одной задаче получить доступ к сообщению из области памяти другого процесса; 3. контекст потоков меньше, чем контекст процессов, а значит вре- мя переключения между потоками, меньше, чем между процессами; 4. т. к. все потоки реализуются в одном исполнительном модуле, значительно упрощается использование программ-отладчиков. Недостатки потоков: 1. как правило, потоки не могут быть подгружены динамически, чтобы добавить поток необходимо провести соответствующие изменения в исходных текстах и перепрограммировать приложение, процессы в отличие от потоков могут подгружаться, что позволяет динамически изменять функции системы в процессе её работы, кроме того, т. к. процессам соответствуют отдельные программные модули, они могут быть разработаны различными производителями, чем достигается дополнительная гибкость и возможность использовать ранее наработанное программное обеспечение; 2. потоки имеют доступ к областям данных друг друга, что может привести к ситуации, когда некорректно работающий поток способен использовать данные другого потока, в отличие от этого, процессы защищены от взаимного влияния, а попытка записи не в свою область приводит к возникновению специального прерывания по обработке исключительных ситуаций. Примером многопоточной программы является MSWORD, где в рамках одного приложения может одновременно происходить и набор и проверка орфографии текста. Процесс может находиться в активном состоянии и участвовать в конкуренции за ресурс ВС и в пассивном состоянии (рис.19). Пассивное Активное Выполнение Бездействие Готовность Блокирование 44 Рис. 19. Схема состояния задачи в вычислительной системе Состояния потоков активного процесса: 1. Выполнение: в этом состоянии все затребованные ресурсы выделены, в данном состоянии в каждый момент времени может находиться только один процесс для однопроцессорных систем. 2. Готовность к выполнению: все ресурсы предоставлены за исключением процессора. 3. Блокировка (ожидание): не предоставлены запрошенные ресурсы или не завершена операция ввода/вывода. В большинстве ОС состояния ожидания подразделяются на множество состояний ожидания каждое из которых соответствует определённому виду ресурсов из-за отсутствия которого процесс переходит в состояние ожидания. В ОС общего назначения процесс возникает при запуске какой-либо программы, ОС организует для нового процесса дескриптор и процесс переходит в состояние готовности к выполнению. Для ОС общего назначения процесс не имеет пассивного состояния. Для ОС реального времени заранее известны состав программ и процессов, которые должны выполняться и их характеристики, поэтому на этапе конфигурирования ОС реального времени для всех необходимых процессов заводят дескрипторы и распределяют ресурсы, таким образом в ОС реального времени процессы могут находится в пассивном состоянии. Наличие процессов в состоянии бездействия в ОС реального времени позволяет уменьшить время на перевод процесса в состояние готовности. За время своего существования процесс может многократно переходить из состояния в состояние. Из пассивного состояния процесс может перейти в состояние готовности в следующих случаях: по команде оператора (для ОС, поддерживающих пассивное состояние); при выборе из очереди планировщиком (для пакетного режима); по вызову другого процесса через обращение к супервизору процессов; 45 по прерыванию от внешнего устройства (сигнал о совершении некоторого события может запускать соответствующий процесс – при наступлении времени запуска процесса). Из состояния выполнения процесс выходит по причинам: процесс завершается через супервизор процессов возникает управление ОС и сообщает всем о своём завершении, при этом сам завершённый процесс либо переводится в пассивное состояние, либо уничтожается, процесс может завершиться по инициативе самого процесса, оператора или другого процесса; процесс переводится супервизором в состояние готовности в связи с появлением более приоритетного процесса, либо при истечении определённого времени; процесс переводится в состояние ожидания либо вследствие запроса операции вода/вывода, либо в силу невозможности предоставления ему запрошенного ресурса, либо по команде оператора на приостановку процесса, либо по требованию через супервизор от другого процесса. При наступлении соответствующих событий (завершения операции ввода/вывода, освобождения запрошенного ресурса и т. д.) процесс деблокируется и переводится из состояния ожидания в состояние готовности. Таким образом, движущей силой, меняющей состояния процессов являются события, один из основных видов событий – прерывание. Для управления процессами ОС создаёт для каждого процесса информационную структуру, которая называется дескриптором процесса (описатель задачи и блок управления задачами). Дескриптор состоит из следующих элементов [5]: 1. идентификатор процесса (PID); 2. тип (класс) процесса, который определяет для супервизора правило предоставления ресурсов; 3. приоритет процесса, в рамках одного типа (класса) процесса, в первую очередь, обслуживаются наиболее приоритетные; 46 4. переменная состояния, которая показывает в каком состоянии находится процесс в текущий момент времени; 5. защищённая область памяти или её адрес, в которой хранится текущее значение регистра процессора, если процесс прерывается не закончив работу, то в ней сохраняются значения регистров процессора, эта информация называется контекстом процесса; 6. информация о ресурсах, которыми владеет или имеет право владеть процесс; 7. область памяти или её адрес для организации общения с другими процессами; 8. параметры времени запуска, т. е. Момент времени, когда процесс должен активизироваться и периодичность этой процедуры; 9. в случае отсутствия в ОС системы управления файлами адрес программы на диске в её исходном состоянии и адрес на диске, куда она выгружается из ОП если её вытесняет другой процесс. Дескрипторы постоянно располагаются в оперативной памяти для ускорения работы супервизора, который организует их в списки (очереди) и отображает изменение состояния процесса перемещением соответствующего дескриптора из одного списка в другой. Для состояния ожидания может быть несколько списков по этому ресурсу. Для системы управляющих процессов ресурсы распределяются изначально и однозначно. 47 2. ОПЕРАЦИОННАЯ СИСТЕМА WINDOWS 2.1. Версии операционной системы Windows Microsoft Windows — семейство операционных систем корпорации Майкрософт (Microsoft), базирующихся на основе графического интерфейса пользователя (рис.20). Появление их явилось решающим шагом в широком продвижении и развитии перспективных способов взаимодействия систем человек-машина и машина-машина, создания дружественной среды для взаимодействия как пользователя с компьютерными приложениями, так и аппаратных средств внутри вычислительного комплекса [1]. Рис. 20. История выпусков версий ОС Microsoft Windows В настоящее время под управлением операционных систем семейства Windows работает около 90% персональных компьютеров. Операционные системы Windows работают на платформах x86, x86-64, IA-64, ARM. Существовали также версии для DEC Alpha, MIPS, PowerPC и SPARC. Обычно версии Windows делят на следующие группы: I. Графические интерфейсы и расширения для DOS: Эти версии Windows не были полноценными операционными системами, а являлись надстройками к операционной системе MS-DOS и являлись по сути операционными оболочками, обеспечивая стандартизацию интерфейсов аппаратного обеспечения и единообразие для пользовательских интерфейсов 48 программ. Предоставляли встроенные средства (GDI) для создания графического интерфейса пользователя. Они работали с процессорами начиная с Intel 8086. 1. Windows 1.0 (1985) 2. Windows 2.0 (1987) 3. Windows 2.1 (Windows 386) (1987) — в системе появилась возможность запуска DOS-приложений в графических окнах, причём каждому приложению предоставлялись полные 640 Кб памяти. Полная поддержка процессора 80286. 4. Windows 3.0 (1990) — появилась поддержка процессоров 80386 и защищённого режима. 5. Windows 3.1 (1992) — серьёзно переработанная Windows 3.0; устранены UAE (Unrecoverable Application Errors — фатальные ошибки прикладных программ), добавлен механизм OLE, печать в режиме WYSIWYG («что видите, то и получите»), шрифты TrueType, изменён Проводник (диспетчер файлов), добавлены мультимедийные функции. 6. Windows для рабочих групп (Windows for Workgroups) 3.1/3.11 — первая версия ОС семейства с поддержкой локальных сетей. В WFWG 3.11 также испытывались отдельные усовершенствования ядра, применённые позднее в Windows 95. II. Семейство Windows 9x: Включает в себя Windows 95, Windows 98 и Windows Me. Windows 95 была выпущена в 1995 году. Её отличительными особенностями являются новый пользовательский интерфейс, поддержка длинных имён файлов, автоматическое определение и конфигурация периферийных устройств Plug and Play, и способность исполнять 32-битные приложения. Windows 95 использует вытесняющую многозадачность и выполняет каждое 32-битное приложение в своём адресном пространстве. ОС этого семейства не являлись безопасными многопользовательскими системами как Windows NT, поскольку строгое разделение исполняющихся приложений не 49 было реализовано в ядре. Программный интерфейс был подмножеством Win32 API поддерживаемым Windows NT, но имел поддержку юникода в очень ограниченном объёме. Также в нём не было должного обеспечения безопасности. В составе Windows 95 присутствовал MS-DOS 7.0, однако его роль сводилась к обеспечению процесса загрузки и исполнению 16-битных DOS приложений. Ее развитием стали Windows 98 и Windows Me. III. ОС семейства Windows NT в настоящее время работают на процессорах с архитектурами x86, x64, и Itanium. Ранние версии (до 4.0 включительно) также поддерживали некоторые RISC-процессоры: Alpha, MIPS, и Power PC. Все операционные системы этого семейства являются полностью 32-битными операционными системами, и не нуждаются в MS-DOS даже для загрузки. Только в этом семействе представлены операционные системы для серверов. До версии Windows 2000 включительно они выпускались под тем же названием что и аналогичная версия для рабочих станций, но с добавлением суффикса, например «Windows NT 4.0 Server» и «Windows 2000 Datacenter Server». Начиная с Windows Server 2003, серверные операционные системы называются по-другому. 1. Windows NT 3.1 (1993) 2. Windows NT 3.5 (1994) 3. Windows NT 3.51 (1995) 4. Windows NT 4.0 (1996) 5. Windows 2000 (2000) — Windows NT 5.0 6. Windows XP (2001) — Windows NT 5.1 7. Windows XP 64-bit Edition (2006) — Windows NT 5.2 8. Windows Server 2003 (2003) — Windows NT 5.2 9. Windows Vista (2006) — Windows NT 6.0 10. Windows Home Server (2007) — Windows NT 5.2 11. Windows Server 2008 (2008) — Windows NT 6.0 12. Windows Small Business Server (2008) — Windows NT 6.0 50 13. Windows 7 — Windows NT 6.1 (2009) 14. Windows Server 2008 R2 - Windows NT 6.1 (2009) В основу семейства Windows NT положено разделение адресных пространств между процессами. Каждый процесс имеет возможность работать с выделенной ему памятью. Однако он не имеет прав для записи в память других процессов, драйверов и системного кода. Семейство Windows NT относится к операционным системам с вытесняющей многозадачностью. Разделение процессорного времени между потоками происходит по принципу «карусели». Ядро операционной системы выделяет квант времени (в Windows 2000 квант равен примерно 20 мс) каждому из потоков по очереди при условии, что все потоки имеют одинаковый приоритет. Поток может отказаться от выделенного ему кванта времени. В этом случае система перехватывает у него управление (даже если выделенный квант времени не закончен) и передаёт управление другому потоку. При передаче управления другому потоку система сохраняет состояние всех регистров процессора в особой структуре в оперативной памяти. Эта структура называется контекстом потока. Сохранение контекста потока достаточно для последующего возобновления его работы. IV. Семейство ОС Windows Mobile для карманных компьютеров. Это семейство операционных систем реального времени было специально разработано для встраиваемых систем. Поддерживаются процессоры ARM, MIPS, SuperH и x86. В отличие от остальных операционных систем Windows, операционные системы этого семейства продаются только в составе готовых устройств, таких как смартфоны, карманные компьютеры, GPS навигаторы, MP3 проигрыватели, и другие. В настоящее время под термином "Windows CE" понимают только ядро операционной системы. Например, Windows Mobile 5.0 включает в себя ядро Windows CE 5.0, хотя в некоторых устройствах ядро Windows CE используется и без Windows Mobile. 51 V. Семейство встраиваемых ОС Windows Embedded. Windows Embedded - это семейство операционных систем реального времени, было специально разработано для применения в различных встраиваемых системах. Ядро системы общее с семейством ОС Windows CE и поддерживает процессоры ARM, MIPS, SuperH и x86. Windows Embedded включает дополнительные функции по встраиванию, среди которых фильтр защиты от записи (EWF и FBWF), загрузка с флеш-памяти, CD-ROM, сети, использование собственной оболочки системы и т.п. ОС этого семейства продаются только в составе готовых устройств, таких как: банкоматы, медицинские приборы, навигационное оборудование, "тонкие" клиенты, VoIP-терминалы, медиапроигрыватели, цифровые рамки (альбомы), кассовые терминалы, платёжные терминалы, роботы, игровые автоматы, музыкальные автоматы, и другие. В настоящее время выпускаются следующие варианты ОС Windows Embedded: Windows Embedded CE, Windows Embedded Standard, Windows Embedded POSReady, Windows Embedded Enterprise, Windows Embedded NavReady, Windows Embedded Server. 2.2. Архитектура операционной системы WINDOWS ОС семейства Windows NT обладают модульной структурой, что обеспечивает гибкость и позволяет работать на различных аппаратных платформах (Intel, Dec) и поддерживает приложения, написанные для различных ОС. Windows различает прикладные программы и программы ОС, к последним, относятся: исполняющая система, микроядро, драйверы устройств и уровень аппаратных абстракций, которые выполняются в режиме ядра (рис.21). Эти программы имеют доступ к системным данным и аппаратному обеспечению. Остальные программы, работающие в пользовательском режиме, имеют ограниченный доступ к системным данным, а для доступа к аппаратному 52 обеспечению могут использоваться только API [6]. Для обеспечения переносимости большая часть исполняющей системы рассматривает аппаратное обеспечение в виде следующих уровней (рис.21): Системные процессы Контроллер сервисов WinLogin Диспетчер сессий Сервисы Репликатор Обработчик извещений Удаленный вызов процедур Регистратор событий Приложения Пользовательские приложения IDE Microsoft Visual Studio Подсистемы среды POSIX OS/2 Win32 Подсистема DLL Режим пользователя NTDLL DLL Режим ядра Системный поток API исполняющей системы Диспетчер Средства Диспет- Диспет- Монитор Диспет- Диспеввода-вывода локально- чер кэша чер про- безопасно- чер вир- тчер го вызова цессов и сти обра- туальной сети Файловые процедур потоков щений памяти системы Управление объектами, библиотека этапа исполнения Драйверы устройств Микроядро Уровень аппаратных абстракций Интерфейсы аппаратного обеспечения (шины, устройство ввода-вывода, таймеры, прямой доступ к памяти, контроллер КЭШа и т.п.) Рис.21. Структурная схема Windows XP 1. Уровень аппаратных абстракций: на нём формируется отображение между общими каналами ОС и ответными сигналами аппаратного обеспечения для конкретной платформыю. Этот уровень отделяет ОС от особенностей аппаратной платформы, благодаря чему системная шина, контроллер прямого доступа в память (ПДП), контроллер прерываний, системные таймеры и память выглядят с точки зрения ядра одинаково. Кроме того, на этом уровне поддерживается симметричная многопроцессорность (SMP). 53 2. Микроядро: в него входят наиболее часто используемые компоненты ОС. Ядро отвечает за распределение ресурсов между процессами, переключение пототоков и синхронизацию. В отличии от остальной части исполняющей системы и процессов, исполняемых на уровне пользователя код микроядра не разделяется на потоки, таким образом, это единственная часть ОС, которая не может быть вытеснена или выгружена на диск. 3. Драйверы устройств: к ним относятся как ФС, так и драйверы аппаратных устройств, которые преобразуют поступающие от пользователя вызовы функций ввода/вывода в запросы для конкретных устройств. 4 .Исполняющая система включает модули, обеспечивающие поддержку её функций и предоставляющие работающим в пользовательском режиме программам соответствующие API. Исполняющая система: Диспетчер ввода/вывода: поддерживает доступность для приложений ввода/вывода, отвечает за координацию работы драйверов устройств, выполняющих дальнейшую обработку и реализует все API I/O ОС с помощью диспетчера объектов следит за безопасностью, именованием устройств и ФС. Диспетчер объектов: создаёт и удаляет объекты и абстрактные типы данных исполняющей системы, а так же уровней или эти объекты и абстрактные типы данных используются для предоставления таких ресурсов как процессы, потоки и объекты синхронизации. Он создаёт и обеспечивает выполнение стандартных правил поддержки объектов именования и безопасность, кроме того, он создаёт диспетчер объектов, в котором содержится информация о правах доступа и указатель на объект. Монитор безопасности обращений: обеспечивает выполнение правил аудита и прав доступа одними и теми же служебными программами для всех защищённых объектов включая файлы, процессы, адресные пространства и устройства ввода/вывода. Диспетчер процессов и потоков: создаёт и удаляет объекты, а так же следит за процессами и потоками. 54 Средства локального вызова процедуры: устанавливает взаимосвязь между приложением и исполняющей подсистемой по модели «клиентсервер» при распределённой обработке данных. Диспетчер виртуальной памяти: отображает виртуальные адреса адресного пространства процессов на физические страницы основной памяти компьютера и обеспечивает управление ими. Диспетчер кеша: повышает производительность файлового I/O путём хранения в ОП тех данных с диска, к которым недавно проводилось обращение, кроме того, он обеспечивает отложенную запись на диск, при которой некоторое время информация для обновления дисковых файлов хранится в памяти. Диспетчер окон: создаёт оконный (экранный) интерфейс и управляет графическими устройствами. 5. Пользовательские процессы: Специальные процессы системной поддержки: к ним относятся служебные программы, которые не входят в ОС, например, диспетчер сессий и процесс входа в систему. Сервисные процессы. Приложения пользователя: Win32, POSIX, Os/2, Win 3.1, MS-DOS. Подсистемы операционной среды: предоставляют приложениям пользователя сервисы ОС, обеспечивая таким образом среду ОС, поддерживаются указанные выше подсистемы, в каждую из них входят DLL, преобразующие вызовы приложений пользователя в вызовы ОС. Наиболее важной из подсистем является Win32 – это API, который реализован для данной ОС (семейство Windows NT), его основные функции: 1. Ввод с клавиатуры и мыши, вывод на печать, динамические библио- теки (DLL), коммуникации, консоли, операции с буфером обмена, сервисы, системная информация, управление окнами, реестром, безопасность, время, графические фильтры, журнал регистра событий, конвейеры и т. д. 2. Структура защитной системы и приложений выполнена в соответ- ствии с вычислительной моделью клиент-сервер. Она позволяет упростить её 55 и повысить надежность, т. к. любой модуль используя систему запускается в виде отдельного процесса которому отводится своя область памяти защищённая от воздействия других моделей. Кроме того клиент не может непосредственно обращаться к аппаратному обеспечению или изменять содержимое той области памяти, в которой находится исполняемая система, таким образом, сбой в работе одного из клиентов не приводит к аварийному отказу или повреждению остальной части ОС. 3. Приложение с помощью локальных вызовов представляются обыч- ными средствами обмена информацией с исполнительной системой. Процесс передачи сообщений скрыт от клиента функциями-заглушками из dll. При вызове API приложения заглушка пересылает переданные при вызове параметры в виде сообщений подсистемы сервера, которые реализуют вызов. 4. Обеспечивает распределённое вычисление ОС. Локальный сервер может передавать сообщения от локального приложения клиента для обработки или удалённого сервера. Клиенту не нужна информация о том, как обрабатывается запрос локально или удалённо, ведь способ обработки может измениться динамически в зависимости от изменчивости конфигурации и загруженности системы. Интегрированная среда разработки (англ. IDE, Integrated development environment — система программных средств) Microsoft Visual Studio используется для разработки приложений для операционной системы Windows. Microsoft Visual Studio — линейка продуктов компании Майкрософт, включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств [1]. Visual Studio включает один или несколько компонентов из следующих: Visual Basic .NET, а до его появления — Visual Basic; Visual C++ ; Visual C#. Многие варианты поставки также включают Microsoft SQL Server либо Microsoft SQL Server Express Обычно среда разработки включает в себя текстовый редактор, компилятор и/или интерпретатор, средства автоматизации сборки и отладчик. Иногда также содержит средства для интеграции с системами управления верси56 ями и разнообразные инструменты для упрощения конструирования графического интерфейса пользователя [7,8]. Многие современные среды разработки также включают браузер классов, инспектор объектов и диаграмму иерархии классов — для использования при объектно-ориентированной разработке ПО. Хотя и существуют среды разработки, предназначенные для нескольких языков — такие как Eclipse, NetBeans или Microsoft Visual Studio, обычно среда разработки предназначается для одного определённого языка программирования — как например, Visual Basic. 2.3. Процессы и потоки в Windows С точки зрения программирования каждый процесс win32/64 включает компоненты (рис. 22): один или несколько потоков; виртуальное адресное пространство, отличное от адресных пространств других процессов, за исключением случаев явного разделения памяти; один или более сегментов кода, включая код DLL; ПРОЦЕСС Код программы Глобальные переменные Память кучи процесса Ресурсы процесса: Открытые файлы, Кучи,… Блок окружения Поток 1 Локальная область памяти потока Стек потока … Поток N Локальная область памяти потока Стек потока Рис. 22. Структура процесса и его потоков 57 один или более сегментов данных, содержащих глобальные переменные; строки окружения с информацией о переменных окружениях, таких как текущий путь поиска файла и др.; память кучи процесса; ресурсы процесса (открытые дескрипторы, файлы, другие кучи). Атрибуты процесса и потока в Windows приведены в табл. 2. Атрибуты процесса и потока в Windows Таблица 2 Процесс Поток Идентификатор процесса - уникальное значе- Идентификатор потока - уникальное значение, идентифицирующее процесс в ОС ние, идентифицирующее поток, когда он вызывает сервис. Дескриптор защиты – описывает, кто создал Контекст потока – набор значений регипроцесс, права доступа и пр. стров, которыми определяется состояние выполняемого потока. Базовый приоритет – базовый приоритет для Динамический приоритет - приоритет выпотоков полняемого потока в данный момент. Базовый приоритет – нижний приоритет динамического приоритета потока. Родственность процессов по умолчанию – за- Родственность процессов по потоку – мноданный по умолчанию набор процессов, где жество процессов, где возможно выполневозможно выполнение потоков. ние потоков. Время выполнения – суммарное время, затра- Время выполнения потока - совокупное ченное на выполнение всех потоков в процес- время, затраченное на выполнение потока в се. пользовательском режиме и режиме ядра. Счётчик ввода/вывода - переменные, в кото- Статус извещения (оповещения) – этот флаг, рые заносятся сведения о количестве и типе который указывает, следует ли потоку выопераций ввода/вывода, выполненных пото- полнять асинхронный вызов процедуры. ками процесса. Счётчик операций с виртуальной памятью – Счётчик приостановок – в нём указывается, это переменные, в которые заносятся сведения сколько раз выполнение потока было прио количестве и типе операций с виртуальной остановлено без последующего возобновлепамятью выполненных потоками процесса. ния. Квоты – максимальное количество страничной Маркеры режима анонимного воплощения – памяти и процессорного времени доступного это временный признак доступа. процессу Порты исключения/отладки – это каналы об- Порт завершения – это канал обмена инмена информацией между процессами, в кото- формацией между процессами, куда диспетрые диспетчер процессов должен отправлять чер процессов отправляет сообщения при сообщения при возникновении исключитель- завершении потока. ных ситуаций одного из потоков процесса. Статус выхода – причины завершения процесса Статус выхода – причины завершения потока 58 Все потоки процесса совместно используют код, глобальные переменные, строки окружения и ресурсы процесса [3]. Каждый поток планируется независимо. Поток включает следующие элементы: стек вызова процедур, переменных, обработчиков исключений и автоматических данных; локальная память потока – это массивы указателей, которые дают возможность процессу выделить память для создания собственного уникального окружения данных потока; структура контекста, управляемая ядром, содержащая значение аппаратных регистров. Некоторые атрибуты потока подобны атрибутам процессов. Значениия таких атрибутов потока извлекаются из значений атрибутов процесса. Например, в многопроцессорной системе родственные процессоры по потоку – это множество процессоров, на которых может выполняться данный поток. Оно совпадает с множеством процессоров родственных по процессу или является его подмножеством. Информация, содержащаяся в контексте потока, позволяет ОС приостанавливать и возобновлять потоки [9]. Основные функции управления процессами и потоками показаны в табл.3. Сервисы процесса и потока в Windows Процесс Создание процесса CreateProcess(). Открытие процесса OpenProcess(). Информация по запросу процесса Информация по наладке процесса Текущий процесс GetCurrentProcessID() Прекращение процесса ExitProcess() Таблица 3 Поток Создание потока CreateThread(). Открытие потока OpenThread() Информация по запросу потока Информация по наладке потока Текущий поток GetCurrentThreadID() Завершение потока ExitThread() Получение контекста Установка контекста Приостановка Delay() Возобновление Извещение потоков Проверка извещения потока Порт регистрации завершения. 59 Основной функцией для управления процессом win32 является функция CreateProcess(). Она создаёт процесс с одним потоком. Так как процесс требует наличие кода, то в вызове функции CreateProcess() необходимо указывать имя исполняемого файла программы. Функция имеет 10 параметров и при успешном выполнении возвращает дескрипторы для процесса и для первичного потока. Дополнительные потоки можно создать функцией CreateThread(). Для Windows все процессы одинаковы, и она не различает дочерние и родительские, в отличие от Unix. Жизненный цикл потока в Windows (рис 23) проходит следующие шесть состояний [3]: Готовый к выполнению: это поток, который может быть направлен на выполнение, у него есть все необходимые ресурсы кроме процессорного времени. Диспетчер микроядра отслеживает, все готовые потоки и осуществляет их планирование в соответствии с их приоритетом. Резервный - это поток, который будет запущен следующим на данном процессоре. Поток находится в этом состоянии до тех пор, пока процессор не освободится. Если приоритет резервного потока достаточно высок, то он может вытеснить выполняющийся в данный момент поток, иначе он ждёт, пока не произойдёт блокировка выполняющегося потока или пока не истечёт выделенный ему квант времени. Выбор потока для выполнения Готовый (1) Ресурсов достаточно Переходное состояние (5) Работоспособные состояния Передача управления Резервный (2) Вытеснение Завершение кванта времени Выполняющийся (3) Завершение Снятие блокировки, Ресурсов достаточно Снятие блокировки, Ожидание (4) Ресурсов недостаточно Блокировка приостановка Завершенный (6) Неработоспособные состояния Рис. 23. Жизненный путь потока в Windows 60 Выполняющийся: как только микроядро переключит поток, резервный поток перейдёт в состояние выполнения и будет в нём находится, пока не произойдёт одно из событий: поток будет вытеснен более приоритетным потоком, если закончится квант времени, будет блокирован или завершён. Ожидающее: поток входит в состояние ожидания, если он блокирован каким-либо событием (например, операцией ввода/вывода); он добровольно ждёт синхронизации; среда подсистемы предписывает потоку, чтобы он сам себя остановил. После удовлетворения условий ожидания, поток переходит в состояние готовности, если все его ресурсы доступны. Переходное: поток готов к выполнению, но не все ресурсы необходимые ему для работы доступны. При доступности всех ресурсов он переходит в состояние готовности. Завершающее: завершение потока может быть инициировано самим потоком, другим процессом или может произойти вместе с завершением родительского процесса. После завершения необходимых операций освобождения ресурсов поток удаляется из операционной системы. 2.4. Взаимодействие процессов В Windows процессы имеют три типа взаимодействия между собой [3]. Они показаны в табл.4. 1) Процессы могут быть не осведомлены о наличии друг друга: это независимые процессы, не предназначенные для совместной работы, например, многозадачность для конкретных заданий и интерактивная сеть. 2) Процессы косвенно осведомлены о наличии друг друга: они не обязательно могут знать идентификаторы друг друга, однако могут разделять доступ к некоторому объекту (буфер ввода/вывода). 61 3) Процессы непосредственно осведомлены о наличии друг друга: они обращаются друг к другу по идентификаторам и предназначены для совместной работы. Взаимодействие процессов Таблица 4. Степень взаВзаимосвязь имодействия Не осведомлены Конкуренция Влияние одного процесса Потенциальная прона другой блема взаимодействия Результаты работы одного про- Взаимоисключение, цесса не зависят от действий взаимоблокировка, других. Возможно влияние од- голодание ного процесса на работу другого Косвенно Сотрудничество Результаты работы одного про- Взаимоисключение, осведомлены с использовани- цесса могут зависеть от инфор- взаимоблокировка, ем разделения мации, полученной от других. голодание, ресурса Возможно влияние одного про- связь данных цесса на работу другого Непосредствен- Сотрудничество Результаты работы одного про- Взаимоблокировка, но осведомлены с использовани- цесса могут зависеть от инфор- голодание ем связей мации, полученной от других. Возможно влияние одного процесса на работу другого Взаимоисключение (mutual exclusion) – это предоставление процессу некоторого ресурса в монопольное использование, например, принтер предоставляется файла для печати, иначе на распечатке будут чередоваться строки различных файлов. Такой ресурс будет называться критическим, а участок программы, который его использует – критической секцией программы. Взаимоблокировка (deadlock) – пусть в системе 2 процесса П1 и П2 и 2 ресурса Р1 и Р2. Для работы П1 требуется Р1 и Р2 и он уже захватил Р1, а Р2 недоступен. В тоже время, П2 требуется Р1 и Р2, он захватил Р2, а Р1 недоступен, таким образом, процессы оказываются взаимноблокированы. Голодание - пусть в системе 3 процесса П1, П2 и П3, которые используют ресурс. Возможна ситуация, когда ресурсом владеет П1, а затем передаёт П3. ОС может предоставлять ресурс так, что П2 его не получит, а П1 и П3 будут использовать его попеременно. Таким образом, П2 не получает ресурса, хотя никакой взаимоблокировки нет, т. е. он голодает. Потоки одного процесса не имеют доступа к адресному пространству другого процесса. Однако существуют механизмы для передачи данных 62 между процессами. Важнейшими из них являются: разделяемая память, именнованные и не именованные каналы, сокеты. Система виртуальной памяти в Win32 использует файл подкачки - swap file (или файл размещения - page file), имея возможность преобразования страниц оперативной памяти в страницы файла подкачки на диске и наоборот. Система может проецировать на оперативную память не только файл размещения, но и любой другой файл. Приложения могут использовать эту возможность. Это может использоваться для обеспечения более быстрого доступа к файлам, а также для совместного использования памяти. Такие объекты называются проекциями файлов на оперативную память (file-mapping object). Для создания проекции файла сначала вызывается функция CreateFileMapping(). Ей передается дескриптор (уже открытого) файла или указывается, что нужно использовать page file операционной системы. Кроме этого, в параметрах ей передается флаг защиты, максимальный размер проекции и имя объекта. Затем вызывается функция MapViewOfFile(). Она отображает представление файла (view of a file) в адресное пространство процесса. По окончании работы вызывается функция UnmapViewOfFile(). Она освобождает память и записывает данные в файл (если это не файл подкачки). Чтобы записать данные на диск немедленно, используется функция FlushViewOfFile(). Проекция файла, как и другие объекты ядра, может использоваться другими процессами через наследование, дублирование дескриптора или по имени. Кроме разделяемой памяти, в Windows есть и другие способы передачи информации между процессами, например, каналы, именованные каналы и сокеты. Все они имеют сходный принцип и представляют собой своеобразный канал или соединение, "трубу", соединяющую процессы. Программа, имея один конец такого соединения, может читать и/или писать в него данные, обмениваясь, таким образом, информацией с программой на другом конце. Каналы используются для пересылки данных в одном направлении между дочерним и родительским процессами или между двумя дочерними 63 процессами. Операции чтения/записи в канал похожи на подобные операции при работе с файлами. Поименованные каналы используются для двустороннего обмена данными между процессом-сервером и одним или несколькими процессами-клиентами. Как и анонимные каналы, они используют файлоподобный интерфейс, но, в отличие от первых, пригодны также для обмена данными по сети. Сокет - это абстрактный объект для обозначения одного из концов сетевого соединения, в том числе и через Internet. Сокеты Windows бывают двух типов: сокеты дейтаграмм и сокеты потоков. Интерфейс Windows Sockets (WinSock) основан на BSD-версии сокетов, но в нем имеются также расширения, специфические для Windows. Для синхронизации в Win API используются (табл.5): уведомление об изменении файла, мьютекс, семафор, события, таймер ожидания. Механизмы для синхронизации параллельных вычислений Таблица 5 Условие перехода в сиг- Ожидающие пональное состояние токи Процесс Программа, включающая ад- Завершение последнего по- Освобождаются ресное пространство и ресур- тока все потоки сы, требуемые для её выполнения Поток Выполняемая единица внутри Завершение работы потока Освобождаются процесса все потоки Файлы Открытый файл или устрой- Завершение операций вво- Освобождаются ство ввода/ вывода да/вывода все потоки Консольный Буфер текстового окна ис- Имеется введённая инфор- Освобождается ввод пользуется для операций I/O в мация доступная процессу один поток MS-DOS Объекты специально для синхронизации Уведомление Уведомление о любых изме- Изменение в ФС соответ- Освобождается об изменении нениях ФС ствующее заданным объек- один поток файла том фильтру Мьютекс Механизм обеспечения взаи- Поток освобождает Освобождается моисключений в Win 32 мьютекс один поток Семафор Счётчик, регулирующий ко- Счётчик семафора обнуля- Освобождается личество потоков, которые ется один поток могут использовать ресурс События Извещение о наступлении не- Поток осуществляет собы- Освобождаются которого события в системе тие все потоки Таймер ожи- Счётчик, учитывающий про- Наступил указанный момент Освобождаются дания шедшее время времени или истёк указан- все потоки ный интервал времени. Тип объекта Определение 64 Семафор – это объект синхронизации, имеющий счетчик целых значенией и над которыми определены три операции: инициализация неотрицательным числом; уменьшения значения семафора: если значение отрицательное, то поток, выполняющий эту операцию блокируется; увеличения значений семафора: если значение было отрицательным, то оно увеличиваясь становится больше нуля, тогда заблокированный поток разблокируется. Каждый объект синхронизации ОС может находиться в сигнальном и несигнальном состоянии, когда объект входит в сигнальное состояние исполняющая система ОС освобождает все потоки, находящиеся в состоянии ожидания этого объекта. Мьютекс похож на бинарный семафор, но он знает имя процесса, который его захватил (в отличии от семафора). При его переходе в сигнальное состояние освобождается только один из ожидающих потоков и скорость его работы на два порядка выше, чем у семафора. 2.5. Управление потоками в Windows Система управления виртуальной памятью контролирует распределение памяти и работу страничной организации. Диспетчер памяти может использовать страницы размером от 4 до 64 кб. Каждый пользовательский процесс получает отдельное 32-битное адресное пространство, предоставляющее процессу 4 Гб памяти (диапазон адресов 232). Часть адресов памяти зарезервирована под ОС так, что каждому пользователю доступны только 2 Гб виртуального адресного пространства. В страничной организации каждая страница может находится в следующих состояниях: 65 1. доступна, т.е. страница используется процессом; 2. зарезервирована – множество страниц, которые диспетчер отвел под процессы, но которые не учитываются в квоте памяти процесса до их использования; 3. размещена – страница, для которой диспетчер выделяет память в файле подкачки страниц на диске, в котором располагаются страницы при удалении их из основной памяти. Диспетчер памяти управляет резидентным множеством страниц каждого процесса, загруженного в основную память. При первой активации процессу передается несколько кадров основной памяти, не весь новый процесс загружается в основную память. Когда процесс обращается к странице, отсутствующей в основной памяти, одна из страниц этого процесса выгружается в файл подкачки страниц, а на ее место загружается в зависимости от приоритета, другая информация (страница). При выполнении процесса (потока) ОС должна принимать 3 типа решений, связанных с планированием: долгосрочное, среднее и краткосрочное (рис.24). Долгосрочное определяет, когда новый процесс должен поступить в систему. Среднесрочное является частью свопинга и определяет, какой из готовых к выполнению процессов будет выполняться процессором следующим. При краткосрочном планировании планировщик использует ряд критериев. Основные: время отклика системы (для пользователя) и степень использования процессора (для системы) [3]. Они противоречивы. Имеется ряд альтернативных критериев для выбора среди готовых к выполнению потоков. 1. Первым поступил – первым обслужен. Выбирается поток, ожидающий обслуживания дольше других. 2. Круговое планирование. Использует кванты времени для ограничения времени непрерывного выполнения потока (они выполняются циклически). 3. Выбор самого короткого потока. Выбирается поток с минимальным времени работы. Вытеснение потоков не применяется. 66 4. Наименьшее остающееся время. Выбирается поток с минимальным ожидаемым временем оставшейся работы. Поток может быть вытеснен. Выполняющийся Готовый Заблокированный Краткосрочное планирование Заблокированный, приостановленный Готовый, приостановленный Среднесрочное планирование Новый Выход Долгосрочное планирование Рис.24. Уровни планирования загрузки процессора 5. Наивысшее отношению отклика. Принимаемое решение опирается на оценку нормализованного времени оборота потока по состояниям. 6. Снижение приоритета. Определяет множество очередей и распределяет в них потоки, основываясь на истории выполнения и других критериях. Выбор алгоритмов или их комбинации зависит от ожидаемой производительности и сложности реализации. В Windows NT реализован планировщик с вытеснением и гибкой системой уровней приоритетов, включая круговое планирование на каждом уровне, а для уровней «переменных приоритетов» – динамическое изменение приоритета на основе текущей активности потоков. В Windows NT две группы (класса) приоритетов: реального времени и переменные, по 16 уровней в 67 каждом (рис. 25). При появлении потока (в состоянии готов) с большим приоритетом, чем у выполняющегося потока, выполняющийся поток вытесняется и начинает выполняться поток с большим приоритетом. Наивысший (31) Класс приоритетов реального времени Наинизший (16) Наивысший (15) Класс переменных приоритетов Наинизший (0) Рис. 25 Приоритеты потоков в Windows В классе РВ все потоки имеют ориентированные приоритеты от 16 до 31, которые никогда не изменяется. Все активные потоки с определенным уровнем приоритета располагаются в круговой очереди данного уровня. Приоритеты потоков в период исполнения остаются постоянными [3]. В классе переменных приоритетов поток начинает работу с некоторым изначально заданным приоритетом, который затем может измениться в большую или меньшую сторону в зависимости от деятельности потоков. Таким образом, на каждом уровне приоритета имеется своя очередь, но потоки могут переходить из одной очереди в другую в пределах класса переменных приоритетов. Начальный приоритет потока в классе переменных приоритетов определяется двумя величинами: базовым приоритетом процесса и базовым приоритетом потока (рис.26). Одним из атрибутов процесса является его базовый приоритет, который может принимать значения от 0 до 15. Каждый объект потока, связанный 68 с объектом процесса, имеет собственный базовый приоритет, который указывает базовый приоритет потока по отношению к приоритету процесса. Он может отличаться от базового приоритета процесса не более чем на 2 уровня в большую или меньшую сторону. Так, например, если базовый приоритет процесса равен 4, а базовый приоритет одного из его потоков равен -1, то 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Базовый приоритет Приоритет процесса Наивысший Повышенный Обычный Пониженный Наинизший Базовый приоритет потока Начальный Диапазон динамических приоритетов потока начальный приоритет (при создании потока) этого потока равен 3. Динамический приоритет Рис. 26 Пример отношения приоритетов в Windows NT После активизации потока из класса переменных приоритетов его действительный приоритет (именуемый динамическим приоритетом потока) может колебаться в определенных пределах. Он не может упасть ниже наименьшего базового приоритета потока и не может подняться выше максимально возможного значения приоритета для данного класса, т.е. 15. В приведенном выше примере (рис.26) это диапазон приоритетов от 2 до 15. 2.6. Файловые системы Windows 69 Для большинства приложений центральным элементом является файл. За исключением приложений реального времени, ввод данных в приложение осуществляется посредством файлов. Выходные данные почти всех приложений также сохраняются в виде файлов для долговременного хранения и последующего обращения к ним пользователей и других программ. Файловая система состоит из системы управления файлами и совокупности файлов на определенном виде носителя (CD, DVD, FDD, HDD, Flash и т.д.). Система управления файлами обеспечивает пользователям и приложениям возможность доступа к файлам, их сохранения и поддержку целостности их содержимого. Наиболее распространенным долговременным носителем информации в современных вычислительных системах является жесткий диск – «Винчестер». Этот термин применяется к любому герметичному диску с аэродинамической конструкцией считывающих магнитных головок. Файловые системы современных операционных систем устанавливаются в разделы жесткого диска. Раздел (англ. partition) — часть долговременной памяти жёсткого диска, выделенная для удобства работы, и состоящая из смежных блоков. На других носителях информации выделение разделов или не предусмотрено, или (за редкими исключениями) не практикуется. Однако, существуют флеш-драйвы, память которых можно разбить на два раздела, причём один раздел можно защитить паролем, при этом система «увидит» составное устройство из двух флеш-карт (на самом деле любую флеш карту можно разбить на два и более разделов, однако драйвер в Windows отображает только первый из них; работа с ними возможна при подмене драйвера или при работе с другими ОС). Выделение на одном жёстком диске нескольких разделов даёт следующие преимущества [1]: на одном физическом жёстком диске можно хранить информацию в разных файловых системах, или в одинаковых файловых системах, но с разным размером кластера (например, выгодно хранить файлы большого разме- 70 ра — например, видео — отдельно от маленьких, и задавать больший размер кластера для хранилища больших файлов); можно отделить информацию пользователя от файлов ОС; на одном жёстком диске можно установить несколько ОС; манипуляции с одной файловой системой не сказываются на других файловых системах. Информация о размещении разделов на жёстком диске хранится в таблице разделов (англ. partition table), которая является частью главной загрузочной записи (MBR). MBR располагается в первом физическом секторе жёсткого диска. Раздел может быть либо первичным (основным), либо дополнительным. В первом секторе каждого основного раздела находится загрузочный сектор (Boot Record), отвечающий за загрузку ОС с этого раздела. Информация о том, какой из основных разделов будет использован для загрузки операционной системы, тоже записана в главной загрузочной записи. В MBR под таблицу разделов выделено 64 байта. Каждая запись занимает 16 байт. Всего на жестком диске может быть создано не более 4 разделов. Когда разрабатывалась структура MBR, это считалось достаточным. Однако, позднее был введён дополнительный раздел, структура которого (EBR) может поддерживать неограниченное число логических дисков (разделов). По правилам дополнительный раздел может быть только один, и не может содержать другой дополнительный раздел. Таким образом, в максимальной конфигурации MBR на жёстком диске может быть сформировано три основных раздела и один дополнительный. При этом, некоторые ОС способны загружаться только с основного раздела. Обойти эти ограничения позволяет дополнительное программное обеспечение (менеджеры разделов). Первичный раздел (англ. primary partition) обязательно должен быть на физическом диске. Этот раздел всегда содержит только одну файловую систему (рис.27). На физическом диске может быть до четырёх первичных раз- 71 делов. Некоторые старые операционные системы - например, MS-DOS и ранние версии Windows - могли быть установлены только на первичный раздел. Основная таблица разделов может содержать не более 4 первичных разделов, поэтому был изобретён Расширенный (дополнительный) раздел (англ. extended partition). Это первичный раздел, который не содержит собственной файловой системы, а содержит другие логические разделы. Первичный раздел 1 (Логический раздел 1): ФС Физический Расширенный раздел Логический раздел 4: ФС диск (HDD) (Первичный раздел 2,Логический раздел 2): Логический раздел 5: ФС (Логический раздел 3): ФС Первичный раздел 3 Рис. 27. Пример разбиения жёсткого диска на разделы Для работы с разделами используются следующие программы, которые обычно называют «дисковыми утилитами»: Acronis Disk Director; Paragon Partition Manager; fdisk - утилита, входящая в комплект ОС MS-DOS, позволяет создавать разделы FAT, удалять любые разделы и выбирать активный; fdisk, cfdisk и sfdisk — стандартные текстовые утилиты для работы с разделами диска под GNU/Linux; Disk Druid — утилита для работы с разделами диска под GNU/Linux с графическим пользовательским интерфейсом; GParted — GNOME Partition Editor (free, GUI); оснастка «Управление дисками», являющаяся частью консоли Windows NT/2000/XP (Windows Management Console), позволяет просматривать, создавать и удалять основные и логические разделы, изменить букву логического диска или отформатировать его под FAT32 или NTFS. Файловые системы FAT. Существуют три файловые системы FAT: FAT12 (для гибких дисков FDD), FAT16, FAT32. Они различаются количе72 ством бит (12, 16, 32) для указания номера кластера в системе управления файлами. В файловых системах FAT логическое дисковое пространство любого логического диска делится на системную область и область данных (рис. 28). BR RS FAT1 FAT2 Системная область RDir Каталоги и файлы Область данных Рис.28 Деление дискового пространства BR – загрузочная запись Boot Record; RS – зарезервированные сектора; FAT1, FAT2 – таблицы 1 и 2 размещения файлов; RDir (Root directory, ROOT) – корневой каталог. Область данных разбивается на кластеры, которые представляют собой 1 или несколько смежных секторов. В таблице FAT кластеры, принадлежащие одному файлу, связываются по цепочке. Картой области данных является, по сути, Таблица размещения файлов (File Allocation Table - FAT) Каждый элемент таблицы FAT (12, 16 или 32 бит) соответствует одному кластеру диска и характеризует его состояние: свободен 00, занят ХХ, последний FF или является сбойным кластером (bad cluster) F7. Для указания номера кластера в системе управления файлами FAT16 используется 16-ти битовое слово, и можно адресовать 65536 кластеров. Кластер – это минимально адресуемая единица дисковой памяти, выделяемая для файла. Файл или каталог занимает целое число кластеров [3]. Если файл имеет размер 8001 байт, а кластер равен 2 Кбайтам, то файл на диске займет 5 кластеров, причем в последнем будет записан только один байт. Разбиение области данных на кластеры вместо использования секторов позволяет: уменьшить размер таблицы FAT, уменьшить фрагментацию файлов, сокращается длина цепочек файла, ускоряется доступ к файлу. Последний кластер может быть задействован не полностью, что приведет к заметной потере дискового пространства при большом размере кластера. На дискете кластер занимает 1 или 2 сектора. На жестком диске – 4, 8, 16, 32, 73 64 – сектора в одном кластере. Каждый элемент имеет следующую структуру (рис.29): имя файла, атрибут файла, резервное поле, время создания, дата создания, дата последнего доступа, резерв, дата последней модификации, время последней модификации, номер начального кластера Fat, размер файла. В данном примере файл с именем MyFile.txt размещается, начиная с 8-го кластера и занимает 12 кластеров. Цепочка кластеров для данного случая: 8,9,А,В,15,16,17,19,1А,1В,1C,1D. Кластер с номером 18 помечен кодом F7 как плохой. Он не может быть использован для размещения данных. Этот код выставляется утилитами форматирования и проверки дисков. Кластер 1D помечен кодом FF как конечный, принадлежащий данному файлу. Свободные кластеры помечены кодом 0. MyFile.txt А Time Data 08 Size 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 1D FF 03 04 05 FF 00 00 09 0A 0B 15 00 00 00 00 10 00 00 00 00 00 16 17 19 F7 1A 1B 1C 1D FF 00 00 Рис.29 Представление файла в FAT-системе При выделении нового кластера для записи в файл берется 1-ый свободный кластер. Поскольку файлы на диске изменяются, удаляются, перемещаются, увеличиваются и уменьшаются, то данное правило размещения приводит к фрагментации, т.е. данные одного файла располагаются не в смежных кластерах, а порой очень удаленных друг от друга. Образовывается сложная цепочка. Это приводит к замедлению работы с файлами. Так как Fat используется при доступе к диску очень интенсивно, она загружается в оперативную память. Система Fat32 намного эффективнее расходует дисковое пространство, так как использует кластеры меньшего размера по сравнению с предыдущими версиями Fat. По сравнению с Fat16 это дает экономию 10-16%. Элемент каталога в поле атрибут может хранить следующие значения: 1) архивный (устанавливается при изменении файла и снимается программой 74 выполняющей резервное копирование файлов на другой носитель); 2) директория; 3) метка тома; 4) системный; 5) скрытый; 6) только для чтения. Длинные имена в FAT32 обеспечиваются использованием нескольких элементов записи каталога: для одного файла (один элемент – одна запись для имени 8.3, и 24 записи для самого длинного имени, которое может содержать до 256 символов. Поэтому не рекомендуется использовать длинные имена. Основной недостаток FAT - медленная работа с файлами. При создании файла работает правило - выделяется первый свободный кластер. Это ведет к фрагментации диска и сложным цепочкам файлов. Отсюда следует замедление работы с файлами. Файловая система NTFS. Одним из основных понятий, используемых при работе с NTFS, является понятие тома. Возможно создание отказоустойчивого тома, занимающего несколько разделов, то есть использование RAIDтехнологии. NTFS делит все полезное дисковое пространство тома на кластеры — блоки данных, адресуемые как единицы данных. NTFS поддерживает размеры кластеров от 512 байт до 64 Кбайт; 2 или 4 Кбайт диска отводятся под MFT-зону — пространство, которое может занимать, увеличиваясь в размере, главный служебный метафайл MFT. Запись данных в эту область невозможна. MFT-зона пуста, чтобы служебный файл (MFT) по возможности не фрагментировался при своем росте [3]. MFT (общая таблица файлов) - централизованный каталог всех остальных файлов диска, в том числе и себя самого. MFT поделен на записи фиксированного размера в 1 Кбайт, каждая запись соответствует какому-либо файлу. Первые 16 файлов носят служебный характер и недоступны операционной системе — они называются метафайлами, причем самый первый метафайл — сам MFT. Эти первые 16 элементов MFT — единственная часть диска, имеющая строго фиксированное положение. Копия этих же 16 записей хранится в середине тома для надежности, поскольку они очень важны. Остальные части MFT-файла могут располагаться в произвольных местах 75 диска — восстановить его положение можно с помощью его самого, «зацепившись» за самую основу — за первый элемент MFT. Каждый файл в NTFS представлен с помощью потоков, у него нет данных, а есть «потоки». Один из потоков — данные файла. Для одного файла можно определить несколько потоков данных. Основные особенности NTFS: Работа на дисках большого объема происходит эффективно (намного эффективнее, чем в FAT); имеются средства для ограничения доступа к файлам и каталогам; разделы NTFS обеспечивают локальную безопасность как файлов, так и каталогов; введен механизм транзакций, при котором осуществляется журналирование файловых операций; существенное увеличение надежности; сняты многие ограничения на максимальное количество дисковых секторов и/или кластеров; имя файла в NTFS, в отличие от файловых систем FAT и HPFS, может содержать любые символы, включая полный набор национальных алфавитов, так как данные представлены в Unicode — 16-битном представлении, которое дает 65535 разных символов. Максимальная длина имени файла в NTFS — 255 символов. система NTFS также обладает встроенными средствами сжатия, которые можно применять к отдельным файлам, целым каталогам и даже томам (и впоследствии отменять или назначать их по своему усмотрению). Каталог в NTFS представляет собой специальный файл, хранящий ссылки на другие файлы и каталоги. NTFS обеспечивает безопасность на уровне файлов; это означает, что права доступа к томам, каталогам и файлам могут зависеть от учетной записи пользователя и тех групп, к которым он принадлежит. Каждый раз, когда пользователь обращается к объекту файловой системы, его права доступа 76 проверяются по списку разрешений данного объекта. Если пользователь обладает достаточным уровнем прав, его запрос удовлетворяется; в противном случае запрос отклоняется. Эта модель безопасности применяется как при локальной регистрации пользователей на компьютерах с NT, так и при удаленных сетевых запросах. Система NTFS также обладает определенными средствами самовосстановления. NTFS поддерживает различные механизмы проверки целостности системы, включая ведение журналов транзакций, позволяющих воспроизвести файловые операции записи по специальному системному журналу. Основной недостаток файловой системы NTFS - служебные данные занимают много места (например, каждый элемент каталога занимает 2 Кбайт) - для малых разделов служебные данные могут занимать до 25% объема носителя. RAID массивы. Повышение эффективности системы ввода-вывода может, достигается параллельным использованием нескольких устройств. В случае с дисками – использование массивов независимо для параллельной работы дисков. То есть различные запросы I/O могут обрабатываться одновременно. Raid – избыточный массив независимых дисков, его схема состоит из 7 уровней, которые не имеют иерархической структуры. Raid – набор физических дисков, рассматриваемых ОС, как один. Данные распределяются по физическим дискам массива. Избыточная емкость дисков используется для хранения контрольной информации, гарантирующей восстановление данных в случае отказа одного из дисков. Сравнительная характеристика уровней RAID [3], показаны в табл. 6. Raid 0 – не является RAID блоком, не использует избыточность. Данные распространяются системные данные по всем дискам. Эффективность зависит от способа размещения. Приложения с высокими требованиями к передаче данных удовлетворяют условиям: на протяжении передачи между памятью и дисками должна быть большая пропускная способность, создание 77 запросов ввода-вывода, которые бы эффективно управлялись дисковым массивом. Дисковый массив может обеспечивать высокую скорость работы i/o путем выравнивания загрузки нескольких дисков. Raid 1 – отличается способом достижения избыточности. Достигается дублирование всех данных. Запросы на чтение могут быть обслужены любыми из дисков, содержащих данные, выбирается диск с минимальным временем поиска. Для запросов на запись необходимо обновление полос. Скорость записи определяется более медленной из них. Простота восстановления данных. Raid 3 аналогичен с 2 – требуется резервный диск. Высокая скорость передачи данных. 1 запрос выполняется 1 раз. Raid 4 – используется технология независимого доступа. В массиве каждый диск функционирует независимо. Запросы выполняются независимо. Каждая операция записи должна обновлять информацию на диске четности. Raid 5 - располагает полосы четности по всем дискам. Raid 6 – выполняет 2 расчета четности, результаты хранятся в разных блоках на разных дисках (для n дисков n+2). Схема обеспечивает высокую надежность хранения данных. Уровни RAID Уровень 0 1 2 3 4 5 6 Категория Описание Скорость обработки запросов Расщепле- Все избыточности Большие ние полосы: отлично Отражение Отражение Хорошо/удовл. Параллель- Избыточность с ко- Плохо ный доступ дами Хэмминга НезависиЧетность с череду- Плохо мый доступ ющимися битами Четность с чередую- Отлично/ щимися блоками удовл. Распределенная чет- Отлично/ ность с чередующи- удовл. мися блоками Двойная распределен- Отлично/ ная четность с чере- Плохо дующимися блоками 78 Таблица 6 Скорость передачи данных Малые полосы: отлично Удовл./ удовл. Отлично Типичное применение ПО с некритическими данными, требующие высокой производительности Системные диски, важные файлы Отлично ПО с большими запросами I/O Удовл./ плохо Удовл./ Высокая скорость запроплохо сов, скорость данных, интенсивное чтение Удовл./ ПО, требующие исклюплохо чительно высокой надежности Ввод-вывод в Windows. Внешние устройства, обеспечивающие операции ввода-вывода, можно разделить на: 1) работающие с пользователем: используются для связи пользователя с компьютером (мышь, терминал, клавиатура); 2) работающие с компьютером: используются для связи с электрическим оборудованием. Это дисковые устройства, датчики и контроллеры; 3) коммуникации: используются для связи с удаленными устройствами (модемы и драйверы цифровых линий). Операции ввода-вывода могут осуществляться тремя способами [3]: 1) программируемый ввод-вывод. Процессор посылает необходимые команды контроллеру ввода-вывода, после этого процесс находится в состоянии ожидания, завершающем операцию ввода-вывода; 2) ввод-вывод, управляемый прерыванием. Процессор посылает необходимые команды контроллеру ввода-вывода и продолжает выполнение следующих команд. Выполнение процесса прерывается контроллером вводавывода, когда последний выполнит свое задание; 3) прямой доступ к памяти (ПДП): модуль ПДП управляет обменом данных между основной памятью и контроллером ввода-вывода. Процессор посылает запрос на передачу блока данных модулю ПДП, а прерывание происходит только после передачи всего блока данных. В Windows диспетчер ввода-вывода отвечает за весь ввод-вывод ОС и обеспечивает однородный интерфейс, который может быть вызван драйвером любого типа. Он обеспечивает управление: диспетчером КЭШа, драйверами ФС, драйверами сети и драйверами аппаратных устройств. Диспетчер КЭШа обеспечивает кэширование в основной памяти для всей файловой системы и сетевых компонентов. Он способен динамически увеличивать и уменьшать размер КЭШа, связанного с определенной должностью в соответствии с изменением объема доступной физической памяти. 79 Для повышения общей производительности диспетчер КЭШа использует отложенную запись. В этом случае системные записи обновляются только в КЭШе, но не на диске. Позже, когда загрузка процессора станет меньше, диспетчер КЭШа произведет запись внесенных изменений на диск. Если за это время будут выполнены дополнительные обновления, то на диск будет записана последняя версия системных записей. Диспетчер КЭШа также использует отложенные подтверждения. Аналогично отложенные записи, но для транзакции. Вместо немедленной пометки транзакции как успешно завершенной, система кэширует информацию и выполняет ее фоновую запись позже. Диспетчер ввода-вывода рассматривает драйвер ФС, как обычный драйвер устройства и направляет сообщения для томов, соответствующих программе-драйверу адаптера этого устройства. Драйверы сети Windows включают интегрированные сетевые возможности и поддержку распределенных приложений. Драйверы аппаратных устройств. Эти драйверы обращаются к регистрам ПУ через точки входа в динамически компонуемых библиотеках исполнительной системы Windows. Windows предоставляет два режима выполнения операции вводавывода: синхронный и асинхронный. При асинхронном вводе-выводе приложение инициирует операцию ввода-вывода, а затем может продолжить свою работу во время выполнения этого запроса. При синхронном вводе-выводе приложение блокируется до завершения выполнения операции ввода-вывода. 2.7. Установка и последовательность загрузки Windows 80 Установка Windows XP. Существует два способа установки Windows XP: на раздел с Windows более ранних версий (более простой) и на пустой дисковый раздел (более стабильный в работе). Шаг первый. Рассмотрим установку Windows XP на новый компьютер с пустым разделом [10]. После включения компьютера и установки инсталляционного диска с ОС в CD- или DVD-ROM необходимо и зайти в BIOS (setup), нажав кнопку “DEL” (в процессе начальной загрузки компьютера), для изменения опций загрузки компьютера (параметр «загрузка с компактдиска»). На рис. 30 показано меню BIOS, где для изменения параметров необходимо выбрать вкладку Advanced – Advanced BIOS Features. Все настройки BIOS всегда стоят по умолчанию, поэтому их изменять не нужно. Необходимо изменить только одну строку во вкладке Advanced – First Boot Device. Выберите в столбце справа, в этой же строке, [CD-ROM]. Затем нужно выйти из BIOS, нажав клавишу F10. В сплывающем окне система попросит, подтвердить сохранение изменений перед выходом из меню. После нажатия клавиши «Y» компьютер перезагрузится и, согласно изменениям, начнет загрузку с компакт-диска. Рис. 30. Меню BIOS и вкладка Advanced Программа установки Windows XP сама подготовит компьютер к инсталляции ОС, но перед этим непременно предложит прочитать лицензион81 ное соглашение, чтобы удостовериться, что вы принимаете все правила использования приобретенного продукта. После подтверждения лицензионного соглашения, установочная программа скопирует необходимую информацию для загрузки ОС с CD на жесткий диск. После копирования будет предложено выбрать и отформатировать раздел жесткого диска, на который будет установлена ОС, поскольку жесткий диск обязательно должен содержать хотя бы один отформатированный раздел. После выбора раздела для инсталлирования, программа продолжит копирование файлов. По завершению этой операции компьютер автоматически перезагрузится. Шаг второй. После перезагрузки необходимо ввести серийный номер – Serial Number. Он должен быть указан на коробке с диском. После этого, появится диалоговое окно с выбором установки. Здесь тоже все по умолчанию, поэтому нажимаем «Далее» (“Next”). Теперь на экране появится окно с параметрами установки рис.31. Рис. 31. Окно с параметрами установки Настройка параметры языка определяет основной и дополнительные языки. Кнопка дополнительные параметры открывает окно настроек, в котором будет два поля. Первое содержит путь и имя папки с файлами для установки Windows XP (значение этого поля должно стоять по умолчанию с компакт-диска). Во втором поле указывается папка, в которую будет установлена система (тоже по умолчанию, но если необходимо здесь можно переименовать папку). Специальные возможности на установку не влияют. В следую82 щем окне нужно указать свои персональные данные: Имя (“Name”) и Организация (“Company”). Поле Имя заполняется в обязательном порядке, а Организацию указывать необязательно. В следующем диалоговом окне можно выбрать место своего проживания (“Location”). От этого зависят форма записи даты, времени, изображение некоторых значков (например, значок валюты), а также многие значения, которые в соответствии со страной проживания, устанавливаются по умолчанию (например, язык). Большинство программ, написанных под Windows XP, подстраиваются под параметры, указанные при установке, для более удобной работы. Далее установка Windows XP продолжается в автоматическом режиме. В зависимости от скорости работы ПК установка занимает 20-50 минут (рис.32). Рис. 32 Установка Windows В течение этого времени еще несколько раз появится окно, сообщающее о необходимой перезагрузке компьютера. Не обязательно все это время ждать перед монитором - компьютер сам перезагрузится через 15 секунд, а после перезагрузки сам продолжит установку. Шаг третий. После установки Windows XP и очередной перезагрузки компьютера установочная программа произведет автоматическую настройку системы в зависимости от особенностей оборудования вашего ПК. Она сама определит его состав и установит необходимые драйверы. На протяжении всего этого процесса, на экране будут высвечиваться соответствующие диалоговые окна, сообщающие о действиях программы. После завершения этого этапа компьютер снова будет перезагружен (либо автоматически через 15 83 сек, либо после того, как вы нажмете любую клавишу). Осталось только установить пакет всех необходимых вам программ. А сама операционная система Windows XP установлена и готова к использованию. Последовательность загрузки Windows XP После того как компьютер включен, процессор начинает выполнять инструкции BIOS. BIOS стартует компьютер, даже если операционная система не установлена. Первый набор инструкций - power-on self test (POST). POST выполняет следующие функции [11]: 1) выполняет начальную проверку оборудования, например, определяет количество установленой RAM, 2) проверяет наличие устройств для начала загрузки ОС, например жесткого диска, 3) получает установки системной конфигурации из CMOS. После того как POST закончен, дополнительные адаптеры (видео карта, контроллеры жесткого диска) выполняют свой тест внутренней диагностики. Затем BIOS загружает код загрузчика (который должен быть написан на ассемблере), передавая ему управление. Код загрузчика находится в master boot record (MBR), если конечно загрузчик существует, если нет, то BIOS выдаст Operating system not installed, т.е. Операционная система не установлена. MBR - это самый первый сектор жесткого диска. Код загрузчика содержит информацию, откуда загружать ОС. После этого начинает загружаться Windows, выполняя следующие шаги: 1) Ntldr (сокращение от NT loader) загружает загрузочные файлы с за- грузочного раздела и переводит процессор в 32 битный режим плоской памяти (32-bit flat memory) и загружает файловую систему 2) Ntldr стартует Ntdetect.com. Ntdetect.com собирает информацию об установленном оборудовании и передает ее Ntldr, который ее сохраняет, чтобы ядро могло ее позже прочитать 84 3) Ntldr стартует ядро (Ntoskrnl.exe) и говорит ему что установлено, т.е. инфо об установленном оборудовании от Ntdetect.com. Ntldr также загружает hardware abstraction layer (HAL) в память. Ядро и HAL инициализируют Windows executive, который просто напросто читает конфигурацию оборудования из регистра (ключ HKEY_LOCAL_MACHINE\SYSTEM) и запускает сервисы и драйверы. Надо отметить, что драйверы это тоже сервисы 4) Ядро запускает Session Manager (Smss.exe), который: переключает Windows из текстового режима в графический; запускает менеджер входа в систему Logon Manager (systemroot\System32\Winlogon.exe); создает дополнительные файлы виртуальной памяти; и если установлены новые программы и/или драйверы, то спросит перезагрузить систему. 5) менеджер входа в систему Logon Manager (Winlogon.exe) запускает подсистему сервисов (Services.exe) и локальную систему безопасности (Local Security Authority, Lsass.exe) и на последок делает возможным комбинацию клавиш CTRL+ALT+DEL, чтобы показать экран регистрации пользователя. 6) после успешной регистрации пользователя считываются настройки пользователя из реестра (ключ HKEY_USERS) и запускает приложения автозагрузки из меню Пуск\Программы\Автозагрузка (Common Startup) и из ветки реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Загрузка окончена. 2.8. Интерпретатор команд и пакетные файлы В Windows используется два интерпретатора команд commad.com (рис.30) и cmd.exe (рис.31), которые можно запустить через меню «Пуск» (Пуск-> Выполнить-> cmd -> ОК или Пуск-> Выполнить-> commad -> ОК). На рис. 33 показана возможность использования справки по командам 85 DOS/Windows. Справка становится доступной при наборе команды help в командной строке. Рис.33 Интерпретатор команд commad.com На рис. 34 показана возможность создания нового файла с использованием команды copy con имя_файла.расширение. Рис.34. Интерпретатор команд cmd.exe Использование пакетных файлов (*.cmd или *.bat) помогает автоматизировать выполнение нескольких заданий при установке и загрузке Windows [12]. При этом никакого вмешательства пользователя не требуется. Эти файлы могут быть выполнены из cmdlines.txt, svcpack.inf, RunOnceEx раздела в реестре, или из секции [GuiRunOnce] в файле winnt.sif. Пакетные файлы поддерживают все команды, которые могут быть выполнены из командной строки. Чтобы увидеть командую строку достаточно проделать следующее: Пуск->Выполнить->cmd->ОК Рассмотрим простейший пакетный файл. Для этого необходимо открыть Блокнот и набрать в нем следующий текст: TITLE Batch File Testing ECHO Hello World ECHO. 86 ECHO Starting Notepad START notepad ECHO. ECHO Starting Wordpad START Wordpad ECHO. PAUSE EXIT Затем нужно сохранить файл с любым именем и в любом месте, но с расширением *.cmd (а не .txt, которое Блокнот присвоит по умолчанию). При запуске этого файла он назначит окну имя "Batch File Testing", запустит Блокнот и WordPad, попросит нажать любую клавишу для продолжения работы и закроет окно. Значения команд, использованных в командном файле @echo off echo. echo message Title Start Pause Exit Таблица 7 Скрывает строку C:\> и все команды, используемые в пакетном файле Создает пробел между строками Отображает сообщение в окне, исключительно с информационными целями Название окна Запускает приложение или установочный процесс Отображает сообщение "Press any key to continue..." ("Нажмите любую клавишу для продолжения...") Закрывает командную строку При добавлении приложения для автоматической установки с инсталляционного диска XP, команды будут выглядить следующим образом: start /wait %systemdrive%\install\some_application\setup.exe /ключ /еще ключ, start запустит установку приложения, а /wait дождется ее окончания перед тем, как выполнить установку следующего приложения. Использование /wait очень важно, т.к. в противном случае одновременно запустится установка сразу нескольких приложений и конфликты неизбежны. Пакетные файлы могут быть запущены из cmdlines.txt или svcpack.inf, которые будут исполнены на Т-13/Т-12 этапе установки Windows (Т-13 означает 13 минут до окончания установки).cmdlines.txt удобен для таких задач как Добавление Пользователей, или для импортирования заранее подготовленных ключей реестра HKEY_CURRENT_USER в профиль по умолчанию (Default Profile). 87 Метод svcpack.inf, как правило, используется для установки обновлений (хотфиксов). Однако ничто не мешает рассматривать пакетный файл как еще один хотфикс. Пример пакетного файла, запущенного из [GuiRunOnce] (скриншот). Как вы видите, здесь используется комбинация ECHO и ECHO Message. Делать это не обязательно, но рекомендуется, т.к. дает возможность видеть, как происходит процесс инсталляции приложений в реальном времени. [GuiRunOnce] запускается при первом входе в систему. Пример содержимого пакетного файла: @echo off TITLE Windows XP SP2 - Unattended Installation ECHO. ECHO Over the next few minutes you will see automated installations ECHO of various sofware applications, and registry tweaks being ECHO implemented. ECHO. ECHO Removing Wallpapers and Screensavers... DEL "%systemroot%\*.bmp" DEL "%systemroot%\Web\Wallpaper\*.jpg" DEL "%systemroot%\system32\dllcache\*.scr" DEL "%systemroot%\system32\*.scr" ECHO. ECHO Removing useless shortcuts... DEL "%systemdrive%\Documents and Settings\All Users\Start Menu\Windows Update.lnk" DEL "%systemdrive%\Documents and Settings\All Users\Start Menu\Set Program Access and Defaults.lnk" DEL "%systemdrive%\Documents and Settings\All Users\Start Menu\Windows Catalog.lnk" ECHO. ECHO Installing TweakUI 2.10 Powertoy ECHO Please wait... start /wait %systemdrive%\Install\TweakUI.msi /qn ECHO. ECHO Applying Registry Tweaks... REGEDIT /S %systemdrive%\Install\RegTweaks.reg ECHO. ECHO Deleting ASP.NET User Account created by .NET Framework 1.1... net user aspnet /delete ECHO. 88 EXIT Он производит удаление обоев и скринсэйверов, устанавливаемых по умолчанию системой, а также некоторых ярлыков. Затем устанавливает TweakUI, импортирует ключи реестра и удаляет учетную запись ASP.NET, созданную при установке .NET Framework. Вызов внешних командных файлов: 1. После выполнения вызванного файла управление не передается в вызывающий файл. @ECHO OFF CLS REM Вывод списка log-файлов DIR C:\*.log REM Передача выполнения файлу f.bat f.bat COPY A:\*.* C:\ PAUSE 2. После выполнения вызванного файла управление передается в вызывающий файл: @ECHO OFF CLS REM Вывод списка log-файлов DIR C:\*.log REM Передача выполнения файлу f.bat CALL f.bat COPY A:\*.* C:\ PAUSE Файл cmdlines.txt нужно положить в директорию $OEM$, и Windows автоматически найдет его во время установки. Все пакетные файлы, запускаемые из cmdlines.txt, должны находиться в той же директории, что и cmdlines.txt. Файл svcpack.inf сохраняется в директории I386 на инсталляционном диске ( необходимо удалить оттуда svcpack.in_ ). Все пакетные файлы, запускаемые из svcpack.inf, должны находиться в директории I386\svcpack, если только это не прописано иначе в самом файле. 89 В пакетных файлах широко используются команды передачи управления IF, FOR, SHIFT, а также параметры, передаваемые из командной строки и операторы перенаправления ввода-вывода >, >>, <, |. Полезными оказываются операторы: «+» - слияния файлов, «?» - замены одного символа в имени файла или расширении, «*» - замены нескольких символов в имени файла или расширении. Системными именами являются: CON, NULL, AUX, COM1, COM2, PRN, LPT1, LPT2. Ими нельзя называть файлы. Не смотря на то, что теперь пользователи компьютеров могут легко обойтись без знания DOS, тем более, что в новых ОС DOS похоже будет отсутствовать вообще, их знание может, пригодятся в нештатных ситуациях, когда Windows по каким-то причинам запускаться не желает и доступна только командная строка. Справку по командам можно, получить, выполнив команду help. 2.9. Конфигурирование Windows Редактор реестра. В операционной системе Windows сведения о конфигурации системы централизованно размещены в реестре. Это упрощает администрирование компьютера или сети, но, вместе с тем, одно неправильное изменение в реестре может вывести операционную систему из строя. Редактор реестра является мощным инструментом изменения параметров системного реестра, содержащего служебную информацию системы [13]. Настройки Windows хранятся в базе данных (реестре), организованной в виде древовидной структуры рис.35. 90 Рис.35. Редактор реестра Windows Опытный пользователь, готовый к изменению и восстановлению реестра, может безопасно использовать редактор реестра для выполнения таких задач, как удаление повторяющихся записей или удаление записей программ, которые были удалены. Редактор реестра позволяет конфигурировать загрузку Windows, удалять вирусы, изменять настройки рабочего стола, разрешение экрана и т.д. Не следует изменять реестр без крайней необходимости. В случае наличия ошибки в реестре компьютер перестает работать надлежащим образом. В этом случае следует восстановить реестр в состояние последнего удачного запуска системы. Папки представляют собой разделы реестра и отображаются в области навигатора в левой части окна редактора реестра. В области разделов отображаются записи раздела. В табл. 8 дано описание основных разделов реестра. В области навигатора редактора реестра содержатся папки, каждая из которых представляет собой стандартный раздел на локальном компьютере. При осуществлении доступа к реестру удаленного компьютера отображаются только два стандартных раздела: HKEY_LOCAL_MACHINE и HKEY_USERS. Разделы редактора реестра Папка/стандартный раздел HKEY_CURRENT_USER Таблица 8 Описание Данный раздел является корневым для данных настройки пользователя, вошедшего в систему в настоящий момент. Здесь хранятся папки пользователя, цвета экрана и настройки панели управления. Эти данные называются 91 HKEY_USERS HKEY_LOCAL_MACHINE HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG профилем пользователя. Данный раздел содержит все профили пользователей компьютера. HKEY_CURRENT_USER является подразделом HKEY_USERS. Раздел содержит данные настройки, относящиеся к данному компьютеру (для всех пользователей). Данный раздел является подразделом HKEY_LOCAL_MACHINE\Software. Хранящиеся здесь сведения обеспечивают открытие необходимой программы при открытии файла с помощью проводника. Данный раздел содержит сведения о профиле оборудования, используемом локальным компьютером при запуске системы. Табл. 9 содержит список типов данных, определенных и используемых системой в настоящий момент. Чтобы запустить редактор реестра, необходимо выбрать меню Пуск/Выполнить в строке «Открыть» набрать regedit и нажать кнопку ОК. Для безопасного использования редактора реестра при удалении повторяющихся записей или удалении записей программ, которые были удалены, следует быть готовым как к правке, так и к восстановлению реестра. Приведенный ниже список содержит советы и рекомендации по аккуратному использованию реестра и редактора реестра: Перед внесением изменений в реестр делайте его резервную копию и создайте резервную копию всех важных данных, имеющихся на компьютере. Резервная копия реестра может быть создана программой архивирования. После внесения изменений в реестр создайте диск аварийного восстановления системы. Для облегчения устранения неполадок сохраняйте список изменений, внесенных в реестр. Дополнительные сведения содержатся в разделе Данные о состоянии системы. Список типов данных Тип данных REG_BINARY REG_DWORD REG_EXPAND_SZ Таблица 9 Описание Необработанные двоичные данные. Большинство сведений об аппаратных компонентах хранится в виде двоичных данных и выводится в редакторе реестра в шестнадцатеричном формате. Данные, представленные целым числом (4 байта). Многие параметры служб и драйверов устройств имеют этот тип и отображаются в двоичном, шестнадцатеричном или десятичном форматах. Строка данных переменной длины Этот тип данных включает пе92 REG_MULTI_SZ REG_SZ REG_FULL_RESOU RCE_DESCRIPTOR ременные, обрабатываемые при использовании данных программой или службой. Многострочный текст. Этот тип, как правило, имеют списки и другие записи в формате, удобном для чтения. Записи разделяются пробелами, запятыми или другими символами. Текстовая строка фиксированной длины. Последовательность вложенных массивов, разработанная для хранения списка ресурсов аппаратного компонента или драйвера. Нельзя заменять реестр Windows реестром другой версии операционных систем Windows или Windows NT. Неверные действия при изменении реестра могут серьезно повредить систему вплоть до необходимости переустанавки ОС. Редактор реестра не поддерживает функцию отката выполненных действий. Для редактирования реестра следует использовать не редактор реестра, а другие программы, обеспечивающие безопасные методы редактирования реестра. Одной из таких программ является утилита MSConfig. Утилита MSConfig. MSConfig (Настройка системы) — утилита для управления автозапускаемыми программами и загрузкой Windows (рис.36). Начиная с Windows версии 98, Microsoft поставляет утилиту "MSConfig.exe", предоставляющую удобный интерфейс для управления файлами, запускающимися при загрузке Windows. Она находится в каталоге установки Windows. Ее можно запустить из диалогового окна "Выполнить". В ней нет возможности добавлять новый элемент с именем приложения или документа для автозапуска, но можно отключать, не удаляя, любой пункт из находящихся в списках. 93 Рис. 36. Окно утилиты MsConfig. Вкладка «Общие» позволяет выбирать вариант загрузки: обычный, диагностический или выборочный. Вкладка SYSTEM.INI предназначена для редактирования служб и драйверов загружаемые из одноименногох файла. Вкладка WIN.INI предназначена для отключения тех или иные программы или службы, загружаемые через этот конфигурационный файл. Вкладка «Службы» позволяет отключить ненужные службы, запускаемые при загрузке системы. Многие программы, такие как антивирусы и программы безопасности компьютера, запускаются через службы ОС. В случае отключения служб такие программы могут перестать работать. Службы Windows являются системными процессами, которые, осуществляют поддержку оборудования и программного обеспечения на низком (аппаратном) уровне. Вкладка Автозагрузка отвечает за загрузку приложений (программ) а так же определенных служебных утилит, загружаемых не через службы. Вкладка Автозагрузка разбита на три колонки. В левой колонке находится элемент (программа), рядом с которой стоит галочка (или квадратик пустой, что означает, что эта программа не загружается вместе с системой). В средней колонке находится путь, указывающий, откуда (из какой папки) загружа94 ется та или иная программа. В правой колонке указывается, каким образом (каким ключом реестра) запускается та или иная программа. Обычно это меню Пуск\Программы\Автозагрузка (Common Startup) и ветка реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Архитектура Windows XP, опирающаяся на базовую технологию NT, подразумевает наличие в составе ОС определенногоколичества сервисов и служб – специальных программ, которые стартуя в момент запуска Windows, обеспечивают выполнение каких-либо специализированных системны задач. Поэтому сервисы Windows NT/2000/XP также называются системными службами. Управление ими возможно через реестр, но более эффективно через утилиту MSConfig (Настройка системы). Все внесенные изменения в конфигурацию ОС посредством MSConfig автоматически вносятся в реест и другие системные файлы. Диспетчер задач. В диспетчере задач отображаются сведения о программах и процессах, выполняемых на компьютере. Кроме того, там можно просмотреть наиболее часто используемые показатели быстродействия процессов рис.37. Диспетчер задач служит для отображения ключевых показателей быстродействия компьютера. Для выполняемых программ можно просмотреть их состояние и завершить программы, переставшие отвечать на запросы. Имеется возможность просмотра активности выполняющихся процессов с использованием до 15 параметров, а также графиков и сведений об использовании процессора и памяти. 95 Рис. 37. Окно диспетчера задач Кроме того, если имеется подключение к сети, можно просматривать состояние сети и параметры ее работы. Если к компьютеру подключились несколько пользователей, можно увидеть их имена, что они делают, а также отправить им сообщение. Для получения дополнительных сведений выберите одну из ссылок. На вкладке «Приложения» отображается состояние выполняющихся на компьютере программ. С помощью нее можно завершить или запустить программу, а также перейти в окно программы. На вкладке «Процессы» отображаются сведения о выполняющихся на компьютере процессах. Например, допускается отображение сведений об использовании ЦП и памяти, ошибках страницы, счетчике дескрипторов и некоторые другие параметры. Здесь можно удалить любой процесс в системе, что бывает полезно при зависании программ и поиске вирусов. На вкладке «Быстродействие» динамически отображаются следующие сведения о быстродействии компьютера. Графики загрузки процессора и ис96 пользования памяти. Общее число дескрипторов, потоков и процессов, выполняющихся на компьютере. Общий объем физической памяти, памяти ядра и выделения памяти в килобайтах. Вкладка «Сеть» позволяет просматривать графическое представление сведений о производительности сети. Простой качественный график показывает состояние сетей, к которым подключен компьютер. Вкладка «Сеть» отображается только для компьютеров с сетевой платой. На этой вкладке выводятся сведения о качестве и доступности сетевого подключения, а также о том, имеется ли подключение к одной или нескольким сетям. На вкладке «Пользователи» отображаются пользователи, имеющие доступ к компьютеру, а также состояние сеанса и имена пользователей. В столбце Имя клиента отображается, если возможно, имя компьютераклиента, который использует этот сеанс. В столбце Сеанс отображается имя, которое можно использовать для выполнения таких задач, как отправка сообщения другому пользователю или подключение к его сеансу. Можно использовать диспетчер задач для выключения компьютера, для перевода его в ждущий режим, для завершения сеанса пользователя или для блокировки компьютера, при которой он будет продолжать работать, но другие не смогут им пользоваться. К стандартным процессам Windows 2000/XP относятся следующие [14]: Csrss.exe. Данный процесс является частью подсистемы Win32, выполняющейся в непривилегированном режиме (Win32.sys является модулем привилегированного режима). Процесс Csrss представляет клиент-серверную подсистему времени выполнения. Данный процесс должен быть запущен все время. Процесс Csrss отвечает за консольные окна, создание и удаление потоков и за некоторые части 16-разрядной виртуальной среды MS-DOS. Explorer.exe - является пользовательской оболочкой, которая отвечает за такие компоненты как Панель задач, Рабочий стол и так далее. Этот процесс не столь важен для работы Windows и может быть остановлен (и пере- 97 запущен) с помощью Диспетчера задач, как правило, без отрицательных побочных эффектов. Internat.exe Процесс Internat.exe выполняется при запуске и загружает поддержку языковых модулей, указанных пользователем. Загружаемые языковые модули указываются в разделе системного реестра: [HKEY_USERS\.DEFAULT\Keyboard Layout\Preload]. Lsass.exe Данный процесс является сервером аутентификации локальной защиты, создающим процесс, ответственный за проверку пользователей для службы Winlogon. Данный процесс использует пакеты аутентификации, такие как Msgina.dll. Если аутентификация успешна, процесс Lsass создает маркер доступа пользователя, который используется для запуска пользовательской оболочки. Другие процессы, инициализируемые пользователем, наследуют данный маркер. Mstask.exe Данный процесс является службой планировщика, ответственной за выполнения задач по определенному пользователем расписанию. Smss.exe Данный процесс представляет подсистему менеджера сеансов. Данная подсистема является ответственной за запуск пользовательского сеанса. Этот процесс инициализируется системным потоком и ответствен за различные действия, включая запуск процессов Winlogon и Win32 (Csrss.exe) и установку системных переменных. После запуска данных процессов процесс Smss ожидает их завершения. При "нормальном" завершении процессов система корректно завершает работу. Если процессы завершаются аварийно, процесс Smss.exe заставляет систему прекратить отвечать на запросы. Spoolsv.exe Служба spooler ответственна за управление буферизацией печати для заданий печати и факсимильных заданий. Svchost.exe Данный процесс представляет собой универсальный процесс, который действует как исходный процесс для других процессов, вызываемых из библиотек DLL. Поэтому возможно наличие более одного экземпляра данного процесса. Чтобы видеть, какие процессы используют 98 Svchost.exe, используйте утилиту Tlist.exe, расположенную на компакт-диске Windows 2000. Введите "tlist -s" (без кавычек) в командной строке. Services.exe Данный процесс является диспетчером управления службами и отвечает за запуск, остановку и взаимодействие с системными процессами. System Большинство системных потоков привилегированного режима выполняются как процесс System. Taskmgr.exe Данный процесс является самим Диспетчером задач. Winlogon.exe Данный процесс отвечает за управление входом и выходом пользователей системы. Кроме того, Winlogon активируется только при нажатии пользователем сочетания клавиш "CTRL + ALT + DEL" и отображает диалоговое окно "Безопасность Windows". Winmgmt.exe Основной компонент управления клиентскими приложениями в Windows NT 5. Этот процесс инициализируется при первом соединении клиентского приложения или выполняется непрерывно, если приложения управления запрашивают его услуги. Бездействие системы. Данный процесс представляет собой отдельный поток, выполняющийся на каждом процессоре и имеющий единственную задачу заполнение процессорного времени, когда система не обрабатывает другие потоки. Данный процесс занимает большую часть процессорного времени. Многие из процессов, которые не могут быть завершены с помощью Диспетчера задач, могут быть завершены с помощью программы Process Killer, но данная команда может вызывать отказ системы. 99 3. ОПЕРАЦИОННАЯ СИСТЕМА QNX NEUTRINO 3.1. Версии операционной системы QNX Neutrino QNX — POSIX-совместимая операционная система жесткого реального времени, предназначенная преимущественно для встраиваемых систем. Считается одной из лучших реализаций концепции микроядерных ОС. Как микроядерная операционная система, QNX основана на идее работы основной части своих компонентов как небольших задач, называемых сервисами [1]. Это отличает её от традиционных монолитных ядер, в которых ядро операционной системы — одна большая программа, состоящая из большого количества «частей», каждая со своими особенностями. Использование микроядра в QNX позволяет пользователям (разработчикам) отключить любую ненужную им функциональность, не изменяя ядро. Вместо этого можно просто не запускать определённый процесс. Система достаточно небольшая, чтобы в минимальной комплектации уместиться на одну дискету, вместе с этим она считается очень быстрой и должным образом «законченной» (практически не содержащей ошибок). QNX Neutrino, выпущенная в 2001 году, перенесена на многие платформы, и сейчас способна работать практически на любом современном процессоре, используемом на рынке встраиваемых систем. Среди этих платформ присутствуют семейства x86, MIPS, PowerPC, а также специализированные семейства процессоров, такие, как SH-4, ARM, StrongARM и xScale. В 1980 году студенты канадского Университета Ватерлоо Гордон Белл и Дэн Додж закончили изучение базового курса по разработке операционных систем, в ходе которого они создали основу ядра, способного работать в реальном времени. Разработчики были убеждены, что в их продукте была коммерческая потребность, и переехали в город Каната в провинции Онтарио (город высоких технологий, иногда это место называют северной Силиконовой долиной Канады) и основали компанию Quantum Software Systems. В 1982 году была выпущена первая версия QNX, работающая на платформе Intel 8088. 100 Одно из первых применений QNX, получивших широкое распространение, не относилось к встраиваемым системам — она была выбрана для собственного компьютерного проекта Министерства образования Онтарио, Unisys ICON. В те годы QNX использовалось в основном только для «больших» проектов, так как ядро, имеющее размер 44 килобайта, было слишком большим, чтобы работать на однокристальных чипах того времени. В середине 1980-х годов была выпущена QNX2. Система имела завидную репутацию за надёжность и получила широкое распространение для управления промышленными машинами. QNX2 и сейчас иногда применяется в ответственных системах. В середине 1990-х в Quantum поняли, что на рынке быстро завоёвывает популярность POSIX, и решили переписать ядро, чтобы оно было более совместимым на низком уровне. Так появилась QNX4. Она была доступна со встраиваемой графической подсистемой, названной Photon microGUI, и портированной под QNX версией X Window System. Перенесение программ в QNX4 из операционных систем, основанных на Unix, стало намного проще, также были убраны многие из «причуд» более ранних версий. Также, в начале 1990-х компания была переименована в QNX Software Systems (QSS), чтобы избежать путаницы с другими компаниями, в первую очередь с производителем жёстких дисков, имеющим такое же имя. В конце 1990-х было решено создать операционную систему, соответствующую свежей редакции POSIX и в максимальной степени совместимую с NetBSD и GNU/Linux, в то же время, сохранив предсказуемое поведение и микроядерную архитектуру. Результатом этих разработок стала QNX Neutrino, выпущенная в 2001 году (рис.38). Эта версия поставляется вместе с QNX Momentics, средой разработки программного обеспечения (IDE), основанной на Eclipse IDE, различными утилитами GNU и программным обеспечением, ориентированным на Интернет: веб-браузерами Voyager и Mozilla, а также веб-сервером. В отличие от предшествующих версий, работавших только в PC-совместимых архитектурах, QNX6 легко адаптируется практиче101 ски к любой аппаратной конфигурации. Кроме того, особое внимание было уделено проработке архитектуры с тем, чтобы её можно было эффективно масштабировать: как «вверх» (добавляя новые сервисы и расширяя функциональность), так и «вниз» (урезая функциональность, чтобы «втиснуться» в ограниченные ресурсы). Иными словами, QNX6 можно установить там, где QNX4 не уместилась бы. Также, в QNX6 все драйверы были приведены к единой модели и все интерфейсы стали открытыми. Рис. 38. Графический интерфейс QNX Neutrino 4 февраля 2004 года Государственная техническая комиссия при Президенте РФ выдала компании «СВД Встраиваемые Системы» сертификат № 846, удостоверяющий, что операционная система реального времени QNX 4.25 (изделие КПДА.00001-01) проверена по 2 уровню контроля отсутствия недекларированных возможностей. Сертификат разрешает использовать изделие при разработке систем защиты для автоматизированных систем до класса 1Б включительно в соответствии с требованиями документов Гостехкомиссии России. 102 18 мая 2004 года в Государственный реестр сертифицированных средств защиты информации внесён сертификат № 906, удостоверяющий, что защищённая система реального времени QNX 4.25 (КПДА.00002-01) соответствует требованиям руководящих документов Гостехкомиссии России по 3 классу защищённости от несанкционированного доступа (НСД) и 2 уровню контроля отсутствия НДВ. 27 октября 2004 года компания QSS была куплена международной корпорацией Harman, активно работающей на рынке мультимедийных устройств и систем автомобильной электроники, но далекой от разработки ОС реального времени. При этом Harman сохранила полную автономию компании QSS, а генеральный директор компании Дэн Додж одновременно занял пост вицепрезидента корпорации Harman по информационным технологиям. 10 ноября 2010 года компания QSS была продана канадской компанией Research in Motion, производителем смартфонов марки BlackBerry с шифрованным каналом связи. В 2011 году компния выпустила планшетный компьютер PlayBook, который работает под управлением QNX. QNX популярна в основном в Японии, Германии, России и, в последнее время, в Китае благодаря активному развитию рынку автомобильной электроники и интегрированных систем управления производством. Осенью 2007 года компания QNX Software Systems приступила к поэтапному открытию исходного кода QNX Neutrino на условиях лицензии гибридного типа в рамках сообщества Foundry27. Эта лицензия позволяет энтузиастам бесплатно получать доступ не только к исходным текстам операционной системы, но и к инструментальным средствам. При этом для коммерческого использования QNX Neutrino по-прежнему необходимо приобретать соответствующие лицензии. Кроме того, лицензия QNX Neutrino прямо запрещает проведение сертификаций продуктов, производных от исходного кода QNX Neutrino, без письменного разрешения компании QSS. В сентябре 2009 года на портале Foundry27 был создан проект, предназначенный для сопровождения QNX4 в публичной форме. 103 В 1982 году QNX попала под запрет комитета COCOM, как технология двойного назначения. Этот запрет был снят в 1990 году, однако жёсткая политика лицензирования привела к тому, что в странах Восточного блока система не получила широкого распространения. На сегодняшний день единственным ограничением на широкое использование QNX является высокая стоимость лицензии и сильная зависимость от QSSL в плане лицензирования разработанного программного обеспечения. Но, тем не менее, она занимает лидирующую позицию среди ОС реального времени на платформе ПК. Примеры применения QNX за рубежом: Наиболее ярким примером применения QNX является работа с кредитными карточками VISA во всех региональных офисах Северной Америки. Управление ядерным реактором. Одно из отделений канадской компании Atomic Energy of Canada Ltd., которая известна как разработчик, производитель и продавец ядерных реакторов, специализируется на разработке программных продуктов по управлению и мониторингу. На основе QNX этим отделением разработана система управления ядерным реактором, которая называется «Распределённая система управления с открытой архитектурой» (Open Architecture Distributed Control System). Кроме применения QNX в области управления, она также успешно используется и для научных исследований: моделирования процессов, отслеживания хода экспериментов. Cisco Systems использует оптимизированную версию микроядра QNX Neutrino в программном обеспечении IOS XR. Программный пакет IOS XR предназначен для управления коммутаторами Cisco CRS-1, обеспечивает непрерывный режим работы и поддерживает развитые функции управления терабитными коммутаторами с распределённой архитектурой. На март 2009 года решения на базе QNX лицензированы для использования на более, чем 10,1 миллионах единиц техники от практически всех ведущих производителей автомобилей, включая BMW, Chrysler, Daimler, Fiat, 104 Ford, General Motors, Honda, Hyundai, Mazda, Mitsubishi, Nissan, Saab, SsangYong, Toyota и Volkswagen. В частности такие автомобили выпускаются под марками Acura, Alfa Romeo, Audi, Buick, Cadillac, Chevrolet, Dodge, Honda, Hummer, Infiniti, Jeep, Lancia, Mini, Mercedes, Opel, Pontiac, Saturn и др. В России и СНГ QNX применения в промышленных системах, которые управляют довольно сложным и ответственным производством с очень высокими требованиями по времени реакции на аварийные ситуации, требованиями к надёжности и непрерывности управления. Наиболее крупными конкурентами QNX являются: Windows CE, VxWorks, OS-9, Integrity, LynxOS а также некоторые ОС на ядре Linux. 3.2. Архитектура операционной системы QNX Neutrino ОС QNX Neutrino строится на основе компактного микроядра, способного управлять группой взаимодействующих процессов. Как видно на рис.39 структура операционной системы больше представляет собой равноправных «игроков» взаимодействуют в ней между собой посредством координирующего ядра, чем иерархию. ОС QNX Neutrino действует как своего рода «программная шина», позволяющая динамически присоединять/ отсоединять модули ОС по мере необходимости. Ядро- это сердце любой операционной системы. В некоторых системах «ядро» несет столько функций, что оно уже само по себе является целой операционной системой [15]. Но микроядро в ОС QNX Neutrino – это истинное ядро, потому что, во-первых, как и ядро исполнительного модуля реального времени, оно очень компактного, а во-вторых, оно предназначено для выполнения только нескольких базовых функций: 105 управление потоками (thread services) посредством POSIX- прими- тивов для создания потоков; управления сигналами (signal services) посредством примитивов сигналов; обмен сообщениями (message-passing services) , с помощью которо- го микроядро выполняет трассировку всех сообщений, пересылаемых между всеми потоками внутри системы; синхронизация (synchronization serviсes) посредством примитивов синхронизации потоков; планирование (scheduling services), с помощью которого микроядро осуществляет планирование потоков в реальном времени на основе различных алгоритмов; управление таймерами (timer services) , помощью которого микро- ядро обеспечивает большой набор POSIX- таймеров; управление процессами (process management services), выполняемое администратором процессов, вместе с которым ядро образует единый модуль procnto. Администратор процессов предназначен для управления процессами, памятью и пространством имен путей (pathname space). Файловый адм. QNX4 Минимальный загружаемый модуль procnto Администратор процессов Микроядро Neutrino Файловый адм. флеш-памяти Файловый адм. CD-ROM Файловый адм. DOS Файловый адм.NFS Программная шина Администратор TCP/IP Адм. граф. польз. интерф. Photon Администратор Mqueue Адм. симв. ввода/вывода Файловый адм. CIFS Приложение Рис.39 Архитектура ОС QNX Neutrino 106 Файловый адм. Qnet В отличие от потоков, микроядро никогда не планируется на выполнение. Процессор выполняет код в микроядре только в случае явного вызова ядра, при возникновении исключения или в результате аппаратного прерывания. Все службы ОС, за исключением тех, которые выполняются обязательным модулем микроядра/администратора процессов (procnto), обрабатываются посредством стандартных процессов в пользовательском режиме. Система может содержать следующие компоненты: Администраторы файловых систем; Администраторы устройств символьного ввода/вывода; Графический пользовательский интерфейс (Photon); Сетевой администратор; Стек протоколов TCP/IP. Системные процессы, по сути, никак неотличимы от пользовательских процессов - они используют те же самые унифицированные службы программного интерфейса и ядра, которые доступны для любого пользовательского процесса, имеющего соответствующие привилегии. Именно такая архитектура дает ОС QNX Neutrino уникальные возможности расширяемости. Поскольку большинство служб ОС выполняются стандартными системными процессами, конфигурация ОС может быть легко дополнена новыми компонентами, для чего достаточно написать соответствующие программы, предназначенные для выполнения новых служб. На самом деле граница между операционной системой и приложением может стать очень размытой. Единственное различие между системными службами и приложениями состоит в том, что службы ОС управляют ресурсами для клиентских задач. Пусть разработан сервер базы данных. Сервер базы данных, так же как файловая система, принимает (посредством сообщений) запросы на открытие файлов и чтение или запись данных. Оба сервера действуют аналогичным образом в том смысле, что они обеспечивают программный интерфейс (на основе обмена сообщениями), с помощью которого клиенты получают до107 ступ к ресурсу. Оба являются независимыми процессами, которые могут быть написаны конечным пользователем и которые могут быть запущены или остановлены по необходимости. Сервер базы данных можно рассматривать при одной конфигурации как системный процесс, а при другой – как приложение. Важным здесь является то, что эти процессы могут выполняться в ОС без необходимости модифицировать стандартные компоненты самой ОС. Для разработчиков, создающих специализированные встроенные системы, это дает гибкие возможности расширения ОС в соответствии с требованиями разрабатываемых ими приложений и избавляет от необходимости обращаться к исходному коду ОС. Драйверы устройств позволяют ОС и прикладным программам согласованно использовать базовое оборудование компьютера (например, жесткий диск, сетевой интерфейс). Если в большинстве ОС драйверы устройств должны быть встроены в структуру ОС, в QNX Neutrino они могут запускаться и останавливаться как стандартные процессы. В результате добавление новых драйверов устройств не нарушает работу какой-либо части ОС, так как драйверы могут разрабатываться и подвергаться отладке как обычные приложения. QNX Momentics IDE - Интегрированная среда разработки приложений для операционной системы QNX Neutrino (рис.40). QNX Momentics IDE представляет собой профессиональный комплект разработчика, который поддерживает различные языки программирования (С, С++, Embedded С++ и Java), различные инструментальные ОС (Windows, Linux, или QNX Neutrino) и различные целевые процессоры (ARM, MIPS, PowerPC, SH-4 и x86) и позволяет существенно сократить время разработки встраиваемого проекта независимо от его масштаба и сложности. Для разработки нестандартных драйверов применяются комплекты разработки драйверов (DDK), содержащие большую базу исходных текстов и готовых шаблонов. Отладка приложений вместе с драйверами выполняется с помощью одного и того же графического символьного отладчика [15]. 108 Рис.40. Структура и функции QNX Momentics IDE QNX Momentics IDE позволяет оптимизировать производительность приложений с использованием профайлера приложений и анализатора ОЗУ, которые тесно интегрированы с остальными инструментами среды разработки. Системный профайлер и отладочная версия микроядра позволят визуально отслеживать проблемы синхронизации, взаимные блокировки и прочие часто возникающие ошибочные ситуации (рис. 41.). Рис. 41. Профилирование кода Для выполнения системного профилирования в состав QNX Momentics IDE входит пакет System Analysis Toolkit (SAT). В операционной системе 109 происходят различные события, все они так или иначе проходят через миктоядро, поэтому основу SAT составляет модуль procnto-instr – Администратор процессов, с которым скомпоновано микроядро, оборудованное средствами диагностики. QNX утверждает, что производительность «истументированного» микроядра составляет не менее 98% производительности обычного микроядра. Средства, входящие в инструментальное расширение микроядра, записывают информацию о системных событиях в специальных буферах ядра (буферах трассировки) в виде записей (рис. 42). Рис.42. Системное профилирование Средства сбора данных извлекают информацию из буферов трассировки в специальный файл журнала трассировки, который для увеличения скорости этой операции имеет двоичный формат – т.е. средства сбора данных не пытаются анализировать данные. Преобразование журнала трассировки в понятный для человека формат выполняется средствами визуализации трассы. Системное профилирование может выполняться тремя способами: 110 1. С помощью утилиты qconn. В этом случае в качестве средства сбора данных используется утилита qconn, которая может на выбор сохранять данные в журнале трассировки на целевой системе или сразу отправлять их в виде потока средству визуализации – перспективе QNX System Profiler интегрированной среды разработки. Важным достоинством этого способа является возможность ограничивать перечень регистрируемых событий трассировки теми событиями, которые нас действительно интересуют – уж больно много информации собирает инструментальное ядро по умолчанию. 2. С помощью утилиты tracelogger. Утилита сохраняет данные в журнале трассировки. Для конвертирования данных в форму, удобную для чтения, следует или воспользоваться утилитой traceprinter, или написать свою программу обработчки журнала трассировки (в составе SAT есть специальная библиотека), или воспользоваться перспективой QNX System Profiler. 3. Управлять процессом трассировки из своего приложения, используя функцию TraceEvent(). Данные будут извлекаться из буферов трассировки в журнал с помощью утилиты tracelogger. Этот метод позволяет весьма тонко настраивать процесс трассировки. По умолчанию и утилита tracelogger, и qconn заказывают у proc-instr 32 буфера. Каждый из буферов состоит из 1024 слов по 16 байт (т.е. каждый буфер имеет размер 16 кбайт). Событие ядра, для описания которого достаточно одного слота, называют fast. Те события, для описания которых недостаточно одного слота, называют wide. Для управления трассировкой можно задавать фильтры: режим fast, wide. Fast указывает, что информация о wide-событиях должна обрезаться до размера fast. Это позволяет сэкономить слоты и увеличить скорость трассировки. Режим fast задан по умолчанию. Статический и динамический фильтры. Позволяют задавать правила записи событий в буферы, например, указывать, какие именно события нас интересуют. Статические фильтры используются утилитой qconn, динамический фильтр – это программа, использующая вызовы функции TraceEvent(). 111 Выходной фильтр. Не влияет на запись трассы, а только позволяет извлекать нужную информацию из журнала трассировки. Пример создания динамического фильтра есть в электронной документации по SAT. Midnight Commander — один из старейших файловых менеджеров в мире *NIX-систем [16]. Несмотря на то, что технологии давно ушли вперед, и жизнь без графического интерфейса существует только у системных администраторов, программа продолжает развиваться и по-прежнему остается востребованной среди пользователей Linux и QNX (рис.43). Рис.43. Файловый менеджер Midnight Commander Для работы Midnight Commander не требуется никаких графических библиотек, главное, чтобы всегда под рукой была консоль/терминал. Ранние версии файлового менеджера имели проблемы с русскими кодировками, но сегодня все ошибки исправлены, и можено просматривать и редактировать файлы, используя различние кодовые страницы. Текстовый редактор Midnight Commander имеет подсветку синтаксиса. В Midnight Commander 112 можно создать обширное меню пользовательских команд, вызываемое клавишей F2. Средства просмотра документов Midnight Commander имеют большое ограничение — отсутствие графического интерфейса. Формально, файловый менеджер может просматривать даже изображения. Программа правильно распознает тип данных, но вместо картинки отображает свойства изображения. Midnight Commander, не умея просматривать документы типа RTF, отлично справляется с форматрм DOC. А ведь DOC — это закрытый формат, имеющий структуру на порядок сложнее документа «со сложным форматированием» (Rich Text Format). Midnight Commander позволяет создавать закладки, имеет историю посещения каталогов. В отличие от других программ, где подобные элементы чаще реализованы в виде компактных, малоинформативных меню, Midnight Commander позволяет добавлять подробные описания элементам и отображает их в большом окне. Если запускается какой-нибудь длительный процесс, например, копирование. Файловый менеджер позволяет выполнять подобные операции в фоновом режиме. При этом на экране не будет отображаться прогресс выполнения задачи. Однако можно вызывать менеджер фоновых процессов и посмотреть состояние тех или иных задач. 3.3. Процессы в QNX6 В UNIX выделяют следующие типы процессов: системные, демоны и прикладные (пользовательские) [5]. Системные: они являются частью ядра и всегда расположены в оперативной памяти. Они не имеют соответствующих им программ в виде исполняемых файлов и запускаются особым образом при инициализации ядра си113 стемы; выполняемые инструкции и данные этих процессов находятся в ядре системы, таким образом, они могут вызывать функции и обращаться к данным не доступным для остальных процессов. Системными процессами UNIX являются: диспетчер свопинга (shed), диспетчер страничного замещения (vhand), диспетчер буферного КЭША (bdfflush), диспетчер памяти ядра (kmademon), к ним относятся процесс init, который является прародителем всех остальных процессов ОС и запускающийся при инициализации системы, хотя он не является частью ядра и запускается из исполняемого файла. Демоны: это неинтерактивные процессы, которые запускаются обычным образом, путём загрузки в память соответствующих им программ и выполняются в фоновом режиме, они запускаются при инициализации системы и обеспечивают работу различных процессов ОС (система печати, сетевого доступа и т. п.). Они не связаны ни с одним пользовательским сеансом работы и не могут непосредственно управляться пользователем. Большую часть времени они ожидают пока тот или иной процесс не запросит определённую услугу, например, доступ к файловому архиву или печать документов. Прикладные процессы: к ним относятся все остальные процессы, выполняющиеся в системе. Эти процессы порождёны в рамках пользовательского сеанса работы. Они могут выполняться как в интерактивном так и в фоновом режиме. Но в любом случае время жизни ограничено сеансом работы пользователя. При выходе пользователя из системы все его пользовательские процессы будут уничтожены. В QNX процесс – это выполняющаяся программа. Процесс состоит из образа процесса и метаданных процесса. Образом процесса называется совокупность кода (т.е. инструкций для процессора – выполнение этих инструкций и есть выполнение программы) и данных (ими манипулируют с помощью инструкций) [15]. Метаданные процесса – это информация о процессе, которая хранится в структурах данных ОС и сопровождается ОС. Метадан- 114 ными являются: информация о физическом размещении кода и данных в оперативной памяти, а также атрибуты процесса, к которым относятся: Идентификатор процесса (Process ID, PID) – уникальный номер, присваиваемый процессу при его порождении ОС. Идентификатор родительского процесса (Parent PID, PPID) – PID процесса, породившего данный процесс, т.е. выполнившего запрос к ОС для создания данного процесса. Реальные идентификаторы владельца и группы (User ID UID и Group ID, GID) – номер, позволяющий механизмам защиты информации от несанкционированного доступа определять, какому пользователю принадлежит процесс и какой группе пользователей принадлежит этот пользователь. Эти идентификаторы присваиваются при регистрации пользователя в системе или командному интерпретатору (login shell), если выполнялась командностроковая регистрация через утилиту login, или графической оболочкой Photon, если регистрация выполнялась в графическом режиме через утилиту phlogin. Процессы, запускаемые пользователем, наследуют UID и GID той программы, из которой они запускались (т.е. родительского процесса). Эффективные идентификаторы владельца и группы (Effective UID EUID и Effective GID, EGID) – предназначены для повышения гибкости механизмов защиты информации от несанкционированного доступа. Пользователь при наличии соответствующих полномочий может в ходе работы менять эффективные идентификаторы. При этом реальные идентификаторы не меняются. Текущий рабочий каталог – путь (разделенный слэшами список каталогов), который будет автоматически добавляться к относительным именам файлов. Выводится на экран командой pwd. Управляющий терминал (TTY) – терминальная линия (терминал или псевдотерминал) ассоциированный с процессом и, с которым связаны потоки ввода, вывода и ошибок. Если процесс становится процессом – демоном, то он отсоединяется от своей терминальной линии и не имеет ассоциированной 115 терминальной линии. Запуск процесса как фонового (знак «&» в конце командной строки) - не отсоединяет процесс от терминальной линии [17]. Маска создания файлов (umask) – атрибуты доступа, которые будут заданы для файла, созданного процессом. Приоритет процесса (prio) – с этим приоритетом создается главный поток процесса (порождаемый функцией main()). Процесс – это статическая субстанция, контейнер. Дисциплина диспетчеризации – также больше относится к потоку. Использование ресурсов процессора (статистика по времени выполнения программы) – включает: время выполнения программы в прикладном контексте (user time – время выполнения инструкций, написанных программистом), время выполнения в контексте ядра (system time – время выполнения инструкций ядра по запросу программы, т.е. системных вызовов), суммарное время выполнения всех дочерних процессов в прикладном контексте, суммарное время выполнения всех дочерних процессов в контексте ядра. Процесс всегда содержит хотя бы один поток. Для процессов исходный код которых подготовлен на языках С/С++, главным потоком процесса является поток, в котором исполняется функция, текстуально описанная под именем main()[15]. Рассмотрим программу, которая получает информацию о значении своих атрибутов (файл process.c): #include <stdlib.h> // вызов стандартной библиотеки #include <sys/resourses.h> // статистическая информация о процессе int main(int argc, char **argv) { struct rusage r_usage; // задается структура последних четырех переметров printf(“\nProcess Information:\n); // \n – переход на новую строку printf(“Process name = \t\t%\n”,argv[0]); // \t – строка, argv[0] – выведем нулевой аргумент (процесс) printf(“User ID = \t\t<%d>\n”,getuid()); // по аналогии вывод остальной информации printf(“Effective User ID = \t<%d>\n”,geteuid()); printf(“Group ID = \t\t<%d>\n”,getgid()); 116 printf(“Process Group ID = \t<%d>\n”,getpgid()); printf(“Process ID (PID) = \t<%d>\n”,getpid()); printf(“Parent PID (PPID) = \t<%d>\n”,getppid()); printf(“Process priority = \t<%d>\n”,getprio()); getrusage(RUSAGE_SELF, &r_usage); printf(‘\t<user time=%d sec, %d microsec >\n’,r_usage, ru_utime,tv_sec, r_usage, ru_utime,tv_usec); printf(‘\t<system time=%d sec, %d microsec >\n’,r_usage, ru_stime,tv_sec, r_usage, ru_stime,tv_usec); return EXIT_SUCCESS; // завершение работы программы } С помощью директивы #include подключаются две библиотки stdlib.h (стандартная библиотека) и sys/resourses.h (статистическая информация о процессе). Программа начинает выполняться с точки входа - функции main(). Параметрами этой функции являются argc – целое значение количества аргументов командной строки при запуске программы и argv – массив, в котором находятся значения этих аргументов. Директива struct rusage задает структуру r_usage для получения информации о статистике выполнения программы. Функция printf() подключаемая через библиотеку stdlib.h обеспечивает вывод на экран сообщений. Управляющий символ \n переводит курсор на новую строку экрана. Переменная argv[0] всегда содержит имя исполняемой программы. Далее в функциях printf() происходит вызов функций для получения соответствующих атрибутов процесса. Функция getrusage(RUSAGE_SELF, &r_usage) возвращает в структуру r_usage информацию о статистике выполнения программы. Оператором return программа завершается и возвращает в создавший ее процесс сообщение EXIT_SUCCESS (имеет значение 0) – успешное завершение. Предком всех процессов QNX является администратор процессов (процесс procnto) (рис. 39), идентификатор PID которого равен 1. Остальные процессы порождаются в результате вызова соответствующей функции другим процессом, именуемым родительским [15]. Первой из функций пораждения процессов является функция fork() – создает дочерний процесс путем «клонирования» родительского процесса. 117 Действие вызова fork() следующее: порождается дочерний процесс, которому системой присваивается новое уникальное значение PID. Дочерний процесс получает собственные копии файловых дескрипторов, открытых в родительском процессе в точке выполнения fork(). Каждый дескриптор ссылается на тот же файл, который соответствует аналогичному дескриптору родителя. Блокировки файлов (locks), установленные в родительском процессе, наследуются дочерним процессом. При клонировании родительский и дочерний процессы различаются только идентификаторами PID и PPID. Функцию fork() рекомендуется использовать только в однопоточных программах. Рассмотрим применение функции fork() на примере программы fork.c. Функция fork() возвращает целое число, которое в родительском процессе равно идентификатору PID дочернего процесса, а в дочернем – нулю. // fork.c #include <stdlib.h> #include <sys/syspage.h> int main(int argc, char **argv, char **env) // функция возвращает целое значение. //argc – количство параметров передаваемых функции аргументов, //argv – сами аргументы, env – сообщения. { pid_t pid; // тип данных для хранения идентификатора процесса char *prefix; prefix=(char*)malloc(sizeof(char)); // выделение памяти pid=fork(); // новый процесс, дочерний к родительскому if (pid==0) sprintf(prefix, ‘child’); // был ли создан дочерний процесс else sprintf(prefix,”parent’); printf(“%s Process name =%s\n”,prefix,argv[0]); // вывод информации printf(“%s PID=%d\n”,prefix,getpid(0)); printf(“%s PPID=%d\n”,prefix,getppid(0)); return EXIT_SUCCESS; // завершение работы программы } На рис.44 показано выполнение программы fork.c. Функция vfork() (виртуальный fork()) – используется как «облегченная» альтернатива паре вызовов fork()-exec(). В отличии от стандартной функции fork(), она не выполняет реального копирования данных, а просто блокирует родительский процесс, пока дочерний не вызовет exec(). 118 Рис.44. Выполнение программы fork.c. Семейство функций exec() – заменяют образ вызвавшего процесса указанным исполняемым файлом (execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe()). В функциях exec и spawn используются суффиксы: l – список аргументов (определяется через список данных непосредственно в самом вызове); e – список аргументов указывается посредством определения массива переменных; р – относительный путь, если не указан полный путь к файлу программы; v – список аргументов определяется через указатель на массив аргументов. Функции семейства ехес() подменяют исполняемый код текущего процесса исполняемым кодом из другого файла (не изменяя его идентификатор PID, права доступа, внешние ресурсы процесса, а также находящийся в том же адресном пространстве). Поэтому используются эти вызовы 119 непосредственно после fork() для замены копии вызывающего процесса новым. Программа exec.c иллюстрирует прохождение нового процесса с помощью комбинации вызовов fork() и exec(): #include <stdlib.h> #include <sys/syspage.h> int main(int argc, char **argv, char **env) // функция возвращает целое значение. // argc – количство параметров передаваемых функции аргументов, // argv – сами аргументы, env – сообщения. { pid_t pid; // тип данных pid=fork(); // результат выполнения функции, определенной ранее, If (pid==0) //если pid=0, выполняется фнкция execlp { execlp(“process”,”process”, NULL); // программа завершается неудачей Perror(“Child”); Exit(EXIT_FAILURE); } Waitpid(0,NULL,0); Printf(“Parants’s PID =%d\n”,getpid(0)); Printf(“Parants’s PPID =%d\n”,getppid(0)); Return EXIT_SUCCESS; } Для запуска программы exec.c из интерпретатора команд sh необходимо набрать имя программы exec и нажать клавишу Enter. После этого интерпретатор команд sh запрашивает администратор процессов Procnto о возможности создания нового процесса exec. Если процесс exec успешно создан, то интерпретатор команд sh блокируется до момента завершения процесса exec. Родительский процесс exec создает дочерний процесс, вызывая функцию fork(). В родительском процессе условие pid==0 не выполняется, так как переменная pid равена идентификатору PID дочернего процесса, а он не может быть равен 0. И затем ожидает завершения дочернего процесса с помощью функции waitpid(). В дочернем процессе условие pid==0 выполняется и с помощью функции execlp(“process”,”process”, NULL) делается попытка загрузить программу process, но путь к ней не указан и функция execlp возвращает ошибку, ко120 торая выводится в поток ошибок функцией perror(“Child”). Затем дочерний процесс завершается функцией Exit(EXIT_FAILURE) и возвращает в функцию waitpid() родительского процесса код возврата дочернего процесса. Родительский процесс получает управление, выводит на экран свои идентификаторы PID и PPID и завершается оператором return. На рис.45 показано выполнение программы exec.c. Рис.45. Выполнение программы exec.c. Семейство функций spawn() – сразу порождает дочерний процесс, загрузив указанный исполняемый файл (spawn(), spawnl(), spawnle(), spawnlp(), spawnlpe(), spawnp(), spawnv(), spawnve(), spawnvp(), spawnvpe()) [17]. Суффиксы имеют аналогичное значение, что для описанной выше функции exec(). Это наиболее эффективный способ порождения процессов в QNX 121 Neutrino. Функции семейства spawn () порождают новый процесс с новым идентификатором PID и в новом адресном пространстве. В файле spawn.c представлен пример наиболее простого и быстрого способа порождения нового процесса: // spawn.c #include <stdlib.h> #include <sys/syspage.h> int main(int argc, char **argv, char **env) { spawnl(P_WAIT, “process”,”process” ,NULL); printf(“Parants’s PID =%d\n”,getpid(0)); printf(“Parants’s PPID =%d\n”,getppid(0)); return EXIT_SUCCESS; } Самый простой способ создания процесса - запустить из программного кода дочернюю копию командного интерпретатора, которому затем передать команду запуска процесса. Для этого используется вызов: int system(const char * command), где command - текстовая строка, содержащая команду, которую предполагается выполнить ровно в том виде, в котором мы вводим ее командному интерпретатору с консоли. Процесс завершается, если программа выполняет вызов exit () или выполнение просто доходит до точки завершения функции main(), будь то с явным указанием оператора return или без него. Другой путь - посылка процессу извне (из другого процесса) сигнала, реакцией на который (предопределенной или установленной) является завершение процесса. Рассмотрим временные затраты на создание процесса с помощью функции fork() на примере программы p2-1.cc [17]: //p2-1.cc #include <stdlib.h> #include <stdio.h> #include <inttypes.h> #include <iostream.h> #include <sys/neutrino.h> #include <process.h> #include <sys/syspage.h> 122 static double cycle2milisec ( uint64_t ccl ) { const static double s2m = 1.E+3; const static uint64_t cps = SYSPAGE_ENTRY( qtime )->cycles_per_sec; // частота процессора: return (double)ccl * s2m / (double)cps; }; struct mbyte { #pragma pack( 1 ) uint8_t data[ 1024 * 1024 ]; #pragma pack( 4 ) }; int main( int argc, char *argv[] ) { mbyte *blk = NULL; if( argc > 1 && atoi( argv[ 1 ] ) > 0 ) { blk = new mbyte[ atoi( argv[ 1 ] ) ]; }; uint64_t t = ClockCycles(); pid_t pid = fork(); if( pid == -1 ) { perror( "fork" ); exit( EXIT_FAILURE );} if( pid == 0 ) exit( EXIT_SUCCESS ); if( pid > 0 ) { waitpid( pid, NULL, WEXITED ); t = ClockCycles() - t; }; if( blk != NULL ) delete blk; cout << "Fork time: " << cycle2milisec( t ) << " msec. [" << t << " cycles]" << endl; exit( EXIT_SUCCESS ); }; Программа начинается с точки входа – функции main(). Предварительно задается структура mbyte, в которой задается блок данных размером один мегабайт. В главном потоке проверяется условие (argc > 1 && atoi( argv[ 1 ]) > 0 ), где функция atoi() преобразует символьную сстроку соответствующую первому параметру из командной строки в целое число ( argv[ 0 ] соответствует имени программы – p2-1). Если это значение больше нуля, то с помощью функции new() и структуры mbyte создается блок данных соответствующего размера. Затем с помощью функции ClockCycles() определяется в переменной t имеющей тип данных uint64_t текущее количество процессорных циклов, котрое необходимо для определения времни затрачиваемого на создание процесса. 123 Функция fork() создает дочерний процесс. Для дочернего процесса pid = 0 поэтому условие выполняется и дочерний процесс сразу же после проверки условия завершается функцией exit( EXIT_SUCCESS ). В это время родительский процесс ожидает завершения дочерненого порцесса на функции waitpid( pid, NULL, WEXITED ). Как только дочерний процесс завершится в переменной t = ClockCycles() - t определяется количество процессорных затраченных на порожденние процесса. Затем удаляется блок данных blk и осуществляется вывод на экран через поток вывода cout и с помощью функции cycle2milisec( t ), преобразующей процессорные циклы в секунды, время на создание и уничтожение процесса. На рис.46 показано выполнение программы p2-1.cc. Рис.46. Выполнение программы p2-1.cc. 124 При запуске программы со значением параметра в Мбайтах от 1 до 100 наблюдается близкая к линенной зависимость времени создания процесса от размера его образа в памяти от 17 до 1170 мсек. Интересны не только затраты на порождение нового процесса, но и то, насколько «эффективно» сосуществуют параллельные процессы в ОС, насколько быстро происходит переключение контекста с одного процесса на другой [17]. Для оценки этих затрат рассмотрим приложение р5.сс. // P5.cc #include <stdlib.h> #include <inttypes.h> #include <iostream.h> #include <unistd.h> #include <sched.h> #include <sys/neutrino.h> int main( int argc, char *argv[] ) { unsigned long N = 1000; if( argc > 1 && atoi( argv[ 1 ] ) > 0 ) N = atoi( argv[ 1 ] ); pid_t pid = fork(); if( pid == -1 ) cout << "fork error" << endl, exit( EXIT_FAILURE ); uint64_t t = ClockCycles(); for( unsigned long i = 0; i < N; i++ ) sched_yield(); t = ClockCycles() - t; delay( 200 ); cout << pid << "\t: cycles - " << t << "; on sched - " << ( t / N ) / 2 << endl; exit( EXIT_SUCCESS ); }; Программа начинается с точки входа – функции main(). Если при запуске программы в командной строке задано количество повторений цикла, то с помощью функци atoi() оно преобразуется в новое значение переменной N . Функция fork() создает дочерний процесс. И в дочернем и в родительском процессах (их главных потоках) определяются каждого процесса). Они переменные t (своих для имеют тип данных uint64_t и хранят текущее количество процессорных циклов, котрое необходимо для определения времни затрачиваемого на переключение контекста процессов. В каждом из процессов (главных потоках) запускается N раз for-цикл, где выполняется единственная функция sched_yield(). Она переводит 125 вызвавший ее процесс (главный поток) из состояния выполнения в состяние готовности к выполнению (хотя квант времени выделенный для работы этого потока еще не истек) и запускает передиспетчеризацию потоков. После завершения цила каждый процесс (главный поток) определяет в своей переменной t = ClockCycles() - t количество процессорных циклов затраченных на выполнение. Делает задержку на 0,2 секунды и выводит на экран через поток вывода cout результаты своей работы. На рис.47 показано выполнение программы p5.cc в перспективе System Profiler. Таким образом, здесь использована симметричная схема, где два одновременно выполняющихся процесса настолько симметричны и идентичны, что они даже не анализируют PID после выполнения fork(), они только в максимальном темпе «перепасовывают» друг другу активность. Рис. 48 показано взаимодействие двух идентичных процессов: вся их «работа» состоит лишь в том, чтобы как можно быстрее передать управление партнеру. 126 Рис.47. Выполнение программы p5.cc. Такая работа возможна при round robin диспетчеризации. На рис. 48 черными стрелками обозначена передача управления от потока к потоку различных процессов. Результат выполнения программы с различными начальными значениями для процессора с частотой 533 МГц, показывает, что время передачи управления составляет 0,2 миллисекунды (600 циклов). Процесс А PID = 671779 Поток main: TID = 1 Процесс B PID = 671786 Поток main: TID = 1 Рис. 48. Симметричное взаимодействие потоков Завершение процесса Завершить процесс можно, направив ему сигнал с помощью утилиты slay или kill в командной строке, или из программы с помощью функций: kill(), sigqueue() и др. Завершение процесса выполняется в две стадии. На первой – происходит «физическое» уничтожение процесса, т.е. закрываются открытые файлы, освобождается оперативная память и т.п. Эта стадия осуществляется потоком-завершителем Администратора процессов, выполняющимся от имени уничтожаемого процесса. После этой стадии процесс (главный поток) находится в состояни «зомби». Все потоки процесса «зомби» находятся в состоянии «DEAD- блокирован». На второй – уничтожается структура данных о процессе (метаданные), хранящаяся в оперционной системе. Эта стадия выполняется Администратором процессов внутри самого себя. 127 3.4. Потоки в QNX6 Поток можно понимать, как любой автономный последовательный (линейный) набор команд процессора. Идентификатором потока (значимым только внутри одного процесса!) является TID (Thread ID), присваиваемый потоку при его создании вызовом pthread_create(). TID позволяет процессу (а также системе в рамках процесса) однозначно идентифицировать каждый поток. Нумерация TID в QNX начинается с 1 (это всегда главный поток процесса, порожденный main()) и последовательно возрастает по мере создания потоков (до 32767) [15]. Другим важнейшим атрибутом потока является приоритет его выполения. Для каждого из уровней приоритетов, обслуживаемях системой (в QNX 6.3 таких уровней 256), поддерживается циклическая очередь потоков, готовых к исполению (фактически большая часть из таких очередей оказывается пустой). Потоки создаются и уничтожаются динамически, и их количество внутри процесса может меняться в значительных пределах. Создание потока (pthread_create()) включает в себя выделение и инициализацию необходимых ресурсов внутри адресного пространства процесса (например, стека потока), а также запуск выполнения потока с некоторой функции в данном адресном пространстве. Завершение потока (pthread_exit(), pthread_cancel()) включает в себя останов потока и освобождение ресурсов потока. Когда поток запущен, он может находиться в одном из двух состояний: «готов» (ready) или «блокирован» (blocked) [18]. Поток может иметь одно из следующих состояний (рис.49): CONDVAR- поток блокирован на условной переменной (например, при вызове функции pthread_condvar_wait()); DEAD- поток завершен и ожидает завершение другого потока; 128 INTERRUPT-поток блокирован и ожидает прерывания (т.е. поток вызвал функцию InterruptWait); JOIN-поток- блокирован и ожидает завершение другого потока ( например, при вызове функции pthread_join()); MUTEX- поток блокирован блокировкой взаимного исключения; NANOSLEEP-поток находиться в режиме ожидания в течение короткого периода времени (например, при вызове функции nanosleep()); NET_REPLY-поток ожидает ответа на сообщение от другого узла сети (т.е. поток вызвал функцию MsgReply*()); NET_SEND- поток ожидает получения импульса или сигнала от другого узла сети (т.е. поток вызвал функцию MsgSendPulse(), MsgDeliverEvent() или SignalKill()); READY- поток ожидает выполнения, пока процессор занят выполнением другого потока равного или более высокого приоритета; RECEIVEпоток блокирован на операции получения сообщения (например, при вызове функции MsgReceive()); RUNNING- поток выполняется процессором; 129 Рис. 49 Возможные состояния потока в QNX Neutrino REPLY- поток блокирован при ответе на сообщение (т.е. при вызове функции MsgSend() и получении сообщения сервером); SEM- поток ожидает освобождения семафора (т.е. поток вызвал функцию SyncSemWait()); SEND- поток блокируется при отправке сообщения (т.е. после вызова функции MsgSend(), но получение сообщения сервером еще не произошло ); SIGSUSPEND- поток блокирован и ожидает сигнала (т.е поток вызвал функцию sigsuspend()); SIGWAITINFO- блокирован и ожидает сигнала (т.е. поток вызвал функцию sigwaitinfo()); STACK-поток ожидает выделения виртуального адресного пространства для своего стека (родительский поток вызывает функцию ThreadCreate()); STOPPED- поток блокирован и ожидает сигнала SIGCONT; WAITCTX-поток ожидает доступности нецелочисленного контекста (например, с плавающей запятой); WAITPAGE- поток ожидает выделения физической памяти для виртуального адреса; WAITTHREAD- поток ожидает завершения создания дочернего потока (т.е. поток вызвал функцию ThreadCreate()). Управление потоком заключается в его создании, изменении его параметров в процессе выполнения и завершения потока. Процесс состоит минимум из одного потока. Этот первый (и, возможно, единственный) поток начинается функцией main() и включает все те функции, которые будут вызваны. Остальные потоки создаются с помощью функции: pthread_create(&tid, &attr, &func, &arg). Для вызова функции pthread_create() необходимо использовать библиотеку pthead.h. Функция имеет 4 параметра [19]. Обязательным парамет130 ром является только func – точка входа в поток, т.е. имя функции, с которой начнет выполнение поток, своего рода «потоковая функция» main(). Первым параметром является возвращаемое значение идетификатора TID созданного потока. Его бывает полезно знать, например, для уничтожения созданного потока функцией: pthread_cancel( tid ), pthread_join( tid ). Второй параметр содержит адрес структуры атрибутов attr, на основе которой задаются атрибуты создаваемого потока. Оно содержит ряд весьма полезных полей. Если вместо этой структуры при создании потока указать NULL, то поток будет создан с атрибутами по умолчанию. При этом параметры диспетчеризации будут наследоваться от родительского потока. Атрибуты изменить после создания потока нельзя, поэтому лучше сразу создать структуру атрибутов pthread_attr_init(&attr). Атрибутная запись потока должна создаваться и обязательно инициализироваться вызовом pthread_attr_init(&attr) до точки порождения потока. Любые последующие изменения атрибутной записи создания потока не производят никаких изменений в поведении потока (хотя некоторые из параметров потока, определяемых атрибутной записью при его создании, могут быть изменены позже, уже в ходе выполнения потока, вызовом соответствующих функций). Таким образом, атрибутная запись потока является чисто инициализирующей структурой и может быть даже уничтожена следующим оператором после порождения этого потока. Эффект повторной инициализации атрибутной записи не определен. Для ее повторного использования (если требуется переопределение значений параметров) должен быть предварительно выполнен вызов pthread_attr_destroy() с последующей повторной инициализацией структуры (он разрушает атрибутную запись, но без освобождения ее памяти) Список функций управления атрибутами выглядит довольно большим (18 функций), но они сгруппированы по парам «get» — « set», т e. в каждой паре есть функция как получения параметров (get), так и их установки (set) . Флаги (булевы характеристики) 131 pthread_attr_getdetachstate(); pthread_attr_setdetachstate(); pthread_attr_getinheritsched(); pthread_attr_setinheritsched(); pthread_attr_getscope(); pthread_attr_setscope(); Параметры стека pthread_attr_getguardsize(); pthread_attr_setguardsize() pthread_attr_getstackaddr(); pthread_attr_setstackaddr() pthread_attr_getstacksize(); pthread_attr_setstacksize() Параметры диспетчеризации pthread_attr_getschedparar(); pthread_attr_setschedparain() pthread_attr_getschedpolicy(); pthread_attr_setschedpolicy() Третим параметером является точка входа в поток, т.е. имя функции, с которой начнет выполнение поток (обязательный параметр). Четвертый параметр содержит параметры для создаваемого потока. В коде реальных приложений очень часто можно видеть простейшую форму вызова, порождающего новый поток, в следующем виде: pthread_create( NULL, NULL, &thread_func, NULL ); и для многих целей такого вызова достаточно, так как созданный поток будет обладать свойствами, предусмотренными по умолчанию (преимущественная часть поведенческих характеристик нового потока наследуется от его родителя). Выделяют отсоединенные и присоединенные потоки. Присоединенный поток сохраняет некоторую связь с родителем, в то время как отсоединенный поток после точки ветвления ведет себя как совершенно автономная сущность: после точки ветвления у родительского потока нет возможности синхронизироваться с его завершением, получить код его завершения или результат выполнения потока. Можно ожидать завершение присоединенного потока в некотором другом потоке процесса (чаще всего именно в родительском, но это не обязательно) с помощью следующего вызова: int pthread_join( pthread_t thread, void** value_ptr ), 132 где thread - идентификатор TID ожидаемого потока, который возвращался как первый параметр вызова pthread_create( pthread_t* thread, …) при создании потока или же пможет быть получен после своего создания вызовом pthread_self (); value_ptr - NULL или указатель на область данных (результата выполнения), которую завершающийся поток, возможно, захочет сделать доступной для внешнего мира после своего завершения. Этот указатель функция потока возвращает оператором return или вызовом pthread_exit(). Для дочернего потока может потребоваться установить (через структуру attr) иную по отношению к родителю дисциплину (политику) диспетчеризации (SCHED_FIFO, SCHED_RR, SCHED_SPORADIC) [17]: Fifo – не вытесняющая, кооперативная, очередь-приоритет. Выполнение потока не прерывается потоками равного приоритета, пока сам поток не передаст управление. Round-robin – карусельная, вытесняющая многозадачность, режим квантования времени. Поток работает непрерывно только в течение определенного кванта времени. После истечения кванта его вытесняет поток равного приоритета. Спорадическая (адаптивная) – предназначена для установления лимита использования потоком процессора в течение определенного времени. Потоку задаются параметры: нормальный N, низкий L приоритеты, начальный бюджет C, период восстановления T, максимальное число пропусков восстановлений P. Когда поток находится в состоянии «готов», его приоритет имеет значение N в течении С, после чего приоритет снижается до L, ограниченный временем Т или истечением количества вызовов P. Все политики диспетчеризации работают с потоками из одной очереди (для QNX 6.3 их 256), очереди потоков наивысшего из присутствующих в системе приоритетов (потоков в состоянии «готов»). Если в системе выполняется поток высокого приоритета, то ни один поток более низкого приоритета не получит управление до тех пор, пока поток высокого приоритета не будет переведен в блокированное состояние при ожидании некоторого события (рис. 50). 133 На рис. 50 представлены два процесса (процесс A с PID=671179 и процесс В с PID=620004), каждый из которых создает внутри себя несколько потоков с диспечеризацией Round-robin, но с различными приоритетами (10 и 12). Жирной сплошной линией на рис.50 показан порядок, в котором потоки высокого приоритета (12) объединены в циклическую очередь диспетчеризации. Эта активная очередь диспетчеризации (наивысшего приоритета). Пукнктирной линией показан порядок потоков в другой очереди (приоритета 10). До тех пор пока все потоки активной очереди (приоритет 12) не окажутся в силу каких-либо обстоятельств в блокированном состоянии, ни один из потоков очереди приоритета 10 не получит ни единого кванта времени. Prio Пр/П Пр/П Пр/П Операционная система (RAM) 10 A/1 Процесс А Pid=671179 Процесс B Pid=620004 Поток tid=1, prio= 10 Поток tid=1, prio= 12 Tid =1 Tid =1 Поток tid=2, prio= 10 Tid =2 Поток tid=3, prio= 12 Tid =3 Поток tid=2, prio= 12 11 12 А) Prio Пр/П Пр/П Пр/П 10 11 A/1 12 B/1 Б) Prio Пр/П Пр/П Пр/П 10 11 A/1 B/2 12 B/1 В) 1 2 3 4 5 6 Prio Пр/П Пр/П Пр/П 7 10 A/1 B/2 Procnto 11 12 B/1 Г) Sh Процесс А поток tid=1 поток tid=2 Процесс B поток tid=1 поток tid=2 поток tid=3 Время 134 Prio Пр/П Пр/П Пр/П 10 11 A/1 B/2 12 B/1 A/2 Д) Prio Пр/П Пр/П Пр/П 10 11 A/1 B/2 12 B/3 A/2 B/1 Е) Рис. 50 Диспетчеризация потоков Рассмотрим временную диаграмму выполнения процессов А и B, состоящую из 8 этапов: 1) Вместе с модулем микроядра procnto в системе работает интерпретатор команд пользователя sh. Пользователь запускает процесс А 2) В системе создается процесс А с главным потоком (tid=1) и приоритетом 10. Это показано в таблице очередей приоритетов на рис 50а. Очередь приоритета 10 становится активной. После некоторого времени работы главный поток процесса А вызывает запуск процесса В. 3) В системе создается процесс В с главным потоком (tid=1) и приоритетом 12. Это показано в таблице очередей приоритетов на рис 50б. Очередь приоритета 12 становится активной. 4) Затем главный поток процесса В запускает второй поток (tid=2) процесса В с приоритетом 10. Созданный поток (В/2) не получает управления так как его приоритет ниже 12 и его очередь приоритетов не активна рис 50в. 5) После некоторого времени работы главный поток (В/1) процесса В блокируется в ожидании доступа к некоторому ресурсу. Очередь приоритетов 12 становится не активной. Активной становится очередь приоритетов 10, где находятся потоки А/1 и В/2 рис 50г. Они некоторое время попеременно работают. 6) Затем главный поток процесса А запускает второй поток (А/2) с tid=2 и приоритетом 12. Очередь приоритетов 12 становится активной и поток А/2 работает в системе один, при этом потоки А/1 и В/2 с приоритетами 10 перестают получать управление. Поток В/1 получает недостающий ресурс и начинает делить процессорное время с потокам А/2, так как они в активной очереди приоритетов рис 50д. 135 7) Главный поток процесса В запускает свой третий поток (В/3) с tid=3 и приоритетом 12. Созданный поток (В/3) получает управления и участвует в конкуренции за процессорное время наравне с потоками В/1 и А/2 очереди приоритетов 12 рис 50е. 8) Пока все потоки (В/1, А/2, В/3) активной очереди (приоритет 12) не окажутся в силу каких-либо обстоятельств в блокированном состоянии, ни один из потоков (А/1 и В/2) очереди приоритета 10 не получит ни единого кванта времени. Рассмотрим временные затраты на создание потока на примере программы p2-2.cc [17]: //P2-2.cc #include <stdlib.h> #include <stdio.h> #include <inttypes.h> #include <iostream.h> #include <sys/neutrino.h> #include <pthread.h> #include <sys/syspage.h> static double cycle2milisec ( uint64_t ccl ) { const static double s2m = 1.E+3; const static uint64_t cps = SYSPAGE_ENTRY( qtime )->cycles_per_sec; // частота процессора: return (double)ccl * s2m / (double)cps; }; void* threadfunc ( void* data ) { pthread_exit( NULL ); }; int main( int argc, char *argv[] ) { uint64_t t = ClockCycles(); pthread_t tid; pthread_create( &tid, NULL, threadfunc, NULL ); pthread_join( tid, NULL ); t = ClockCycles() - t; cout << "Thread time: " << cycle2milisec( t ) << " msec. [" << t << " cycles]" << endl; exit( EXIT_SUCCESS ); }; На рис.51 показано выполнение программы p2-2.cc в перспективе System Profiler. 136 Рис.51. Выполнение программы p2-2.cc в перспективе System Profiler Программа начинается с точки входа – функции main(). Главный поток, реализуемый функцией main() имеет tid = 1. Переменная t имеет тип данных uint64_t. С помощью функции ClockCycles() в ней определяется текущее количество процессорных циклов, которое необходимо для вычисления времни затрачиваемого на создание потока. Функция pthread_create() создает дочерний поток c tid = 2, реализуемый функцией threadfunc(). Дочерний поток сразу после запуска завершает функцией pthread_exit( NULL ). Во время работы дочернего потока, родительский ожидает его завершения на функции pthread_join(). Как только родительский поток разблокируется в переменной t = ClockCycles() - t определяется количество процессорных затраченных на порожденние потока. 137 Затем результаты выводятся на экран через поток и родительский поток завершается функцией exit( EXIT_SUCCESS ). На результаты этого теста значительно влияет приоритет, с которым выполняется программа. Для запуска программы p2-2.cc из командной строки может использоваться команда nice и сторока запуска будет выглядеть так #nice –n-19 p2-2. При одиинаковых приоритетах программ p2-1.cc и p2-2.cc создание потока выполняется в 20 раз быстрее чем процесса. Теперь рассмотрим скрость переключения потоков на примере программы p5t.cc [17]. Она организована аналогично программе p5.cc. На рис.52 показано выполнение программы p5t.cc в перспективе System Profiler. // P5t.cc #include <stdlib.h> #include <stdio.h> #include <inttypes.h> #include <iostream.h> #include <unistd.h> #include <pthread.h> #include <errno.h> #include <sys/neutrino.h> unsigned long N = 1000; // количество циклов static pthread_barrier_t bstart; void* threadfunc ( void* data ) { pthread_barrier_wait( &bstart ); uint64_t t = ClockCycles(); for( unsigned long i = 0; i < N; i++ ) sched_yield(); t = ClockCycles() - t; // задает количество потоков, которое будет создано delay( 100 ); cout << pthread_self() << "\t: cycles - " << t << "; on sched - " << ( t / N ) / 2 << endl; return NULL; }; int main( int argc, char *argv[] ) { int opt, val; while ( ( opt = getopt( argc, argv, "n:" ) ) != -1 ) { switch( opt ) { case 'n' : if( sscanf( optarg, "%i", &val ) != 1 ) cout << "parse command line error" << endl, exit( EXIT_FAILURE ); 138 if( val > 0 ) N = val; break; default : cout << "parse command line failed" << endl, exit( EXIT_FAILURE ); break; } }; const int T = 2; pthread_t tid[ T ]; if( pthread_barrier_init( &bstart, NULL, T ) != EOK ) cout << "barrier init error", exit( EXIT_FAILURE ); for( int i = 0; i < T; i++ ) if( pthread_create( tid + i, NULL, threadfunc, NULL ) != EOK ) cout << "thread create error", exit( EXIT_FAILURE ); for( int i = 0; i < T; i++ ) pthread_join( tid[ i ], NULL ); exit( EXIT_SUCCESS ); }; Программа начинается с точки входа – функции main(). Если при запуске программы в командной строке задано количество повторений цикла с ключом n, то с помощью функций getopt() и sscanf() оно преобразуется в новое значение переменной n. Затем функцией pthread_barrier_init( &bstart, NULL, T ) создается барьер для синхронизации запуска двух дочерних потоков. Главный поток создает два дочерних потока функцией pthread_create() с tid=2 и tid=3, а затем ожидает их завершения на функции pthread_join(). 139 Рис.52. Выполнение программы p5t.cc в перспективе System Profiler Каждый дочерний поток при запуске блокируется на функции pthread_barrier_wait( &bstart ). Когда последний дочерний поток создан, то все блокированные на барьере &bstart потоки одновременно разблокируются и становятся готовыми к выполнению. В переменных t (своей для каждого дочернего потока) имеющей тип данных uint64_t функцией ClockCycles() определяется текущее колисество процессорных циклов. Затем в каждом из дочерних потоков запускается n раз for-цикл, где выполняется единственная функция sched_yield(). Она переводит вызвавший ее поток из состояния выполнения в состяние готовности к выполнению 140 (хотя квант времени выделенный для работы этого потока еще не истек) и запускает передиспетчеризацию потоков. После завершения цила каждый поток определяет в своей переменной t = ClockCycles() - t количество процессорных затраченных на выполнение циклов. Делает задержку на 0,2 секунды и выводит на экран через поток вывода cout результаты своей работы. Это симметричный тест для потоков аналогичный тому, как это делалось для переключения контекстов процессов. Результаты отмечают очень высокую устойчивость при изменении объему вычислений на 4 порядка, однако по своим величинам значения для потоков почти в 2 раза меньше, чем для процессов. Завершение потока При завершении потока различают два случая: 1) «естественное» завершение выполнения потока из кода самого потока; 2) завершение потока извне, из кода другого потока или по сигналу. Для этого действия, в отличии от «естественного » завершения, используется термин – отмена. Завершение потока происходит при достижении функцией потока своего естественного конца, выполнения оператора return или выполнения потоком вызова void pthread_exit(). Если поток принадлежит к категории ожидаемых, то он может возвратить результат своей работы другому потоку, ожидающему его завершения на вызове pthread_join(). Если поток отсоединенный, то по его завершении все системные ресурсы, задействованные потоком, освобождаются немедленно. Для последнего потока процесса вызов void pthread_exit() эквивалентен exit(). Отмена потока значительно более сложная задача. Это связанно с тем, что необходимо корректно завершить все системные объекты (файловые дискрипторы, блоки динамической памяти, примитивы синхронизации и др.), связанные с отменяемым потоком. 141 Для отмены (принудительного завершения) потока используется вызов int pthread_cancel(pthread_t thread); где в качестве параметра указывается TID отменяемого потока (см. пример sy22.cc в [17]). Однако этот вызов не отменяет поток, а только запрашивает возможность отмены потока. Поток может отказаться выполнять любые отмены, вызвав из своей функции потока: int pthread_setcancelstate(int state, int* oldstate). Отмена потока состоит из следующих этапов: 1. выполняются все процедуры завершения, занесенные ранее в стек завершения вызовами pthread_cleanup_push(); 2. выполняются деструкторы собственных данных потока; 3. отменяемый поток завершается; 4. действие отмены – асинхронный с точки зрения вызывающего pthread_cancel() кода, поэтому вызывающий отмену поток должен дождаться завершения потока на вызове pthread_join(). 3.5. Управление потоками и процессами в QNX6 Микроядро QNX и администратор процессов обеспечивают управление памятью и защиту адресного пространства одного процесса от других с помощью блока управления памятью. С помощью них ОС может завершить процесс сразу после возникновения ошибки доступа к памяти. ОС узнает о месте ошибочной инструкции и может запустить символьный отладчик, начиная с этой инструкции. Микроядро делит физическую память на страницы размером 4 кБайта. Процессор использует набор из множества таблиц страниц, хранящихся в системной памяти. Эти таблицы служат для описания того, как виртуальный адрес преобразуется процессором для доступа к физизической памяти [19]. Во время выполнения потока в таблицу страниц зано142 сятся данные о том, как адреса памяти, используемые потоком, отображаются в физической памяти системы. Для сохранения высокой производительности процессор выполняет кэширование часто используемых сегментов памяти. В QNX предусмотрено управление на уровне таблиц страниц. С ними связаны биты, определяющие атрибуты каждой страницы. Страницы могут лишь различаться по степени доступа. Память выполняет процесс со страницы «только чтение» для кода и «чтение и запись» для данных. Когда применяется операция приостановки одного, и выполнения другого приоритетов, она указывает блок управления памятью применить для потока другой набор таблиц страниц. Если меняется контекст в потоке между процессами, изменения блока управления не требуется. Так же применяются аппаратные таймеры, он присоединяется к процессу, и если передачи сигнала нет, процесс перезагружается. Для пользовательских процессов отводится 2,5 Гб адресного пространства. А оставшиеся 1,5 Гб отводится для микроядра. Механизмы IPC Многозадачная ОС реального времени должна предоставить механизмы, позволяющие нескольким процессам, выполняющимся одновременно в изолированных адресных пространствах, общаться друг с другом. Связь между процессами (InterProcess Communication, сокращенно IPC) является средством к разработке приложений как совокупности процессов, в которых каждый процесс выполняет отведенную ему часть общей задачи. Процессы операционной системы QNX Neutrino, в каких бы «родственных» отношениях они ни находились, выполняются каждый в своем изолированном адресном пространстве и не могут обмениваться информацией без использования IPC [15]. В QNX Neutrino реализован ряд таких механизмов, как стандартных, так и уникальных. К стандартным механизмам IPC относятся: именованные и неименованные программные каналы; разделяемая память; 143 очереди сообщений POSIX, реализованные с помощью администратора ресурсов mqueue, который обеспечивает функции: открытия и создания очереди, отправки и приема сообщения. В микроядре Neutrino реализована поддержка нескольких специальных механизмов IPC: Синхронные сообщения QNX. Они наряду с архитектурой микроядра являются фундаментальным принципом QNX. Это самый быстрый способ обмена данными произвольного размера в QNX; Pulses (импульсами) - это сообщения фиксированной длинны, не блокирующие отправителя и имеющие размер 40 бит (8-битный код импульса и 32 бита данных); Сигналы POSIX (простые и реального времени); Асинхронные сообщения, как и механизм импульсов, использует буфер для хранения сообщений. Функции асинхронных сообщений имеют такие же имена, как и функции обычных сообщений, но с префиксом asyncmsg. Программные каналы достаточно широко используются для обмена данными между процессами. В нашем распоряжении два типа программных каналов — неименованные и именованные. Каждый из этих типов обладает особенностями, которые следует принимать во внимание при организации межпроцессного взаимодействия. Неименованный программный канал — это механизм, который командный интерпретатор использует для создания конвейеров. Этот механизм реализован в администраторе ресурсов pipe и обеспечивает передачу данных через промежуточный буфер в оперативной памяти (в адресном пространстве администратора pipe). Неименованный канал создается функцией pipe(), которой в качестве аргумента передается массив из двух целых чисел. В этот массив записывается два файловых дескриптора, один из которых в последующем используется для записи информации, другой — для чтения. К достоинствам неименованных программных каналов можно отнести то, что они 144 являются стандартным POSIX-механизмом IPC, а также то, что это — достаточно быстрый механизм. К недостаткам — то, что обмен данными возможен только между процессами-"родственниками", т. к. процесс может получить файловые дескрипторы для работы с неименованным каналом, только наследуя их от родительского процесса. Именованные каналы — это POSIX-механизм, поддержка которого реализована в файловой системе Neutrino. В основе механизма лежит особый тип файла — FIFO, выполняющего функцию буфера для данных. Файл типа FIFO можно создать двумя способами: из командной строки — утилитой mkfifo; из программы — функцией mkfifo(). Поскольку FIFO — это файл, имеющий имя, то, во-первых, работа с ним выполняется практически так же, как с обычным файлом (open(), read(),write(), close() и т. п.), во-вторых, именованный канал медленнее неименованного, но данные, записанные в именованный канал, сохраняются в случае сбоя (например, отключения питания). Разделяемая память — чрезвычайно важный и широко используемый POSIX-механизм обмена данными большого объема между процессами. Для его использования необходимо на стороне каждого из взаимодействующих процессов выполнить следующие действия: 1. С помощью функции shm_open() создается или открывается существующий регион памяти, который будет разделяться. 2. С помощью функции shm_ctl() задаются нужные атрибуты разделяемого региона. 3. С помощью функции mmap() на разделяемый регион памяти отображается фрагмент адресного пространства процесса, после чего с этим фрагментом выполняются необходимые операции (например, чтения или записи данных). 4. Для отмены отображения адресного пространства процесса на разделяемый регион используется функция unmap(), для закрытия разделяемого региона — функция shm_close(), для уничтожения — функция shm_unlink(). 145 Рассмотрим пример из двух программ — shm_creator и shm_user. Пример работает так: 1. Запускается программа shm_creator, которая создает регион разделяемой памяти, задает его параметры и отображает на него некий буфер, содержащий текстовую строку. 2. Запускается программа shm_user, которая отображает регион разделяемой памяти, созданный программой shm_creator, на свой буфер и печатает содержимое этого буфера. Приведем исходные тексты обеих программ [15]. Текст файла shm_creator.c выглядит так: #include<stdlib.h> #include <fcntl.h> #include <sys/mman.h> #include <inttypes.h> int main() { int fd, status; void* buffer; fd = shm_open("/swd_es", O_RDWR | O_CREAT, 0777); if( fd == -1 ) { perror("shm_creator"); return EXIT_FAILURE; } status = ftruncate(fd, 100); if (status!=0) { perror("shm_creator"); return EXIT_FAILURE; } buffer=mmap(0,100,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if (buffer == MAP_FAILED) { perror("shm_creator"); return EXIT_FAILURE; } sprintf(buffer, "It's a nice day today, isn't it?"); printf("shm_creator: %s\n", buffer); return EXIT_SUCCESS; } Итак, сначала вызываем функцию shm_open(): fd = shm_open("/swd_es", O_RDWR|O_CREAT, 0777); Первый аргумент "/swd_es" — имя региона разделяемой памяти (или, как еще говорят, разделяемого объекта памяти); Когда имя разделяемого объекта начинается с символа /, объект будет помещен в служебный "каталог" /dev/shmem. То есть реальное имя создаваемого нами региона — /dev/shmem/swd_es. 146 Второй аргумент представляет собой битовую маску из нескольких флагов, к этим флагам относятся: O_RDONLY — открыть объект только для чтения; O_RDWR — открыть объект для чтения и записи; O_CREAT — создать разделяемый объект с режимом доступа, заданным третьим аргументом функции shm_open(). Если объект уже существует, то флаг O_CREAT игнорируется, за исключением случаев, когда указан еще и флаг O_EXCL; O_EXCL — этот флаг используют совместно с флагом O_CREAT. В результате, если разделяемый объект памяти уже существует, то функция shm_open() завершится с ошибкой; O_TRUNC — этот флаг работает, когда объект уже существует и успешно открыт для чтения/записи. При этом размер объекта становится равным нулю (режим доступа и идентификатор владельца сохраняются). Третий аргумент задает атрибуты доступа к разделяемому объекту. Функция вернет файловый дескриптор fd, который в последующем и будет использоваться для доступа к данному разделяемому объекту. Теперь нужно сделать, чтобы разделяемый объект имел нужный размер и параметры. Для этого используем функцию shm_ctl(): ftruncate(fd, 100); В качестве первого аргумента используется тот самый идентификатор объекта разделяемой памяти fd, который вернула функция shm_open(); Иногда вместо функции ftrancate() используют функцию shm_ctl(). Теперь созданный объект, имеющий нужный размер, необходимо отобразить на виртуальное адресное пространство нашего процесса: buffer = mmap(0, 100, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); Первый и последний аргументы в нашем случае не нужны — они требуются при работе с физической памятью. Второй аргумент (100) указывает, какой величины фрагмент разделяемого объекта стоит отобразить на адресное пространство процесса (мы отобразили весь объект). Третий аргумент представляет собой битовую маску, которая может содержать несколько флагов: 147 PROT_EXEC — разделяемый объект доступен для исполнения; PROT_NOCACHE — не кэшировать разделяемый объект; PROT_NONE — разделяемый объект недоступен; PROT_READ — разделяемый объект доступен для чтения; PROT_WRITE — разделяемый объект доступен для записи. Четвертый аргумент определяет режим отображения региона. В нашем случае лучше задать MAP_SHARED (остальные режимы используются для работы с физической памятью). Пятый аргумент — идентификатор разделяемого объекта. Функция mmap() возвращает указатель на область виртуальной памяти процесса, на который отображен разделяемый объект (buffer). С полученым указателем мы можем поступать, как нам вздумается. Все, что мы запишем по этому адресу, будет отображено на разделяемый объект (конечно же, столько байт, сколько мы задали функции mmap()). Запишем в буфер текстовую строку: sprintf(buffer, "It's a nice day today, isn't it?"); Теперь посмотрим на исходный текст программы shm_user.c: #include<stdlib.h> #include <fcntl.h> #include <sys/mman.h> int main() { int fd; char *buffer; fd = shm_open("/swd_es", O_RDONLY, 0777); if( fd == -1 ) { perror("shm_user"); return EXIT_FAILURE; } buffer = mmap(0, 100, PROT_READ, MAP_SHARED, fd, 0 ); if (buffer == MAP_FAILED) { perror("shm_user"); return EXIT_FAILURE;} printf("shm_user: %s\n", buffer); unmap(buffer, sizeof (buffer)); return EXIT_SUCCESS; } 148 Как видно из текста программы, для получения доступа к разделяемому объекту снова используется функция shm_open(). Для того чтобы отобразить разделяемый регион на адресное пространство процесса, используется функция mmap(). В результате получаем указатель buffer на область виртуальной памяти процесса, который можно использовать. Распечатаем содержимое разделяемого объекта: printf("shm_user: %s\n", buffer). По аналогии можно передавать между процессами любые структуры данных. Но за правильность интерпретации данных, содержащихся в разделяемой памяти, и определения момента подготовки данных к считыванию отвечает разработчик. Поэтому воизбежании нарушений целостности данных, нужно использовать механизмы синхронизации. Основным POSIXмеханизмом синхронизации процессов являются семафоры. Сигналы в QNX инициируются некоторыми событиями в системе и посылаются процессу для его уведомления о том, что произошло нечто неординарное, требующее определенной реакции [17]. Порождающее сигнал событие может быть действием пользователя или может быть вызвано другим процессом или ядром операционной системы. Действия, вызываемые для обработки сигнала, являются принципиально асинхронными. Сигналы могут быть использованы как простейшее, но мощное средство межпроцессного взаимодействия. Все относящиеся к сигналам определения находятся в заголовочном файле signal.h. Поток может отреагировать на полученный сигнал следующими способами: Стандартное действие - выполнение действия, предписанного для обработки этого сигнала по умолчанию. Игнорирование сигнала - сигнал не оказывает никакого воздействия на ход выполнения потока получателя. Вызов обработчика - по поступлению сигнала вызывается функция реакции, определенная пользователем. Если для сигнала устанавливается функция-обработчик, то говорят, что сигнал перехватывается (относительно стандартного действия). В QNX определены 64 сигнала в трех диапазонах: 1...40 - 40 POSIX-сигналов общего назначения; 149 41...56 - 16 POSIX-сигналов реального времени, введенных в стандарт позже; 57...64 - 8 сигналов, используемых в QNX Neutrino для специальных целей. Специальные сигналы не могут быть проигнорированы или перехвачены. Сигналы являются не блокирующим отправителя способом IPC. Сигналы имеют структуру, подобную импульсу (1 байт кода + 4 байта данных, и тоже могут ставиться в очередь. Для отправки процессу сигнала администратор может использовать две утилиты- стандартную UNIX- утилиту kill и более гибкую QNX – утилиту slay. По умолчанию обе этих утилиты посылают сигнал SIGINTR, при получении которого процесс обычно уничтожается. Процесс может определить три варианта поведения при получении сигнала: Игнорировать сигнал – для этого следует задать соответствующее значение такому атрибуту потока, как сигнальная маска (говорят не «игнорировать», а «маскировать» сигнал). Не могут быть проигнорированы три сигнала: SIGSTOP, SIGCONT, SIGTERM; Использовать обработчик по умолчанию - т.е. ничего не предпринимать. Обычно обработчиком по умолчанию для сигналов является уничтожение процесса. Зарегистрировать собственный обработчик - т.е. собственную функцию, которая будет вызвана при получении сигнала. Поток может вызвать функцию ожидания того или иного сигнала (сигналов). При этом поток станет SIGNAL-блокированным. Спецификация POSIX определяет порядок обработки сигналов только для процессов. Поэтому при работе с многопоточными процессами в QNX необходимо учитывать следующие правила. Действие сигнала распространяется на весь процесс. Сигнальная маска распространяется только на поток. Неигнорируемый сигнал, предназначенный для какого-либо потока, доставляет только этому потоку. Неигнорируемый сигнал, предназначенный для процесса, передается первому не SIGNAL-блокированному потоку. 150 Средства синхронизации в QNX В QNX Neutrino реализовано несколько способов синхронизации потоков. Причем только два из них (mutex и condvar) реализованы непосредственно в микроядре, остальные надстройки над этими двумя [17]: Взаимоисключающая блокировка (mutual exclusion lock- mutex, «мютекс (мутекс)»)- это механизм обеспечивает исключительный доступ потоков к разделенным данным. Только один поток в один момент времени может владеть мютексом. Если другие потоки попытаются захватить мютекс, они становятся мютекс-заблокированными. Если в состоянии мютекс-блокировки находится поток с приоритетом выше, чем у потока-владельца блокировки, то значение эффективного приоритета этого потока автоматически повышается до уровня высокоприоритетного заблокированного потока; Условная переменная (condition variable, или condvar ) - предназначена для блокировки потока до тех пор, пока соблюдается некоторое условие. Это условие может быть сложным. Условные переменные всегда используются с мутекс-блокировкой для определения момента снятия мутекс-блокировки; Барьер - устанавливает точку для нескольких взаимодействующих потоков, на которой они должны остановиться и дождаться «отставших» потоков. Как только все потоки из контролируемой группы достигли барьера, они одновременно разблокируются и могут продолжить исполнение; Ждущая блокировка – упрощенная форма совместного использования условной переменной с мутексом. В отличие от прямого применения mutex+ condvar имеет некоторые ограничения; Блокировка чтения /записи (rwlock)-простая и удобная в использовании ‘надстройка’ над условными переменными и мутексами; Семафор – это, можно (условно) сказать, мутекс со счетчиком. Вернее, мутекс является семафором со счетчиком, равным единице. 151 Большинство этих механизмов работает в пределах одного процесса, но это ограничение преодолевается путем использования механизма разделяемой памяти. Кроме перечисленных способов синхронизацию можно осуществлять с помощью FIFO-диспетчеризации, ”родных” QNX-сообщений и атомарных операций. Рассмотрим синхронизацию потоков на барьерах и одновременно выясним эффективности однопоточное и многопоточное выполнение приложений на примере программы t1.cc [17]: //Однопотосчное и много поточное приложение T1.cc #include <stdlib.h> #include <stdio.h> #include <iostream.h> #include <unistd.h> #include <limits.h> #include <pthread.h> #include <inttypes.h> #include <sys/neutrino.h> #include <sys/syspage.h> #include <errno.h> #include <math.h> // преобразование процессорных циклов в милисекунды: static double cycle2milisec ( uint64_t ccl ) { const static double s2m = 1.E+3; const static uint64_t cps = SYSPAGE_ENTRY( qtime )->cycles_per_sec; // частота процессора: return (double)ccl * s2m / (double)cps; }; static int nsingl = 1; // рабочая функция void workproc( int how ) { const int msingl = 30000; for( int j = 0; j < how; j++ ) // ... якобы вычисления for( uint64_t i = 0; i < msingl * nsingl; i++ ) i = ( i + 1 ) - 1; }; static pthread_barrier_t bstart, bfinish; 152 struct interv { uint64_t s, f; }; interv *trtime; void* threadfunc ( void* data ) { // заблокироваться на барьере, чтоб соскочить с него одновременно pthread_barrier_wait( &bstart ); int id = pthread_self() - 2; trtime[ id ].s = ClockCycles(); workproc( (int)data ); trtime[ id ].f = ClockCycles(); pthread_barrier_wait( &bfinish ); return NULL; }; int main( int argc, char *argv[] ) { int opt, val, nthr = 1, nall = SHRT_MAX; while ( ( opt = getopt( argc, argv, "t:n:p:a:" ) ) != -1 ) { switch( opt ) { case 't' : if( sscanf( optarg, "%i", &val ) != 1 ) perror( "parse command line failed" ), exit( EXIT_FAILURE ); if( val > 0 && val <= SHRT_MAX ) nthr = val; break; case 'p' : if( sscanf( optarg, "%i", &val ) != 1 ) perror( "parse command line failed" ), exit( EXIT_FAILURE ); if( val != getprio( 0 ) ) if( setprio( 0, val ) == -1 ) perror( "priority isn't a valid" ), exit( EXIT_FAILURE ); break; case 'n' : if( sscanf( optarg, "%i", &val ) != 1 ) perror( "parse command line failed" ), exit( EXIT_FAILURE ); if( val > 0 ) nsingl *= val; break; case 'a' : if( sscanf( optarg, "%i", &val ) != 1 ) perror( "parse command line failed" ), exit( EXIT_FAILURE ); if( val > 0 ) nall = val; break; default : perror( "parse command line failed" ), exit( EXIT_FAILURE ); break; } }; 153 if( nthr > 1 ) cout << "Multi-thread evaluation, thread number = " << nthr; else cout << "Single-thread evaluation"; cout << " , priority level: " << getprio( 0 ) << endl; _clockperiod clcout; ClockPeriod( CLOCK_REALTIME, NULL, &clcout, 0 ); cout << "rescheduling = \t" << clcout.nsec * 4. / 1000000. << endl; // калибровка единичного выполнения const int NCALIBR = 512; uint64_t tmin = 0, tmax = 0; tmin = ClockCycles(); workproc( NCALIBR ); tmax = ClockCycles(); cout << "calculating = \t" << cycle2milisec ( tmax - tmin ) / NCALIBR << endl; // многопотоковое выполнение if( pthread_barrier_init( &bstart, NULL, nthr ) != EOK ) perror( "barrier init" ), exit( EXIT_FAILURE ); if( pthread_barrier_init( &bfinish, NULL, nthr + 1 ) != EOK ) perror( "barrier init" ), exit( EXIT_FAILURE ); trtime = new interv [ nthr ]; int cur = 0, prev = 0; for( int i = 0; i < nthr; i++ ) { cur = (int)floor( (double)nall / (double)nthr * ( i + 1 ) + .5 ); prev = (int)floor( (double)nall / (double)nthr * i + .5 ); if( pthread_create( NULL, NULL, threadfunc, (void*)( cur - prev ) ) != EOK ) perror( "thread create" ), exit( EXIT_FAILURE ); }; pthread_barrier_wait( &bfinish ); for( int i = 0; i < nthr; i++ ) { tmin = ( i == 0 ) ? trtime[ 0 ].s : __min( tmin, trtime[ i ].s ); tmax = ( i == 0 ) ? trtime[ 0 ].f : __max( tmax, trtime[ i ].f ); }; cout << "evaluation = \t" << cycle2milisec ( tmax - tmin ) / nall << endl; pthread_barrier_destroy( &bstart ); pthread_barrier_destroy( &bfinish ); delete trtime; exit( EXIT_SUCCESS ); }; Логика этого приложения крайне проста: есть некоторая продолжительная по времени рабочая функция (workproc), выполняющая многогратно. Число выполнений определяется ключом запуска а. А время ее единичного выполнения задается ключом n. В примере установлена диспетчеризация по умолчанию - круговая, или карусельная). Весь объем этой работы делится 154 поровну (или почти поровну) между несколькими (ключ t) потоками. На рис.53 показано выполнение программы t1.cc в перспективе System Profiler. Рис.53. Выполнение программы t1.cc Сравниваем усредненное время единичного выполнения рабочей функции для разного числа выполняющих потоков (в выводе "calculating" это время эталонного вычисления в одном главном потоке, a "evaluation" время того же вычисления, но во многих потоках). Для того чтобы иметь еще большую гибкость, предоставляется возможность переопределять приоритет, под которым в системе все это происходит (ключ р). Краткий итог этого теста может звучать так: при достаточно высоком уровне приоритета (выше 12-13, когда на его выполнение не влияют процессы 155 обслуживания клавиатуры, мыши и др.) время выполнения в «классическом» последовательном коде и в многопоточном коде (где несколько тысяч потоков!) практически не различаются. Различия не более 8%, причем в обе стороны. В отличие от создаваемых параллельных процессов, рассмотренных ранее, все потоки, создаваемые в рамках одного процесса, разделяют единое адресное пространство процесса, и поэтому все переменные процесса, находящиеся в области видимости любого потока, доступны этому потоку. 3.6. Файловые системы QNX Высокая степень отказоустойчивости благодаря разбиению блоков а основной битовой карте, защита от потерь данных и возможность быстрого восстановления, использование многопоточности, приоритетность. Родной раздел QNX называется QNX4FS (для версий ОС QNX 4.х – 6.3.) и QNX6FS (начиная с версии ОС QNX 6.4.0), новый раздел создается утилитой fdisk [15]. Принято согласование разделов - первое число порядковый номер диска, второе – тип раздела диска. Раздел имеет компоненты: блок загрузки, ключевой (root), битовая карта, корневой каталог. Блок загрузчика - первичный физический блок в разделе диска. Содержит начальный загрузчик. Корневой блок имеет структуру обычного, содержит следующие в себе: корневой root каталог, файл /.inodes – информационный узел. Если имя файла длиннее 16 символов, содержимое файла помещается в этот файл. Файл /.boot содержит загрузочный образ ОС. Файл /.altboot - содержит резервный загрузочный образ. Файл /.longfilenames – файл, содержащий столько битов, сколько разделов у диска. Каждому физическому разделу соответствует 1 бит. 156 Типы файлов В QNX файл - это объект, в который может производиться запись, из которого может производиться чтение, либо и то и другое. QNX поддерживает шесть типов файлов: В QNX поддерживаются следующие типы файлов: регулярные(обычные) файлы; каталоги; жёсткие и символические ссылки; блок- и байт-ориентированные специальные файлы; специальные именованные устройства (Named Special Device); именованные программные каналы (pipes). Регулярные файлы - состоят из последовательности байт с произвольным доступом и не имеют предопределенной структуры. Они составляют большинство файлов в файловых системах. Файловые системы поддерживаются Менеджером файловой системы и реализованы на базе блокориентированных файлов, соответствующих разделам диска. Каталоги - содержат элементы каталога и информацию, необходимую для поиска регулярных файлов; также содержат статус и атрибуты для каждого регулярного файла. Каждый элемент каталога увязывает имя файла с файлом. Имя файла - это символьное имя, которое позволяет идентифицировать файл и работать с ним. Файл может быть идентифицирован несколькими именами. Символические связи (ссылки) - содержат путь к файлу или каталогу, к которым перенаправляются все запросы; символические связи, часто используются для предоставления множества путей к одному файлу. Программные каналы (pipes) и FIFO - служат как каналы ввода/вывода между взаимодействующими процессами. Блок-ориентированные файлы - относятся к устройствам, таким, как диски, ленты и разделы дисков. Доступ к этим файлам обычно осуществляется таким образом, что аппаратные характеристики устройств скрыты от приложений. Байт-ориентированные специальные файлы-файлы, аналогичные блочным устройствам, с той разницей ,что символьные устройства обеспечивают 157 интерфейс к аппаратуре, осуществляющей посимвольный ввод/вывод. К такой аппаратуре относятся, например, последовательный порт, сетевая карта и т.п. Эти файлы ,так же как и блочные. Создаются драйверами при запуске. Жесткие ссылки (связи) - дополнительные элементы каталога. При ее создании, во-первых, информация о физическом размещении данных выносится в файл /.inodes, во-вторых, счетчик ссылок (атрибут файла) увеличивается на единицу. При удалении одной из жестких ссылок реально будет удален только соответствующий элемент каталога, а счетчик ссылок на inodeзапись будет уменьшен на единицу. Как только счетчик достигнет значения “ноль”, и inode-запись ,и физические данные файла будут уничтожены. Именованные специальные устройства-специальный дополнительный тип файлов (Named Special Device). В QNX файл может обозначаться более чем одним именем. Каждое имя файла называется связью. В действительности существует два вида связей: жесткие связи, или просто "связи", и символические связи. Для поддержки связей каждого файла, имя файла отделяется от остальной информации, описывающей файл. Эта информация хранится в структуре, называемой inode (индексным дескриптором). Если файл имеет только одну связь (т.е. одно имя), то блок inode хранится в элементе каталога для этого файла. Но если файл имеет более чем одну связь, то inode хранится как запись в специальном файле /.inodes, а элемент каталога для файла содержит указатель на запись inode.Можно создать связь для файла, только если файл исвязь находятся в одной и той же файловой системе. Нельзя создавать жесткие связи для каталога. Однако каждый каталог имеет две жестко определенные связи: «.» («точка»), «..» («точка точка»). Имя файла "точка" соответствует текущему каталогу; "точка точка" соответствует каталогу, предшествующему текущему каталогу. Доступ к регулярным файлам и каталогам управляется битами режима, хранящимися в inode (индексном дескрипторе) файла. Эти биты разрешают 158 чтение, запись и выполнение в зависимости от эффективных ID пользователя и группы. При этом пользователи делятся на три категории: владелец файла; члены группы, к которой принадлежит владелец; остальные. Процесс может выполняться с ID пользователя или ID группы файла, а не родительского процесса. Механизм, который позволяет это, называется setuid (установить ID пользователя) и setgid (установить ID группы). QNX может работать со следующими типами файловых систем: 9) встраиваемые: образная (ROM/Flash, Execute-in-place), в ОЗУ (временное хранилище), NOR Flash (линейное flash-ППЗУ), NAND Flash (страничное flash-ППЗУ); 10) дисковые: OC QNX (POSIX (QNX4)), Linux (Ext2), MS-DOS (FAT 12, 16, 32), CD-ROM (ISO9660, Joliet); 11) специальные: со сжатием (разворачивание «на лету»), пакет- ная (обновления и откаты на «лету»); 12) сетевые: NFS (совместимость с UNIX), CIFS ( совместимость Microsoft). На рис. 54 показана типовая структура каталогов QNX Neutino. Основные каталоги следующие [5]: Корневой каталог "/" является основой любой файловой системы UNIX. Все остальные файлы и каталоги располагаются в рамках структуры, порожденной корневым каталогом, независимо от их физического местонахождения. /bin В каталоге /bin находятся наиболее часто употребляемые команды и утилиты системы, как правило, общего пользования. /dev Каталог /dev содержит специальные файлы устройств, являющиеся интерфейсом доступа к периферийным устройствам. 159 /etc В этом каталоге находятся системные конфигурационные файлы и многие утилиты администрирования. Рис. 54 Организация каталогов QNX Neutino /lib В каталоге /lib находятся библиотечные файлы языка С и других языков программирования. /lost+found Каталог "потерянных" файлов. Программы проверки и восстановления файловой системы помещают файлы в каталог /lost+found под системными числовыми именами. /mnt Стандартный каталог для временного связывания (монтирования) физических файловых систем к корневой для получения единого дерева логической файловой системы. /home Общеупотребительный каталог для размещения домашних каталогов пользователей. /usr В этом каталоге находятся подкаталоги различных сервисных подсистем -системы печати, электронной почты и т. д. (/usr/spool), исполняемые файлы утилит UNIX (/usr/bin), дополнительные программы, используе160 мые на данном компьютере (/usr/Iocal), файлы заголовков (/usr/include), электронные справочники (/usr/man)n т. д. /var В UNIX System V этот каталог является заменителем каталога /usr/spool, используемого для хранения временных файлов различных сервисных подсистем — системы печати, электронной почты и т. д. -/tmp Каталог хранения временных файлов, необходимых для работы различных подсистем QNX. 3.7. Инсталляция и последовательность загрузки QNX Как и большинство операционных систем, ОСРВ QNX Neutrino имеет несколько этапов загрузки (рис. 55). Кратко рассмотрим каждый из этапов [20]. Рис. 55. Процесс начальной загрузки QNX Neutrino ФАП (фазовая автоподстройка, phased locked loop, PLL). ФАП – это процесс, длящийся от подачи питания на процессор до начала выполнения процессором первой инструкции. Для большинства ЦПУ процесс ФАП занимает время, за которое исходная тактовая частота задающего генератора проходит через все таймеры, используемые кристаллом. Время, занимаемое процессом ФАП для получения необходимых частот, обычно соответствует наибольшей временной метке, требуемой для запуска процессора. Время эта- 161 па ФАП не зависит от загружаемой ОС и меняется в зависимости от типа ЦПУ. В некоторых случаях это время может быть более 32 мс. НЗ (начальный загрузчик, initial program loader, IPL). IPL находит загрузочный образ ОС (OS image - это не ядро) и отдает управление программе загрузки, которая находится в этом образе. В QNX используется стандартный начальный загрузчик, который выполняет минимально необходимые операции для подготовки памяти, инициализации выбора нужных микросхем и конфигурирования других, необходимых для работы ЦПУ установок. После окончания этих установок начальный загрузчик копирует в ОЗУ программу Запуска и передает ей управление. Стандартный начальный загрузчик QNX может быть заменен любым другим. Среди таких замен могут быть полнофункциональные продукты типа U-Boot или RedBoot, которые через канал TFTP-клиента передают новый образ загрузки и записывают его во флеш-память. Обычно работа начального загрузчика продолжается не менее 6 мс до того, как начнется загрузка в память образа ОС. Фактическое время зависит от архитектуры ЦПУ, от того, что требуется материнской плате для определения минимальной конфигурации и что выбранный начальный загрузчик делает перед началом передачи управления ОС. После включения питания ЭВМ, на которой инсталлирована ОСРВ QNX, в зависимости от того, установлена QNX одна или совместно с другими ОС, сразу запускается процесс начальной нагрузки, либо мультизагрузчик сначала предлагает выбрать, какую ОС следует загружать. Если используется мультизагрузчик QNX, то сообщение выглядит примерно так: Press F1-F4 to select drive or select partition 1, 2, 3, 4? 2 Нажмите Fl — F4 для выбора дисковода или выберите раздел 1, 2, 3, 4? 2 Запуск (Startup). На этапе запуска происходит копирование образа ОС из флеш-памяти в ОЗУ и запуск образа на выполнение. Эта фаза копирования составляет самую длительную часть процесса начальной загрузки ОСРВ QNX Neutrino. То есть, системному архитектору есть над чем поработать, чтобы обеспечить управление длительностью этой фазы, пусть даже косвенное. В 162 ОСРВ QNX Neutrino файловая система на базе образа ОС (IFS, image file system) содержит как собственно образ ОС, так и программу Запуска (которые начальный загрузчик копирует в ОЗУ). Образ ОС состоит из ядра, сценария построения и любых других драйверов, приложений и бинарных кодов, которые необходимы системе. Поскольку вы можете управлять составом IFS, то и время выполнения данного этапа есть величина переменная. На рис. 55 она обозначена значением Х. Это время может составлять и 200 мс, и 2-3 с. В некоторых особых случаях, когда система имеет образ большого размера и не имеет никакой другой файловой системы, кроме IFS, этап Запуска может продолжаться дольше (до 10 и более секунд). В QNX обычно используются два загрузочных образа: основной образ помещается в файл /.boot, а резервный — в файл / .altboot. Вторичный загрузчик startup предлагает нажать клавишу "ESC" для загрузки резервного образа: Hit Esc for .altboot. Если ничего не нажимать, то загружаться будет основной образ. Для добавления, удаления или конфигурирования файлов, хранящихся в IFS можно отредактировать сценарий построения или использовать инструмент построителя встраиваемых конфигураций в интегрированной среде разработки QNX Momentics® IDE. Ядро (Kernel). На этапе запуска ядра инициализируется блок управления памятью (MMU, memory management unit), создаются структуры для управления страницами, процессами и исключениями, а также разрешается работа системы прерываний. После завершения этого этапа ядро становится полностью работоспособным и может начать загрузку и запуск процессов пользователя из сценария построения. Сценарий построения (build script). В сценарии определяется, какие драйверы и приложения должны быть запущены и в какой последовательности (/etc/system/ sysinit.). Поскольку ОСРВ QNX Neutrino является микроядерной ОС, то каждый драйвер, сервер или приложение запускаются в виде отдельного загружаемого процесса пользовательского уровня. Такой подход имеет явные преимущества: не нужно ждать загрузки и инициализации ядра и полного набора драйверов, прежде чем приложениям будет передано управление. При запу163 щенном микроядре можно чередовать запуск драйверов и приложений, чтобы достичь максимально быстрого завершения этапа запуска системы. 3.8. Интерпретаторы команд и пакетные файлы в QNX Командных интерпретаторов существует несколько. В QNX стандартным считается интерпретатор Korn Shell (ksh). Хотя, вы можете использовать и другие, такие как C-Shell (csh) или Bourn Vgain Shell (bash). Для систем с ограниченными ресурсами можно использовать Embedded Shell (esh) или Fat Embedded Shell (fesh) [15]. Если регистрация пользователя в системе была выполнена с помощью командно-строковой утилиты login, то программа регистрации запустила входной Shell. Она определяет какой командный интерпретатор запускать на основе информации записаной в базе данных пользователей. По умолчанию в систем есть только один пользователь "root" и его интерпретатор — ksh. Пользователей, привыкших работать в Windows, обычно не вдохновляет работа в командной строке. Командная строка в UNIX-подобных системах — весьма мощное средство управления системой. Некоторые наиболее используемые команды приведены в табл. 10. Основные команды QNX Таблица 10 Что нужно сделать? Команда Что нужно сделать? Команда В каком каталоге находимся pwd Копировать файл cр Просмотр содержимого каталога ls Копировать каталог cр –R Перейти в другой каталог cd Удалить файл rm Создать пустой файл touch Удалить каталог rmdir, rm –R Создать каталог mkdir Просмотреть файл cat Информация о потоках pidin Переименовать файл mv Информация о процессах ps Удалить процесс kill Запуск текстового редактора ped Удалить процесс slay Запуск в режиме демона ped & Справка по команде use Запуск связи с целевой системой qconn Управление выводом >, >>, <, | Большинство стандартных QNX-утилит содержат краткую информацию об аргументах запуска утилиты. Для просмотра этой информации суще164 ствует команда use. Например, для просмотра информации по использованию утилиты ls выполните такую команду: use ls. При работе в командной строке важную роль играют так называемые переменные системного окружения. Список этих переменных можно получить командой set. Изменять значения переменных в Korn Shell очень просто — надо выполнить присваивание: ПЕРЕМЕННОЙ=значение переменной Таблица 11 Имя переменной Что означает переменная НОМЕ PATH LD_LIBRARY_PATH IFS LOGNAME PWD PS1 PS2 UID TZ ? Домашний каталог пользователя Перечень каталогов для поиска запускаемых программ Перечень каталогов для поиска динамических библиотек Разделитель полей ввода Имя пользователя Имя текущего каталога Вид первичного приглашения Вид вторичного приглашения (для ввода незаконченной команды) Идентификатор пользователя Временной пояс Код завершения последней выполненной команды Однако присвоенное таким образом значение будет иметь смысл только в данной работающей оболочке. Для того чтобы переменная распространялась на все запущенные процессы, используют такую команду: port ИМЯ_ПЕРЕМЕННОЙ Можно экспортировать переменную непосредственно при создании: Export ИМЯ_ПЕРЕМЕННОЙ= ЗНАЧЕНИЕ_ПЕРЕМЕННОЙ Просмотреть значение одной из переменных (чтобы не выводить весь список) можно такой командой: echo $ИМЯ__ПЕРЕМЕННОЙ При запуске в качестве входной оболочки (login shell) Korn Shell выполняет команды, содержащиеся в файле /etc/profile, затем команды, содержащиеся в файле $номе/.profile. Разумеется, если эти файлы существуют и доступны по чтению. Для того чтобы при входе в систему автоматически устанавливались необ165 ходимые переменные, необходимо откорректировать файл .profile, лежащий домашнем каталоге. Для этого можно, например, воспользоваться редактором vi. Для создания нового командного файла необходимо выполнить команду touch <имя файла> (например, touch d) и затем открыть созданный пустой файл в текстовом редакторе ped (например, ped d). В текстовом редакторе необходимо набрать следующий текст: #!/bin/sh ls touch cc ls rm cc ls Затем сохранить файл, закрыть редактор. Если запустить пакетного файла так: # d, то ОС не находет файл и он не выполниться. Если указать полный путь, так: # ./d, то файл ОС найдет, но не сможет исполнить, так как у него не установлен атрибут исполняемого файла. Команда chmod 777 d устанавливает все необходимые атрибуты. Теперь запуск пакетного файла: # ./d обеспечит его успешное выполнение. Сравнение команд QNX и MS-DOS QNX Назначение команды MS-DOS mkdir a1 ls cd a1 pwd touch aa ls cat aa ped aa cat aa ls > bb cat bb ls ls >> bb cat bb ls > bb cat bb rm bb cd . Создать каталог с именем a1 Вывод на экран содержимого каталога Перейти в каталог a1 Выводит имя текущего каталога Создание нового файла Вывод на экран содержимого каталога Вывод содержимого файла на экран Отредактировать файл aa Просмотреть на экране содержимое файла aa Перенаправить вывод команды ls в файл bb Просмотреть на экране содержимое файла bb Вывод на экран содержимого каталога Перенаправить вывод команды ls в файл bb Просмотреть на экране содержимое файла bb Перенаправить вывод команды ls в файл bb Просмотреть на экране содержимое файла bb Удаление файла bb Переход из каталога сам в себя md a1 dir cd a1 166 copy con aa dir type aa edit aa type aa dir > bb type bb dir > bb dir >> bb type bb dir > bb type bb del bb cd . cd .. cd / Переход в родительский католог Переход в корневой католог cd .. cd / Подробнее примеры работы в командной строке и применения потоков ввода/вывода и конвееров рассмотрено в книге «QNX Momentics. Основы применения» [15 стр. 40-51]. Работа в графической среде Photon microGUI. Если при входе в систему выполнен через phlogin или запущена команда ph после вохода через login, то пользователь оказывается в рабочем пространстве ("workspace") графической оболочки Photon аналогичной Windows. Снизу находится панель задач, в левой ее части находится кнопка Launch. При нажатии кнопки Launch появляется меню, через которое можно вызывать различные прикладные программы. В правой части экрана находится меню быстрого запуска приложений – Shelf. Следует обратить внимание на следующие программы: Photon Terminal — pterm. Это штатный псевдотерминал, позволяющий работать с инструментами командной строкой (в том числе и с нашим рекстовым редактором vi); Helpviewer — программа доступа к штатной электронной документации. Надо сказать, что в составе QNX поставляется достаточно обширная и подробная документация; Photon File Manager (pfm) – штатный файловый менеджер Для любителей Norton Commander есть продукт третьего производителя mqc (MiShell QNX Commander) анализа Linux-ового Midnight Commander. Есть весьма полезный файл $HOME/.ph/phapps — это командный файл, в котором можно перечислить приложения, которые Photon должен запускать автоматически при своем запуске. Переключение между виртуальными консолями выполняется комбинацией клавиш Ctrl+Alt+F[1-6], где F1-F6 номера консолй. 167 3.9. Конфигурирование QNX Командный сценарий sysinit . Процесс diskboot перед своим завершением запускает командный сценарий /etc/system/sysinit. Задача этого сценария — запустить процессы, обеспечивающие необходимую функциональность ОС [15]. Давайте посмотрим, что же делает этот командный файл. 1. Запускает сервис регистрации системных событий (если он еще не запущен) slogger. 2. Запускает администратор неименованных каналов pipe. 3. В случае если это первый запуск системы после инсталляции, то запускает сценарий /etc/re.d/rc.setup-once. Факт первого запуска устанавливается по отсутствию файла /etc/sys tern/package/packages. 4. Устанавливает часовой пояс. Информация берется из файла /etc/TIMEZONE. 5. Запускает командный сценарий /etc/re.d/rc.rtc (если таковой существует) для настройки часов реального времени. 6. Определяет имя ЭВМ. Информация берется из файла /etc/HOSTNAME. 7. Запускает командный сценарий /etc/rc.d/rc.devices (если таковой существует). Этот скрипт инициирует распознавание аппаратных устройств. 8. Если существует файл /etc/system/config/useqnet И запущен администратор сетевого ввода/вывода io-net, то загружается администратор сетевого протокола Qnet. Факт работы io-net определяется по наличию регистрируемого этим администратором префикса – каталога /dev/ io-net. Администратор протокола Qnet реализован в виде DLL, расширяющей функциональность администратора io-net. Подключение выполняется следующей командой: 9. mount -Tio-net npm-qnet.so 168 10. Если существует файл /.swapfile, то он подключается в качестве устройства свопинга. 11. Запускает командный сценарий /etc/re.d/rc.sysinit (если таковой существует). Этот скрипт продолжает инициализацию системы. 12. Если не удается запустить rc.sysinit, то делается попытки запустить командный интерпретатор Korn Shell в интерактивном режиме. Если стандартный интерпретатор не может запуститься, делается попытка запустить интерпретатор с меньшими требованиями к ресурсам -- Fat Embedded Shell (fesh). Таким образом, сценарий sysinit перед окончанием своего выполнения вызывает сценарий rc.sysinit. Командный сценарий rc.setup-once. Этот командный сценарий вызывается из скрипта /etc/system/ sysinit только один раз — при первом запуске системы. Сценарий создает ряд каталогов: /tmp, /var с несколькими подкаталогами, /pkgs С /pkgs/repository, /root (домашний каталог системного администратора). Файл для своппинга /.swapfile, файл начальной конфигурации базовой системы /etc/system/package/packages. Если существует файл /boot/setup.inf (в этом файле сохраняются любые настройки, выполненные в процессе инсталляции), то запускается сценарий /etc/re.d/rc.setup-info. Затем перезапускается администратор пакетной файловой системы fs-pkg и генерируется начальная поисковая база данных программы– просмотрщика электронной документации helpviewer. Кроме перечисленных действий, создается рабочая копия файла /etc/passwd. Командный сценарий rc.devices. Командный файл /etc/re.d/rc.devices вызывается при каждой загрузке QNX из сценария /etc/system/sysinit. Этот сценарий запускает администратор псевдотерминалов devc-pty, затем определяет каталоги, содержащие информацию о поддерживаемых 169 устройствах (для локального узла – /etc/ system/enum). После этого запускается администратор конфигурирования аппаратуры enum-devices, сканирующий подключенные устройства. Командный сценарий rc.sysinit. Командный сценарий /etc/re. d/rc. sysinit вызывается при каждой загрузке QNX из сценария /etc/system/sysinit и предназначен для выполнения настроек, специфичных для данной ЭВМ, и запуска необходимых сервисов [21]. Этот сценарий запускает процесс dumper, сохраняющий "посмертные" core-файлы процессов, завершившихся аварийно. Затем запускает сценарий /etc/re. d/rc. local, если таковой существует. Этот сценарий нужен, если вы хотите добавить свои команды инициализации, не редактируя созданные системой файлы. На моей рабочей станции, например, из сценария rc.local запускается процесс, принимающий запросы к TСР/IР-сервисам inetd. Последнее действие сценария rc.sysinit — запуск программы инициализации терминала tinit. Эта программа запускает на терминале утилиту входа в систему login или графическую оболочку Photon с графической утилитой входа в систему phlogin. Какой вариант использовать, сценарий определяет по наличию или отсутствию файла /etc/system/config/nophoton. Если запустить tinit не удалось, сценарий пытается последовательно запустить командные интерпретаторы ksh (sh — это просто ссылка на ksh) и fesh. 170 4. ВИРТУАЛЬНЫЕ МАШИНЫ 4.1. Общие сведения о виртуальных машинах Виртуальная машина (англ. virtual machine) — программная или аппаратная среда, исполняющая некоторый код (например, байт-код, шитый код, p-код или машинный код реального процессора), или спецификация такой системы (например: «виртуальная машина языка программирования Си»). Зачастую виртуальная машина эмулирует работу реального компьютера. На виртуальную машину, также как и на реальный компьютер, можно устанавливать операционную систему, у виртуальной машины также есть BIOS, оперативная память, жёсткий диск (выделенное место на жёстком диске реального компьютера), могут эмулироваться периферийные устройства. На одном компьютере может функционировать несколько виртуальных машин [22] . Виртуальные машины могут использоваться: для защиты информации и ограничения возможностей процессов. для исследования производительности ПО или новой компьютерной архитектуры. для эмуляции различных архитектур (например, эмулятор игровой приставки). вредоносным кодом для управления инфицированной системой: вирус PMBS (1993 г.). Он создавал виртуальную систему, которой ограничивался пользователь и все защитные программы (антивирусы и прочие). для моделирования информационных систем с клиент-серверной архитектурой на одной ЭВМ (эмуляция компьютерной сети с помощью нескольких ВМ). для упрощения управления кластерами — виртуальные машины могут просто мигрировать с одной физической машины на другую во время работы. В широком философском понимании идея виртуализации это отделение логического представления процессов от способа их физической реализации применима к любому ИТ-продукту (и в первую очередь к ОС). В узком смысле (уже в рамках ИТ) данное понятие связано с созданием механизма виртуальных машин (ВМ) корпорацией IBM для своих mainframe 171 в начале 70-х гг. прошлого века. Это было обусловлено необходимостью одновременного запуска на одном компьютере нескольких разных ОС. Можно предположить, что решение такой задачи было не очень сложным, поскольку mainframe изначально проектировались как мощные системы коллективного доступа с высоким уровнем виртуализации и изоляции вычислительных ресурсов. Не говоря уже о том, что вся эта аппаратно-программная платформа (в том числе и разные версии ОС) принадлежала одному разработчику. Появление компьютеров архитектуры x86 — сначала ПК, а потом и серверов — сделало идею ВМ просто неактуальной: в них был заложен принципиально иной (чем в mainframe) подход: один компьютер — одна ОС. Однако к концу 90-х, по мере роста мощности х86-систем, значимость задачи запуска нескольких ОС на одном компьютере вновь стала возрастать. Поначалу это касалось преимущественно вопросов разработки и тестирования ПО, а потом на первый план вышли проблемы консолидации серверов в “боевом” режиме работы информационных систем. Но в случае x86 поддержка виртуальных сред была весьма непростой задачей. Тут можно выделить несколько аспектов. Во-первых, эта архитектура не была изначально предназначена для подобного применения. Во-вторых, речь шла не об одном vendor, которому нужно было решать свои внутренние технические проблемы, а о большом ИТ сообществе с непростыми конкурентными отношениями, а также о массовом рынке (разделенном на аппаратные и программные сегменты), а значит — о необходимости поддержки огромного числа унаследованных приложений от десятков тысяч разработчиков. ИТ - системы неоднородны (несколько групп поставщиков оборудования, ОС, приложений, ПО виртуализации, и в каждой группе есть своя неоднородность). Механизм ВМ понадобился для запуска на одном компьютере нескольких разных ОС. На самом деле многозадачность ОС для x86-архитектуры является весьма и весьма условной, фактически это однозадачные системы. Запускать в их среде несколько приложений можно, но с точки зрения надежности и балансировки нагрузки это не нужно. Традиционные ОС не обеспе172 чивают нужного (для бизнес-применения) уровня изоляции приложений, а современные методы виртуализации направлены на повышение этого уровня. Средства виртуализации сегодня являются не самодостаточным видом порграммного обеспечения (альтернативой современных операционных систем), а некоторым дополнением и расширением традиционных ОС. Общая тенденция развития ОС будет направлена именно на повышение уровня поддержки многозадачности систем и в том числе более высокой изоляции приложений и к использованию новой модели распределенных вычислений в “облачном” стиле (Cloud Computing). Такой процесс будет эволюционным и весьма долгим. Таким образом, еще долго средства виртуализации будут интегрированы в ОС. При всех преимуществах виртуализации, функционал нынешних ОС большинство пользователей вполне устраивает. В то же время включение средств виртуализации на уровне ядра ОС может привести к неоправданному “утяжелению” систем в целом, в частности — негативно отразиться на их производительности. И вот что еще важнее. Прикладные программы создавались и создаются для работы в среде традиционных ОС. Не говоря уже о проблеме поддержки унаследованных приложений, переход на чисто виртуализационную модель потребует радикального изменения всей схемы разработки пограммного обеспечения. Вся эта проблема очень хорошо видна на примере развития технологий нынешнего лидера в области виртуализации — компании VMware. Целью создания ОС нового поколения — ОС для виртуальных дата-центров (virtual datacenter OS, VDC OS) является не замена традиционных ОС, а вносение корректив в общую структуру комплекса програмного обеспечения. VDC OS может функционировать только при использовании традиционных ОС, в то время как сами эти ОС могут применяться и без каких-либо дополнительных средств виртуализации. На сегодняшний день в общей структуре виртуализационных средств выделяются три основных слоя: 173 виртуализация вычислительных сред (ресурсов центрального процессора, включая ОЗУ, и операционной системы); виртуализация хранилищ данных; виртуализация сетей. Именно такая структура просматривается и в VDC OS; при этом видно, что ключевым и наиболее проработанным на сегодня компонентом системы является слой ВМ. Он фактически уже представлен комплексом Virtual Infrastructure с ядром в виде EXS Server, в то время как остальные две части системы — vNetworks и vStorage — еще только предстоит создать. VMware начала свою деятельность в 1999 г. с создания решения для ПК — Workstation. Затем появился вариант этой же технологии для серверов — GSX Server (сейчас просто VMware Server), и лишь потом вышел качественно иной вариант специально для серверов — ESX Server. В такой же последовательности двигалась и Microsoft: Virtual PC, на основе которой был разработан Virtual Server, и уже ему на смену пришел качественно новый Hyper-V. Использование виртуальных сред должно дать принципиально новые возможности гибкого управления ИТ-инфраструктурой: ВМ можно легко, без остановки их работы, переносить с одного компьютера на другой, выделять дополнительные вычислительные ресурсы в случае повышения нагрузки и т.д. Развертывание ИТ-сервисов (в том числе по требованию бизнеса) теперь будет занимать вместо нескольких дней сколько часов или даже минут, профилактические мероприятия и ввод в действие новых сервисов будет выполняются без остановки работы пользователей. 4.2. Работа с виртуальной машиной VmWare Виртуальная машина, или, иначе, VM,- это программа, которая эмулирует настоящий физический компьютер, притом таким изощренным образом, 174 что на этот компьютер можно установить операционную систему и приложения, которые будут работать, не подозревая о том, что работают они не на "железе", а в программной среде. При этом виртуальная машина может создавать различные аппаратные конфигурации (в некоторых пределах) например, можно определить, сколько памяти получит та или иная виртуальная машина [23]. Сама программа эмуляции, равно как и работающая на ней операционная система, называется виртуальной машиной, в то время как основная операционная система и физическая машина называются хостсистемой. Задействованные виртуальной машиной ресурсы или "вырезаются" из основного пула ресурсов (как, например, происходит с оперативной памятью), или раздельно используются и хост, и виртуальной системами - как это происходит с процессором и съемными носителями. Описываемые виртуальные машины предназначены для работы в качестве хост-системы под Windows и в случае VMWare - под Linux, хотя многообразие устанавливаемых систем значительно шире. Как правило, VMWare показывает отличные результаты, но если не удается поставить какую-то систему или возникают сбои, то, как вариант, попробуйте VirtualPC - возможно, она справится с вашими проблемами. Если ОС корректно работает на архитектуре Intel, то она с максимальной вероятностью установится и станет работать в VMWare. В VMWare хорошо работают все версии DOS, Windows, а также основные дистрибутивы Linux и QNX. VMWare при создании виртуальной машины сразу же создает виртуальный жесткий диск, после чего можно добавить еще какое-то их количество. Размер этого диска по умолчанию - 4 Гб, но этот размер просто изменить. С точки зрения аппаратной части, этот диск может быть привязан к любому каналу IDE или SCSI. При необходимости изменитя этих настроек, их нужно изменять это до инсталляции ОС, поскольку впоследствии не все системы правильно поймут перестановку диска с одного шлейфа на другой. 175 С жесткими дисками связано три возможности. Во-первых, файл жесткого диска можно, подобно физическому устройству, "извлечь" из ВМ - то есть сохранить, переписать на другую систему и потом подключить, воссоздав тем самым ВМ в первозданном виде. Другая возможность - настроить "откат" изменений на диске. Обычно изменения будут храниться на диске так же, как это происходит на обычном компьютере. Режим отката позволяет работать с системой, но после перезагрузки все изменения на диске будут утеряны. Существует также промежуточный вариант, то есть при выключении ВМ будет задан вопрос, сохранить ли изменения. Наконец, третий вариант - при создании машины сделать не виртуальный диск в файле, а отвести под диск настоящий раздел. Это несколько трудоемкий и не очень эффективный метод. Его назначение - установить ВМ, настроить систему в виртуальном режиме, после чего перенести жесткий диск с настройками на другой компьютер и запускать систему в собственном режиме. Несколько другая ситуация со сменными носителями. Самое главное отличие - это то, что под VMWare они могут использоваться одновременно и ВМ, и хостом. При этом несколько виртуальных машин тоже разделяют одно устройство, так что никаких проблем не возникает. Кроме того, в VMWare есть возможность вместо физического устройства использовать образ диска - как ISO для CD-ROM, так и образа флоппи-диска для соответствующего юнита. Под VirtualPC все сделано слабее. Сменные носители монтируются, подобно тому, как это происходит в Unix. После того как диск примонтирован, он захватывается ВМ и из других систем не доступен. Если пользователь извлекает носитель, устройство автоматически освобождается - и ВМ теряет его. Для того, чтобы она его нашла нужно щелкнуть правой кнопкой на маленькой пиктограмме в строке состояния и снова захватить CD ROM. Настройка видео - ответственный участок в настройке виртуальной машины. По крайней мере, при настройке X-Windows - поскольку тут придется сделать кое-что своими руками. VMWare и VirtualPC решают проблему видео разными путями, а именно: VirtualPC эмулирует видеокарточку S3 Trio 176 32/64 PCI, и поскольку любая существующая операционная система поддерживает эту карточку с вероятностью 99,99%, то таким образом проблема видео решается удовлетворительно. Совершенно другим путем пошла VMWare. Вместо эмуляции какой-то существующей карточки она предлагает собственный драйвер, входящий в пакет vmware-tools, устанавливаемый на виртуальной системе. Настройка сетевых интерфейсов - это самое важное, поскольку вряд ли кто-то ставит FreeBSD или Linux с иной целью, чем задействовать сетевые возможности последних. Представляемые виртуальные машины имеют несколько принципиально различных методов подключения к вашему компьютеру и ко внешней сети. Рассмотрим (как более канонический вариант) схемы подключения vmware и потом перечислим отличия в VirtualPC. Существует три основных режима подключения виртуальной машины к сети: Bridged mode, NAT и Host Only, схематически показанные на рисунке. 1) Bridged mode дает виртуальной машине непосредственный доступ к внешнему интерфейсу хост-машины, на котором виртуальная машина самостоятельно устанавливает или получает через DHCP собственные сетевые параметры - такие как IP-адрес, маршрутизатор по умолчанию и тому подобные. Этот вариант подключения нужно использовать для тех случаев, когда на VM устанавливаются серверы, которые должны иметь определенные сетевые адреса. 2) NAT использует трансляцию адресов исходящего трафика. В этом случае адрес виртуальной машины, полученный по встроенному, в NAT DHCP, в момент пересылки на внешний протокол подменяется на адрес хостмашины. При этом запрос помещается в таблицу запросов. Полученные ответы от удаленных систем сверяются с этой таблицей - и по ряду параметров находится соответствие, по типу "в ответ на ваше письмо от такого-то какогото рады вам сообщить…". При пересылке в VM адрес снова подменяется, так чтобы программа, запросившая информацию, получила пакеты на свой порт и адрес. Таким образом, пересылаются запросы и в серверные приложения, к которым пользователь обычно не обращается напрямую, например DNS. 177 NAT без проблем работает на исходящем трафике, но в случае входящего запроса все запросы приходят на адрес хост-машины, поскольку во внешнем мире все NAT-адреса были представлены одним адресом хостсистемы. Для того чтобы виртуальная машина могла получать входящий трафик, на хост-машине необходимо вручную установить правило ретрансляции, смысл которого примерно следующий: "входящие пакеты на порту таком-то переводить в ВМ такую-то на порт такой-то (порт обычно тот же самый)". То есть доступ к серверу можно осуществлять и через NAT, но это требует дополнительной настройки. Для более подробной инструкции по настройке NAT под VMWare ищите "Understanding NAT" в справочном пособии и изучайте файл C:\WINNT\system32\vmnetnat.conf. 3) Третий режим Host Only представляет дела так, будто у хостмашины в дополнение к имеющимся сетевым интерфейсам есть еще одна сетевая карточка (видимая в системе и без запуска VM), к которой подключается наша ВМ, образуя с хост-машиной маленькую подсеть. Таким образом, можно устроить сеть на одном компьютере, что называется, не отходя от дома. При этом совсем не обязательно судьба исходящих пакетов заканчивается на хост-машине - она может выступать как мост между подсетями и переводить пакеты на другой интерфейс, например на модем. Таким образом ВМ может получать доступ к другим подсетям. Настройка производительности. Несколько приложений, работающих параллельно, будут работать медленнее, чем по отдельности. В случае с виртуальными машинами процесс усугубляется тем, что все приложения на всех машинах разделяют один процессора. Поскольку виртуальные машины не используют особых средств разделения процессорного времени, кроме системных диспетчеров хост- и виртуальной машин, и учитывая, что накладные расходы современных диспетчеров составляют не более 1%, то для расчета производительности можно применять обычную арифметику. Например, для нормальной работы Windows 2000 нужен Pentium II/III 600. Для работы Linux-сервера в терминальном режиме требуется Pentium 178 300. Просто складывая эти числа, получается искомый 1 ГГц, на котором обе системы будут поддерживать прежнюю производительность. В меню Settings > Preferences на закладке Priority VMWare есть установка приоритетов, помогающая тонко настроить приоритет виртуальной машины при распределении циклов процессора. Global обозначает настройку для всех виртуальных машин. Локальная настройка относится только к текущей виртуальной машине. Grabbed input соответствует режиму, когда виртуальная машина получает управление и захватывает ввод пользователя; Ungrabbed, соответственно,- фоновому режиму виртуальной машины (даже если ее окно и находится на переднем плане). Особое внимание нужно обратить на память, учитывая, что она выделяется статически, в момент запуска виртуальной машины. Поскольку на хост-системе установлена виртуальная память, можно загрузить несколько виртуальных машин - и под все будет распределена память. Но поскольку вся она (на 90%) будет в файле подкачки, производительность значительно упадет. Для рассчета памяти нужно брать только физическую память. Например, современные Linux-системы с Gnome для комфортной работы требуют около 128 Мб памяти. Плюс в хост-режиме под NT5 планируется обрабатывать графику, что тоже требует около 128 Мб. А так же несколько приложений, таких как браузер, почтовый клиент, текстовый редактор. Таким образом, система с 256 Мб будет показывать несколько замедленную реакцию в требовательных к памяти приложениях, а вот установка 256 + 128 Мб обеспечит полный комфорт в работе. Диспетчером задач позволяет просмотреть фактическую нагрузку на процессор и распределение памяти и показать, сколько требуют те или иные системы при запуске тех или иных приложений. В случае соответсвия компьютера требованиям VM можно получить максимум производительности и удовольствия от этой технологии. Для выхода виртуальной машины VMWare нужно нажать левые <Alt + Ctrl>. Эта же комбинация вернут к хост-системе из полноэкранного виртуального режима. 179 5. ЗАЩИТА ОТ СБОЕВ И НЕСАНКЦИОНИРОВАННОГО ДОСТУПА 5.1. Принципы построения систем безопасности Компьютерная безопасность охватывает вопросы физического и административного контроля, а также автоматических видов контроля. Рис. 56 дает представление о сфере применения автоматизированных средств обеспечения безопасности [3]. Рассмотрим виды угроз, которым подвержены устройства, обеспечивающие возможности обмена информацией между компьютерами. Компьютерная система Данные Компьютерная система (4) Необходимо обеспечение безопасности важных файлов (безопасность файлов) Данные (3) Необходимо обеспечение безопасной передачи данных по сети (безопасность сетей) (1) Необходим контроль доступа к данным (защита) Процессы, представляющие пользователей Процессы, представляющие пользователей Защита Защита (2) Необходим контроль доступа к компьютерным устройствам (аутентификация пользователя) Пользователи, делающие запросы Рис 56 Область охвата системной безопасности К безопасности вычислительной системы выдвигаются такие четыре требования: 1. Конфиденциальность - информацию от компьютерных систем могут получать только авторизованные лица. Доступ подобного рода включает в себя вывод на печать, на экран и другие формы предоставления информации, в том числе само обнаружение существования объекта. 2. Целостность - Предполагает, что свойства компьютерной системы могут изменять только авторизованные лица. Под изменением подразумева- 180 ется запись, редактирование, изменение статуса, удаление или создание новых объектов. 3. Доступность - Необходимо, чтобы свойства компьютерной системы были доступны авторизованным лицам. 4. Аутентичность - Компьютерная система должна иметь возможность проверять идентичность пользователя. Выделяют следующие виды угроз для компьютерных систем в процессе предоставления информации (рис.57): Источник информации Получатель информации А) Нормальная передача Б) Прерывание В) Перехват Г) Изменение д) Подделка Рис.57. Угрозы безопасности 1. Прерывание - Компоненты системы выходят из строя, становятся недоступными или непригодными. Это атака, целью которой является нарушение доступности. 2. Перехват - Это атака, целью которой является нарушение конфиденциальности, в результате чего доступ к компонентам системы получают несанкционированные стороны. 181 3. Изменение - Несанкционированная сторона не только получает доступ к системе, но и вмешивается в работу ее компонентов. Целью этой атаки является нарушение целостности. Подделка - Несанкционированная сторона помещает в систему поддельные объекты. Целью этой атаки является нарушение аутентичности. В основе многозадачности лежит способность системы предоставлять пользователям возможность совместного использования ресурсов. Объектом совместного использования является не только процессор, но и такие элементы, как память; устройства ввода-вывода, программы; данные. Возможность совместного использования ресурсов предполагает их защиту. Компоненты компьютерной системы можно разделить на следующие категории: аппаратное обеспечение, программное обеспечение, данные, а также линии связи и сети [3]. На рис. 58, а также в табл. 12 указан характер угроз, с которыми встречаются категории каждого вида. Рассмотрим их по порядку. Пассивные угрозы Извлечение содержимого сообщения Анализ трафика Активные угрозы Имитация Воспроизве- Изменение Отказ в обдение содержимого служивании сообщения Рис. 58. Угрозы безопасности активного и пассивного характера Аппаратное обеспечение. Основная угроза для аппаратного обеспечения компьютерной системы связана с его доступностью. Аппаратное обеспечение больше всего подвержено атакам и менее всего поддается автоматическому управлению. В число угроз входят случайный и преднамеренный вывод оборудования из строя, а также его кража. Распространенность персональных компьютеров, рабочих станций и все более широкое использование локальных сетей приводят к увеличению потенциальной возможности потерь 182 в этой области. Для устранения угрозы подобного рода нужны административные меры по предотвращению физического доступа к системам. Компоненты компьютерной системы и виды угроз для них Таблица 12. Доступность Оборудование может быть похищено или выведено из строя (отказ в обслуживании) Программное Удаление программ, обеспечение отказ пользователям в доступе Секретность Целостность/Аутентичность Несанкционированное копирование программ Данные Удаление файлов, отказ пользователям в доступе к ним Линии связи Разрушение или удаление сообщения. Нарушение работы линий передачи или сетей Несанкционированное чтение данных. Анализ статистических данных Чтение сообщений. Наблюдение за трафиком Рабочая программа изменяется таким образом, что она либо перестает работать, либо выполняет какое-то другое задание Изменение имеющихся файлов или подделка новых Аппаратное обеспечение Изменение содержимого, времени доставки (задержка), порядка доставки сообщений или их дублирование. Подделка сообщений Программное обеспечение. Компьютерная система без программного обеспечения представляет собой бесполезный набор аппаратных устройств. Именно операционная система, утилиты и приложения делают компьютерную систему пригодной для использования отдельными лицами и организациями. Рассмотрим несколько различных угроз этой части компьютерной системы. Основную опасность для программного обеспечения представляет атака на доступность. Программы, особенно прикладные, чрезвычайно легко удалить. Кроме того, программное обеспечение может быть изменено или повреждено, в результате чего оно станет непригодным для работы. Аккуратное управление настройкой конфигурации программ, включающее хранение резервных копий новейших версий, поможет повысить надежность их работы. Сложнее решить проблему, когда изменение программы приводит к тому, что она продолжает работать, но при этом ведет себя не так, как раньше. Эта категория атак связана с компьютерными вирусами. Упомянем также о проблеме секретности программ. Несмотря на существование (определен183 ных мер защиты, в целом проблема несанкционированного копирования программного обеспечения остается неразрешенной. Данные. Ответственность за безопасность аппаратного и программного обеспечения обычно возлагается на профессионалов вычислительного центра или на пользователей персонального компьютера. Безопасность данных является более обширной проблемой, включающей в себя безопасность файлов и других видов данных, управляемых отдельными лицами, группами и деловыми организациями. Безопасность данных охватывает широкий круг вопросов, включающий в себя доступность, секретность и целостность. Когда речь идет о доступности, подразумевается защита от случайной либо преднамеренной порчи файлов с данными. Очевидно, что для соблюдения секретности необходимо заботиться о предотвращении несанкционированного чтения файлов данных или баз данных. В этой области было проведено больше исследований и затрачено больше усилий, чем в любой другой области компьютерной безопасности. Не столь очевидной угрозой для секретности является анализ данных, заключающийся в использовании так называемых статистических баз данных, предоставляющих краткую или совокупную информацию. Совокупная информация обычно не представляет угрозы вмешательства в частную жизнь отдельных лиц. Однако в результате все более широкого использования статистических баз данных возрастает потенциальный риск раскрытия хранящейся в ней информации личного характера. По сути, в ходе тщательного анализа могут быть получены сведения цельных лицах, занесенных в базу данных. Это можно пояснить на таком простом примере: если в одной таблице записан суммарный доход респондентов А, В, С и D, а в другой — суммарный доход респондентов А, В, С, D и Е, разность этих величин составит доход респондента Е. Проблема обостряется в связи с комбинированием наборов данных. Во многих случаях в процессе составления необходимых совокупностей нужно извлекать отдельные составляющие, сопоставляя несколько различных наборов данных на уровнях агрегирования, подходящих 184 для задачи. Таким образом, на различных этапах обработки наборов данных становятся доступными отдельные составляющие базы данных, являющиеся закрытыми. Наконец, в большинстве систем основной задачей является сохранение целостности данных. Изменение файлов данных может иметь различные последствия – от незначительных до сокрушительных. Линии связи и сети. Прослушивание или отслеживание передаваемой информации по своему характеру являются пассивными атаками. Цель атакующего, состоит в получении этой информации. К данному виду атак относятся извлечение содержимого сообщения и анализ трафика. Другой вид пассивной атаки, анализ трафика (traffic analysis), является более сложным. Предположим, что у нас есть возможность скрыть содержимое передаваемой информации, так что оппоненты, даже перехватив сообщение, не могут извлечь из него информацию. Общепринятым методом маскировки содержимого является его шифровка. Однако оппонент может получить представление о характере сообщений, несмотря на то что они зашифрованы. Он может определить местоположение и параметры узлов, обменивающихся информацией, а также собрать сведения о частоте передачи сообщений и об их размере. Полученные сведения могут дать представление о характере передаваемой информации. Пассивные атаки очень трудно выявить, так как они не влекут за собой никаких изменений данных. Однако предотвратить эти атаки вполне возможно. Таким образом, внимание следует сосредоточить не на выявлении пассивных атак, а на их предотвращении. Другой категорией атак являются активные атаки. Они предполагают некоторое изменение потока данных или создание поддельного потока и подразделяются на четыре категории: имитация, воспроизведение, изменение сообщений и отказ от обслуживания. Имитация имеет место, когда какой-то объект выдает себя за другой объект. Атака с имитацией обычно предпринимается вместе с активными атаками других видов. Например, может перехватываться, а затем воспроиз185 водиться последовательность сообщений, передаваемых в процессе аутентификации, в результате чего авторизированные стороны с небольшими привилегиями получают дополнительные привилегии, выдавая себя за объект, обладающий ими. Воспроизведение включает в себя пассивный перехват элементов данных с их последующей повторной передачей, чтобы произвести неавторизированный доступ. Под изменением сообщений подразумевается изменение какой-то части первоначального законного сообщения, удаление сообщений или изменение порядка их получения. Все это делается с целью получить несанкционированный доступ. Например, сообщение: "Позволить Ивану Сидорову читать конфиденциальные файлы" может быть изменено на такое: "Позволить Сидору Иванову читать конфиденциальные файлы". Отказ от обслуживания препятствует нормальному использованию средств связи или управлению ими либо сдерживает их. Цель этой атаки может быть вполне конкретной; например, объект может подавлять все сообщения, предназначенные конкретному адресату (например, службе аудита безопасности). Другим видом отказа от обслуживания является подрыв работы всей сети, который достигается посредством вывода ее из строя либо перегрузки сообщениями в целях снижения ее производительности. Активные атаки обладают характеристиками, противоположными характеристикам пассивных атак. Хотя пассивные атаки трудно выявить, их можно предотвратить с помощью специально разработанных мер. С другой стороны, активные атаки очень трудно полностью предотвратить, потому что для этого понадобилось бы обеспечить постоянную физическую защиту всех средств связи. Целесообразнее сосредоточить усилия на выявлении этих атак и устранении их последствий. Благодаря тому, что выявление производит сдерживающий эффект, оно также может способствовать и предупреждению. Возможность совместного использования ресурсов предполагает их защиту. ОС может обеспечивать шесть степеней защиты: 186 1. Отсутствие защиты - процедуры выполняются во времени раздельно. 2. Изоляция - каждый процесс работает отдельно от других процессов, не используя совместно с ними никаких ресурсов и не обмениваясь информацией. 3. Полное разделение или полное его отсутствие - Владелец объекта (например, файла или сегмента памяти) объявляет его открытым либо закрытым. В первом случае доступ к объекту может получить любой процесс; во втором — доступ к этому объекту предоставляется только его владельцу. 4. Совместное использование с ограничением доступа - Операционная система проверяет дозволенность доступа каждого отдельного пользователя к каждому отдельному объекту. 5. Совместное использование с помощью динамических возможностей - расширяет концепцию контроля доступа, позволяя динамически создавать права совместного использования объектов. 6. Ограниченное использование объекта - ограничивается не столько доступ к объекту, сколько его использование. Защита памяти: Разделение пространства памяти между различными процессами легко осуществляется при использовании схемы виртуальной памяти. Эффективным средством управления основной памятью является сегментная или страничная организация памяти, либо комбинированный вариант, в котором сочетаются оба вида организации. Если нужно обеспечить полную изоляцию, то операционной системе достаточно просто убедиться, что каждый сегмент или каждая страница доступна только тому процессу, которому она предоставлена. Если совместное использование разрешено, то один и тот же сегмент или страница может появиться в нескольких таблицах. Зловредное программное обеспечение. Вероятно, наиболее изощренные угрозы для компьютерных систем представляют программы, исследующие их уязвимые места [3]. Общее название угроз такого вида — зловредные программы (malicious software или malware). Зловредные программы — 187 это программы, которые предназначены для того, чтобы причинить вред или использовать ресурсы компьютера, выбранного в качестве мишени. Они часто маскируются в легальных программах или выдаются за них. В некоторых случаях они распространяются сами по себе, переходя на другие компьютеры по электронной почте или через зараженные файлы или дискеты. На рис. 59 представлена общая систематизирующая схема зловредных программ. Угрозы этого вида можно разделить на две категории: те, которые используют программу-носитель, и те, которые являются независимыми. К первой категории в основном относятся фрагменты программ, которые не могут существовать независимо от программы-носителя, в роли которой может выступать приложение, утилита или системная программа. Ко второй категории относятся отдельные независимые программы, которые могут планироваться и запускаться операционной системой. Зловредное программное обеспечение Независимое Нуждается в программе - носителе Люки Логические бомбы Троянские кони Вирусы Черви Зомби Размножаются Рис. 59. Систематизация зловредных программ Опасные программы разделяются на такие, которые не воспроизводят себя, и такие, которые делают это. К программному обеспечению первого вида относятся фрагменты программ, которые должны активизироваться во время определенных действий главной программы. В программное обеспечение второго вида входят либо фрагменты программ (вирусы), либо независимые программы (черви), способные при запуске создавать одну или не- 188 сколько копий самих себя; эти копии позже активизируются в этой же или в какой-то другой системе. Хотя представленная на рис. 59 систематика полезна для усвоения обсуждаемой информации, она не дает полной картины. В частности, логические бомбы или троянские кони также могут быть составной частью вирусов или червей. 5.2. Безопасность операционной системы WINDOWS Операционная система Windows XP предоставляет средства единообразного контроля доступа к процессам, потокам, файлам, семафорам, окнам и другим объектам. Контролем доступа управляют два элемента: маркер доступа, который связан с каждым процессом, и дескриптор защиты, связанный с каждым объектом, для которого возможно межпроцессное взаимодействие [3]. Схема контроля доступа. При входе пользователя система Windows XP использует для его аутентификации схему имя/пароль. Если пользователь успешно зарегистрирован, для него создается процесс, с которым ассоциируется маркер доступа. Этот маркер доступа, детали которого будут описаны далее, содержит идентификатор защиты (security ID — SID), по которому система безопасности идентифицирует данного пользователя. Когда начальный пользовательский процесс порождает какие-нибудь другие процессы, новый объект-процесс наследует тот же маркер доступа. Маркер доступа имеет два предназначения. 1. Благодаря ему вся информация по безопасности хранится вместе, что способствует ускорению подтверждения доступа. Когда какой-нибудь связанный с пользователем процесс пытается получить доступ, подсистема безопасности может использовать связанный с процессом маркер, чтобы опреде189 лить привилегии доступа, которыми обладает данный пользователь. 2. Наличие маркера доступа позволяет процессу в определенных рам- ках изменять свои характеристики безопасности, не влияя при этом на ра- боту других процессов, запущенных от имени данного пользователя. Основное значение второго пункта состоит в том, что маркер доступа должен иметь дело с привилегиями, которые могут быть связаны с пользователем. Маркер доступа указывает, какие привилегии разрешено иметь пользователю. Как правило, для каждой из этих привилегий маркер инициализируется состоянием запрета. Впоследствии, если одному из процессов пользователя нужно выполнить привилегированную операцию, этот процесс может включить соответствующую привилегию и попытаться получить доступ. Иногда нежелательно хранить всю информацию по безопасности, касающуюся пользователя, в одном месте системы, потому что в этом случае предоставление привилегии одному процессу приводит к тому, что данная привилегия предоставляется всем остальным процессам. С каждым объектом, для которого возможен межпроцессный доступ, связан дескриптор защиты. Основным компонентом дескриптора защиты является список контроля доступа, в котором права доступа к данному объекту указываются для различных пользователей и для различных групп пользователей. Когда процесс пытается получить доступ к этому объекту, идентификатор защиты этого процесса сравнивается со списком управления доступом объекта и определяется, разрешен ли доступ. Когда приложение открывает ссылку на подлежащий защите объект, Windows XP проверяет, предоставляет ли дескриптор защиты объекта доступ пользователю, которому принадлежит приложение. Если проверка проходит, система Windows XP помещает предоставленные в результате права доступа в кэш. Важным аспектом безопасности операционной системы Windows XP является концепция заимствования прав, упрощающая использование безопасности в среде клиент/сервер. Если клиент и сервер общаются между собой с помощью вызова удаленных процедур, сервер может временно принять параметры клиен190 та, чтобы суметь оценить возможность доступа с правами клиента. После обработки обращения сервер возвращается к своему собственному состоянию. Маркер доступа. На рис. 60, а показана общая структура маркера доступа, в который входят такие параметры. Идентификатор защиты. Уникальным образом идентифицирует пользователя в рамках всех машин сети. Идентификатор защиты, как правило, соответствует регистрационному имени пользователя. Идентификаторы защиты групп. Список групп, в которые входит пользователь. Группа — это просто набор идентификаторов пользователей, который идентифицируется при контроле доступа как группа. Каждая группа обладает собственным идентификатором защиты. Доступ к объекту можно определять на основе группового идентификатора защиты, персонального идентификатора защиты или их комбинации. Привилегии. Список системных сервисов, важных для безопасности к которым может обратиться данный пользователь. Примером является создание маркера. Другой пример — назначение привилегий резервирования. Пользователям, обладающим этими привилегиями, разрешено пользоваться средствами создания резервных копий для резервного копирования файлов, которые им нельзя читать. Большинство пользователей не обладают никакими привилегиями. Владелец по умолчанию. Если процесс создает другой объект, в данном поле указывается владелец нового объекта. Чаще всего пользователем нового процесса является пользователь родительского процесса. Однако пользователь может указать, что по умолчанию пользователем любого процесса, порожденного данным процессом, является идентификатор безопасности группы, к которой принадлежит пользователь. Список контроля доступа по умолчанию. Это начальный список средств защиты, которые применяются к объекту, создаваемому данным пользователем. Впоследствии пользователь может изменить список контроля доступа любого объекта, которым он владеет или который принадлежит группе пользователя. 191 Идентификатор защиты (SID) Идентификатор защиты групп Привилегии Пользователь по умолчанию Список контроля доступа по умолчанию а) Маркер доступа Флаги Владелец Заголовок ACL Заголовок ACE Системный список контроля доступа (SACL) Список разграничительного контроля доступа (DACL) б) дескриптор защиты Маска доступа Идентификатор защиты (SID) Заголовок ACE Маска доступа Идентификатор защиты (SID) … в) список контроля доступа Рис.60. Структуры безопасности операционной системы Windows XP Дескрипторы безопасности На рис. 60. показана общая структура дескриптора защиты, который содержит в себе такие параметры. Флаги. Определяют тип и содержимое дескриптора защиты. Флаги указывают на наличие (или отсутствие) системного списка контроля доступа и списка разграничительного доступа, на то, помещены ли эти списки в объект по умолчанию и какая адресация используется в указателях дескриптора: абсолютная или относительная. Относительные дескрипторы требуются для объектов, которые передаются по сети. Примером такого объекта является информация, передаваемая при удаленном вызове процедуры. Владелец. Вообще говоря, владелец может выполнить с дескриптором защиты любое действие. В роли пользователя может выступать индивидуальный или групповой дескриптор защиты. Владелец имеет право изменять список разграничительного контроля доступа. Системный список контроля доступа (System Access Control List — SACL). В этом списке указано, операции какого вида должны генерировать сообщения аудита. Чтобы выполнять операции чтения или записи с SACL какого-либо объекта, приложение должно иметь соответствующие привилегии в своем маркере доступа. Это нужно, чтобы предотвратить чтение не192 санкционированными приложениями системных списков контроля доступа (в результате чего они смогут избежать создания записей аудита), а также запись в них (что может привести к созданию слишком большого количества записей аудита, в которых затеряется запись о незаконной операции). Список разграничительного контроля доступа (Discretionary Access Control List — DACL). Определяет, какие пользователи и группы могут получить доступ к данному объекту и для каких операций. Этот список состоит из записей контроля доступа (Access Control Entry — АСЕ). Когда создается объект, процесс-создатель может в качестве владельца назначить этому объекту в его маркере доступа собственный идентификатор защиты или идентификатор защиты своей группы. Следовательно, любой процесс, которому предоставлено право изменять владельца объекта, может это делать, но с определенными ограничениями. Это ограничение нужно, чтобы пользователь не смог замести следы после того, как он попытается предпринять какие-нибудь несанкционированные действия. Рассмотрим подробнее структуру списков контроля доступа, так как они лежат в основе средства контроля доступа Windows NT (рис. 61). Каждый список состоит из общего заголовка и переменного количества элементов контроля доступа. В каждом элементе указан индивидуальный или групповой идентификатор защиты, а также маска доступа, в которой определены права, которые должны быть предоставлены данному идентификатору защиты. При попытке процесса получить доступ к объекту диспетчер объектов исполняющей системы Windows NT считывает в маркере доступа индивидуальные и групповые идентификаторы защиты, а затем просматривает список разграничительного контроля доступа объекта. Если обнаружено совпадение (т.е. если найден элемент контроля доступа, идентификатор защиты которого совпадает с идентификатором защиты, обнаруженным в маркере доступа), значит, этот процесс обладает правами доступа, установленными маской доступа данного элемента контроля доступа. На рис. 61 показано содержимое маски доступа. В 16 младших значащих разрядах указываются права доступа, 193 применяющиеся к объектам определенного типа. Например, в нулевом разряде объекта-файла задается доступ по чтению, а в нулевом разряде объектасобытия задается доступ для запроса статуса события. Право на удаление Контроль чтения Запись DAC Разрешение изменения владельца Общие права доступа Разрешение синхронизации Стандартные права доступа Специфические права доступа Доступ к системному списку контроля доступа Максимальное разрешение Полный общий доступ Общий доступ для выполнения Общий доступ для записи Общий доступ для чтения Рис. 61. Маска доступа В 16 старших разрядах маски содержатся биты, применимые к объектам всех видов. Синхронизация. Разрешает синхронизацию выполнения с некоторым связанным с данным объектом событием. В частности, объект может быть использован в функции ожидания. Разрешение на изменение владельца. Позволяет программе изменять владельца объекта. Иногда это оказывается полезным, так как владелец объекта всегда может менять защиту своего объекта (владельцу нельзя отказывать в доступе для записи параметров избирательного контроля доступа). Разрешение на изменение списка избирательного контроля доступа. Позволяет приложению изменять DACL, изменяя таким образом защиту объекта. Контроль чтения. Позволяет приложению обращаться к полям в дескрипторе защиты, в которых указан владелец данного объекта и его DACL. 194 Разрешение на удаление. Позволяет приложению удалять объект. Кроме того, в старшей половине маски доступа содержатся общие права доступа четырех видов. С помощью этих битов легко устанавливать специфические права доступа к различным объектам других типов. Предположим, например, что приложению нужно создать объекты нескольких видов таким образом, чтобы пользователи имели права доступа по чтению ко всем объектам, даже если само понятие “чтение” несколько изменяется в зависимости от типа объекта. Если бы приложению нужно было защищать каждый объект каждого вида, не используя биты общего доступа, оно должно было бы для объектов каждого вида создавать свой элемент контроля доступа, а затем аккуратно передавать его в качестве параметра при создании каждого объекта. Удобнее создать один элемент контроля доступа, в котором была бы выражена общая концепция разрешения чтения, а затем просто применять этот элемент контроля доступа к каждому создаваемому объекту. В этом и состоит предназначение битов общего доступа. Перечислим эти биты: Generic_all — позволяет осуществлять все виды доступа; Generic_execute — позволяет запускать исполняемые файлы; Generic_write — позволяет осуществлять доступ для записи; Generic_read — позволяет осуществлять доступ для чтения. Значения битов общего доступа также влияют на стандартные типы доступа. Например, для файлового объекта бит Generic_read отображается в стандартные биты Read control и Synchronize, а также в специфические биты File Read Data, File_Read_Attributes и File_Read_EA. Два оставшихся бита маски доступа имеют специальное значение. Бит Access System Security позволяет изменять контроль аудита и аварийного сигнала данного объекта. Однако недостаточно установить этот бит в элементе контроля доступа для идентификатора защиты. Кроме того, в маркере доступа процесса, обладающего этим идентификатором защиты, должна быть разрешена соответствующая привилегия. 195 Бит Maximum_Allowed — это не совсем бит доступа. Он изменяет алгоритм, по которому Windows NT сканирует список выборочного контроля доступа данного идентификатора безопасности. Обычно Windows NT просматривает список выборочного контроля доступа, пока не дойдет именно до того элемента контроля доступа, который предоставляет (бит установлен) или запрещает (бит не установлен) запрашиваемый процессом доступ, или пока она не дойдет до конца списка (в этом случае доступ запрещен). Бит Maximum_Allowed позволяет владельцу объекта определять набор прав доступа, представляющий собой максимум того, что может быть позволено данному пользователю. Предположим, что у приложения нет информации обо всех выполняемых над объектом операциях, разрешение на которые ему нужно будет просить на протяжении сеанса работы. При выполнении запроса возможны ситуации: 1. Попытка открыть объект для всех возможных видов доступа. Недостаток этого подхода состоит в том, что в доступе может быть отказано, даже если приложение обладает всеми правами доступа, которые нужны для этого сеанса. 2. Открытие объекта только для определенных видов доступа. При этом в объекте для каждого типа запроса открывается новый дескриптор. В большинстве случаев этот метод является предпочтительным, потому что при его использовании не бывает отказов в доступе без необходимости и не предоставляется больше доступа, чем нужно. Однако он требует дополнительных накладных расходов. 3. Попытка открыть объект для доступа, осуществляемого в такой мере, в какой это позволяет идентификатор защиты. Преимущество такого метода в том, что пользователь не получит "искусственного" отказа в доступе. Однако при этом приложение может иметь больший доступ, чем требуется. Эта ситуация может скрывать имеющиеся в приложении ошибки. Важная особенность системы безопасности операционной системы W2K состоит в том, что приложение может использовать структуру безопасности этой операционной системы для объектов, заданных пользователем и при реализации внешних файловых систем. 196 6. СЕТЕВЫЕ ВОЗМОЖНОСТИ ОПЕРАЦИОННЫХ СИСТЕМ 6.1. Аппратаное обеспечение локальных сетей Cети подразделябт на локальные и глобальные. Локальные сети объединяют некоторое количество компьютеров в пределах одного или нескольких зданий. Такие сети иногда называют интранет. Глобальные сети подразумевают соединение различных локальных сетей в одну общую сеть, называемую Интернет. Компьютерные сети позволяют объединить информационные ресурсы, находящиеся на разных компьютерах, независимо от разделяющего их расстояния. В зависимости от степени удаленности компьютеров, составляющих сеть, то есть их физического расположения, различают: локальные, корпоративные и глобальные сети [1]. Локальные сети предназначены для обмена информацией между компьютерами, расположенными на небольшом расстоянии друг от друга, в пределах одного здания. Локальная сеть — это объединение компьютеров, расположенных на небольшом расстоянии друг от друга. Локальные сети позволяют: - совместно использовать аппаратные ресурсы (периферийные устройства, накопители); - совместно использовать программные ресурсы (сетевые версии прикладного программного обеспечения); - создавать и совместно использовать информационные ресурсы для работы пользователей над общими задачами; - централизовать усилия по информационной безопасности. По способу связи компьютеров в локальной сети различают: одноранговые сети и сети с выделенным сервером. В одноранговых сетях используется технология «равный к равному». Любой компьютер может использовать ресурсы другого подключенного к нему компьютера. Иначе говоря, любой компьютер может выступать и как сервер, и 197 как клиент. В одноранговых сетях работа приложений на компьютере ухудшается, когда его ресурсами пользуются другие компьютеры сети. Сети с выделенным сервером в этом смысле гораздо стабильнее и производительнее. В качестве каналов связи в локальных сетях используется электрический кабель [24]. Сопряжение компьютеров с каналами связи обеспечивает специальное коммуникационное оборудование. Существует мнение, что если ты хоть раз поработал в составе сети, то работа без подключения к сети становиться болезненно тяжело. Да действительно, так, например наши компьютеры объединены в локальную сеть, подключенную с Интернет. Стоит произойти какой-нибудь неприятности с Интернетом, как работать становиться значительно тяжелее. Казалось бы, почему? Ведь по большому счету в сети мы видим просто чужие диски, иногда пользуемся вычислительными ресурсами удаленного процессора. Почему бы ни воспользоваться собственными дисками и мощностью собственного процессора. Все дело в информации. Ведь сегодня сеть это огромная база знаний, созданная усилиями каждого имеющего желание поделиться с другими своими знаниями и умениями. С одной стороны, это превращает сеть в некую «помойку» где из огромного объема информации приходится извлекать полезную информацию, с другой стороны нет ни одного другого электронного или любого off-line источника, способного дать ответ на абсолютно любой вопрос. Локальные вычислительные сети (ЛВС) позволяют объединять компьютеры, расположенные в ограниченном пространстве. Для локальных сетей прокладывается специализированная кабельная система, и положение возможных точек подключения абонентов ограничено этой кабельной системой. Локальные сети - LAN (Local-Area Network) - являются элементами более крупномасштабных образований - CAN (Campus-Area Network - кампусная сеть, объединяющая локальные сети близко расположенных зданий), MAN (Metropolitan-Area Network - сеть городского масштаба), WAN (WideArea Network - широкомасштабная сеть), GAN (Global-Area Network - глобальная сеть). Наконец, 'сетью сетей' называют глобальную сеть Интернет. 198 Кабельные системы локальных сетей Традиционной и наиболее широко распространенной физической средой передачи информации в локальных сетях являются кабели. Альтернативой кабелю в локальных сетях является связь с помощью инфракрасного излучения и радиосвязь, но эти виды связи по ряду причин пока что используются весьма ограниченно (за исключением WiFi). Все многообразие кабелей, применяемых для передачи информации, в первую очередь разделяется на электрические, чаще всего медные (Copper cable), и оптоволоконные (Fiberoptic cable), кратко именуемые Fiber. Слово Fiber (волокно) иногда заменяют транслитерацией "фибра", однако это не очень удачно - не так давно из фибры (волокнистого материала) делали чемоданы и другие изделия. Кабельные системы первых сетей, получивших широкое распространение и поныне активно развивающихся - Ethernet и Token Ring, существенно различались как по типу кабеля, так и по топологии. В классической сети Ethernet, имеющей шинную логическую и физическую топологию, использовался коаксиальный кабель с импедансом 50 Ом. В сети Token Ring логическое кольцо было реализовано на физической звездообразной топологии и кабеле типа экранированная витая пара (STP). Некогда популярные сети ARCnet использовали коаксиальный кабель с иным значением импеданса, нежели Ethernet, и более гибкую физическую топологию (комбинацию шины и звезды). Пространственные и топологические ограничения этих сетей существенно различались, а кабельное хозяйство было жестко привязано к выбранной сетевой технологии, так что смена технологии требовала дорогостоящей "кабельной революции". Со временем эти сетевые архитектуры развивались таким образом, что различия их кабельных систем стали стираться. В технологии Ethernet логическую шину стали реализовать на физической звезде с хабом в центре, а коаксиальный кабель заменили на неэкранированную витую пару (UTP). Звездообразная физическая топология современных сетевых технологий (включая FDDI и ATM) предполагает возможность максимального удаления узла от центрального устройства (длину луча) до 100 м 199 при использовании медного кабеля. Применение оптической связи позволяет разносить узлы (и центральные устройства) на расстояния, измеряемые километрами. Таким образом, топология современных локальных сетей стала практически независимой от применяемых технологий, что и обусловило появление концепции структурированных кабельных систем СКС (SCS Structured Cabling System). На этой концепции основан современный подход к созданию коммуникационной инфраструктуры зданий, насыщенных компьютерной техникой. Коммуникации должны выполняться по принципу открытой кабельной системы, что предполагает возможность свободного выбора сетевого приложения (так в контексте СКС называются сетевые технологии). При необходимости смена приложения (технологии) должна обходиться без дорогостоящей "кабельной революции". В структурированную кабельную систему могут входить и кабели, используемые для пожарной и охранной сигнализации, телевизионного вещания и прочие. К структурированным кабельным системам относятся три стандарта, действующих в настоящее время: EIA/TIA-568A Commercial Building Telecommunications Wiring Standard (американский) ISO/IEC IS 11801 Information Technology - Generic cabling for customer premises cabling (международный); CENELEC EN50173 Performance Requirements of Generic Cabling Schemes (европейский) Вышеперечисленные стандарты описывают практически одну и ту же область, но несколько различаются в терминологии и определениях норм для родственных параметров. Здесь они приведены в хронологическом порядке принятия, причем каждый последующий базировался на предыдущем. Основная цель данных спецификаций: Определить общую кабельную систему для передачи голоса и данных, поддерживающую подключение аппаратуры различных производителей. 200 Определить направления в разработке телекоммуникационного оборудования и кабельной продукции. Обеспечить планирование и установку СКС, удовлетворяющей различным требованиям персонала, населяющего здания. Установить критерии пропускной способности и технические характеристики различных типов кабелей и соединительной аппаратуры. Спецификации данных стандартов ориентированы на офисное применение (не промышленные здания). Выполнение требований к СКС должны обеспечивать срок жизни (с учетом морального старения) системы более 10 лет [24]. В стандартах приводятся спецификации по следующим областям: Среда передачи данных Топология Допустимые расстояния (длина кабелей) Интерфейс подключения пользователей Кабели и соединительная аппаратура Пропускная способность (Performance) Практика установки Отсутствие подобных стандартов или официального признание международных в нашей стране осложняет официальную техническую сертификацию кабельных систем, но хочется верить, что в скором времени эта ситуация изменится в лучшую сторону. По критерию пропускной способности для проводки на медном кабеле в стандартах фигурируют понятия категорий (Category) и классов (Class) хуже всего категория 1 и класс A. В стандарте 568-A и для проводки в целом, и для компонент (кабелей и соединителей) имеется 5 категорий, из которых нам интересны категория 3, эффективно пропускающая сигнал в полосе частот до 10 МГц, и категория 5 - до 100 МГц. В стандартах 11801 и 50173 для проводки в целом определены классы, полосе частот 10 МГц соответствует класс C, а 100 МГц - класс D. Недавно появились компоненты для медного кабеля категории 6 (200 МГц) и 7 (600 МГц), для которых предполагается 201 определение классов E и F соответственно. Здесь отметим, что значение скорости передачи данных, измеряемого в Мбит/с, не совпадает с требуемой полосой частот, измеряемой в МГц. Например, технология ATM со скоростью 155 Мбит/с успешно работает на кабеле категории 5 (100 МГц), а 100VG AnyLan при скорости 100 Мбит/с - на кабеле категории 3 (10 МГц). Медные кабели и коннекторы. Определим некоторые понятия, имеющие отношение к кабелям и проводам на основе витой пары. Провод витая пара представляет собой минимальный элемент - два скрученных изолированных проводника. Такой провод применяют для кроссировки (Cross-Wires) внутри коммутационных шкафов или стоек, но никак не для прокладки соединений между помещениями. Кабель отличается от провода наличием внешнего изоляционного чулка (Jacket). Этот чулок главным образом защищает провода (элементы кабеля) от механических воздействий и влаги. Шнур (коммутационный) представляет собой отрезок кабеля с разъемами на концах. Типичный пример - патч-корд (patch cord) - отрезок многожильного 4-парного кабеля длиной 1-10 м с вилками RJ-45 на концах. Калибр определяет сечение проводников. Кабели и провода маркируются в соответствии со стандартом AWG (American Wire Gauge - американскиие калибры проводов). В основном применяются проводники 26 AWG (сечение 0.13 мм2), 24 AWG (0.2-0.28 мм2) и 22 AWG (0.33-0.44 мм2). Однако калибр проводника не дает информации о толщине провода в изоляции, что весьма существенно при заделке концов кабеля в модульные вилки. Категория (Category) витой пары определяет частотный диапазон, в котором ее применение эффективно (ACR имеет положительное значение). В настоящее время действуют стандартные определения 5 категорий кабеля (Cat 1... Cat 5), однако уже выпускаются кабели категорий 6 и 7. Упоминание PowerSum означает более жесткий подход к определению перекрестных наводок. 202 Витая пара может быть как экранированной (Shielded), так и неэкранированной (Unshielded). Неэкранированная витая пара (НВП) больше известная по аббревиатуре UTP (Unshielded Twisted Pair). Экранированная витая пара (ЭВП), она же STP (Shielded Twisted Pair), имеет множество разновидностей. STP с обозначением вида "Type xx" - "классическая" витая пара, введенная IBM для сетей TokenRing. Каждая пара этого кабеля заключена в отдельный экран из фольги, обе пары заключены в общий плетеный проволочный экран, снаружи все покрыто изоляционным чулком, импеданс - 150 Ом. Распространенные кабели STP Type1 - одножильный калибра 22 AWG, STP Type 6 - многожильный 26 AWG и STP Type 9 - одножильный 26 AWG. Кабель Type 6A, используемый для коммутационных шнуров, не имеет индивидуального экранирования пар. STP категории 5 - общее название для кабеля с импедансом 100 Ом, экран может иметь различное исполнение. ScTP (Screened Twisted Pair) - кабель, в котором каждая пара заключена в отдельный экран. FTP (Foilled Twisted Pair) - кабель, в котором витые пары заключены в общий экран из фольги. PiMF (Pair in Metal Foil) - кабель, в котором каждая пара завернута в полоску металлической фольги, а все пары - в общем экранирующем чулке. По сравнению с "классическим" STP этот кабель тоньше, мягче и дешевле (хотя про кабель PiMF на 600 МГц такого уже не скажешь). Экранированный кабель заметно дороже неэкранированного, но при корректном заземлении экрана обеспечивает лучшую электромагнитную совместимость кабельной системы с остальными источниками и приемниками помех. Однако некорректное заземление экрана может приводить и к обратному результату. Кроме того, наличие экрана, который требуется заземлять с обоих концов кабеля, может вызвать проблему обеспечения равенства "земляного" потенциала в пространственно разнесенных точках. 203 Наибольшее распространение получили кабели с числом пар 2 и 4 калибра 24 AWG. Из многопарных популярны 25-парные, а также сборки 6 штук из 4-парных. Кабели с большим числом пар (50, 100) применяются только в телефонии, поскольку изготовление многопарных кабелей высоких категорий - задача очень сложная. Кабели чаще всего бывают круглыми - в них элементы собираются в пучок. Существуют и плоские кабели, используемые в телефонии для подключения оконечного оборудования, но в них пары проводов обычно не скручены, так что высокие рабочие частоты для них не реализуемы. Существуют и специальные плоские кабели для прокладки коммуникаций под ковровыми покрытиями (Undercarpet Cable), среди которых есть и кабели категорий 3 и 5. Проводники могут быть жесткими одножильными (Solid) или гибкими многожильными (Stranded или Flex). Кабель с одножильными проводами обычно обладает лучшими и более стабильными характеристиками. Его применяют, в основном, для стационарной проводки, которая представляет наибольшую часть в кабельных связях. Многожильный гибкий кабель применяют для соединения портов оборудования (абонентского и телекоммуникационного) между собой и со стационарной проводкой при небольших расстояниях. Кабели (и провода) соединяются между собой с помощью коннекторов. Коннектор обеспечивает механическую фиксацию и электрический контакт. Как и кабели, они классифицируются по категориям, определяющим диапазон рабочих частот. Для витой пары широко применяют модульные разъемы (Modular Jack), широко известные под названием RJ-45: розетки (Outlet, Jack) и вилки (Plug). Розетки категории 5 (на них должно быть соответствующее обозначение) отличаются от розеток 3-й категории способом присоединения проводов: в категории 5 допустим только зажим провода ножевым разъемом (типа S110), в категории 3 применяют и зажим провода под винт. Кроме того, на 204 плате розетки категории 5 имеются согласующие реактивные элементы с нормированными параметрами, выполненные печатным способом. Категорию модульных вилок на взгляд определить затруднительно. Вилки для одножильного и многожильного кабеля различаются формой игольчатых контактов. Для экранированной проводки розетки и вилки должны иметь экраны, сплошные или же только обеспечивающие соединение экранов кабелей. Использование контактов модульных соединителей, а также цветовая маркировка проводов стандартизованы. Каждая пара представляется двумя проводами, обозначаемыми Tip и Ring (условно - прямой и обратный повода), для которых определен цвет изоляции и номер контакта разъема. Существует несколько стандартов на модульные соединители, различающихся шириной, количеством используемых контактов и раскладкой пар проводов (см. рис. 62 и табл. 13). Рис. 62 Раскладка проводов (вид на розетку) Таблица 13 Раскладка T568A № 1 2 3 4 5 6 7 Цвет: основной / полоски бело-зеленый зеленый бело-оранжевый синий бело-синий оранжевый бело-коричневый Раскладка T568B Пара 3 (Tip) 3 (Ring) 2 (Tip) 1 (Ring) 1 (Tip) 2 (Ring) 4 (Tip) № 1 2 3 4 5 6 7 Цвет: основной / полоски бело-оранжевый оранжевый бело-зеленый синий бело-синий зеленый бело-коричневый Пара 2 (Tip) 2 (Ring) 3 (Tip) 1 (Ring) 1 (Tip) 3 (Ring) 4 (Tip) При монтаже структурированной кабельной системы для передачи данных следует использовать раскладку EIA/TIA-568A (сокращенно T568A) или EIA/TIA-568B (сокращенно T568B). Раскладка T568B известна и под 205 именем AT&T258A или WECO. Обе эти раскладки совместимы со всеми приложениями (сетевыми технологиями), приведенными в табл. 14. Основными правилами построения горизонтальной системы СКС являются: Каждая розетка рабочего места должна иметь 8-контактное модульное гнездо (RJ-45 Jack). Горизонтальные кабели должны соединять контакты розетки рабочего места с контактами розетки патч-панели "один-в один", соблюдая парность проводов и полярность пар. Длина кабеля не более 90 м, кабель - одножильный (solid).. Таблица 14 Использование пар проводов в модульных соединителях Коммуникационное приложение Телефон (аналоговый) ISDN 10BaseT 100BaseTX 1000BaseCX 100BaseT4 100BaseVG TokenRing ATM TP PMD (FDDI) Пары на контактах (нумерация 8-позиционного разъема) 1-2 + + + + + + + + 3-6 + + + + + + + + + 4-5 + + + + + + + + 7-8 + + + + + + Для независимости от сетевых приложений (технологий) к каждой розетке должны подходить свои 4 пары категории 5 (или выше). Раскладка проводов, включая цветовую маркировку, должна соответствовать T568A или T568B и быть единой по всей кабельной сети. Принятый тип должен быть отражен в документации на СКС. При разделке концов кабеля не допускается расплетение витой пары больше чем на сантиметр (точнее, 0.5 дюйма), необходимый для раскладки проводов. Шнуры подключения абонентов и активного оборудования (патчкорды) должны иметь 8-контактные вилки (RJ-45 Plug), контакты которых 206 соединяются "один-в один", соблюдая парность проводов и полярность пар. Кабель - многожильный (stranded). "Перекрестные" шнуры, требуемые для соединения обычных портов пару концентраторов Ethernet, должны иметь на одном конце раскладку T568A, на другом - T568B. По виду (цвету шнуров или колпачков) они должны быть легко отличимы от обычных "прямых" шнуров. При необходимости разделяемое использование 4-парного кабеля для Ethernet 10BaseT и 100BaseTX организуется Y-образными патч-кордами, переходниками или сменными вставками. Для разделяемого использования 100BaseTX при большой длине кабеля может потребоваться кабель с улучшенными свойствами (PowerSum). 6.2. Сети Windows Операционная система Windows 3.1 имела очень ограниченный инструментарий для организации даже самой простой сети и требовала использование программного обеспечения сторонних разработчиков (рис. 63). Возможно для операционной системы, выпущенной 10-12 лет назад, это было нормально. Специально для рабочих групп Microsoft выпустила Windows 3.11 for Workgroups, которая, имела только протокол совместного использования файлов. 207 Рис. 63. Интерфейс Windows 3.1 Позднее в августе 1995 года была выпущена операционная система Windows 95. Несмотря на недостатки, эта операционная система имела более продвинутые сетевые средства, однако по современным меркам все было очень сложно и недостаточно для требований современного пользователя. Через год была выпущена операционная система Windows NT 4.0, с дополнительными патчами и сервис паками. Windows NT 4.0 использовала интерфейс и принципы Windows 95. Главным отличием являлись наличие расширенных особенностей защиты, лучшие средства многозадачности, администрирование пользователей и больший упор на сетевую организацию для бизнес пользователей. Однако реализация сетевых особенностей оказалась еще сложнее, и недоступной для неподготовленного пользователя [25]. Через 2-3 года после Windows 95 были выпущены операционные системы Windows 98 и Millennium. Windows 98, за исключением NT, была первой настоящей 32-bit версией Windows с полностью 32-bit кодом. В то время как Windows 98 имела некоторые усовершенствование сетевого инструментария и возможностей, они все еще были похожи на Windows 95 [26]. Дополнительно Microsoft выпустила “Special Edition” Windows 98, известную как Windows 98 SE, в которой исправлены ошибки в сетевых протоколах. В феврале 2000 Microsoft выпустила Windows 2000. Эта система основана на ядре Windows NT и поэтому ее иногда называют Windows NT 5.0. Windows 2000 208 имеет очень продвинутые сетевые возможности, однако их реализация пока не проста, и напоминает Windows NT. Вопросы безопасности сетей Windows рассмотреы [27-32] Обе версии Windows XP (Professional и Home) являются эффективным сочетанием сетевых возможностей NT, 2000 и простого и понятного пользовательского интерфейса [25]. Физическая установка сети. Для упрощения, предположим, что мы используем в сети три компьютера – два “клиентских компьютера” и один «сервера». Для организации, даже такой маленькой сети нам понадобятся сетевые карты, которые устанавливаются в каждый компьютер, свич или хаб, а так же специальный сетевой кабель, называемый витая пара. Выбор сетевой карты. В прошлом сетевая карта представляла собой отдельную ISA (для тех, кто не знает это такой старый стандарт слота расширения) или PCI плату. Причем их цена превышала 100$, что несколько ограничивало развития сетей в небольших организациях. Сегодня сетевая карта стала настолько доступной, что частенько ее интегрируют на системную плату. Для управления всеми транзакциями (передача блоков информации) в сети используется устройство называемой хаб или свич. Во время передачи пакета данных хаб отправляет их сразу на все компьютеры, что значительно уменьшает пропускную способность канала. Свич, имеет встроенную память, в которой храниться информация о том, к какому порту подключен какой компьютер. Поэтому во время передачи пакета, он отправляется на определенный порт. Кроме того, свич позволяет использовать в сети контроллеры с разной скоростью передачи, при этом общая пропускная способность не будет опускаться до уровня контроллера с минимальной скоростью. По соотношению цена/производительность свич более эффективен. На сегодняшний день впускаются свичи с 5, 8, 16, 24 или 32 портами. Цена устройства напрямую зависит от количества портов. 802.11a и 802.11b. Это стандарты беспроводных сетей позволящий сделать размещение компьютеров более гибким, а пользователям использу209 ющим карманные компьютеры или ноутбуки, получить доступ к сети в любой точке офиса и даже за пределами. На сегодняшний день существует два стандарта 802.11a и 802.11b. Для реализации такого подключения необходимо использовать специальные хабы и сетевые карточки. Рекомендации по конфигурированию сервера. Если Ваш сервер не планируется использовать для игр, нет необходимости использовать самый последний процессор Pentium 4 или Athlon XP с большим объемом оперативной памяти и емким жестким диском, а так же с самой последней графической картой GeForce 4. Главное, чего необходимо добиться, это стабильной круглосуточной работой. Так. Как сервер будет использовать Windows XP, он должен быть оснащен минимум 128MB RAM. В идеале, Вы можете использовать процессор Pentium 2, III или Athlon 500MHz, при этом система будет достаточно хорошо работать в нашей среде. Конфигурация сети в Windows XP. Установить сетевые параметры в Windows XP Вы можете несколькими способами. Во-первых, вручную. Этот метода предпочтительнее, т.к. позволяет контролировать все настройки. Вовторых, для тех, кто ничего не понимает в сетевых терминах Microsoft включила мастер установки сети (Network Setup Wizard). Для запуска мастера, необходимо войти в “My Network Places” и нажать на “set up a home or small office network”. Нажмите Next, на втором экране будут описаны некоторые рекомендации по правильной установке. Фактически здесь Вы найдете полное руководство к действию. Нажимаем Next. Теперь для всех клиентских компьютеров Вы должны выбрать вторую опцию (The computer connects to the Internet through another computer on my network or through a residential gateway) и нажмите Next. На следующем экране Вы можете ввести или изменить имя компьютера. Теперь переходим к следующему окну, где мы сможем изменить название рабочей группе. Следующий экран резюмирует сделанные изменения и применяет их. На следующем экране Вам будет предложено создать диск установки сети. Этот диск можно не создавать и нажать «Wizard and then Finish». 210 Мастер сетевой идентификации. Теперь необходимо установить имя Вашего компьютера в рабочей группе, к которой он принадлежит. Для этого нажмите Start -> Settings -> Control Panel -> System -> и выберите закладку Computer Name. Сначала нажмите “Network ID”, что позволит активизировать мастер сетевой идентификации (Network Identification Wizard). На первом экране просто нажмите Next. На следующем экране нужно выбрать первую опцию (This computer is part of a business network, and I use it to connect to other computers at work), на следующем экране выберете вторую опцию (My company uses a network without a domain) (рис. 64). Здесь Вы должны установить название рабочей группы. Эти действия Вы должны повторить на всех компьютерах Вашей сети. Обращаем Ваше внимание, что некоторые broadband провайдеры используют свою собственную рабочую группу. В этом случае они должны Вас проинструктировать об использовании имени рабочей группы. Рис. 64. Окно задания рабочей группы IP адресация. Прежде всего вы должны идентифицировать каждый компьютер в сети. Для этого служит так называемая IP (Internet Protocol) адресация. IP адрес – это уникальный номер Вашего компьютера в Вашей сети. IP адрес может быть “статическим” или “динамическим”. В своей внутренней сети Вы можете использовать IP адреса класса C, т.е. в диапазоне 192.168.0.1 до 192.168.0.254. Другими словами в одной рабочей группе мо211 жет работать до 254 компьютеров. Обычно серверу назначают адрес 192.168.0.1. Когда Вы активизируете совместный доступ к сети (Internet Connection Sharing) по умолчанию Вашему серверу будет автоматически назначен этот адрес Конфигурация сервера. Примечание: Под XP и Windows NT для установки сетевых параметров Вы должны войти с правами администратора. OK – установив на все компьютеры сетевые карты, Вам необходимо назначить каждому компьютеру IP адрес. Для этого нажмите Start -> Settings -> Network Connections. Теперь кликните правой кнопкой мышки на “Local Area Connection” и выберите меню Properties. Затем укажите на протокол TCP/IP и нажмите Properties (рис.65). Рис.65 Задание IP адреса На рис 65 показана настройка IP адреса для сервера. Пока этого достаточно. Ниже мы покажем, как конфигурировать клиентские компьютеры. Для того, что бы Вы лучше понять, как работает сервер в сети на рис. 66 приведена примерную схему подключения компьютеров рабочей группы к Интернет, через один компьютер. 212 Рис. 66 Схема подключения компьютеров рабочей группы к Интернет Конфигурирование клиентских машин. На рис 67. показана установка IP адреса 192.168.0.5. для клиентского компьютера Маска подсети устанавливается автоматически. IP адрес должен быть уникальным, и не может повторяться внутри одной сети. В случае повторного использования IP адреса, Windows сообщит о возникновении проблемы с повторяющимся IP адресом. Рис 67. Установка IP адреса 192.168.0.5. для клиентского компьютера 6.3. Локальная сеть на основе QNET Сетевая подсистема QNX ОС QNX Neutrino –система изначально сетевая, однако сетевые механизмы ,как и все остальное, реализованы в виде дополнительных админи213 страторов ресурсов. Хотя некоторая поддержка сети есть в микроядре – способ адресации QNX-сообщений обеспечивает возможность передачи их по сети. Структура сетевой подсистемы QNX В центре реализации сетевой подсистемы QNX Neutrino находится Администратор сетевого ввода-вывода io-net. Процесс io-net при старте регистрирует префикс каталога / dev/ io-net и загружает необходимые администраторы сетевых протоколов и аппаратные драйверы [15]. Протоколы, драйверы и другие необходимые компоненты загружаются либо в соответствии с аргументами командной строки,заданными при запуске io-net, либо в любое время командой монтирования mount. Загрузка разделяемых библиотек: Администратор стека TCP/IP- npm-tcpip.so Администратор протоко Qnet- npm-qnet.so Драйвер сетевых адаптеров AMD PCNET-devn-pcnet.so Следующая команда запускает поддрежку сети с драйвером сетевого адаптера NE2000 и с поддержкой протоколов TCP/IP и Qnet: io-net -dne2000 –ptcpip –pqnet Драйверы сетевого адаптера. Администратор сетевого адаптера ввода/вывода io-net сообщает драйверу, когда он может забрать данные из какого-то буфера для передачи в физическую среду, и принимает от драйвера уведомление о поступлении данных из физической среды в какой-то буфер. Администратор сетевого протокола. Администратор сетевого ввода/вывода io-net сообщает администратор протокола ,когда можно забрать данные из какого-то буфера для передачи в приложение, и принимает от администратора протокола уведомление о готовности данных в каком-то буфере для отправки во внешний мир. Фильтр. Фильтр может быть восходящего и нисходящего типа. Фильтр сообщает свой тип и между какими модулями он хочет хозяйничать. Администратор io-net сообщает восходящему фильтру, когда можно за214 брать данные их какого-то буфера драйвера, и принимает от восходящего фильтра уведомление о готовности данных для считывания администратором протокола. Нисходящий фильтр работает с точностью донаоборот. Пример входящего фильтра-firewall, нисходящего фильтра-NAT. Конвертор – модуль для инкапсуляции/деинкапсуляции данных при передаче их между уровнями. Отключить поддержку какого-либо протокола, выгрузив соответствующую DLL, в QNX Neutrino 6.3.0 нельзя, но в QNX Neutrino 6.3.0 можно всетаки выгружать драйвер Ethernet: umount /dev/io-net/en0 Для получения диагностической и статистической информации о работе сетевой карты предназначена утилита nicinfo, по умолчании. Эта утилита обращается к устройству /dev/io-net/en0.Для адаптеров nicinfo выводит наименование модели контроллера . QNX-сеть- Qnet. Задача протокола Qnet – превратить сеть из машин под управлением QNX Neutrino в некое подобие единого распределенного компьютера. В составе дистрибутива поставляется две версии администраторов Qnet: Npm-qnet-compact.so- полнофункциональная версия Qnet, полно- стью совместимая с Qnet, использовавшаяся в версии QNX Neutrino 6.2.х; Npm-qnet-14_lite.so-‘облегченная’ версия Qnet, появившаяся в версии QNX Neutrino 6.3.0 Сетевая прозрачность QNX достигается тем, что администраторы Qnet,работающие на разных ЭВМ, организуют как бы мост между своими микроядрами. Микроядро, когда видит, что у адресата сообщения дескриптор узла не равен нулю, отдает это сообщение Администратору Qnet. Администратор Qnet засылает это сообщение администратору Qnet указанного узла. Администратору Qnet узла на стороне получателя отправляет сообщение собственно получателю (рис. 68). 215 Основная сеть Резервная сеть Администратор процессов Администратор сети Могут использовать разные среды (в том числе switched fabric) и транспорты (в том числе TCP/IP) Администратор процессов Администратор файловой системы Администратор высокой готовности TCP/IP Стек протоколов Драйвер устройства Администратор сети Вычислительные узлы могут быть реализованы на разных типах процессоров! Драйвер устройства Рис.68 Резервируемая Сеть QNet В QNX Neutrino узел имеет фиксированное имя, а дескриптор ND назначается ему способом, напоминающим назначение файлового дескриптора при открытии файла. ND=0 всегда обозначает локальный узел (ядро не будет передавать администратору сети сообщение, содержащее ND=0, а сразу направит это сообщение потоку-адресату ). Существует два способа определения ND при известном имени узлаадресата сообщения: Первый способ заключается в использовании функции netmgr_strtond (), определяющей ND по имени узла. Недостаток этого способа очевиден – он платформозависимый. Поэтому чаще применяют второй способ. Второй способ основан на использовании пространства путевых имен Администратора процессов. При загрузке и инициализации Администратор протокола Qnet npm-qnet.so регистрирует не только символьное устройство /dev/io-net/qnet_en ,но и префикс каталога /net, в котором размещаются папки, имена которых совпадают с именами узлов сети. Эти папкиузлы соответствуют корневым каталогам одноименных узлов. Таким образом, Qnet обеспечивает прозрачный доступ к файлам всех узлов сети с помощью обычных локальных средств - файлового менеджера, команды ls и т.п. Другими словами, просто открываем файл с путевым именем , начинаю- 216 щимся с /net , получаем файловый дескриптор и начинаем записывать или считывать информацию как ни в чем не бывало. В TCP/IP используется протокол ARP, а что использует Qnet? Qnet по умолчанию использует протокол NDP, очень похожий на ARP. Можно по аналогии с протоколом FLEET операционной системы QNX4 жестко задать пару имя_узла-МАС –адрес. Только файл будет называться не /etc/config/netmap, а /etc/qnet_hosts , и синтаксис записей в этом файле таков: имя_узла. имя _домена МАС-адрес1[,МАС-дрес2] как видно из синтаксиса, для одного узла можно задать два МАС – адреса. Для того чтобы использовать эту схему, нужно задать Администратору протокола Qnet опцию resolve=file. Поскольку в QNX Neutrino почти все построено на механизме сообщений, протокол Qnet, делающий механизм сообщений сетевым, дает нам достаточно много возможностей. Например, Qnet позволяет запускать процессы на любом узле сети. Рассмотрим простую, но полезную утилиту on. Эта утилита является своего рода расширением командного интерпретатора по запуску приложений. Синтаксис утилиты on : оn опции команда При этом команда будет выполнена в соответствии с предписаниями, заданными посредством опций. Основные опции этой утилиты: -n узел – указывает имя узла, на котором должна быть выполнена команда. При этом в качестве файловой системы будет использована файловая система узла, с которого запущен процесс; -f узел – аналогична предыдущей опции, но в качестве файловой системы будет использована файловая система узла, на котором запущен процесс; -t tty – указывает, с каким терминалом целевой ЭВМ должен быть ассоциирован запускаемый процесс; 217 -d- предписывает отсоединиться от родительского процесса. Если задана эта опция, то утилита on завершится, а запущенный процесс будет продолжать выполняться; -p приоритет [дисциплина]- можно задать значение приоритета и , если надо, дисциплину диспетчеризации. Например, команда, выполненная на узле host4: оn –d –n host5 –p 30f mytest запустит на процессоре узла с именем host5 программу mytest, находящуюся на узле host4. приоритет запущенного процесса будет иметь значение 30 с дисциплиной диспетчеризации FIFO. После запуска программы mytest, утилита on сразу завершит свою работу, и интерпретатор выдаст приглашение для ввода очередной команды. Вывод утилиты mytest будет напечатан в текущей консоли узла host4. Можно выполнить команду: on -n host5 –f host3 –t con2 mytest Она запустит на процессоре узла host5 программу mytest , находящуюся на узле host3, вывод направит на консоль /dev/con2 узла host3. Если нужно направить поток вывода утилиты mytest на другой узел, то имя консоли нужно указать целиком. То есть команда : on –n host5 –f host3 –t/net/node2/dev/con1 mytest выполненная с консоли узла node4, запустит на процессоре узла host5 программу mytest, находящуюся на узле host3, а вывод направит на консоль /dev/con2 узла host2. Платформенные файлы целесообразно хранить в «платформозависимых» каталогах например, файл PowerPCBigEndian помещают в каталог /ppcbe. Это позволяет брать на удаленном узле файлы, предназначенные для выполнения на аппаратуре конкретного узла сети. Информацию о доступных узлах сети Qnet можно посмотреть с помощью команды sin net. В результате получим список доступных узлов Qnet – сети с информацией о каждом из них. 218 Для получения диагностической и статистической информации о работе Qnet можно в любом текстовом редакторе посмотреть файл статистики /proc/qnetstats. 6.4. Глобальные сети Большой интерес представляет глобальная информационная сеть Интернет. Интернет объединяет множество различных компьютерных сетей (локальных, корпоративных, глобальных) и отдельных компьютеров, которые обмениваются между собой информацией по каналам общественных телекоммуникаций. Интерне́т (англ. Internet, сокр. от Interconnected Networks — объединённые сети) — глобальная телекоммуникационная сеть информационных и вычислительных ресурсов [1]. Служит физической основой для Всемирной паутины. Часто упоминается как Всемирная сеть, Глобальная сеть, либо просто Сеть. В настоящее время, когда слово Интернет употребляется в обиходе, чаще всего имеется в виду Всемирная паутина и доступная в ней информация, а не сама физическая сеть. К середине 2008 года число пользователей, регулярно использующих Интернет, составило около 1,5 млрд человек (около четверти населения Земли). Всемирная компьютерная сеть Интернет вместе с персональными компьютерами образует технологическую основу для развития международной концепции «Всемирного информационного общества». В России почти все средние школы с 2008 года оснащены компьютерами с доступом к сети Интернет и базовыми пакетами программ для обучения информатике, работе с персональными компьютерами и сетью Интернет. Интернет состоит из многих тысяч корпоративных, научных, правительственных и домашних компьютерных сетей. Объединение сетей разной 219 архитектуры и топологии стало возможно благодаря протоколу IP (англ. Internet Protocol) и принципу маршрутизации пакетов данных. Протокол IP был специально создан агностическим в отношении физических каналов связи. То есть любая система (сеть) передачи цифровых данных, проводная или беспроводная, для которой существует стандарт инкапсуляции в неё IP-пакетов, может передавать и трафик Интернета. Агностицизм протокола IP, в частности, означает, что компьютер или маршрутизатор должен знать тип сетей, к которым он непосредственно присоединён, и уметь работать с этими сетями; но не обязан знать, какие сети находятся за маршрутизаторами. На стыках сетей специальные маршрутизаторы (программные или аппаратные) занимаются автоматической сортировкой и перенаправлением пакетов данных, исходя из IP-адресов получателей этих пакетов. Протокол IP образует единое адресное пространство в масштабах всего мира, но в каждой отдельной сети может существовать и собственное адресное подпространство, которое выбирается исходя из класса сети. Такая организация IPадресов позволяет маршрутизаторам однозначно определять дальнейшее направление для каждого пакета данных. В результате между отдельными сетями Интернета не возникает конфликтов, и данные беспрепятственно и точно передаются из сети в сеть по всей планете и ближнему космосу. Сам протокол IP был рождён в дискуссиях внутри организации IETF (англ. Internet Engineering Task Force; Task force — группа специалистов для решения конкретной задачи), чьё название можно вольно перевести как «Группа по решению задач проектирования Интернета». IETF и её рабочие группы по сей день занимаются развитием протоколов Всемирной сети. IETF открыта для публичного участия и обсуждения. Комитеты организации публикуют так называемые документы RFC. В этих документах даются технические спецификации и точные объяснения по многим вопросам. Некоторые документы RFC возводятся организацией IAB (англ. Internet Architecture Board — Совет по архитектуре Интернета) в статус стандартов Интернета 220 (англ. Internet Standard). С 1992 года IETF, IAB и ряд других интернеторганизаций входят в Общество Интернета (англ. Internet Society, ISOC). Общество Интернета предоставляет организационную основу для разных исследовательских и консультативных групп, занимающихся развитием Интернета. Подобно тому, как коммерческие интернет-провайдеры соединяются посредством точек обмена трафиком, исследовательские сети объединяются в свои подсети, такие как: National LambdaRail Abilene Network GEANT GLORIAD В России наиболее известен проект «А́билин» (англ. Abilene Network) — высокоскоростная экспериментальная сеть, созданная и поддерживаемая американским консорциумом «Интернет2» (англ. Internet2). Сам консорциум является некоммерческой организацией и занимается разработкой передовых приложений и сетевых технологий. Его сеть Абилин уже объединяет более 230 американских университетов, научных центров и других учреждений. Особенностью сети Абилин является высокая скорость передачи данных, теоретически она может достигать 10 Гбит/с (OC-192c), реально скорость составляет порядка 6—8 Гбит/с. Internet не принадлежит никому конкретно. Некоторые секторы Интернет финансируются либо государством, либо коммерческими группами. Внедрением стандартов Интернет занимаются комитеты Сообщества Интернет (Internet Society), такие как World Wide Web Consortium, Internet Engineering Task Force и тд. Связь между компьютерами в сети Интернет происходит с помощью протокола TCP/IP. TCP/IP(Transmission Control Protocol / Internet Protocol) стандарт, используемый для обмена данными между удаленными компьтерами. Протокол IP обеспечивает маршрутизацию (доставку по адресу сете221 вых пакетов). Протокол TCP разбивает информацию на пронумерованные пакеты. Далее с помощью протокола IP все пакеты передаются получателю, где они располагаются в нужном порядке и собираются в единое целое. То есть TCP/IP фактически разбивает данные на маленькие пакеты одинакового размера и автоматически определяет маршрут, по которому данные будут добираться до адресата. Модель«Клиент-сервер». Процесс обмена данными в Интернет построен на основе модели «Клиент-сервер». Принцип работы этой модели заключается в следующем: Клиент (обычный компьютер) инициирует соединение с сервером и запрашивает у него какие-либо данные (файлы и т.д.) Сервер обрабатывает полученный запрос, высылает запрашиваемый документ и закрывает соединение в ожидании следующих запросов. Существует несколько видов соединения с сетью Интернет, которые зависят от провайдера, от мощности компьютерного оборудования и от необходимой скорости связи. Коммутируемая линия (Dial up) - аналоговая телефонная линия + модем. Самый простой и низкоскоростной вид связи. ISDN (Integrated Services Digital Network) - цифровая сеть, очень сходна с традиционной телефонной системой, но при этом по телефонным линиям передается не аналоговый сигнал, а цифровой, в том числе, и оцифрованный голос. Спутниковое соединение - самый высокоскоростной вид соединения, используемый в основном провайдерами, крупными компаниями и предприятиями, а также военными и правительственными организациями. Радио соединение - применяется в местах, где недостаточно развита телекоммуникация с использованием радио модемов или в основном используется для подключения к сети переносных компьютеров (Notebooks).. Выделенная линия (Leased Line) - высокоскоростной вид соединения. При таком соединении пользователь имеет постоянную связь с сетью Интернет. 222 Передача документа в интернете иногда происходит очень медленно, что вызвано значительной удаленностью интересующего вас сервера, его перегрузкой или перегрузкой каналов Сети. Для увеличения скорости доступа к интересующим вас файлам у провайдеров существует программка Proxy Server, которая работает на машине провайдера . E-MAIL - электронная почта - всеми признанный быстрый, удобный и дешевый инструмент связи, без которого уже очень многие себя не мыслят. Каждый компьютер в сети Интернет имеет уникальный цифровой адрес. Эти адреса называются IP-адресами и выдаются провайдерами. IP-адрес представляет собой набор 4-х целых чисел, разделенных точками, каждое из которых не превышает 255, например: 215. 48. 110. 2 Из-за сложности запоминания IP-адресов была введена система перевода цифровых адресов в доменные имена (DNS - Domain Name Server). Доменное имя - это уникальное имя, которое каждая организация избирает для идентификации своего сервера в Интернет. Например, IP-адрес Web-сервера компании Microsoft - 207. 46.130.45. А соответствующее доменное имя - www.microsoft.com URL (Uniform Resource Locator) используется для задания местоположения файлов, размещаемых на серверах Сети. URL включает в себя следующую информацию: - метод доступа к ресурсу, то есть протокол доступа, адрес ресурса в Сети (имя домена и хост-машины), - полный путь к файлу на сервере. Услуги, которые могут быть предоставлены пользователям в Интернет: электронная почта E-mail; компьютерная телефония; передача файлов FTP; терминальный доступ для интерактивной работы на удаленном компьютере TELNET; глобальная система телеконференций USENET; справочные службы; 223 доступ к информационным ресурсам и средства поиска информации в Интернете. Кроме того, Интернет - это мощное средство ведения электронного бизнеса и дистанционного (интерактивного или он-лайн) обучения. Дальнейшее совершенствование общедоступной сети Интернет многие связывают с внедрением концепции семантической паутины, что позволило бы людям и компьютерам более эффективно взаимодействовать в процессе создания, классификации и обработки информации. 224 7. МНОГОПРОЦЕССОРНЫЕ СИСТЕМЫ 7.1. Архитектуры многопроцессорных операционных систем Традиционно компьютер рассматривается как машина, предназначенная для выполнения последовательных действий. В большинстве языков программирования алгоритм задается в виде последовательных инструкций; при работе программы процессор выполняет машинные команды последовательно, одну за другой. Каждая команда представляется в виде последовательности операций (выборка команды, выборка операндов, выполнение операции, сохранение результатов). Такая точка зрения на компьютер никогда не соответствовала действительности полностью. На уровне микроопераций одновременно генерируются несколько управляющих сигналов. Уже давно применяется конвейерная обработка команд, позволяющая выполнять одновременно, по крайней мере операции выборки и выполнения. Оба приведенных примера являются образцами параллельного выполнения функций. По мере развития компьютерных технологий и уменьшения стоимости аппаратного обеспечения разработчики компьютеров находили все больше возможностей реализации параллелизма. Обычно это делалось для повышения производительности, а в некоторых случаях — для повышения надежности. В данной книге исследуются два наиболее популярных подхода обеспечения одновременной работы процессоров в многопроцессорных системах: симметричная многопроцессорность (symmetric multiprocessor — SMP) и кластеры. [3] Архитектура SMP Рассмотрим, каким образом архитектура SMP соотносится с общей категорией параллельных процессоров. Общепринятым методом классификации таких систем по-прежнему является систематика, в которой выделяются системы с параллельными процессорами, впервые введенная Флинном 225 (Flynn) [FLYN72]. Флинн предложил ввести следующие классы компьютерных систем. Архитектура с одним потоком команд и одним потоком данных (Single Instruction Single Data — SISD). На одном процессоре выполняется один поток команд; операции выполняются над данными, которые хранятся в единой области памяти. Архитектура с одним потоком команд и многими потоками данных (Single Instruction Multiple Data — SIMD). С каждым из обрабатываемых элементов связаны хранящиеся в памяти данные, и каждая команда выполняет действия с различными наборами данных, относящимися к разным процессам. Под эту категорию подпадают векторный и матричный процессоры. Архитектура со многими потоками команд и одним потоком данных (Multiple Instruction Single Data — MISD). Последовательность данных передается набору процессоров, каждый из которых выполняет свою последовательность команд. Такая структура еще не была реализована. Архитектура со многими потоками команд и многими потоками данных. (Multiple Instruction Multiple Data — MIMD). Несколько процессоров одновременно выполняют различные последовательности команд с различными наборами данных. В схеме MIMD процессоры являются универсальными, потому что они должны иметь возможность обрабатывать все команды, необходимые для соответствующего преобразования данных. Дальнейшая классификация систем с архитектурой MIMD может производиться в соответствии с тем, как в них осуществляется обмен данными между процессорами (рис. 69). Если каждому процессору выделяется отдельная область памяти, то каждый обрабатывающий элемент является самостоятельным компьютером. Они обмениваются между собой информацией либо через специальные каналы, либо через какие-то сетевые устройства. Такие системы известны под названием кластеры (clusters) или мультикомпьютеры. Если процессоры совместно использу226 ют общую память, то каждый из них имеет доступ к программам и данным, которые там хранятся. Процессоры могут обмениваться информацией через эту память. Такие системы известны под названием многопроцессорных систем с общей мятью (shared-memory multiprocessor). Параллельный процессор Архитектура с одним потоком команд и многими потоками данных Архитектура с многими потоками команд и многими потоками данных Совместно используемая память (сильносвязанные системы) Выделение основных и подчиненных процессоров Симметричная мультипроцессорность Распределенная память (свободно связанные системы) Кластеры Рис. 69. Архитектуры систем с параллельными процессорами Одна из общих классификаций многопроцессорных систем основана на том, как процессы распределяются между процессорами. Два главных подхода — выделение основных и подчиненных процессоров и симметричная многопроцессорная обработка. В архитектуре с ведущим и ведомыми процессорами (muster/slave architecture) ядро операционной системы всегда выполняется на специально выделенном процессоре. На других процессорах могут выполняться только пользовательские программы и, возможно, утилиты операционной системы. Ведущий процессор отвечает за планирование процессов или потоков. Если выполняющемуся на ведомом процессоре процессу или потоку понадобится какой-нибудь системный сервис (например, вызов 227 процедуры ввода-вывода), он должен будет послать запрос основному процессору, а затем ждать, пока сервисная программа не закончит свою работу. Такой подход довольно прост, и для его реализации достаточно немного усовершенствовать операционную систему, предназначенную для однопроцессорных многозадачных систем. Разрешение конфликтов упрощается, благодаря тому что всей памятью и всеми ресурсами ввода-вывода управляет один процессор. Этот подход имеет ряд недостатков. Сбой в работе основного процессора влечет за собой отказ всей системы. Основной процессор может тормозить работу всей системы, так как только на нем должны производиться все действия по планированию и управлению процессами. В симметричной многопроцессорной системе (symmetric multiprocessor) ядро может выполняться на любом процессоре; как правило, каждый процессор сам планирует свою работу, извлекая имеющийся в наличии процесс или поток из накопителя. Ядро может быть выполнено в виде многих процессов или многих потоков; при этом разные его части способны работать параллельно. Симметричный подход несколько усложняет архитектуру операционной системы. Нужно принять меры предосторожности, чтобы два процессора не выбрали один и тот же процесс или чтобы процесс какимнибудь образом не выпал из очереди. Необходимо применять специальные методы для разрешения запросов одного и того же ресурса различными процессами и синхронизации запросов. Симметричные мультипроцессоры и кластеры имеют сложную архитектуру. Для их разработки нужно решать вопросы, связанные с физической организацией, структурами взаимосвязей, обменом информацией между процессорами, архитектурой операционной системы и обеспечением прикладными программами. 228 7.2. Принципы функционирования SMP Организация симметричной многопроцессорной системы. На рис. 70 проиллюстрирована общая архитектура симметричной многопроцессорной системы. В ней имеется несколько процессоров, каждый из которых содержит свой собственный управляющий модуль, арифметико-логическое устройство и свои регистры. Каждый из процессоров имеет доступ к общей основной памяти и устройствам ввода-вывода. Этот доступ осуществляется с помощью некоторого механизма взаимодействия; традиционно в роли такого механизма выступает общая шина. Процессоры могут обмениваться между собой информацией посредством общей памяти (т.е. с помощью сообщений и информации о состоянии, хранящихся в общем адресном пространстве) [3]. Кроме того, процессоры могут иметь возможность непосредственного обмена сигналами. Память зачастую имеет организацию, позволяющую осуществлять одновременный множественный доступ к ее отдельным блокам. Как правило, в современных машинах процессоры имеют, по крайней мере, один уровень собственного кэша. Его использование вносит новые аспекты в рассмотрение архитектуры операционных систем. Поскольку в каждом локальном кэше хранится образ какой-то части основной памяти, то в результате изменения слова в одном кэше соответствующее слово в другом кэше может оказаться неверным. Чтобы предотвратить такую ситуацию, все процессоры, в кэше которых содержится данное слово, должны быть извещены о необходимости изменить его. Эта проблема известна как проблема когерентности кэшей и относится скорее к аппаратному обеспечению, чем к операционной системе. Операционная система, предназначенная для симметричной многопроцессорной системы, управляет процессорами и другими ресурсами компьютера таким образом, чтобы с точки зрения пользователя многопроцессорная система выглядела так же, как и многозадачная однопроцессорная. 229 Процессор Кэш Процессор ... Кэш Основная память Процессор Кэш Подсистема ввода-вывода Рис. 70. Архитектура симметричной многопроцессорной системы Пользователь может создавать приложения с использованием нескольких процессов или нескольких потоков в процессах, не заботясь о том, какое количество процессоров будет доступно — один или несколько. Таким образом, многопроцессорная операционная система должна выполнять все функции многозадачной системы, а также обладать дополнительными возможностями по распределению вычислений среди процессоров. В число особенностей архитектуры такой операционной системы входят следующие: Одновременные параллельные процессы или потоки. Чтобы несколько различных процессов могли одновременно выполнять один и тот же код ядра, он должен быть реентерабельным. При выполнении несколькими процессорами одного и того же кода ядра (или разных его частей) необходима организация управления таблицами и управляющими структурами ядра, чтобы избежать взаимоблокировок или неправильного выполнения операции. Планирование. Планирование может выполняться на любом из процессоров, поэтому необходимо предусмотреть механизм, позволяющий избежать конфликтов. При использовании многопоточности на уровне ядра 230 несколько потоков одного и того же процесса могут выполняться на разных процессорах. Синхронизация. В ситуации, когда несколько активных процессов имеют возможность доступа к совместным адресным пространствам или ресурсам ввода-вывода, необходимо позаботиться об их эффективной синхронизации. Синхронизация — это средство, обеспечивающее реализацию взаимоисключений и упорядочение событий. Общепринятым механизмом синхронизации в многопроцессорных операционных системах являются блокировки. Управление памятью. Система управления памятью в многопроцессорнойсистеме должна быть способна разрешать все проблемы, возникающие в однопроцессорных машинах, а кроме того, операционная система должна уметь использовать возможности, предоставляемые аппаратным обеспечением, например многопортовую память. Механизмы страничной организации памяти разных процессоров должны быть скоординированы, чтобы обеспечить согласованность работы в ситуации, когда несколько процессоров используют одну и ту же страницу или один и тот же сегмент и принимают решение по вопросу замещения страниц. Надежность и отказоустойчивость. При отказе одного из процессоров операционная система должна обеспечить продолжение корректной работы системы. Планировщик операционной системы (как и другие ее части) должен получить информацию о потере одного из процессоров и соответствующим образом перестроить свои управляющие таблицы. Поскольку при описании архитектуры многопроцессорной операционной системы, как правило, рассматриваются те же вопросы (с добавлением некоторых других), что и при описании устройства однопроцессорной операционной системы, мы не будем останавливаться на многопроцессорных операционных системах отдельно. Вместо этого по ходу изложения материала книги будем обращаться к вопросам, являющимся специфичными для многопроцессорных систем. 231 7.3. Принципы функционирования кластеров Кластер - набор вычислительных узлов (вполне самостоятельных компьютеров), связанных высокоскоростной сетью (интерконнектом) и объединенных в логическое целое специальным программным обеспечением [3]. Фактически простейший кластер можно собрать из нескольких персоналок, находящихся в одной локальной сети, просто установив на них соответствующее программное обеспечение. Кластеры ассоциируются у нас с суперкомпьютерами, круглые сутки решающими на десятках, сотнях и тысячах вычислительных узлов какуюнибудь сверхбольшую задачу. Часто встречаются кластеры, в которых одни узлы, дублируя другие, готовы в любой момент перехватить управление, или, например, одни узлы, проверяя получаемые с другого узла результаты, радикально повышают надежность системы. Еще одно популярное применение кластеров - решение задачи массового обслуживания, когда серверу приходится отвечать на большое количество независимых запросов, которые можно легко раскидать по разным вычислительным узлам. Суперкомпьютеркластер состоит из трех основных компонентов: " компьютеров, образующих узлы кластера; интерконнекта, соединяющего эти узлы в сеть, и программного обеспечения, заставляющего всю конструкцию "почувствовать" себя единым компьютером. Программное обеспечение для кластеров: для кластерных вычислений существует стандарт - MPI (Message Passing Interface). Программы, написанные с использованием MPI, абсолютно переносимы - их можно запускать из любой операционной системы. Идея многопроцессорной обработки как способа повышения общей эффективности вычислений родилась давно. Однако прежде чем попытаться распределить вычисления между N процессорами, нужно отчётливо понимать, что не любой вычислительный процесс получит какие-либо преимущества от реализации на многопроцессорных архитектурах. Для этого он должен быть достаточно «хорошо распараллеливаемым». Какие правило это за232 дачи с вычислениями, многократно повторяемыми при вариациях некоторых начальных условий в каждом цикле. Кроме того, желательно, чтобы в таких задачах параметры последующих циклов вычисления имели бы минимально выраженную зависимость от результатов предыдущих циклов («итерационность»). Достаточно широкие классы задач оказываются в определённой мере «хорошо распараллеливаемыми» [33]: Восстановление криптографированного текста с помощью всех воз- можных ключей шифрования и выбор наилучшего результата. Поиск в больших объёмах данных по ключевым признакам или по их сложным комбинациям. Прочностные расчёты, реализация метода конечных элементов, задачи гидро- и электродинамики сплошных сред. Проверка комбинаторно синтезируемых гипотез и идентификация отметок, полученных пространственно разнесёнными приёмниками, в системах радио- и гидролокации. Задачи баллистики. Обработка изображений, например идентификация дактилоскопических отпечатков или анализ аэрокосмических снимков. Множественное вычисление целевой функции в процедурах многомерной нелинейной оптимизации. Реализация нестационарного метода статистического моделирования для газовой динамики и кинетической теории газов. Обеспечение высокой надёжности систем баз данных. Большинство задач поиска вариантов в пошаговых игровых программах. Степень успешности распараллеливания обратно зависима от того, как сильно исходные данные последующих циклов вычислений зависят от предыдущих. За годы эволюции идеи распределённой обработки сложились две модели: сильносвязанные многопроцессорные системы (системы с симметричной многопроцессорной обработкой — SMP) и слабосвязанные многопроцессорные системы (кластерные системы). 233 В SMP-системах N обрабатывающих процессоров разделяют общие поля внешних устройств и, что особенно важно, поле оперативной памяти. Для реализации этой модели необходимо использовать специализированные архитектуры взаимодействия процессоров и специальные наборы системных микросхем (chipset). В таких архитектурах оптимальным механизмом распределения работы между параллельными ветвями представляется разделение на уровне потоков (thread). Последовательно наблюдались массовая реализация механизмов thread в аппаратных платформах (начало 90-х), поддержка абстракций thread в операционных системах (1994-1996) и отражение их в стандартах POSIX (конец 90-х). Одной из самых существенных технических трудностей при построении таких архитектур является необходимость обеспечения когерентности данных в локальных устройствах кэш-памяти каждого из процессоров. В кластерных системах предполагается, что каждый из узлов является типовой вычислительной архитектурой со своим процессором, оперативной памятью, каналами ввода_вывода и т.д., а кооперация узлов осуществляется через некоторые каналы передачи данных между ними. В такой архитектуре распараллеливание работ реализуется на уровне процессов, каждый из которых выполняется на своём узле вычислительной структуры. И та и другая модель имеет как свои преимущества, так и свои недостатки, баланс которых может существенно смещаться в зависимости от класса решаемых задач. Все прочие многопроцессорные архитектуры могут рассматриваться как линейная комбинация решений, почерпнутых из этих двух моделей. SMP-структуры пригодны только для наращивания производительности системы, а кластерные системы, кроме того, могут быть использованы и для повышения «живучести» системы в применениях, где должна быть обеспечена высокая надёжность. В N - процессорном кластере при выходе из строя любого количества хостов до (N - 1) система может сохранять работоспособность (правда, обычно со снижением общей производительности) за счёт перераспределения загрузки между оставшимися хостами. 234 СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 1. Википедия [Электронный ресурс]: Операционная система. – Режим доступа: http://ru.wikipedia.org. 2. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение. – СПб.: Изд-во «Питер», 2002. 740с. 3. Столлингс В. Операционные системы. – М.: Вильямс, 2002, 848с. 4. Таненбаум Операционные системы. – М.: Вильямс, 2006, 934с. 5. Робачевский А.М., Немнюгин С.А., Стесик О.Л. Операционная систе- ма Unix. 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2005. 656с. 6. Соломон Д., Русинович А. Внутреннее устройство W2000. – М.: Виль- ямс, 2001. 900с. 7. Фленов М.Е. Программирование на Delphi глазами хакера. – СПб.: БХВ-Петербург, 2003. 336с 8. Фленов М.Е. Программирование на С++ глазами хакера. – СПб.:БХВ- Петербург, 2006. 336с. 9. Джонсон М. Харт. Системное программирование в среде Win32. – М.: Вильямс, 2001, 446с. 10. Мир советов [Электронный ресурс]: Установка Windows XP. – http://mirsovetov.ru/a/hi-tech/software/direction-windows-xp.html 11. [Электронный ресурс]: Загрузка Windows XP. – файлов. – http://sysbin.com/files/articles/startupprocess/startupprocess.html 12. [Электронный ресурс]: Разработка пакетных http://www.oszone.net/2245 13. [Электронный ресурс]: Работа с реестром. – http://forum.chel- net.ru/archive/index.php/t-6632.html 14. [Электронный ресурс]: Стсндартные процессы Windows XP. – http://md-forum.net/article219.html 15. Зыль С.Н. QNX Momentics: основы применения. – СПб.:БХВ- Петербург, 2005. 256с. 16. [Электронный ресурс]: Файловый менэджер Midnight Commander . – http://www.ixbt.com/soft/filemanagers-linux.shtml 235 Компилятор 17. Цилюрик О., Горошко Е. QNX/UNIX: анатомия паралеллизма. – СПб.:Символ-Плюс, 2006. 288с. 18. Операционная система реального времени QNX Neutrino 6.3. Систем- ная архитектура: Пер. с англ. – СПб.: БХВ-Петербург, 2005. 336с. 19. Кёртен Р.Введение в QNX Neutrino 2. Руководство для разработчиков приложений реального времени. – СПб.:БХВ-Петербург, 2005. 400с. 20. [Электронный ресурс]: Последовательность загрузки QNX. – http://www.rts.ua/rus/articles/360/0/43/ 21. Практика работы с QNX. Алексеев Д., Ведревич Е., Цилюрик О. и др. – М.: КомБук, 2004. 432с. 22. Электронная энциклопедия «Википедия» [Электронный ресурс]: Вир- туальные машины. – http://ru.wikipedia.org/wiki/Виртуальная_машина 23. [Электронный ресурс]: Работа с виртуальной машиной VmWare. – http://www.citforum.ru/operating_systems/seven/ 24. М. Гук Аппаратные средства локальных сетей. Энциклопедия – СПб: Издательство «Питер», 2000. 576с. 25. [Электронный ресурс]: Сети Windows. – http://www.xnets.ru/plugins/content/content.php?content.20 26. Богумирский Б. Оптимизация и настройка Windows 98 для профессио- налов. – СПб: Изд-во «Питер», 1999. 400с. 27. Касперский К. Техника и философия хакерских атак. – М.:Солон-Р, 1999. 272с. 28. Касперский К. Техника сетевых атак. – М.:Солон-Р, 2001. 396с. 29. Касперский К. Образ мышления – дизассемблер IDA. – М.:Солон-Р, 2001. 472с. 30. Касперский К. Укрощение Интернета. – М.:Солон-Р, 2002. 284с. 31. Касперский К. Фундаментальные основы хакерства. – М.:Солон-Р, 2002. 445с. 32. Айрапетян Р.А. Отладчик SoftICE подробный справочник – М.:Солон- Р, 2003. 302с. 33. Цилюрик О. QNX : кластерные вычисления СТА // СТА, 2004. №4. С.54-62. 236