1. Лекция: Понятие операционной системы (ОС), цели ее работы. Классификация компьютерных систем В лекции дано определение понятия "операционная система" (ОС). Дан краткий обзор функциональности и назначения ОС, краткий обзор широкого спектра видов и архитектур современных компьютерных систем (настольные, распределенные, мобильные, облачные и др.) и операционных систем для них. Содержание Введение Комментарии к списку литературы Краткое содержание курса Почему важно знать операционные системы – мнение эксперта из Microsoft Расцвет ОС в 2000-х гг Понятие операционной системы и цели ее работы Компоненты компьютерной системы Общая картина функционирования компьютерной системы Классификация компьютерных систем Классификация компьютерных архитектур Основные компоненты операционной системы Ключевые термины Краткие итоги Набор для практики o Вопросы o Темы для курсовых работ, рефератов, эссе Введение Данный курс познакомит Вас с основами современных операционных систем и сетевых технологий и научит их практически использовать. Комментарии к списку литературы Список литературы по курсу приведен в конце данной лекции. Вот некоторые комментарии к этому списку. Книга [1] классический учебник по ОС Йельского университета (США). Некоторые материалы презентаций к этому курсу использованы при подготовке презентаций моего курса, за что автор выражает признательность коллегам из Йельского университета. Книги [2], [3] профессора Эндрю Таненбаума входят в "золотой фонд" современной учебной литературы по ИТ. Настоятельно рекомендую их студентам в качестве основной литературы по моему курсу. Учебник [4] представляет классическую литературу по ОС прошлых лет (1970-х гг.). Несмотря на свой возраст, он является фундаментальной работой, одной из лучших книг по операционным системам, материал которой не устарел и по сей день. Книги [5], [6], [8], [9] посвящены некоторым конкретным современным операционным системам – Windows, Linux, MacOS. Книга [7] уникальна, так как является первой книгой по внутренней архитектуре Windows. Она написана специалистами, несколько лет работавшими совместно с подразделением разработки Windows в Microsoft (один из ее авторов стал сотрудником Microsoft). Рекомендую для использования также материалы своих курсов по ОС в электронном виде на русском и английском языках [10], [11]. Краткое содержание курса Данный курс посвящен основным концепциям операционных систем и сетей. Однако он не является чисто теоретическим, а дает практические навыки работы в современных ОС, рассматривает методы и приемы администрирования ОС и сетей, а также содержит лабораторные работы, помогающие студентам практически освоить рассматриваемые концепции. 1 Набор операционных систем, рассматриваемых в курсе, очень широк. Это прежде всего ОС семейства Windows (2000, XP, 2003, Vista, 2008, 7), в том числе – Windows для встроенных систем (Windows Embedded), Windows для мобильных устройств (Windows Mobile) и Windows для облачных вычислений (Windows Azure). Кроме того, рассматриваются популярные ОС семейства Linux, а также особенно хорошо известная автору ОС Solaris разработки Sun / Oracle, которая была для автора основным рабочим инструментом в течение 10 лет. Рассмотрена, также популярная современная ОС для мобильных устройств Google Android. Современность курса нашла свое выражение также в рассматриваемых сетевых протоколах. Рассмотрена не только классическая 8-уровневая модель сетевых протоколов ISO / OSI, но и некоторые современные протоколы, например, Wi-Fi, GPRS, EVDO, SIMPLE/SIP. Почему важно знать операционные системы – мнение эксперта из Microsoft По мнению Дэвида Проберта, менеджера по разработке ОС Windows (Microsoft), знание операционных систем является основой успешной карьеры в сфере программирования. Предмет ОС сочетает в себе как математические методы, так и методы проектирования современного программного обеспечения, которые используются и во многих других современных областях – при разработке игр, клиент-серверных приложений, бизнес-приложений, Web-технологий и программных инструментов. Знание ОС способствует становлению зрелого мышления программиста и хорошему знанию сетевых технологий и протоколов, виртуальных машин, методов современного программирования. С этим компетентным мнением нельзя не согласиться. Расцвет ОС в 2000-х гг. В настоящее время мы являемся свидетелями небывалого расцвета операционных систем, поэтому для их изучения сейчас для студентов открываются огромные возможности: выпускаются новые ОС для настольных компьютеров, кластеров компьютеров и параллельных вычислений, мобильных устройств, облачных вычислений. Бесспорным лидером в данной области является корпорация Microsoft, выпустившая менее чем за 10 недавних лет целую серию ОС семейства Windows: Windows XP, Windows 2003, Windows Vista (2007), Windows 2008, Windows 2008 High-Performance Computing (HPC), Windows 7. Развиваются также диалекты ОС Linux (Red Hat, Fedora, Mandrake, Ubuntu, SuSE и др.– сотни диалектов). Linux – операционная система типа UNIX, ядро которой свободно распространяется с исходными кодами. Фирма Sun (в 2010 г. вошедшая в состав фирмы Oracle) разрабатывает и выпускает ОС Solaris – одну из наиболее современных ОС типа UNIX с развитой поддержкой параллельного программирования, новыми видами файловых систем, отличающуюся своей повышенной надежностью. Это лишь некоторые ОС, которым в данном курсе будет уделено значительное внимание. Существует также много других операционных систем. В США и Канаде, как известно, весьма популярны компьютеры семейства Macintosh фирмы Apple (коротко – Mac) со своей операционной системой MacOS, являющейся законодателем мод в области графических пользовательских интерфейсов (GUI) и обмена мультимедийной информацией (например, речевого ввода). Назовем также ОС фирмы IBM для суперкомпьютеров и компьютеров общего назначения (mainframes). Особенно важно для успешного изучения операционных систем то, что в настоящее время многие из них (или их крупные части, например, ядро) доступны с открытым исходным кодом. Корпорация Microsoft положила начало этому движению в 2003 г., когда была объявлена академическая программа Windows Embedded Shared Source – был открыт исходный код 2 Windows для встроенных систем. А в 2006 г. произошло и вовсе невероятное доселе в программистском мире событие – Microsoft открыла "святую святых", исходный код ядра ОС Windows семейства NT (NT/2000/XP/2003/2008/7) и предоставила в распоряжение университетов и академических организаций Windows Research Kernel (WRK) – самодокументированный исходный код "исследовательского" ядра Windows. Теперь каждый студент, преподаватель и исследователь имеют возможность изучать систему Windows "изнутри" и даже развивать ее, но только для целей обучения и исследований, а не для коммерции. Фирма Sun (ныне – Oracle) положила начало аналогичной инициативе для ОС Solaris – несколько лет назад был начат проект OpenSolaris. Результаты этого академического проекта используются при выпуске новых версий коммерческой ОС Solaris. По традиции, еще с начала 1990-х гг., ядро ОС Linux также распространяется свободно, с исходными кодами, что вызвало целую волну работ по созданию новых диалектов Linux, а также по разработке новых ОС для мобильных устройств на базе ядра Linux (например, ОС Google Android). Также интенсивно развиваются ОС для мобильных устройств. Еще несколько лет назад наиболее используемыми ОС в этой области были ОС семейства Symbian. Однако сейчас ОС Microsoft Windows Mobile и Google Android активно теснят Symbian с рынка. ОС для облачных вычислений – принципиально новый вид ОС, отражающий современную тенденцию к организации вычислений как облачных (cloud computing). Облако – это метафора Интернета. При облачных вычислениях пользователь со своего компьютера получает платный доступ через Интернет к Web-сервисам, работающим на компьютерах мощных центров обработки данных (например, на серверах Microsoft). При этом не только используемое программное обеспечение (в виде набора Web-сервисов), но и сами обрабатываемые данные пользователя хранятся на серверах "облачного" центра обработки данных. На своем компьютере пользователь имеет лишь простой и удобный и не требующий больших ресурсов "облачный" Web-интерфейс. Наиболее распространенной ОС для облачных вычислений является в настоящее время Microsoft Windows Azure. Вот лишь очень краткий обзор развития операционных систем в наши дни. По мнению автора, крупные фирмы открывают исходные коды своих операционных систем, привлекая молодых талантливых специалистов интересными проектами ОС с открытым исходным кодом, так как им необходимы молодые программисты и новые интересные идеи, которые позволят сделать ОС еще более мощными, масштабируемыми, удобными, эффективными, надежными и безопасными. Понятие операционной системы и цели ее работы После краткого вводного обзора перейдем к основным понятиям и их определениям. Прежде всего, дадим определение операционной системы. Операционная система (ОС, в англоязычном варианте - operating system) – базовое системное программное обеспечение, управляющее работой компьютера и являющееся посредником (интерфейсом) между аппаратурой (hardware), прикладным программным обеспечением (application software) и пользователем компьютера (user). Фактически операционная система с точки зрения пользователя– это как бы продолжение аппаратуры, надстройка над ней, обеспечивающая более удобное, надежное и безопасное использование компьютеров и компьютерных сетей. Основные цели работы операционной системы следующие. 1. Обеспечение удобства, эффективности, надежности, безопасности выполнения пользовательских программ. Для пользователя самое главное – чтобы его программа работала, вела себя предсказуемо, выдавала необходимые ему правильные результаты, не давала сбоев, не подвергалась внешним атакам. Вычислительную среду для такого выполнения программ и обеспечивает операционная система. 2. Обеспечение удобства, эффективности, надежности, безопасности использования компьютера. Операционная система обеспечивает максимальную полезность и эффективность использования компьютера и его ресурсов, обрабатывает прерывания, защищает компьютер от сбоев, отказов и хакерских атак. Эта деятельность ОС может быть не столь заметной для пользователя, но она осуществляется постоянно. 3 3. Обеспечение удобства, эффективности, надежности, безопасности использования сетевых, дисковых и других внешних устройств, подключенных к компьютеру. Особая функция операционной системы, без которой невозможно использовать компьютер, - это работа с внешними устройствами. Например, ОС обрабатывает любое обращение к жесткому диску, обеспечивая работу соответствующего драйвера (низкоуровневой программы для обмена информацией с диском) и контроллера (специализированного процессора, выполняющего команды ввода-вывода с диском). Любая "флэшка", вставленная в USB-слот компьютера, распознается операционной системой, получает свое логическое имя (в системе Windows – в виде буквы, например, G) и становится частью файловой системы компьютера на все время, пока она не будет извлечена (демонтирована). 4. Подчеркнем особую важность среди функций современных ОС обеспечения безопасности, надежности и защиты данных. Следует учитывать, что компьютер и операционная система работают в сетевом окружении, в котором постоянно возможны и фактически происходят атаки хакеров и их программ, ставящие своей целью нарушение работы компьютера, "взлом" конфиденциальных данных пользователя, хранящихся на нем, похищение логинов, паролей, использование компьютера как "робота" для рассылки реклам или вирусов и др. В связи с этим в 2002 г. фирма Microsoft объявила инициативу по надежным и безопасным вычислениям (trustworthy computing initiative), целью которой является повышение надежности и безопасности всего программного обеспечения, прежде всего – операционных систем. В данном курсе мы будем подробно останавливаться на том, какие действия по обеспечению надежности, безопасности и защите данных предпринимают современные ОС. Компоненты компьютерной системы Чтобы лучше понять место и роль операционной системы в процессе вычислений, рассмотрим компьютерную систему в целом. Она состоит из следующих компонент: 1. Аппаратура (hardware) компьютера, основные части которой – центральный процессор (Central Processor Unit - CPU), выполняющий команды (инструкции) компьютера; память (memory), хранящая данные и программы, и устройства ввода- вывода, или внешние устройства (input-output devices, I/O devices), обеспечивающие ввод информации в компьютер и вывод результатов работы программ в форме, воспринимаемой пользователем-человеком или другими программами. Часто на программистском сленге аппаратуру называют "железом". 2. Операционная система (operating system) – основной предмет нашего курса; системное программное обеспечение, управляющее использованием аппаратуры компьютера различными программами и пользователями. 3. Прикладное программное обеспечение (applications software) – программы, предназначенные для решения различных классов задач. К ним относятся, в частности, компиляторы, обеспечивающие трансляцию с программ с языков программирования, например, C++, в машинный код (команды); системы управления базами данных (СУБД); графические библиотеки, игровые программы, офисные программы. Прикладное программное обеспечение образует следующий, более высокий уровень, по сравнению с операционной системой, и позволяет решать на компьютере различные прикладные и повседневные задачи. 4. Пользователи (users) – люди и другие компьютеры. Отнесение пользователячеловека к компонентам компьютерной системы - вовсе не шутка, а реальность: любой пользователь фактически становится частью вычислительной системы в процессе своей работы на компьютере, так как должен подчиняться определенным строгим правилам, нарушение которых приведет к ошибкам или невозможности использования компьютера, и выполнять большой объем типовых рутинных действий – почти как сам компьютер. Одна из важных функций ОС как раз и состоит в том, чтобы избавить пользователя от большей части такой рутинной работы (например, резервного копирования файлов) и позволить ему сосредоточиться на работе творческой. Другие компьютеры в сети также могут играть роль пользователей (клиентов) по отношению к данному компьютеру, выступающему в роли сервера, используемого, например, для хранения файлов или выполнения больших программ. Девизом фирмы Sun Microsystems еще в 1982 г., при ее создании, стал афоризм "The network is the computer" (Сеть – это компьютер). Эту истину следует помнить всем пользователям компьютеров и их операционных систем и шире использовать возможности ком- 4 пьютерных сетей, распределяя различные функции между ее различными компьютерами (или хостами – hosts, как на компьютерном сленге принято называть компьютеры в сети). Изолированный от сети компьютер ныне – это "каменный век". Отсюда – неразрывная связь операционных систем и сетей. Общая картина функционирования компьютерной системы Пользователь 1 Пользователь 2 Пользователь 3 Компилятор Ассемблер Текстовый редактор … … Пользователь 4 СУБД Системные прикладные программы Операционная система Оборудование компьютера Рис. 1.1. Общая картина функционирования компьютерной системы Пользователям компьютера доступны верхние уровни программного обеспечения – системные и прикладные программы (например, компиляторы, текстовые редакторы, системы управления базами данных). Эти программы взаимодействуют с операционной системой, которая, в свою очередь, управляет работой компьютера. Классификация компьютерных систем Для того, чтобы представить себе разнообразие и масштабируемость операционных систем, рассмотрим, прежде всего, классификацию современных компьютерных систем, для которых разрабатываются и используются ОС – от суперкомпьютеров до мобильных устройств, - и суммируем требования к ОС для этих классов компьютеров. Суперкомпьютеры (super-computers) – мощные многопроцессорные компьютеры, наиболее современные из которых имеют производительность до нескольких petaflops (1015 вещественных операций в секунду; аббревиатура flops расшифровывается как floating-point operations per second). Пример – суперкомпьютер "Ломоносов", установленный в МГУ. Суперкомпьютеры используются для вычислений, требующих больших вычислительных мощностей, сверхвысокой производительности и большого объема памяти. В реальной практике это прежде всего задачи моделирования – например, моделирования климата в регионе и прогнозирования на основе построенной модели погоды в данном регионе на ближайшие дни. Особенностью суперкомпьютеров является их параллельная архитектура – как правило, все они являются многопроцессорными. Соответственно, ОС для суперкомпьютеров должны поддерживать распараллеливание решения задач и синхронизацию параллельных процессов, одновременно решающих подзадачи некоторой программы. Многоцелевые компьютеры, или компьютеры общего назначения (mainframes) – традиционное историческое название для компьютеров, распространенных в 1950-х – 1970-х гг., еще до эпохи всеобщего распространения персональных компьютеров. Именно для mainframe-компьютеров создавались первые ОС. Типичные примеры таких компьютеров: IBM 360/370; из отечественных – М-220, БЭСМ-6. На таких компьютерах решались все необходимые задачи – от расчета зарплаты сотрудников в организации до расчета траекторий космических ракет. Подобный компьютер выглядел достаточно неуклюже и громоздко и мог 5 занимать целый большой зал. Вспомните, например. огромный компьютер HAL на космическом корабле в фантастическом фильме 1960-х гг. Стэнли Кубрика "Космическая одиссея 2001 г." Но никакие фантасты не смогли предвидеть прогресса компьютерной техники XXI века – прежде всего, того, что мощный компьютер будет не занимать целую комнату, а помещаться в небольшом ящике. Параметры ранних mainframe-компьютеров были весьма скромными: быстродействие - несколько тысяч операций в секунду, оперативная память – несколько тысяч ячеек (слов). Недостаточно удобным был пользовательский интерфейс (интерактивное взаимодействие с компьютерами было реализовано гораздо позже, в 1960-х гг.). Тем не менее, на таких компьютерах решались весьма серьезные задачи оборонного и космического назначения. С появлением персональных и портативных компьютеров классические mainframe-компьютеры ушли в прошлое. Однако следует подчеркнуть, что в именно в операционных системах для mainframe-компьютеров были реализованы все основные методы и алгоритмы, рассмотренные в данном курсе, которые впоследствии были использованы в ОС для персональных, карманных компьютеров и мобильных устройств. Кластеры компьютеров (computer clusters) – группы компьютеров, физически расположенные рядом и соединенные друг с другом высокоскоростными шинами и линиями связи. Кластеры компьютеров используются для высокопроизводительных параллельных вычислений. Наиболее известны в мире компьютерные кластеры, расположенные в исследовательском центре CERN (Швейцария) – том самом, где находится большой адронный коллайдер. Как правило, компьютерные кластеры располагаются в исследовательских институтах и в университетах, в том числе, например, в Петродворцовом учебно-научном комплексе СПбГУ они используются в Петродворцовом телекоммуникационном центре (ПТЦ), на нашем математико-механическом и на физическом факультетах. Операционная система для кластеров должна, помимо общих возможностей, предоставлять средства для конфигурирования кластера, управления компьютерами (процессорами), входящими в него, распараллеливания решения задач между компьютерами кластера и мониторинга кластерной компьютерной системы. Примерами таких ОС являются ОС фирмы Microsoft – Windows 2003 for clusters; Windows 2008 High-Performance Computing (HPC). Настольные компьютеры (desktops) – это наиболее распространенные в настоящее время компьютеры, которыми пользуются дома или на работе все люди, от школьников и студентов до домашних хозяек. Такой компьютер размещается на рабочем столе и состоит из монитора, системного блока, клавиатуры и мыши. Параметры современного (2010 г.) настольного компьютера, наиболее приемлемые для использования современных ОС: быстродействие процессора 1 – 3 ГГц, оперативная память – 1 – 8 гигабайт и более, объем жесткого диска (hard disk drive – HDD) – 200 Гб – 1 Тб и более (1 терабайт, Тб = 1024 Гб). Все разнообразие современных операционных систем (Windows, Linux и др.) – к услугам пользователей настольных компьютеров. При необходимости на настольном компьютере можно установить две или более операционных системы, разделив его дисковую память на несколько разделов (partitions) и установив на каждый из них свою операционную систему, так что при включении компьютера пользователю предоставляется стартовое меню, из которого он выбирает нужную операционную систему для загрузки. Портативные компьютеры (laptops, notebooks – дословно "компьютеры, помещающиеся на коленях"; "компьютеры-тетрадки") – это миниатюрные компьютеры, по своим параметрам не уступающие настольным, но по своим размерам свободно помещающиеся в небольшую сумку или рюкзак или, например, на коленях пользователя, летящего в самолете в командировку и не желающего терять времени даром. Ноутбуки стоят обычно в несколько раз дороже, чем настольные компьютеры с аналогичными характеристиками. На ноутбуках используются те же операционные системы, что и для настольных компьютеров (например, Windows или MacOS). Характерными чертами портативных компьютеров являются всевозможные встроенные порты и адаптеры для беспроводной связи: Wi-Fi (официально IEEE 802.11) – вид радиосвязи, позволяющая работать в беспроводной сети с производительностью 10-100 мегабит в секунду (используется обычно на конференциях, в гостиницах, на вокзалах, аэропортах – т.е. в зоне радиусом в несколько сотен метров от источника приемапередачи); Bluetooth – также радиосвязь на более коротких расстояниях (10 – 100 м для Bluetooth 3.0), используемая для взаимодействия компьютера с мобильным телефоном, наушниками, плейером и др. Внешние устройства (дополнительные жесткие диски, принтеры, иногда даже DVD-ROM) подключаются к ноутбуку через порты USB. Еще лет 10 назад на ноутбуках активно использовались инфракрасные порты (IrDA), которые, однако, неудобны, так как требуют присутствия "ответного" IrDA – порта другого устройства на расстоянии 20-30 см от порта ноутбука, при отсутствии между ними препятствий. Другая характер- 6 ная черта ноутбуков – это наличие кард-ридеров – портов для чтения всевозможных карт памяти, используемых в мобильных телефонах или цифровых фотокамерах; обеспечивается также интерфейс FireWire (официально – IEEE 1394) для подключения цифровой видеокамеры; таким образом, ноутбуки хорошо приспособлены для ввода, обработки и воспроизведения обработки мультимедийной информации. Ныне портативный компьютер имеется почти у каждого студента, что они и используют для подготовки к ответу на экзамене, либо для решения задач практикума, иногда прямо в университетском буфете. Один из критических параметров ноутбука – время работы его батарей без подзарядки; очень хорошо, если это время составляет порядка 10 часов, что пока сравнительно редко; на компьютерах, используемых автором, это время составляет не более 5 часов. Популярная разновидность ноутбука ныне – это нетбук - ноутбук, предназначенный для работы в сети, обычно менее мощный и поэтому более дешевый, а также более миниатюрный. Карманные портативные компьютеры и органайзеры (КПК, handhelds, personal digital assistants – PDA) – это "игрушки для взрослых" в виде миниатюрного компьютера, помещающегося на ладони или в кармане, но по своему быстродействию иногда не уступающего ноутбуку. При всей привлекательности, серьезные недостатки КПК, с точки зрения автора, - это неудобство ввода информации (приходится пользоваться палочкой-стайлусом, - ведь не носить же с собой еще и громоздкую клавиатуру, - либо микроскопической выдвижной клавиатурой, на которой фактически тем же стайлусом только и можно работать), а также неудобство чтения информации на маленьком экране. Автор уже "наигрался" в подобные КПК, - например, типа PalmPilot, - предпочитает пользоваться ноутбуками, а самым надежным органайзером считает ... небольшой бумажный блокнот. Однако молодежь приглашается к этой увлекательной интересной игре – через все в жизни нужно пройти. Современные КПК имеют фактически те же порты и адаптеры, что и ноутбуки – Wi-Fi, Bluetooth, IrDA, USB. Операционные системы для КПК аналогичны ОС для ноутбуков, но все же учитывают более жесткие ограничения КПК по объему оперативной памяти. В настоящее время для КПК широко используется ОС Windows Mobile – аналог Windows для мобильных устройств. До недавнего времени была также широко распространена PalmOS для органайзеров типа PalmPilot фирмы 3COM. Разумеется, для КПК имеется аппаратура и программное обеспечение для подключения к ноутбуку или настольному компьютеру с целью синхронизации данных, что обеспечивает дополнительную надежность. Мобильные устройства (mobile intelligent devices – мобильные телефоны, коммуникаторы) – это устройства, которыми каждый из нас пользуется постоянно для голосовой связи, реже – для записи или обработки какой-либо информации или для выхода в Интернет. С точки зрения автора, наиболее важные параметры мобильного устройства – это попрежнему качество голосовой связи и время автономной работы батареи. Однако все большее значение приобретают встроенные в них цифровые фото- и видеокамеры. Операционные системы для мобильных устройств отличаются большей компактностью, ввиду более жестких ограничений по памяти (например, собственная память, не расширенная SmartMedia-картой, у используемого автором с 2006 г. мобильного телефона Nokia 3230, кстати, с неплохой встроенной фотокамерой – всего 30 мегабайт). Эпоха доминирования на рынке мобильных телефонов операционных систем типа Symbian, видимо, заканчивается, и они уступают место более современным и обеспечивающим лучший пользовательский интерфейс ОС Google Android и Microsoft Windows Mobile. Для мобильных устройств, как и для КПК, весьма важная характеристика ОС – это ее надежность, в частности, сохранность данных после переполнения памяти, возникающего, например, в результате приема большого числа SMS-сообщений, интенсивной фото- или видеосъемки. К сожалению, ОС Symbian, по опыту автора, ведет себя в этом отношении недостаточно надежно: при приеме "лишнего" SMS-сообщения, не помещающегося в память телефона, он ... блокируется с жалобным сообщением "Memory full", после чего приходится вручную отключать и включать телефон и таким образом перезагружать ОС (к сожалению, SMS-ка, переполнившая чашу терпения ОС, при этом пропадает). С этой точки зрения, ОС для мобильных устройств нуждаются в дальнейшем совершенствовании. Что касается прочего программного обеспечения для мобильных телефонов (игр, утилит, прикладных программ и др.), то при их разработке доминирует Java-технология – одна из постоянных областей научных интересов автора. Изучить основы Java Вы можете, например, по книге автора "Введение в Java-технологию" или по его Интернет-курсу, опубликованному на русском сайте Sun / Oracle. В мобильных телефонах используется платформа ("издание") JME – Java Micro Edition, и любой мобильный телефон, выпускаемый вот уже в течение вот уже более 10 лет, поддерживает Java. Программы на Java для мобильных телефонов называются мидлетами (от аббревиатуры MID – Mobile Intelligent Device). 7 Носимые компьютеры (wearable computers) – для повседневной жизни достаточно экзотические устройства, однако для специальных применений (например, встроенные в скафандр космонавта или в кардиостимулятор) они жизненно важны. Разумеется, их память и быстродействие значительно меньше, чем у настольных компьютеров, но критическим фактором является их сверхвысокая надежность, а для их операционных систем и прочего программного обеспечения – минимальное возможное время ответа (response time) – интервал, в течение которого система обрабатывает информацию от датчиков, от пользователя или из сети, превышение которого грозит катастрофическими последствиями. С этой точки зрения, ОС для носимых компьютеров можно отнести к системам реального времени. Распределенные системы (distributed systems) – это системы, состоящие из нескольких компьютеров, объединенных в проводную или беспроводную сеть. Фактически, таковы ныне все компьютерные системы (вспомните девиз "Сеть – это компьютер"). Все операционные системы должны, таким образом поддерживать распределенный режим работы, средства сетевого взаимодействие, высокоскоростную надежную передачу информации через сеть. Все эти вопросы подробно рассмотрены в данном курсе. Системы реального времени (real-time systems) – вычислительные системы, предназначенные для управления различными техническими, военными и другими объектами в режиме реального времени. Характеризуются основным требованием к аппаратуре и программному обеспечению, в том числе к операционной системе: недопустимость превышения времени ответа системы, т.е. ожидаемого времени выполнения типичной операции системы. Для ОС требования реального времени накладывают весьма жестких ограничения – например, в основном цикле работы системы недопустимы прерывания (так как они приводят к недопустимым временным затратам на их обработку). Системы реального времени – особая весьма серьезная и специфическая область, изучение которой выходит за рамки данного курса. Приведенный обзор дает некоторое представление о разнообразии компьютерных систем в наше время. Для каждой из них должна быть разработана адекватная операционная система. Классификация компьютерных архитектур Компьютерные системы отличаются между собой не только по своим параметрам и своему назначению, но и по своим внутренним архитектурным принципам. Наиболее известны следующие подходы к архитектуре компьютерных систем. CISC (Complicated Instruction Set Computers – компьютеры с усложненной системой команд) – исторически первый подход к компьютерной архитектуре, суть которого в том, что в систему команд компьютера включаются сложные по семантике операции, реализующие типовые действия, часто используемые при программировании и при реализации языков – например, вызов рекурсивных процедур и автоматическое обновление дисплейрегистров, групповые операции пересылки строк и массивов и др. Типичными представителями CISC-компьютеров были: из зарубежных компьютерных систем – машины серии IBM 360/370, из отечественных – многопроцессорные вычислительные комплексы (МВК) "Эльбрус". В IBM 360, например, была реализована команда MVC (move characters), которая выполняла пересылку массива символов (строки) из одной области памяти в другую, причем адреса источника, получателя и длина пересылаемой строки задавались в регистрах. В "Эльбрусе" был аппаратно реализован в общем виде вход в процедуру с передачей через стек параметров, обновлением дисплей-регистров, указывающих на доступные процедуре области локальных данных. Другой пример – в "Эльбрусе" команда считывания в стек значения по заданному адресу осуществляла автоматический проход "косвенной цепочки" заранее не известной длины – если значение оказывалось также адресом, то происходило считывание в стек значения по нему и т.д., до тех пор, пока считанная в стек величина не окажется значением, а не адресом. С одной стороны, понятно стремление авторов CISC-архитектур сделать аппаратуру как можно более "умной". С другой стороны, жесткое "вшивание" сложных алгоритмов выполнения команд в "железо" приводило к тому, что аппаратура исполняла каждый раз некоторый общий алгоритм команды, требовавший десятков или даже сотен тактов процессора, но как-либо оптимизировать выполнение этих команд с использованием конкретной информации о длине строки, косвенной цепочки и т.д. возможности не было. Другой недостаток CISC-архитектур в том, что подобные групповые операции на время их выполнения фактически останавливали работу конвейера (pipeline) - реализованной в 8 любой компьютерной архитектуре аппаратной оптимизации, параллельного выполнения нескольких соседних команд при условии их независимости друг от друга по данным. RISC (Reduced Instruction Set Computers – компьютеры с упрощенной системой команд) – упрощенный подход к архитектуре компьютеров, предложенный в начале 1980-х гг. профессором Дэвидом Паттерсоном (университет Беркли, США) и его студентом Дэвидом Дитцелом (впоследствии – крупным ученым, руководителем компании Transmeta). Примеры семейств RISC-компьютеров: SPARC, MIPS, PA-RISC, PowerPC. Принципы данного подхода: упрощение семантики команд, отсутствие сложных групповых операций (которые могут быть реализованы последовательностями команд, содержащими циклы); одинаковая длина команд (32 бита – архитектура была разработана в расчете на 32-битовые процессоры); выполнение арифметических операций только в регистрах и использование специальных команд считывания из памяти в регистр и записи из регистра в память; отсутствие специализированных регистров (например, дисплей-регистров для адресации доступных областей локальных данных в стеке); использование большого набора регистров (регистрового файла) общего назначения– 512, 1024, 2048 регистров и т.д., в зависимости от конкретной модели процессора; передача при вызове процедур параметров через регистры. Подобная архитектура дает широкий простор для оптимизаций, выполняемых компиляторами, что и демонстрируют компиляторы Sun Studio разработки фирмы Sun / Oracle для ОС Solaris и Linux. RISC-архитектура до сих пор используется при разработке новых компьютеров. VLIW (Very Long Instruction Word – компьютеры с широким командным словом) – подход к архитектуре компьютеров, сложившийся в 1980-х – 1990-х гг. Основная идея данного подхода – статическое планирование параллельных вычислений компилятором на уровне отдельных последовательностей команд и подкоманд. При данной архитектуре каждая команда является "широкой" (long) и содержит несколько подкоманд, выполняемых параллельно за один машинный такт на нескольких однотипных устройствах процессора – например, в таком компьютере может быть два устройства сложения, два логических устройства, два устройства для выполнения переходов и т.д. Задачей компилятора является оптимальное планирование загрузки всех этих устройств в каждом машинном такте и генерация таких (широких) команд, которые позволили бы оптимально загрузить на каждом такте каждое из устройств. Достоинством такой архитектуры является возможность распараллеливания вычислений, недостатком – сложность (по сравнению с RISC-архитектурой). Примеры компьютеров таких архитектур: из зарубежных – компьютеры Cray X/MP, Cray Y/MP и др., разработанные компьютерным гением Сей муром Креем (Cray) и его фирмой Cray Research; из отечественных – многопроцессорный вычислительный комплекс "Эльбрус-3". EPIC (Explicit Parallelism Instruction Computers – компьютеры с явным распараллеливанием) – по архитектуре аналогичны VLIW, но с добавлением ряда важных усовершенствований: например, спекулятивных вычислений – параллельного выполнения обеих веток условной конструкции с вычислением условия. Подход сложился и используется с 1990-х гг. Примеры процессоров данной архитектуры - Intel IA-64, AMD-64. Multi-core computers (многоядерные компьютеры) – получившая наиболее широкую популярность в настоящее время архитектура компьютеров, при которой каждый процессор имеет несколько ядер (cores), объединенных в одном кристалле и параллельно работающих на одной и той же общей памяти, что дает широкие возможности для параллельных вычислений. В настоящее время известны многоядерные процессоры фирмы Intel (Cure 2 Duo, Dual Core и др.), а также мощные многоядерные процессоры фирмы Sun / Oracle: Ultra SPARC-T1 ("Niagara") - 16-ядерный процессор; Ultra SPARC-T2 ("Niagara2") – 32-ядерный процессор. Все ведущие фирмы мира заняты разработкой и выпуском все более мощных многоядерных процессоров. Соответственно, создатели операционных систем для таких компьютеров разрабатывают базовые библиотеки программ, позволяющие в полной мере использовать возможности параллельного выполнения на многоядерных процессорах. Hybrid processor computers (компьютеры с гибридными процессорами) – новый, все шире распространяющийся подход к архитектуре компьютеров, при котором процессор имеет гибридную структуру – состоит из (многоядерного) центрального процессора (CPU) и (также многоядерного) графического процессора (GPU – Graphical Processor Unit). Такая архитектура была разработана, в связи с необходимостью параллельной обработки графической и мультимедийной информации, что особенно актуально для компьютерных игр, просмотре на компьютере высококачественного цифрового видео и др. Гибридная архитектура является новым "интеллектуальным вызовом" для разработчиков компиляторов, 9 которым необходимо разработать и реализовать адекватный набор оптимизаций, как для центральных, так и для графических процессоров. Примерами таких архитектур являются новые процессоры фирмы AMD, а также графические процессоры серии Tesla фирмы NVidia. Основные компоненты операционной системы Рассмотрим теперь основные части ОС. Ядро (kernel) – низкоуровневая основа любой операционной системы, выполняемая аппаратурой в особом привилегированном режиме (подробно о нем речь в следующей лекции). Ядро загружается в память один раз и находится в памяти резидентно – постоянно, по одним и тем же адресам. Подсистема управления ресурсами (resource allocator) – часть операционной системы, управляющая вычислительными ресурсами компьютера - оперативной и внешней памятью, процессором и др. Управляющая программа (control program, supervisor) – подсистема ОС, управляющая исполнением других программ и функционированием устройств ввода-вывода. Ключевые термины CISC (Complicated Instruction Set Computer – компьютер с усложненной системой команд) – исторически первый подход к компьютерной архитектуре, суть которого в усложненности в системы команд вследствие реализации в них сложных по семантике операций, реализующие типовые действия, часто используемые при программировании и при реализации языков (например, групповая пересылка строк). EPIC (Explicit Parallelism Instruction Computers – компьютеры с явным распараллеливанием команд) – подход к архитектуре компьютера, аналогичный VLIW, но с добавлением ряда усовершенствований, например, спекулятивных вычислений – параллельного выполнения обеих веток условной конструкции с вычислением условия. RISC (Reduced Instruction Set Computer – компьютер с упрощенной системой команд) – упрощенный подход к архитектуре компьютеров, характеризующийся следующими принципами: упрощение семантики команд; отсутствие сложных групповых операций; одинаковая длина команд (32 или 64 бита, по размеру машинного слова); выполнение арифметических операций только в регистрах и использование специальных команд записи и считывания регистр память; отсутствие специализированных регистров; использование большого набора регистров общего назначения (регистрового файла); передача при вызове процедур параметров через регистры. VLIW (Very Long Instruction Word – компьютеры с широким командным словом) – подход к архитектуре компьютеров, основанный на следующих принципах: статическое планирование параллельных вычислений компилятором на уровне отдельных последовательностей команд и подкоманд.; представление команды как "широкой" - содержащей несколько подкоманд, выполняемых параллельно за один и тот же машинный такт на нескольких однотипных устройствах процессора – например, двух устройствах сложения и двух логических устройствах. Внешние устройства - см. Устройства ввода-вывода Гибридный процессор – новый, все шире распространяющийся подход к архитектуре компьютеров, при котором процессор имеет гибридную структуру – состоит из (многоядерного) центрального процессора (CPU) и (также многоядерного) графического процессора (GPU – Graphical Processor Unit). Инициатива по надежным и безопасным вычислениям (trustworthy computing initiative) – инициатива корпорации Microsoft (2002), целью которой является повышение надежности и безопасности программного обеспечения, прежде всего – операционных систем. Карманный портативный компьютер (КПК, органайзер) - миниатюрный компьютер, помещающийся на ладони или в кармане, по своим параметрам почти сравнимый с ноутбуком, предназначенный для повседневного использования с целью записи, хранения и чтения информации, в том числе – мультимедийной, и коммуникации через Интернет. 10 Кластеры компьютеров – группы компьютеров, физически расположенные рядом и соединенные друг с другом высокоскоростными шинами и линиями связи. Многоцелевые компьютеры (компьютеры общего назначения, mainframes) – традиционное историческое название для компьютеров, распространенных в 1950-х – 1970х гг., использовавшихся для решения любых задач. Многоядерный компьютер (multi-core computer) – наиболее распространенная в настоящее время (2010 г.) архитектура компьютеров, при которой каждый процессор имеет несколько ядер (cores), объединенных в одном кристалле и параллельно работающих на одной и той же общей памяти, что дает широкие возможности для параллельных вычислений. Мобильное устройство (мобильный телефон, коммуникатор) – карманное устройство, предназначенное для голосовой связи, обмена короткими сообщениями, а также для чтения, записи и воспроизведения мультимедийной информации и коммуникации через Интернет. Настольный компьютер – персональный компьютер, размещаемый на рабочем столе и используемый на работе или дома. Носимый компьютер – сверхминиатюрный компьютер, встроенный в одежду или имплантированный в тело человека, предназначенный для обработки информации от датчиков, управления специализированными устройствами (например, кардиостимулятором), или выдачи рекомендаций по навигации и выполнению других типовых действий человеком. Операционная система – базовое системное программное обеспечение, управляющее работой компьютера и являющееся посредником (интерфейсом) между аппаратурой, прикладным программным обеспечением и пользователем компьютера. Память – часть компьютера, хранящая данные и программы. Подсистема управления ресурсами – компонента операционной системы, управляющая вычислительными ресурсами компьютера. Портативный компьютер (ноутбук, лэптоп) – миниатюрный компьютер, по своим параметрам не уступающий настольному, но по своим размерам свободно помещающийся в небольшую сумку и предназначенный для использования в поездке, дома, на даче. Прикладное программное обеспечение – программы, предназначенные для решения различных классов задач. Распределенная система – вычислительная система, состоящая из нескольких компьютеров, объединенных в проводную или беспроводную сеть. Система реального времени – вычислительная система, предназначенная для управления техническим, военным или другим объектом в режиме реального времени. Суперкомпьютер – мощный многопроцессорный компьютер, производительностью до нескольких петафлопс (1015 вещественных операций в секунду), предназначенный для решения задач, требующих больших вычислительных мощностей, например, моделирование, прогнозирование погоды. Управляющая программа – компонента операционной системы, управляющая исполнением других программ и функционированием устройств ввода-вывода. Устройства ввода-вывода – устройства компьютера, обеспечивающие ввод информации в компьютер и вывод результатов работы программ в форме, воспринимаемой пользователем или другими программами Центральный процессор – центральная часть компьютера, выполняющая его команды (инструкции) Ядро – низкоуровневая основная компонента любой операционной системы, выполняемая аппаратурой в привилегированном режиме, загружаемая при запуске ОС и резидентно находящаяся в памяти Краткие итоги В настоящее время наблюдается бурное развитие операционных систем (Windows, Linux, Solaris, MacOS и др.) , в том числе – с открытым исходным кодом (Windows Research Kernel, Linux, OpenSolaris и др.). 11 По мнению Дэвида Проберта (менеджера Microsoft по развитию Windows), Знание ОС способствует становлению зрелого мышления программиста и хорошему знанию сетевых технологий и протоколов, виртуальных машин, методов современного программирования. Операционная система (ОС) – общее системное программное обеспечение, являющееся интерфейсом между аппаратурой компьютера, пользователем, прикладным программным обеспечением и другими компьютерами в сети. Цели работы ОС – обеспечение удобства, эффективности, надежности и безопасности выполнения пользовательских программ, использования компьютерного оборудования и внешних устройств, подключенных к компьютеру. Особая важность в настоящее время придается инициативе по надежным и безопасным вычислениям (trustworthy computing) фирмы Microsoft. Компонентами компьютерной системы (в широком смысле слова) являются аппаратура, операционная система, прикладное программное обеспечение, пользователи (клиенты) – люди и другие компьютеры в сети. Компьютерные системы очень разнообразны по своему назначению и по архитектуре. По своему назначению и параметрам различаются суперкомпьютеры, многоцелевые компьютеры (mainframes), кластеры компьютеров, настольные компьютеры, портативные компьютеры, карманные портативные компьютеры (КПК), мобильные устройства (мобильные телефоны, коммуникаторы), носимые компьютеры, распределенные компьютерные системы, компьютерные системы реального времени. Основные архитектуры компьютеров: CISC, RISC, VLIW, EPIC, многоядерные компьютеры, компьютеры с гибридными процессорами. Основные компоненты операционной системы: ядро, подсистема управления ресурсами, управляющая программа. Набор для практики Вопросы 1. Назовите наиболее распространенные операционные системы, в том числе – с открытым исходным кодом. 2. Дайте определение операционной системы. 3. Каковы цели работы операционной системы? 4. Назовите компоненты компьютерной системы (включая программное обеспечение и пользователей). 5. Назовите основные виды компьютерных систем, различающиеся по своему назначению и параметрам. 6. Назовите основные архитектуры компьютерных систем и кратко определите, в чем суть каждой из них. 7. Каковы основные компоненты операционной системы? Темы для курсовых работ, рефератов, эссе 1. Краткий обзор современных операционных систем (реферат). 2. Классификация современных компьютерных систем (реферат). 3. Обзор современных компьютерных архитектур (реферат). 12 2. Лекция: История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени В лекции дан исторический обзор ОС, как зарубежных, так и отечественных (ОС ДИСПАК, ОС "Эльбрус" и др.). Рассмотрены основные режимы работы пользователей и заданий в ОС (пакетный, мультипрограммирование, разделение времени). Содержание Введение История ОС Диалекты UNIX Отечественные операционные системы Особенности операционных систем для компьютеров общего назначения (mainframes) Распределение памяти в однозадачной ОС с пакетной обработкой заданий ОС пакетной обработки с поддержкой мультипрограммирования Режим разделения времени и особенности ОС с режимом разделения времени Ключевые термины Краткие итоги Набор для практики o Вопросы o Темы для курсовых работ, рефератов, эссе Введение Операционные системы имеют долгую (более 50 лет) и весьма насыщенную историю. Не следует полагать, что в России и в СССР использовались и используются лишь зарубежные ОС. Известны также выдающиеся, оригинальные отечественные работы в данной области, их мы также рассмотрим. По мере эволюции ОС были реализованы все более гибкие и удобные режимы их использования. История ОС В ранних mainframe-компьютерах (1940-1950 гг.), первым из которых был компьютер ENIAC (1947 г., США), операционные системы отсутствовали. Обращение к памяти в этих компьютерах осуществлялось по реальным (физическим) адресам, а обращение к внешним устройствам (например, к устройству ввода с перфокарт или накопителю на магнитной ленте) осуществлялось специальными командами, также по физическим адресам. Подобные компьютеры были весьма громоздкими, каждый из них занимал большой зал, в котором пользователи по очереди работали на компьютере, используя столь неудобный интерфейс, как инженерный пульт. Каждый пользователь перед уходом "с машины" (как тогда говорили) останавливал и "обнулял" ее нажатием кнопок на пульте и уступал место следующему пользователю, который вводил свою программу и данные с перфокарт или перфоленты, набирал ее начальный адрес тумблерами на пульте и запускал ее с помощью специальной кнопки. При любом сбое или ошибке в программе, в ситуации приходилось разбираться, изучая комбинации лампочек на пульте, воспроизводящие в двоичном виде содержимое регистров. Разумеется, подобный способ взаимодействия с компьютером был очень неудобен. Требовалась хотя бы минимальная автоматизация. Для этого в 1950-х – 1960-х гг. – были созданы диспетчеры (dispatchers) - предшественники ОС, системные программы, управлявшие прохождением пакета задач, вводимых с перфокарт. Например, такой диспетчер (названный ДМ-222) использовался на ЭВМ М-222 в середине 1970-х гг., на котором студенты мат-меха, в том числе и автор курса, пропускали свои студенческие задания. Выглядело это следующим образом. Студент писал свою программу (или исправления к ней – так называемую "добивку") на специальных бланках и сдавал в перфорацию, затем получал перфокарты и отдавал колоду перфокарт с программой оператору машинного зала. Через несколько часов он мог рассчитывать получить результаты своей программы – колоду перфокарт обратно и распечатку результатов. В машинном зале оператор вводил очередное задание с перфокарт. Программа-диспетчер копировала образ введенной колоды перфокарт с заданием на ленту ввода, на которой хранились все образы заданий в хронологическом порядке их ввода, независимо от требуемых для них ресурсов – времени и объема памяти. Диспетчер осуществлял запуск заданий по очереди, по принципу FIFO (First-In-First-Out) – в по- 13 рядке поступления. Выбирая из очереди некоторое задание, диспетчер размещал его в памяти и запускал. По окончании задания (или при его прерывании вследствие ошибки) на печатающее устройство выдавалась распечатка результатов. Затем управление передавалось следующему заданию. Такой режим доступа к компьютеру был, конечно, гораздо удобнее, чем работа с пульта. Недостатки его в том, что, во-первых, программы пропускались по очереди (отсутствовала одновременная обработка нескольких заданий), во-вторых, ресурсы, требуемые для выполнения задания, никак не учитывались, и программа, требующая для выполнения всего 1 мин., должна была ожидать завершения большой задачи, требовавшей для выполнения, например, пяти часов, - только потому, что последняя была раньше введена в систему. В 1960-х – 1970-х гг. были разработаны классические операционные системы, которые все более и более усложнялись. Все более сложными становились их системы файлов и другие компоненты ОС. Наиболее известные из операционных систем этого периода: среди зарубежных - ATLAS, MULTICS, OS IBM/360, среди отечественных – ОС ДИСПАК для ЭВМ БЭСМ-6. Для классических операционных систем были характерны следующие основные возможности: 1. мультипрограммирование (multi-programming) – одновременная обработка нескольких заданий; 2. пакетная обработка (batch mode) – обработка пакета заданий, введенных с перфокарт или с терминалов, с учетом их приоритетов и требуемых ресурсов 3. разделение времени (time sharing) – параллельная работа нескольких пользователей с терминалов (телетайпов или дисплеев), управлявших прохождением своих заданий, выполнявших их ввод в текстовых редакторах, компиляцию, выполнение и отладку; 4. управление процессами – параллельное (или попеременное, если компьютер был однопроцессорным) выполнение пользовательских процессов; возможность явного запуска параллельного процесса. Разработка каждой операционной системы для каждой новой модели компьютера требовала многих лет напряженной высококвалифицированной работы. При этом каждая ОС первоначально разрабатывалась на низкоуровневом языке – языке ассемблера. Поэтому еще в 1960-х гг. возникла идея разработки мобильных (переносимых) ОС – операционных систем, которые могли бы использоваться на нескольких семействах компьютеров путем переноса их кода (возможно, с небольшими изменениями) с более старых моделей на более новые. Заметим, что термин мобильный используется здесь в ином понимании, отличном от того, к которому мы привыкли ныне (мобильные телефоны и операционные системы для них). Первая мобильная ОС была разработана в 1970 г. Брайаном Керниганом (B. Kernighan) и Деннисом Ритчи (D. Ritchie) в фирме AT & T и получила название UNIX. Даже в самом ее названии заложено своего рода противопоставление MULTICS (multi - много, uni – один) – последняя, известна своей усложненностью. Этим названием авторы подчеркивали основную идею UNIX – унификацию и упрощение представления файлов и операций над ними (в UNIX файл – это последовательность байтов), пользовательских программ и процессов. Унифицированным, не зависимым от целевой аппаратной платформы, был также исходный код UNIX, который был полностью написан на специально разработанном новом языке Си (основными авторами Си, как и UNIX, являются Б. Керниган и Д. Ритчи). Использование языка высокого уровня для разработки UNIX было революционным шагом в истории ОС и позволило, во-первых, значительно ускорить и облегчить разработку, во-вторых – перенести UNIX на многие модели компьютеров (для которых при этом, разумеется, необходимо было разработать компилятор с языка Си). Впервые система UNIX была использована в 1970 г. на миникомпьютере PDP-10. Компьютеры фирмы PDP образца начала 1970-х гг. принято относить к классу миникомпьютеров. Хотя данное название с современной точки зрения не вполне правомерно: такой компьютер занимал ... два небольших шкафа, по сравнению с mainframeкомпьютером образца 1960-х гг., занимавшим целый зал. Объем оперативной памяти миникомпьютеров составлял всего порядка 32 килобайт (!). Однако на них успешно работала ОС UNIX (были и другие ОС – например, RSX-11), был компилятор с языка Паскаль, была реализована удобная система файлов и программа для работы с ними, были доступны математические библиотеки программ. В начале 1980-х годов появились персональные компьютеры. Операционные системы для них фактически повторили в своем развитии операционные системы для компьютеров общего назначения: в них были использованы аналогичные идеи и методы. Однако первые 14 персональные компьютеры были менее мощными, чем mainframes, как по объему памяти, так и по быстродействию и разрядности микропроцессора. Первый распространенный микропроцессор фирмы Intel был 8-разрядным, и для него была разработана также 8-разрядная операционная система CP/M. В 1975 г. была создана фирма Microsoft, и ее первой разработкой была 16-разрядная операционная система MS DOS для персональных компьютеров с процессорами Intel 8086 (или, коротко, x86). В командном языке MS-DOS чувствуется явное влияние UNIX, однако MS-DOS предоставляет гораздо меньшие возможности командного языка. В начале 1980-е гг. фирма Apple выпустила персональные компьютеры Lisa и Macintosh с операционной системой MacOS. Ее характерной чертой была реализация удобного графического пользовательского интерфейса (GUI) в виде окон, меню, "иконок" и многих других элементов GUI, к которым мы с Вами ныне так привыкли. MacOS стала первой ОС с развитой поддержкой GUI (для сравнения, MS-DOS предоставляла возможности работы непосредственно на командном языке). В конце 1980-х - начале 1990-х гг., под влиянием MacOS, Microsoft разработала графическую оболочку Windows над операционной системой MS-DOS. Первая версия Windows, таким образом, еще не была операционной системой; она запускалась командой win из командного языка MS-DOS. Однако многие современные черты GUI, характерного для Windows, ставшие "родными" для пользователей Windows, в ней уже присутствовали. Затем были выпущены Windows 3.x и Windows for Workgroups (уже операционные системы), в 1995 г. – Windows 95 (с развитыми мультимедийными возможностями, большим набором встроенных драйверов для различных устройств и поддержкой механизма Plug-and-Play подключения нового устройства без остановки компьютера) и Windows NT с развитыми сетевыми возможностями и повышенной надежностью. Именно Windows NT стала основой для последующего развития Windows. В настоящее время наиболее популярными моделями Windows являются Windows XP (поддержка которой фирмой Microsoft уже завершается – система выпущена в 2001 г.), Windows 2003 Server, Windows Vista, Windows 2008 Server и Windows 7. В начале 1990-х гг. появилась первая версия ОС Linux (ОС типа UNIX с открытыми исходными кодами ядра), которая постепенно приобрела значительную популярность, но, главным образом, используется на серверах. Большинство клиентов (пользователей) в мире предпочитают на своих компьютерах Windows или MacOS (заметим, что, например, в США и Канаде компьютеры Macintosh более популярны, чем Windows-машины с процессорами Intel или их аналогами. Не будем также забывать, что в ответ на такой, на первый взгляд, простой вопрос: "Какая ОС самая популярная в мире?" даже сотрудники Microsoft не отвечают "Windows". Дело в том, что наиболее популярными в мире компьютерными устройствами являются не настольные или портативные компьютеры, а более дешевые и компактные мобильные телефоны, для которых пока первенство удерживает специализированная ОС семейства Symbian, которая, в частности, используется в большинстве мобильных телефонов крупнейшей фирмы Nokia. Операционную систему Symbian активно догоняет на рынке ОС для мобильных устройств новая ОС Google Android. Так что, операционные системы семейства Windows по своей распространенности оказываются лишь на втором месте. Диалекты UNIX Одним из наиболее широко используемых семейств операционных систем с 1970-х гг. является UNIX. Существуют сотни диалектов UNIX. Все они имеют ряд общих возможностей, в том числе – мощные командные языки и развитые системные библиотеки. Однако все они несколько отличаются друг от друга. Фактически большинство крупных фирм в области ИТ разработали или разрабатывают собственные диалекты UNIX. Среди них наиболее известны следующие. Berkeley Software Distribution (BSD), в настоящее время – FreeBSD (University of Berkeley) – один из наиболее известных диалектов UNIX, разработанный в Университете Беркли, США. В нем впервые были реализованы сетевые сокеты. Именно этот диалект был положен в основу первой версии ОС Solaris фирмы Sun (Solaris 1.x) при ее создании в 1982 г. Один из авторов данного диалекта – Билл Джой (Bill Joy), один из четверых легендарных создателей фирмы Sun. System V Release 4 (SVR4) – диалект UNIX, разработанный в фирме AT&T. Для него наиболее характерны расширенные возможности параллельного многопоточного про- 15 граммирования (multi-threading). Данный диалект был положен в основу второй версии ОС Solaris (Solaris 2.x) фирмы Sun в начале 1990-х годов. Linux (RedHat, SuSE, Mandrake, Caldera, Debian, Fedora и др.) – ОС типа UNIX со свободно распространяемым с исходными кодами ядром. Первая версия Linux была разработана в начале 1990-х гг. В настоящее время диалекты Linux активно используются как серверные ОС (ОС, управляющие работой всевозможных серверов), а также как основа для разработки ОС для мобильных устройств. Solaris (Sun Microsystems, ныне – Oracle / Sun) – один из наиболее известных и развитых диалектов UNIX. Имеет удобную графическую оболочку, развитые средства параллелизма и синхронизации процессов, удобные сетевые возможности (в частности, классическую сетевую файловую систему NFS), ряд новых оригинальных файловых систем (в частности, ZFS – файловая система с большим размером файлов и возможностью криптования информации). В настоящее время распространяется ОС Solaris 10. IRIX (Silicon Graphics) – диалект UNIX, разработанный фирмой Silicon Graphics (SGI), США, широко известным производителем графических рабочих станций. HP-UX (Hewlett-Packard) – диалект UNIX, разработанный и используемый одной из крупнейших "акул" в мире ИТ – фирмой Hewlett-Packard. Digital UNIX (DEC) – диалект UNIX, разработанный в начале – середине 1990-х гг. фирмой Digital Equipment Corporation (DEC), впоследствии приобретенной фирмой Compaq. Первая версия UNIX, поддерживавшая 64-разрядные процессоры. Отечественные операционные системы При анализе истории развития области ИТ следует иметь в виду особые условия, в которых развивались эти разработки как в СССР (России), так и в США, начиная с 1950-х гг. – "холодная война" и "железный занавес". Вследствие этого, все эти разработки, как в области аппаратуры, так и в области программного обеспечения, были строго засекречены (по мнению автора, в СССР – даже более строго, чем в США, так как о работах американских специалистов мы все же имели возможность узнавать из журналов). Такая ситуация приводила к тому, что аналогичные идеи подчас возникали и реализовывались по обе стороны "железного занавеса" примерно в одно и то же время, при почти полном отсутствии информации о работах друг друга. Однако в этом были и своего рода положительные стороны: на эти работы выделялись значительные средства правительством и отраслевыми министерствами, на эти средства создавались и развивались весьма сильные команды разработчиков (прежде всего – в области аппаратуры, операционных систем и компиляторов). В конце 1980-х – начале 1990-х гг., в известный переходный период в СССР и России, когда начинали создаваться группы для работы по outsourcing – проектам, финансируемые фирмами США, американские специалисты были просто поражены, обнаружив в России сильнейшие исследовательские и промышленные группы в области ИТ, предлагающие и реализующие массу своих идей, находящиеся в курсе новейших разработок, а своим теоретическим уровнем, разработками в области структур данных и эффективных алгоритмов подчас опережавшие лучшие американские команды. Автору этих строк посчастливилось стать руководителем одной из таких групп, работавшей в течение многих лет с фирмой Sun в стенах математико-механического факультета СПбГУ. Все описанные тенденции существенно повлияли на разработку аппаратуры и операционных систем. Отечественные разработчики, почти ничего не зная об аналогичных работах американских коллег, создавали свои оригинальные системы, в том числе – ОС. Например, идея многопоточности (multi-threading) была реализована в ОС "Эльбрус" [12] еще в конце 1970-х гг., а в популярных зарубежных ОС (UNIX, Solaris, Windows NT) многопоточность появилась только в конце 1980-х – начале 1990-х гг. К сожалению, имело место и существенное отставание советских и российских ИТ-специалистов от американцев – прежде всего, в области разработки элементной базы и технологии производства компьютеров, а также в области графических пользовательских интерфейсов (GUI). Среди передовых оригинальных отечественных разработок в области компьютерной аппаратуры и ОС 1960-х – 1970-х гг. следует выделить прежде всего ЭВМ БЭСМ-6, ее операционные системы: ОС ДИСПАК, ОС ДИАПАК, ОС ИПМ и ее системное и прикладное программное обеспечение. Разработчиком БЭСМ-6, ОС ДИСПАК и ОС ДИАПАК был Институт точной механики и вычислительной техники АН СССР под руководством академика Сергея Алексеевича Лебедева, основателя всей нашей отечественной вычислительной техники. Разработчик ОС ИПМ – Институт прикладной математики АН СССР. ЭВМ БЭСМ-6 и ее программное обеспечение следует признать уникальными. В их развитии участвовали многие академические и 16 университетские коллективы не только СССР, но и зарубежных стран - достаточно вспомнить такие системы, как АЛГОЛ-ГДР - реализацию расширения Алгола-60 с развитыми математическими библиотеками, выполненную нашими коллегами из Германии, а также реализацию Паскаля для БЭСМ-6, разработанную специалистами из Польской Академии наук. Операционные системы для БЭСМ-6 поддерживали пакетный (с учетом приоритетов и ресурсов заданий) и диалоговый режимы взаимодействия с компьютером, страничную организацию виртуальной памяти, работу с внешними устройствами и телекоммуникационными каналами, работу в локальных сетях. К каждой БЭСМ-6 были подключены десятки терминалов, работавших под управлением диалоговых систем ДИМОН, ДЖИН и др. (это при объеме оперативной памяти БЭСМ-6 всего в 32 страницы по 4096 байтов и быстродействии до 1 млн. операций в секунду). Работу БЭСМ-6 и ее ОС отличала высокая надежность. Руководитель разработки ОС ДИСПАК – В.Ф. Тюрин. Другой передовой отечественной разработкой 1970-х – 1980-х гг. была разработка многопроцессорных вычислительных комплексов (МВК) "Эльбрус-1" и "Эльбрус-2" [12]. В разработке программного обеспечения системы "Эльбрус" автор курса со своей командой принимал активное участие в течение 15 лет. Идейным вдохновителем проекта "Эльбрус" стал сам С.А. Лебедев, затем им руководили академик Всеволод Сергеевич Бурцев, а после него – чл.-корр. АН СССР Борис Арташесович Бабаян. Следует признать, что у "Эльбруса" были зарубежные прототипы и задолго до его появления были написаны академические зарубежные работы, заложившие научные основы подобных компьютерных архитектур, например, [13]. Коммерческим прототипом "Эльбруса" была известная серия компьютеров фирмы Burroughs (США): B5000 / B5500 / B6700 / B7700. Однако разработчикам "Эльбруса" и его операционной системы удалось предложить и реализовать целый ряд собственных оригинальных идей и методов. Основными принципами "Эльбруса", как и его предшественников, являлись: теговая архитектура (каждое слово памяти, кроме данных, содержало тег – код типа данных, хранящихся в этом слове, по которому аппаратура контролировала правильность выполнения операции), динамизм и аппаратная поддержка типичных (подчас весьма сложных) последовательностей действий, используемых при реализации языков высокого уровня - например, вход в процедуру по указателю на нее, с установкой дисплей-регистров, ссылающихся на доступные процедуре области локальных данных. ОС "Эльбрус" поддерживала создание процессов и операции над ними, аналогичные тем, которые впоследствии в зарубежных разработках были названы многопоточностью (multi-threading); была реализована математическая (виртуальная) память с поддержкой страничного распределения виртуальной памяти (на диске) и сегментного распределения физической (оперативной) памяти. Динамизм выражался в том, что отсутствовала статическая линковка; все программы и модули загружались в память только динамически, при первом вызове. Также динамически, при первом запросе, по прерыванию, выделялся каждый массив математической памяти. Подобные принципы были для своего времени передовыми, использование тегов значительно повысило надежность. Однако, с современной точки зрения, идеологию "Эльбруса", повидимому, нельзя считать гибкой и эффективной, так как все аппаратные операции и соответствующие действия ОС были реализованы в общем виде, и практически отсутствовала какая-либо возможность оптимизаций, например, для более быстрого вызова процедуры в случае отсутствия необходимости обращения к ее аргументам, для быстрого доступа к статической области памяти и т.д. Более подробно принципы "Эльбруса" описаны в монографии [12]. Были и другие интересные отечественные разработки новых архитектур компьютеров и их операционных систем, прежде всего - оригинальные специализированные компьютеры для различных применений и их операционные системы (в основном, по своему классу и назначению, они были системами реального времени). Однако в начале 1970-х годов в развитии отечественной вычислительной техники и ее системного программного обеспечения начался новый, неожиданный для большинства пользователей и специалистов, этап. Правительство СССР приняло беспрецедентное решение о создании, в качестве основной на достаточно долгий период времени (как изначально планировалось, на 20-30 лет, что оказалось утопией), отечественной серии -Единой Системы ЭВМ (ЕС ЭВМ) - путем копирования американских компьютеров серии IBM 360. Соответственно, все базовое системное программное обеспечение, в том числе и ОС, также было адаптировано к использованию в СССР (либо использовалось в оригинальном виде – с сообщениями на английском языке и т.д.). Это решение вызвало большие проблемы с финансированием у разработчиков отечественных архитектур компьютеров. Это также вызвало большие сложности у пользователей и разработчиков программного обеспечения, так как 17 далеко не все хорошо владели английским языком (ныне в этом последнем отношении ситуация гораздо лучше). Появились, например, системы-обертки, обеспечивающие русскоязычный интерфейс: с их помощью все задания для ЕС писались с использованием русскоязычной мнемоники, затем конвертировались в англоязычный Job Control Language (язык управления заданиями IBM 360), а все сообщения, выдаваемые в качестве результатов, переводились на русский язык. Это было интересным подходом, однако не прижилось. Документация по IBM 360 постепенно была переведена на русский язык, появилась русскоязычная справочная и учебная литература по ЕС ЭВМ. К сожалению, отечественные аналоги аппаратуры IBM 360 – машины серии ЕС ЭВМ – оказались гораздо менее надежными, чем их прототипы. В течение еще нескольких лет было принято еще одно правительственное решение – об аналогичном копировании американских миникомпьютеров серий PDP 10 и PDP 11, под общим названием "Система Мини-ЭВМ" (СМ ЭВМ). Были выпущены компьютеры этой серии СМ-1, СМ-2, СМ-3 и СМ-4. Были и другие аналогичные работы по копированию зарубежных архитектур компьютеров и выпуске на этой основе отечественных аналогов. Фактически, можно сказать, что, благодаря подобному подходу, срок использования зарубежных ОС в СССР и в России был продлен не менее чем на 15-20 лет, что просто беспрецедентно. Копирование машин IBM 360 и PDP, с одной стороны, дало возможность советским программистам освоить новые развитые операционные системы, языки программирования, библиотеки программ, с другой – отбросило нашу отечественную вычислительную технику еще дальше назад. Один из классиков компьютерной науки, профессор Эдсгер Дейкстра (E. Dijkstra) в 1977 г. на научном семинаре в Ленинграде в АН СССР не без иронии заметил, что "решение русских о копировании IBM-360 можно считать серьезной победой США в холодной войне". Разумеется, история отечественных ОС на этом не закончилась. Например, в настоящее время ведется разработка отечественной свободно распространяемой операционной системы на базе Linux. Среди отечественных программистов многие являются специалистами весьма высокого уровня по операционным системам. Особенности операционных систем для компьютеров общего назначения (mainframes) Пакетный режим. Более подробное рассмотрение операционных систем начнем с особенностей ОС для mainframes. Один из основных режимов работы ОС – пакетный режим (batch mode) – режим пропуска и одновременной обработки пользовательских заданий (jobs) – программ, введенных с внешнего носителя или с терминала, с учетом их приоритетов и требуемых ими ресурсов. При этом ОС пытается максимально сэкономить время пропуска пакета заданий, формируя их оптимальным образом, - например, запускать на процессоре короткое задание, пока более длинное выполняет ввод-вывод. Уже в самых первых ОС была реализована другая основная возможность - автоматическая передача управления от одного задания к другому при завершении или прекращении предыдущего задания. Для этого ОС использует резидентный (постоянно находящийся в памяти по фиксированным адресам) монитор – программу, осуществляющую поочередную передачу управления от задания к заданию, по мере их завершения. Алгоритм работы монитора следующий. При запуске компьютера управление передается монитору, который выбирает очередное задание и передает ему управление. По окончании задания управление возвращается монитору, и т.д. Распределение памяти в однозадачной ОС с пакетной обработкой заданий Оно очень простое: операционная система занимает постоянно смежную область памяти (например, по меньшим адресам), остальная область памяти отдана пользовательской программе. Такая операционная система является однозадачной – обрабатывает, выполняет и хранит в оперативной памяти в каждый момент времени только одно пользовательское задание (программу). По окончании текущего задания ОС загружает в освободившуюся область памяти следующее задание. Разумеется, такой режим работы недостаточно удобен и эффективен, так как при выполнении задания возможны прерывания на выполнение ввода-вывода и другие паузы, во время которых ОС могла бы дать возможность выполняться другим очередным заданиям. 18 Операционная система Область пользовательской программы Рис. 2.1. Распределение памяти в простой системе пакетной обработки ОС пакетной обработки с поддержкой мультипрограммирования Более развитые операционные системы поддерживают режим мультипрограммирования – одновременной обработки и размещении в памяти сразу нескольких пользовательских заданий. Распределение памяти в такой системе изображено на рис. 2.2. В такой системе ОС занимает по-прежнему смежную область памяти по меньшим адресам, однако вслед за областью ОС размещаются несколько смежных областей памяти, занимаемых пользовательскими программами. Их число и размеры могут меняться. Особенности ОС с поддержкой мультипрограммирования следующие. Использование программ ввода-вывода, поддерживаемых операционной системой. При однозадачном режиме (см. предыдущий параграф) подобной необходимости не возникало: каждое очередное задание получало в полное распоряжение все ресурсы компьютера, в том числе – устройства ввода-вывода. При выполнении последнего процессор простаивал. В мультипрограммном режиме уже возникает потребность в реализации специальных подпрограмм для ввода-вывода, которые могли бы вызываться пользователем или операционной системой в необходимых случаях. Вызов в одной из пользовательских программ подпрограммы ввода-вывода означает для ОС возможность во время его выполнения предоставить процессор другому пользовательскому заданию. 0 Операционная система Задание 1 Задание 2 Задание 3 Задание 4 512К Рис. 2.2. Распределение памяти в системе пакетной обработки с поддержкой мультипрограммирования 19 Управление памятью. Поскольку заданий в памяти может быть несколько, причем число и размеры их областей могут меняться, перед операционной системой возникает задача распределения памяти для пользовательских заданий – выделения памяти для загружаемого пользовательского задания и ее освобождения после завершения каждого задания. При решении этой классической задачи возникает целый ряд проблем: хранение списков свободной и занятой памяти, реализация оптимального алгоритма поиска и выделения свободной области памяти, реализация освобождения памяти, фрагментация - дробление свободной памяти на мелкие участки, вследствие неточного совпадения размеров свободных и требуемых участков памяти и др. Все эти проблемы и общепринятые алгоритмы их решения подробно описаны в классической монографии Д. Кнута [15] и будут рассмотрены подробно в курсе. Планирование загрузки процессора (CPU scheduling) – реализация в ОС алгоритмов выбора очередного задания из набора загруженных в память заданий и выделения кванта времени центрального процессора очередному выбранному заданию. В отличие от однозадачного режима, в режиме мультипрограммирования операционная система, таким образом, в определенные моменты времени должна сделать выбор, какое из нескольких загруженных в память заданий запустить. Алгоритмы планирования и диспетчеризации процессов подробно рассмотрены ниже в данном курсе. Управление внешними устройствами и буферизация ввода-вывода. В однозадачном режиме загруженная в память пользовательская программа для вывода на печать могла выполнить специальную машинную команду, которая выводила на устройство печати очередную строчку, что не вызывало проблем и не проводило к какой-либо путанице, вследствие монопольности "владения" компьютером очередным заданием. Однако в мультипрограммном режиме ситуация иная. Если сохранить тот же режим вывода на печать, то на печатающее устройство могут быть выведены фрагменты, принадлежащие разным заданиям, что недопустимо. Для группировки и отделения выводимой информации различных заданий друг от друга в мультипрограммной ОС используется буферизация вывода (spooling) – хранение для каждого задания буфера его вывода (в виде области памяти или файла), накопление в буфере выводимой заданием информации и ее вывод полностью на устройство (принтер) при завершении задания. Режим разделения времени и особенности ОС с режимом разделения времени Когда в составе компьютерных систем появились терминалы (вначале телетайпы, затем дисплеи), возникла необходимость реализации в ОС режима разделения времени (time sharing) – возможности одновременной работы пользователей со своими заданиями с терминалов, ввода заданий в систему, их запуска (при наличии свободного процессора), управления заданиями с терминала, их приостановки, отладки, визуализации на терминале их результатов. Рассмотрим особенности ОС с режимом разделения времени. Хранение заданий в памяти или на диске. Ресурсы процессора в ОС с разделением времени распределены между несколькими заданиями, находящимися в памяти или на диске. Задание загружается в память (при наличии свободной памяти), если оно является пакетным и выбрано операционной системой для выполнения, либо если оно активируется пользователем с терминала. Процессор выделяется только тем заданиям, которые находятся в памяти. Откачка и подкачка (swapping) - загрузка заданий с диска в память и их выгрузка из памяти на диск. В системе с разделением времени возможна ситуация, когда какое-либо задание, управляемое с терминала, неактивно (например, выполняет ввод-вывод, либо система ожидает ответа от пользователя, у которого в данный момент перерыв в работе). В этом случае ОС может принять решение о временной выгрузке (swap out) образа памяти задания из оперативной памяти на диск, с целью освобождения памяти для других заданий. При повторной активизации задания оно (при возможности) вновь загружается в память (swapped in). Подобная стратегия называется откачкой и подкачкой. Поддержка диалогового взаимодействия между пользователем и системой. Когда ОС завершает исполнение пользовательской команды, она выполняет поиск следующего управляющего оператора (control statement), введенного с пользовательской клавиатуры. 20 Предоставление диалогового доступа к данным и коду пользовательской программы. В ОС с разделением времени обеспечивается возможность для пользователя ввода, запуска, редактирования, отладки своей программы с терминала, управления своим заданием (приостановки, с последующим возобновлением), просмотра его промежуточных результатов, состояния памяти и регистров, просмотра окончательных результатов на терминале при завершении задания. Следует учитывать, что в ОС с разделением времени обрабатываются как пакетные, так и интерактивные (диалоговые) задания, поэтому система должна обеспечивать их диспетчеризацию – переключение в нужный момент с диалогового задания на пакетное, либо с одного диалогового (пакетного) задания на другое. Режим разделения времени, наряду с пакетным режимом, был основным в операционных системах 1960-х – 1970х- гг. Ключевые термины FIFO (First-In-First-Out) – режим обслуживания некоторой очереди (например, очереди введенных заданий) в порядке их поступления. UNIX - первая мобильная ОС для миникомпьютеров, разработанная в 1970 г. Б. Керниганом и Д. Ритчи на новом языке программирования Си. Буферизация вывода (spooling) – хранение для каждого задания буфера его вывода (в виде области памяти или файла), накопление в буфере выводимой заданием информации и ее вывод полностью на устройство (принтер) при завершении задания. ДИСПАК – отечественная операционная система для ЭВМ БЭСМ-6. Диспетчер (dispatcher) – ранняя упрощенная версия операционной системы , системная программа, управляющая прохождением пакета вводимых заданий. Единая система ЭВМ (ЕС ЭВМ) – семейство отечественных mainframe-компьютеров 1970-х – 1980-х годов, разработанных путем копирования американских компьютеров серии IBM 360. Задание (job) – пользовательская программа, введенная в систему с внешнего носителя или с терминала. Мобильная (переносимая) ОС – операционная система, используемая на нескольких семействах компьютеров путем переноса ее кода (возможно, с небольшими изменениями). Монитор – упрощенный вариант операционной системы; программа, осуществляющая поочередную обработку пользовательских заданий, с последовательной передачей управления от задания к заданию, по мере их завершения. Мультипрограммирование (multi-programming) – одновременная обработка операционной системой нескольких пользовательских заданий. Однозадачная операционная система – ОС, обрабатывающая, выполняющая и хранящая в оперативной памяти в каждый момент времени только одно пользовательское задание (программу). Откачка и подкачка заданий (swapping) – загрузка задания с диска в оперативную память при его активизации и его выгрузка из памяти на диск при неактивности задания; выполняется в режиме разделения времени. Пакетная обработка (batch mode) – обработка пакета заданий, введенных пользователями, с учетом их приоритетов и требуемых ими ресурсов. Планирование загрузки процессора (CPU scheduling) – реализация в ОС алгоритмов выбора очередного задания их набора загруженных в память заданий и выделения кванта времени центрального процессора очередному выбранному заданию. Разделение времени (time sharing) – поддержка операционной системой одновременной работы в системе нескольких пользователей с терминалов, управление прохождением своих заданий, выполнение их ввода, редактирования, компиляции, выполнения, отладки, визуализации результатов. 21 Распределения памяти для пользовательских заданий – выделение памяти операционной системой для загружаемого пользовательского задания и ее освобождение после завершения каждого задания. Резидентная программа - программа, постоянно находящаяся в оперативной памяти по фиксированным адресам. Система мини-ЭВМ (СМ ЭВМ) - семейство отечественных миникомпьютеров 1970-х – 1980-х годов, разработанных путем копирования американских компьютеров серии PDP 10 – PDP 11. Тег – числовой код типа данных, хранящихся в рассматриваемом слове памяти, по которому аппаратура контролирует правильность выполнения операции над данными. Управление процессами – параллельное (или поочередное - на однопроцессорном компьютере) выполнение пользовательских процессов; возможность явного запуска параллельных процессов, управления ими и их синхронизации. Фрагментация памяти - дробление свободной памяти на мелкие несмежные участки, вследствие неточного совпадения размеров свободных и требуемых при запросах к ОС участков памяти. "Эльбрус" - семейство отечественных многопроцессорных суперкомпьютеров (Эльбрус1, Эльбрус-2) 1970-х – 1980-х годов, архитектура которого основана на использовании тегов, принципах динамизма и аппаратной поддержке механизмов реализации языков высокого уровня; в операционной системе впервые был реализован аналог многопоточных вычислений (multi-threading), а также были поддержаны виртуальная память, пакетный режим, режим разделения времени, динамическое выделение памяти по запросу, динамическая линковка и загрузка выполняемых программ при первом вызове. Краткие итоги В ранних mainframe-компьютерах операционные системы отсутствовали. Обращение к памяти осуществлялось по конкретным физическим адресам, обращение к внешним устройствам – специальными командам, также по физическим адресам. В 1960-х гг. были разработаны диспетчеры – упрощенные варианты ОС, осуществлявшие поочередный пропуск пользовательских заданий. Для классических ОС 1960-х – 1970-х гг. (ATLAS, MULTICS, OS IBM 360) были характерны поддержка мультипрограммирования, пакетного режима, режима разделения времени, управление процессами. Первой мобильной ОС, использованной на нескольких аппаратных платформах, стала система UNIX, первая версия которой разработана в 1970 г. Первые ОС для персональных компьютеров (1980-е гг.) – CP/M (для 8-разрядных процессоров) и MS-DOS (для 16-раздярных процессоров). Операционная система MacOS фирмы Apple характеризуется удобным графическим пользовательским интерфейсом. С начала 1990-х гг. до настоящего времени имеет место эволюция Windows от графической оболочки к MS-DOS до наиболее популярной ОС для настольных и портативных компьютеров (Windows 7, Windows 2008 и др.). Также популярна ОС Linux (как серверная ОС). Наиболее распространены в мире операционные системы для мобильных устройств, ввиду широкой распространенности последних. Это прежде всего ОС Symbian. Windows в этом отношении на втором месте. Наиболее распространенные диалекты ОС UNIX: Berkeley Software Distribution (BSD), в настоящее время – FreeBSD (University of Berkeley); System V Release 4 (SVR4) – фирмы AT&T; Linux (RedHat, SuSE, Mandrake, Caldera, Debian, Fedora и другие диалекты); Solaris (Oracle / Sun); IRIX (Silicon Graphics); HP-UX (Hewlett-Packard); Digital UNIX (Digital / Compaq). Из отечественных ОС следует отметить ОС ДИСПАК для БЭСМ-6 и ОС "Эльбрус" для МВК "Эльбрус", отличавшиеся оригинальными идеями и методами. 22 В 1970-х гг. в СССР было принято правительственное решение о копировании зарубежных компьютеров серии IBM 360, а затем – миникомпьютеров серий PDP-10 и PDP-11, которое на долгие годы предопределило развитие отечественной вычислительной техники и на 15-20 лет продлило срок использования их операционных систем. Первые операционные системы для mainframe-компьютеров поддерживали обработку пакетов заданий в однозадачном режиме. Затем в ОС появилась поддержка мультипрограммирования и разделения времени, что привело к необходимости реализации в ОС распределения памяти для пользовательских заданий, диспетчеризации процессора и буферизации ввода-вывода. Особенности ОС с поддержкой режима разделения времени: хранение заданий в памяти либо на диске, с их откачкой и подкачкой (swapping) по мере необходимости; поддержка интерактивного взаимодействия между пользователями и ОС; поддержка диалогового доступа к коду и данным пользователей. Набор для практики Вопросы 1. Каким образом происходило обращение к памяти и к внешним устройствам для ранних моделей компьютеров, при отсутствии операционных систем? 2. Назовите классические операционные системы 1960-х – 1970-х гг., зарубежные и отечественные. 3. Каковы основная цель и идея разработки ОС UNIX? 4. Назовите операционные системы для 8-разрядных, 16-разрядных и современных персональных компьютеров. 5. Какая, по Вашему, операционная система является наиболее распространенной в мире? 6. Назовите известные Вам диалекты ОС UNIX. 7. Каковы основные возможности отечественной ОС ДИСПАК и для каких компьютеров она была разработана? 8. Какие оригинальные идеи были положены в основу системы "Эльбрус" и ее операционной системы? 9. Какие зарубежные серии компьютеров были скопированы в СССР в 1970-е гг. и под какими названиями? В чем, по-вашему, состояли плюсы и минусы подобного подхода к развитию вычислительной техники? 10. Каковы особенности однозадачных ОС для mainframe-компьютеров с поддержкой пакетного режима? 11. Что такое монитор? 12. Как распределялась память в однозадачных ОС? 13. Что такое режим мультипрограммирования? 14. Как распределяется память в ОС с поддержкой мультипрограммирования? 15. Какие функции выполняла ОС с пакетной обработкой заданий и поддержкой мультипрограммирования? 16. Что такое режим разделения времени и каковы особенности ОС, поддерживающих этот режим? 17. Что такое откачка и подкачка заданий? 18. Какие возможности предоставлялись пользователю операционной системой для управления его заданием в режиме разделения времени? Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. История зарубежных операционных систем (реферат). История отечественных операционных систем (реферат). История и диалекты операционной системы UNIX (реферат). Поддержка мультипрограммирования и разделения времени в операционных системах (реферат). 23 3. Лекция: Особенности ОС для различных классов компьютерных систем. ОС реального времени. ОС для облачных вычислений В лекции дан обзор особенностей ОС для различных классов вычислительных устройств (многопроцессорные и распределенные системы, настольные, карманные, мобильные и др.). Рассмотрены ОС реального времени, ОС для облачных вычислений. Проанализирована специфика требований к ОС и архитектур ОС для рассмотренных классов устройств. Содержание Введение Особенности ОС для персональных компьютеров Параллельные компьютерные системы и особенности их ОС. Симметричные и асимметричные мультипроцессорные системы Распределенные компьютерные системы и особенности их ОС Виды серверов в клиент-серверных компьютерных системах Кластерные вычислительные системы и их ОС Системы и ОС реального времени Карманные компьютеры (handhelds) и их ОС Развитие концепций и возможностей ОС представлено на рис. 3.3. Вычислительные среды Облачные вычисления и ОС для облачных вычислений Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Чтобы лучше понять, каковы особенности ОС для различных классов компьютерных систем и устройств, рассмотрим несколько более подробно особенности этих устройств и обсудим соответствующую специфику их операционных систем. Особенности ОС для персональных компьютеров В "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени " мы анализировали особенности ОС для более ранних компьютеров общего назначения (mainframes). Что же изменилось в самих компьютерах и их операционных системах с появлением персональных компьютеров – настольных и портативных, которые ныне являются самыми распространенными компьютерными системами? Персональные компьютеры предназначены, как правило, для одного пользователя. Тем не менее, ОС для персональных компьютеров должна предусматривать режим мультипрограммирования (многозадачности), так как пользователям подчас удобнее выполнять несколько заданий параллельно – например, набирать некоторый текст в редакторе, принимать электронную почту и одновременно печатать на принтере какие-либо документы. Кроме того, при работе в локальной сети возможен удаленный вход на компьютер других пользователей. То есть, ОС для персональных компьютеров должна поддерживать также режим разделения времени. Персональные компьютеры имеют разнообразный набор устройств ввода-вывода, работу с которыми должна поддерживать операционная система с помощью драйверов – низкоуровневых системных программ для управления этими устройствами. Для пользователя удобнее всего, если все необходимые драйверы встроены в операционную систему. Однако ситуация осложняется тем что драйверы устройств разрабатывает обычно фирмаразработчик соответствующего устройства - в англоязычной терминологии, Original Equipment Manufacturer (OEM), а не фирма-разработчик ОС. Поэтому при выпуске и установке на компьютер новой ОС могут возникнуть проблемы с драйверами – какое-либо устройство новая ОС "не понимает". На практике, должно пройти не менее двух-трех лет эксплуатации новой ОС, прежде чем для нее появятся драйверы для всех используемых 24 внешних устройств, хотя в последнее время в этом отношении ситуация значительно улучшилась – новые ОС становятся все более "понятливыми" и имеют в своем составе огромные наборы драйверов. Персональный компьютер имеет традиционные клавиатуру и мышь, обычно подключаемые через USB-порт, либо беспроводные клавиатуру и мышь, блок управления которыми также подключается через USB-порт. Портативный компьютер может иметь также встроенный манипулятор типа trackball (шарик для перемещения курсора мыши) или touchpad (плоская пластинка для этой же цели). К компьютеру подключен монитор: для настольного компьютера – к порту VGA, для портативного – монитор встроен в компьютерную систему, но дополнительно может подключаться через порт VGA внешний монитор или мультимедийный проектор. К традиционным дополнительным внешним устройствам относится также принтер (подключается через порт USB, более старые модели – через так называемый параллельный порт, или LPT – аббревиатура от Line PrinTer. Реже используется сканер – устройство для оцифровки бумажных изображений, например, подписанных или рукописных документов. Сканер может также подключаться через порт USB, однако некоторые модели сканеров подключаются через другой интерфейс – SCSI, используемый и для жестких дисков (название произносится "скАзи"; о нем – чуть позже). Имеется внутренний жесткий диск (hard drive) емкостью 250 GB – 1 TB и более, подключаемый через интерфейс IDE (более старый) или SATA. Могут подключаться через порт USB также внешние накопители - flashпамять, или "флэшки", имеющие миниатюрный размер и объем памяти до 128 гигабайт и более; ZIV drives и другие разновидности внешних жестких дисков, имеющие в настоящее время емкость до 1 терабайта. Операционная система должна обеспечивать их использование как части компьютерной системы (например, на внешний ZIV-диск может быть даже установлено программное обеспечение, в том числе - другая операционная система). Для настольного компьютера в комплект входит устройство чтения и записи компакт-дисков в различных форматах - CD-ROM, CD-RW (с возможностью записи на CD); DVD-ROM/DVD-RW; DVD-RAM (последнее означает устройство с режимом непосредственной записи на компактдиск, как в память); BluRay – более современный формат компакт-дисков емкостью до 25 или 50 GB и др. Для ноутбука DVD-ROM, из соображений экономии веса и размеров, может отсутствовать и должен подключаться, по шутливому выражению автора, "на веревочке" – через USB-порт. Весьма важным внешним устройством, особенно для портативного компьютера, является порт для подключения цифровой видеокамеры (IEEE 1394, или FireWire), более миниатюрный, чем USB. Он имеет дуплексный режим работы, так что, например, перемотка видеоленты на видеокамере может запускаться программным путем с компьютера. Об адаптерах для беспроводной связи – Wi-Fi, Bluetooth, IrDA – мы уже говорили в "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени ". Наиболее важными свойствами ОС для персонального компьютера должны быть, конечно, простота и удобство в использовании, дружественность к пользователю. Это достигается прежде всего, удобным и современным аппаратным и программным пользовательским интерфейсом, например, интерфейсом типа multi-touch (с доступом непосредственно к экрану), ноутбуками типа Tablet PC (с возможностью поворота экрана и ввода информации прикосновением к экрану). При разработке ОС для ПК используются те же технологии, которые применяются и в "больших" ОС (для mainframe-компьютеров). Однако, поскольку пользователь имеет персональный доступ к компьютеру, он часто не нуждается в каких-либо системных программах для оптимизации работы процессора или в улучшенных средствах защиты (последней, однако, не следует пренебрегать и отключать ее, так как на компьютер возможны сетевые атаки). Как мы уже говорили в "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени ", на одном и том же персональном компьютере могут быть установлены, при необходимости, две или более операционных системы - такой компьютер носит название double bootable system, и при его включении пользователю выдается начальное меню для уточнения, какую именно ОС требуется запустить – boot loader (загрузчик ОС). Такое использование компьютера рекомендуется, например, для студентов, изучающих ОС и желающих попробовать новую операционную систему, либо изучить другую уже известную, на которую до сих пор не хватало времени, например, установить на одном компьютере Windows и Linux. Для установки второй ОС необходимо воспользоваться специальной утилитой (например, Partition Magic) для выделения на диске для инсталляции новой ОС отдельного раздела (partition) – смежной области 25 дисковой памяти, имеющей определенное обозначение, чаще всего – в виде латинской буквы. Персональные компьютеры имеют сетевые адаптеры (сетевые карты) – устройства для подключения к локальной сети. Соответственно, ОС для персональных компьютеров имеют в своем составе драйверы сетевых адаптеров и пользовательский интерфейс для настройки подключения компьютера к локальной сети (об этом подробнее – в специальном разделе данного курса, посвященном сетям). Параллельные компьютерные системы и особенности их ОС. Параллельные компьютерные системы – это мультипроцессорные системы с несколькими непосредственно взаимодействующими процессорами. Классические примеры: из зарубежных компьютеров - CRAY, из отечественных – "Эльбрус"; из более современных – компьютеры серии СКИФ. В настоящее время выпускаются мультипроцессорные рабочие станции - например, купив или получив в подарок настольный компьютер, Вы можете обнаружить в его составе два или даже четыре процессора. Соответственно, ОС должна обеспечивать реконфигурацию такой системы, подключение новых процессоров или удаление процессоров из системы, распараллеливание решения задачи на нескольких процессорах и синхронизацию решающих ее параллельных процессов. Среди параллельных компьютеров выделяются тесно связанные (tightly coupled) системы, в которых процессоры разделяют общую память и таймер (такты); взаимодействие между ними происходит через общую память. О параллельных компьютерах архитектур Very Long Instruction Word (VLIW) и Explicit Parallelism Instruction Computer (EPIC), в которых распараллеливание вычислений происходит на уровне команд, мы уже говорили в "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени ". Многоядерные (multi-core) компьютеры (см. также "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени ") – компьютерные системы, основанные на тесно связанных друг с другом процессорах (ядрах), находящихся в одном кристалле, разделяющих ассоциативную память (кэш) второго уровня и работающих на общей памяти. Преимущества параллельной компьютерной системы: 1. Улучшенная производительность (throughput) – очевидно, что распараллеливание алгоритма решения задачи может позволить уменьшить суммарное время ее решения; 2. Экономичность – в параллельной системе ОС может поручить часть работы другому процессору или ядру; 3. Повышенная надежность – при сбое или отказе одного из процессоров ОС может переключить вычисления на другой процессор; 4. "Дружественное" к пользователю снижение производительности (graceful degradation) – если один из процессоров отказал и выведен из конфигурации, пользователь, при правильной организации компьютера и ОС, может даже не почувствовать замедления вычислений 5. Устойчивость к ошибкам (fail-soft system) – стабильная работа многопроцессорной системы при ошибке в аппаратуре или в программе. Симметричные и асимметричные мультипроцессорные системы Симметричная мультипроцессорная система - symmetric multiprocessing (SMP) – это многопроцессорная компьютерная система, все процессоры которой равноправны и используют одну и ту же копию ОС. Операционная система при этом может выполняться на любом процессоре. В такой системе любому свободному процессору может быть поручено любое задание. Все процессоры используют общую память и общие дисковые ресурсы. Несколько процессов (или потоков) могут исполняться одновременно без существенного нарушения производительности. Большинство современных ОС поддерживают архитектуру SMP. После инсталляции ОС (например, Linux) на симметричную мультипроцессорную систему пользователь может заметить в меню boot loader, что фактически на его компьютер установилась не одна, а две версии ОС – с поддержкой SMP и без нее. 26 Асимметричная мультипроцессорная система (asymmetric multiprocessing) – это многопроцессорная компьютерная система, в которой процессоры специализированы по своим функциям. Каждому процессору дается специфическое задание; главный процессор (master processor) планирует работу подчиненных процессов (slave processors). В такой системе ОС, как правило, выполняется на одном определенном, закрепленном за ней, центральном процессоре. Подобная архитектура более типична для очень больших систем. Пример – система "Эльбрус", которая имела в своем составе, в зависимости от конфигурации, от одного до 10 центральных процессоров, от одного до четырех специализированных процессоров ввода вывода (ПВВ), от одного до четырех процессоров передачи данных (ППД). Схема организации SMP-архитектуры компьютеров приведена на рис. 3.1. Процессор Процессор … Процессор Память Рис. 3.1. Схема организации SMP-архитектуры компьютеров Распределенные компьютерные системы и особенности их ОС В распределенной системе (distributed system)вычисления распределены между несколькими физическими процессорами (компьютерами), объединенными между собой в сеть. Слабо связанная система (loosely coupled system) – распределенная компьютерная система, в которой каждый процессор имеет свою локальную память, а различные процессоры взаимодействуют между собой через линии связи – высокоскоростные шины, телефонные линии, беспроводную связь (Wi-Fi, EVDO, Wi-Max и др.). Преимущества распределенных систем: 1. Разделение (совместное использование) ресурсов: в распределенной системе различные ресурсы могут храниться на разных компьютерах. Нет необходимости дублировать программы или данные, храня их копии на нескольких компьютерах. 2. Совместная загрузка (load sharing): каждому компьютеру в распределенной системе может быть поручено определенное задание, которое он выполняет параллельно с выполнением другими компьютерами своих заданий. 3. Надежность: при отказе или сбое одного из компьютеров распределенной системы его задание может быть перераспределено другому компьютеру, чтобы сбой в минимальной степени повлиял или вовсе не повлиял на итоговый результат. 4. Связь: в распределенной системе все компьютеры связаны друг с другом, так что, например, при необходимости возможен удаленный вход с одного компьютера на другой с целью использования ресурсов более мощного компьютера. В распределенной системе компьютеры связаны в сетевую инфраструктуру, которая может быть: 1. локальной сетью (local area network - LAN); 2. глобальной или региональной сетью (wide area network - WAN). По своей организации распределенные системы могут быть клиент-серверными (clientserver) или одноранговыми (peer-to-peer) системами. В клиент-серверной системе определенные компьютеры играют роль серверов, а остальные – роль клиентов, пользующихся их услугами. Подобная организация распределенных систем наиболее распространена, и мы рассмотрим ее подробнее. В одноранговой распределенной системе все компьютеры равноправны. Структура клиент-серверной системы изображена на рис. 3.2. 27 Клиент Клиент Клиент … Клиент сеть Сервер Рис. 3.2. Структура клиент-серверной системы Виды серверов в клиент-серверных компьютерных системах Клиент-серверная архитектура распределенных систем весьма широко распространена и поддержана операционными системами. Поэтому очень важно знать, какие виды и функции серверов предлагают современные распределенные системы. Файл-сервер (file server) – компьютер и программное обеспечение, предоставляющие доступ к подмножеству файловых систем, расположенных на дисках компьютера-сервера, другим компьютерам локальной сети (LAN). Пример – серверное программное обеспечение SAMBA (SMB – сокращение от Server Message Block) для ОС типа UNIX (Linux, FreeBSD, Solaris и т.д.), обеспечивающее доступ с Windows-компьютеров локальной сети к файловым системам UNIX-машин. Samba также реализована для платформы Macintosh / MacOS. Сервер приложений (application server) – компьютер и программное обеспечение, предоставляющее вычислительные ресурсы (память и процессор) и необходимое окружение для удаленного запуска определенных классов (как правило, больших) приложений с других компьютеров локальной сети. Примеры серверов приложений - WebSphere (IBM), WebLogic (BEA) – наилучшие из известных серверов приложений, работающих в Java Enterprise Edition (JEE). Сервер баз данных (database server) – компьютер и программное обеспечение, предоставляющее доступ другим компьютерам сети к базам данных, расположенным на компьютере-сервере. Пример: серверное программное обеспечение для доступа к базам данных Microsoft SQL Server. Веб-сервер (Web server) – компьютер и программное обеспечение, предоставляющее доступ клиентам через WWW к Web-страницам, расположенным на компьютере-сервере. Пример: свободно распространяемый Web-сервер Apache. Прокси-сервер – компьютер и программное обеспечение, являющиеся частью локальной сети и поддерживающие эффективное обращение компьютеров локальной сети к Интернету, фильтрацию трафика, защиту от внешних атак. Proxy-сервер обычно встроен в операционную систему. Сервер электронной почты – компьютер и программное обеспечение, выполняющие отправку, получение и "раскладку" электронной почты для компьютеров некоторой локальной сети. Могут обеспечивать также криптование почты (email encryption) – шифрование электронных писем перед отправкой адресатам из определенного сетевого домена (как правило, заказчику) и их дешифровку после получения от заказчика. Серверный бэк-энд (Server back-end) – группа (пул) связанных в локальную сеть серверных компьютеров, используемых вместо одного сервера, в целях большей надежности и предоставления большего объема ресурсов. Другой термин, близкий к этому, - центр обработки данных (data center). Эти понятия особенно актуальны в связи со все более широким распространением облачных вычислений, являющихся, с этой точки зрения, наиболее современной реализацией клиент-серверной схемы взаимодействия. 28 Кластерные вычислительные системы и их ОС Компьютерные кластеры весьма популярны для научных вычислений. Компьютеры в кластере, как правило, связаны между собой через быструю локальную сеть. Кластеризация позволяет двум или более системам использовать общую память. Кластеризация обеспечивают высокую надежность. Различают компьютерные кластеры двух видов: асимметричная кластеризация (asymmetric clustering) – организация компьютерного кластера, при которой один компьютер выполняет приложение, а остальные простаивают; симметричная кластеризация (symmetric clustering) - организация компьютерного кластера, при которой все машины кластера исполняют одновременно различные части одного большого приложения. Различают также: кластеры с высокоскоростным доступом (high-availability clusters) – компьютерные кластеры, обеспечивающие оптимальный доступ к ресурсам, предоставляемым компьютерами кластера, например, к базам данных; кластеры с балансировкой загрузки (load-balancing clusters) – компьютерные кластеры, которые имеют несколько входных компьютеров, балансирующих запросы (front-ends), распределяющих задания между компьютерами серверного back-end’а (серверной фермы). Кластеры часто используются в университетах (например, установлены на нескольких факультетах СПбГУ) и в исследовательских центрах (например, CERN, Швейцария). Операционные системы для кластеров: Windows 2003 for clusters; Windows 2008 High-Performance Computing. Системы и ОС реального времени Системы реального времени часто используются как управляющие устройства для специальных приложений, - например, для научных экспериментов; в медицинских системах, связанных с изображениями; системах управления в промышленности; системах отображения (display); системах управления космическими полетами, АЭС и др. Для таких систем характерно наличие и выполнение, четко определенные временные ограничения (время реакции – response time; время наработки на отказ и др.). Различаются системы реального времени видов hard real-time и soft real-time. Hard real-time – системы – системы реального времени, в которых при нарушении временных ограничений может возникнуть критическая ошибка (отказ) управляемого ею объекта. Примеры: система управления двигателем автомобиля; система управления кардиостимулятором. В таких системах вторичная память ограничена или отсутствует; данные хранятся в оперативной памяти (RAM) или постоянном запоминающем устройстве (ПЗУ, ROM). При использовании таких систем возможны конфликты с системами разделения времени, не имеющие места для ОС общего назначения. Выражаясь более простым языком, при работе подобных систем не допускаются прерывания; все необходимые данные для основного цикла работы системы должны предварительно быть загружены в память; процесс, выполняющий код такой системы, не должен подвергаться откачке на диск. ОС для таких систем обычно упрощены, вместо виртуальной памяти выделяется физическая, все другие виды виртуализации ресурсов исключены. Популярной практикой разработки ОС реального времени является практика разработки таких ОС на основе открытых исходных кодов ОС общего назначения путем "отсечения всего лишнего". Однако при этом следует соблюдать осторожность. Автору приходилось консультировать разработчиков системы реального времени для "Эльбруса", которые использовали для своей системы низкоуровневую процедуру выделения физической памяти, но не учли ее возможных конфликтов с общей системой виртуальной памяти ОС Эльбрус; в результате выделяемая память иногда "портилась" … в результате изменения связующей информации в списке областей свободной памяти, который использовался механизмом виртуальной памяти "Эльбруса". Soft real-time – системы – системы реального времени, в которых нарушение временных ограничений не приводит к отказу управляемого ею объекта. Обычно это системы управления несколькими взаимосвязанными системами с постоянно изменяющейся ситуацией. Пример - система планирования рейсов на коммерческих авиалиниях. В случае какойлибо задержки в работе такой системы, в худшем случае, пассажирам некоторых рейсов 29 придется немного подождать в аэропорту, но никаких фатальных последствий не будет. Подобные системы имеют ограниченную полезность для промышленных систем управления и в роботике. Они также полезны в современных приложениях (например, для мультимедиа и виртуальной реальности), требующих развитых возможностей ОС. Карманные компьютеры (handhelds) и их ОС К данному классу устройств, как уже отмечалось, относятся карманные персональные компьютеры (КПК), или Personal Digital Assistants (PDA), и мобильные телефоны. Особенности и проблемы данного класса компьютеров следующие: ограниченный объем памяти; относительно медленные процессоры: для мобильного устройства типично ожидание выполнения простейшей команды в течение нескольких секунд, что неудобно; маленький размер экрана мониторов (дисплеев), отсюда – необходимость в специализированном программном обеспечении для поддержки GUI; например, в Java Micro Edition (JME) – версии Java для мобильных устройств – невозможно использовать удобные общие пакеты AWT и Swing для разработки GUI; вместо них разработчику в JME предлагаются специализированные пакеты видаjavax.microelectronics…lcdui, несовместимые со стандартным изданием Java (JSE), что делает код зависимым от типа устройства, а иногда – и от конкретных моделей мобильных телефонов, которые имеют разные размеры экранов; невысокая скорость связи через Интернет: например, GPRS-модем мобильного телефона обеспечивает связь примерно со скоростью dial-up – 3-5 килобайт в секунду; связь для передачи данных осуществляется через Bluetooth или IrDA (причем последний часто отсутствует); имеются не все необходимые порты: например, часть в мобильных устройствах отсутствует порт USB, т.е. для них нельзя использовать "флэшки", что весьма неудобно, и приходится использовать специальные сверхминиатюрные диски типа SmartMedia, для которых в настольных компьютерах не всегда имеются адаптеры для чтения. Тем не менее, современные средства коммуникации (например, Wi-Fi) и совместимые с персональными компьютерами порты и внешние модули памяти начинают использоваться и на карманных и мобильных устройствах. В операционных системах и другом системном программном обеспечении для карманных и мобильных устройств приходится учитывать все эти ограничения, в частности, ограниченный объем памяти. В связи с этим целый ряд удобных повседневных программистских возможностей приходится для мобильных устройств запрещать (например, в JME нет вещественной арифметики). Развитие концепций и возможностей ОС представлено на рис. 3.3. На схеме хорошо видны аналогичные "волны" ("витки") развития ОС - сначала для mainframe-компьютеров, затем – для миникомпьютеров, для персональных и для карманных компьютеров. Каждая волна проходит в своем развитии определенные этапы. ОС развиваются от резидентных мониторов до поддержки пакетного режима (для ранних моделей компьютеров), затем – режима разделения времени, многопользовательских и сетевых возможностей. Вычислительные среды В современном мире ИТ имеет место тенденция к интеграции описанных выше устройств и их локальных сетей в вычислительные среды – интегрированные распределенные компьютерные системы для решения задач в различных проблемных областях. Вычислительные среды подразделяются на следующие виды: традиционные вычислительные среды – локальные и региональные сети, используемые в течение нескольких десятков лет; Web-ориентированные вычислительные среды – вычислительные среды на основе Web-сервисов, характерные для настоящего времени, начиная с 1990-х гг.; к этому классу относятся и среды для облачных вычислений; 30 встроенные (embedded) вычислительные среды – вычислительные среды для специализированных устройств, например, сети микропроцессоров, встроенных в элементы линии электропередач. Все эти виды вычислительных сред должны адекватно обслуживаться операционными системами, в чем и состоят ближайшие задачи их разработки. 1950 Компьютеры общего назначения 1970 1960 1980 1990 2000 MULTICS компилятор ПО отсутствует пакет разделение времени многопользовательские системы распределенные системы мультипроцессорные системы сетевые системы резидентные мониторы системы, устойчивые к ошибкам UNIX Микрокомпьютеры компиляторы ПО отсутствует мультипроцессорные системы многопользовательские системы системы, сетевые системы устойчивые кластеры к ошибкам резидентные мониторы UNIX Настольные компьютеры ПО отсутствует компиляторы Карманные компьютеры интерактивные системы мультипроцессорные системы многополь- сетевые системы зовательские UNIX системы компиляторы ПО отсутствует диалоговые системы сетевые системы Рис. 3.3. Развитие концепций и возможностей ОС. Облачные вычисления и ОС для облачных вычислений Облачные вычисления (сloud computing) являются одним из наиболее популярных направлений развития ИТ. "Облако" (cloud) – это уже десятки лет используемая метафора для изображения сервисов, предоставляемых через Интернет или другую коммуникационную сеть (например, через ATM-сеть). Облачные вычисления – модель вычислений, основанная на динамически масштабируемых (scalable) и виртуализованных ресурсах (данных, приложениях, ОС и др.), которые доступны и используются как сервисы через Интернет и реализуются с помощью высокопроизводительных центров обработки данных (data centers С точки зрения пользователей, существует совокупность "облаков" (общедоступные, корпоративных, частных и др.), предоставляемых различными компаниями, для использования мощных вычислительных ресурсов, которых нет у индивидуального пользователя. Как правило, "облачные" сервисы платные. Из бесплатных назовем Windows Live (http://www.live.com; см. лабораторную работу номер 6). Недостаток облачных вычислений в том, что пользователь оказывается полностью зависимым от используемого им "облака" (в котором доступны используемые им данные и программы) и не может управлять не только работой "облачных" компьютеров, но даже резервным копированием своих данных. В связи с этим возникает целый ряд важных вопросов о 31 безопасности облачных вычислений, сохранении конфиденциальности пользовательских данных и т.д.; далеко не все из них на данный момент решены. Серьезной проблемой организации облачных вычислений с точки зрения аппаратуры центров обработки данных является экономия электроэнергии и проблема распределения загрузки, так как облачные вычисления в каждом центре обработки данных имеют (или в ближайшем будущем будут иметь) миллионы удаленных пользователей. Наиболее популярная "облачная" платформа – Microsoft Windows Azure (облачная ОС) и Microsoft Azure Services Platform (реализованная на основе Microsoft.NET). Windows Azure можно рассматривать как "ОС в облаке". Пользователю нет необходимости беспокоиться о ее инсталляции на его компьютере, который может не иметь для этого необходимых ресурсов. Все, что требуется, это иметь Web-браузер и минимальный пакет надстроек (plug-ins) для запуска и использования через браузер облачных сервисов. В настоящее время все крупные компании (Microsoft, IBM, HP, Dell, Oracle и др.) разрабатывают свои системы облачных вычислений; имеется тенденция к интеграции этих корпоративных систем в единое доступное пользователю "облако". Ключевые термины Boot loader - загрузчик одной из нескольких ОС, установленных на некотором компьютере, управляемый специальным меню при включении компьютера. Double bootable system - компьютер, на котором установлены две (или более) операционных системы, при его включении которого пользователю выдается начальное меню для уточнения, какую именно ОС требуется запустить. Hard real-time – система реального времени, в которой при нарушении временных ограничений может возникнуть критическая ошибка (отказ) управляемого ею объекта. Original Equipment Manufacturer (OEM) - фирма-разработчик какого-либо внешнего устройства, обычно разрабатывающая и драйвер к нему. Soft real-time – система реального времени, в которой нарушение временных ограничений не приводит к отказу управляемого ею объекта. Асимметричная кластеризация (asymmetric clustering) – организация компьютерного кластера, при которой один компьютер выполняет приложение, а остальные простаивают. Асимметричная мультипроцессорная система (asymmetric multiprocessing) – многопроцессорная компьютерная система, в которой процессоры специализированы по своим функциям; имеется главный процессор, планирующий работу подчиненных процессоров. Веб-сервер (Web server) – компьютер и программное обеспечение, предоставляющее доступ клиентам через WWW к Web-страницам, расположенным на компьютере-сервере. Вычислительная среда – интегрированная распределенная компьютерная система для решения задач в каких-либо проблемных областях. Драйвер – низкоуровневая системная программа для управления каким-либо внешним устройством (например, жестким диском). Кластеры с балансировкой загрузки (load-balancing clusters) – компьютерные кластеры, которые имеют несколько входных компьютеров, балансирующих запросы (frontends), распределяющих задания между компьютерами серверного бэк-энда. Кластеры с высокоскоростным доступом (high-availability clusters, HA) – компьютерные кластеры, обеспечивающие оптимальный доступ к ресурсам, предоставляемым компьютерами кластера, например, к базам данных. Клиент-серверная система – распределенная компьютерная система, в которой определенные компьютеры играют роль специализированных серверов, а остальные – роль клиентов, пользующихся их услугами. Многоядерный (multi-core) компьютер – компьютерная система, основанная на тесно связанных друг с другом процессорах (ядрах), находящихся в одном кристалле, разделяющих ассоциативную память (кэш) второго уровня и работающих на общей памяти. 32 Облачные вычисления – модель вычислений, основанная на динамически масштабируемых (scalable) и виртуализованных ресурсах (данных, приложениях, ОС и др.), которые доступны и используются как сервисы через Интернет и реализуются с помощью высокопроизводительных центров обработки данных (data centers). Параллельная компьютерная система – мультипроцессорная система, состоящая из нескольких непосредственно взаимодействующих процессоров. Параллельный порт, или LPT (аббревиатура от Line PrinTer) – порт для подключения устаревших моделей принтеров. Для подключения принтера через данный порт требуется предварительно отключить и принтер, и компьютер. Прокси-сервер – компьютер и программное обеспечение, являющиеся частью локальной сети и поддерживающие эффективное обращение компьютеров локальной сети к Интернету, фильтрацию трафика, защиту от внешних атак. Распределенная система (distributed system) – компьютерная система, вычисления распределены между несколькими физическими процессорами (компьютерами), объединенными между собой в сеть. Сервер баз данных (database server) – компьютер и программное обеспечение, предоставляющее доступ другим компьютерам сети к базам данных, расположенным на компьютере-сервере локальной сети. Серверный бэк-энд (Server back-end) – группа (пул) связанных в локальную сеть серверных компьютеров, используемых вместо одного сервера, в целях большей надежности и предоставления большего объема ресурсов. Сервер приложений (application server) – компьютер и программное обеспечение, предоставляющее вычислительные ресурсы (память и процессор) и необходимое окружение для удаленного запуска определенных классов (как правило, больших) приложений с других компьютеров локальной сети. Сервер электронной почты – компьютер и программное обеспечение, выполняющие отправку, получение и "раскладку" электронной почты для компьютеров некоторой локальной сети. Может обеспечивать также криптование почты (email encryption). Сетевой адаптер (сетевая карта) – устройство для подключения компьютера к локальной сети. Симметричная кластеризация (symmetric clustering) - организация компьютерного кластера, при которой все машины кластера исполняют одновременно различные части одного большого приложения. Симметричная мультипроцессорная система (symmetric multiprocessing - SMP) – многопроцессорная компьютерная система, все процессоры которой равноправны и используют одну и ту же копию ОС; операционная система при этом может выполняться на любом процессоре. Слабо связанная система (loosely coupled system) – распределенная компьютерная система, в которой каждый процессор имеет свою локальную память, а различные процессоры взаимодействуют между собой через линии связи. Сканер – устройство для оцифровки бумажных изображений, например, подписанных или рукописных документов. Тесно связанная (tightly coupled) система – параллельная компьютерная система, в которой процессоры разделяют общую память и таймер (такты); взаимодействие между ними происходит через общую память. Файл-сервер (file server) – компьютер и программное обеспечение, предоставляющие доступ к подмножеству файловых систем, расположенных на дисках компьютера-сервера, другим компьютерам локальной сети. Краткие итоги Операционные системы для персональных компьютеров, предназначенных для одного пользователя, поддерживают многозадачный режим работы, взаимодействие с широким набором внешних устройств, возможности сетевого взаимодействия и имеют удобный дружественный пользовательский интерфейс. На одном ПК могут быть установлены несколько ОС. 33 Параллельные компьютерные системы могут быть тесно связанными (VLIW, многоядерными и др.) и слабо связанными, или распределенными. Многопроцессорные системы подразделятся на симметричные (SMP) и асимметричные. В распределенных системах компьютеры соединены через сеть. Преимущества параллельных систем – улучшенная производительность, более высокая надежность, устойчивость к ошибкам. Сетевые системы могут быть одноранговыми или клиент-серверными. Сети подразделяются на локальные, региональные и глобальные. В клиент-серверных системах клиентам предоставляются файл-серверы, серверы приложений, серверы баз данных, веб-серверы, прокси-серверы, серверы электронной почты, бэк-энды (пулы, фермы) серверов. Кластерные вычислительные системы используются для научных вычислений и подразделяются на симметричные, асимметричные, кластеры с балансировкой загрузки, кластеры с высокоскоростным доступом. Системы реального времени служат для управления различными объектами и подразделяются на hard real-time (в которых нарушение временных ограничений приводит к отказу объекта) и soft real-time (в которых нарушение временных ограничений не имеет столь фатальных последствий). Карманные и мобильные компьютерные системы широко используются, хотя и имеют целый ряд недостатков – малый объем памяти, медленные процессоры, невысокая скорость взаимодействия через Интернет, маленькие экраны, неудобство ввода информации, отсутствие традиционных портов. ОС для этих устройств должны учитывать все эти особенности. Для разработки программного обеспечения таких устройств чаще всего используется Java Micro Edition (JME). Развитие ОС для различных типов компьютеров (mainframe, миникомпьютеров, ПК, настольных и карманных компьютеров) происходит аналогичными волнами (витками), от резидентных однозадачных мониторов - к поддержке разделения времени, многозадачности и работы в сети. Интегрированные вычислительные ориентированные и встроенные. среды подразделяются на традиционные, веб- Облачные вычисления обеспечивают клиентам доступ к веб-сервисам центров обработки данных через веб и браузер, без необходимости инсталляции ПО и хранения данных на компьютере клиента. Они являются наиболее популярной моделью вычислений в настоящее время. Недостаток – полная зависимость клиента от используемого им облака. Наиболее распространенная среда и ОС для облачных вычислений – Microsoft Windows Azure. Набор для практики Вопросы 1. 2. 3. 4. 5. 6. 7. 8. Назовите основные возможности и особенности ОС для персональных компьютеров. Какие внешние устройства используются для персональных компьютеров? Что такое dooble bootable system и boot loader? Что такое мультипроцессорная система? Что такое тесно связанная компьютерная система? Как организованы многоядерные компьютеры? Каковы преимущества параллельных компьютерных систем? В чем различие между симметричными и асимметричными мультипроцессорными системами? 9. Назовите основные разновидности компьютерных сетей. 10. Каковы основные виды серверов в клиент-серверных системах? 11. Назовите виды кластерных вычислительных систем. 12. В чем отличие hard real-time систем от soft real-time систем реального времени? 13. Каковы возможности и недостатки (ограничения) карманных и мобильных компьютерных систем и их ОС? 14. Назовите основные этапы развития операционных систем для каждой разновидности компьютеров (mainframes, миникомпьютеры и т.д.). 15. Назовите основные виды вычислительных сред. 16. Что такое облачные вычисления, в чем их возможности и недостатки? 34 Упражнения 1. Предложите и опишите желательную для Вас конфигурацию настольного офисного компьютера, на котором удобно было бы выполнять любые повседневные операции (объем памяти, быстродействие, объем жесткого диска, порты, внешние устройства). 2. Предложите оптимальную конфигурацию портативного компьютера (ноутбука), удобного для поездок и максимально компактного. 3. Имеется компьютер с четырехъядерным процессором. Предложите схему распределения его ядер для исполнения ОС, пользовательских программ, параллельных процессов и потоков. 4. Имеется 16-процессорный компьютер. Предложите схему реализации на этом компьютере параллельного алгоритма умножения двух матриц 4*4, с параллельным вычислением столбцов матрицы-результата. 5. В Вашем офисе для организации локальной сети имеются шесть компьютеров. Предложите распределение между ними необходимых серверных функций (файл-сервер, сервер электронной почты и др.). 6. Опишите желаемый минимальный набор портов и адаптеров для карманной вычислительной системы, удобный для сетевого взаимодействия, использования Интернета, взаимодействия с настольным компьютером. 7. На основе рассмотренной в лекции схемы развития ОС, попытайтесь предсказать ход развития операционных систем и инструментов для облачных вычислений – какие новые возможности появятся в них в ближайшие 3-5 лет? Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. Обзор ОС для персональных компьютеров (реферат). Обзор ОС для карманных и мобильных компьютерных систем (реферат). Обзор ОС и инструментальных средств для облачных вычислений (реферат). Обзор параллельных компьютерных систем и их ОС (реферат). Обзор клиент-серверных архитектур и видов серверов в современных распределенных системах (реферат). 6. Реализуйте локальную сеть из 6 имеющихся компьютеров с ОС Windows в офисе Вашей фирмы - практическая курсовая работа. 7. Найдите в Интернете бесплатные облачные сервисы (например, на сайте kaavo.com), подпишитесь на них, воспользуйтесь ими для решения какой-либо простой задачи (например, вычисления скалярного произведения двух векторов) и опишите свои впечатления и выводы - практическая курсовая работа. 35 36 4. Лекция: Архитектура компьютерной системы В лекции подробно рассмотрена архитектура компьютерной системы: управление прерываниями, памятью, вводом-выводом, иерархия памяти, ассоциативная память (кэширование), защита памяти, аппаратная защита памяти в системах с теговой архитектурой. Содержание Введение Архитектура компьютерной системы Функционирование компьютерной системы Обработка прерываний Архитектура ввода-вывода Таблица состояния устройств Прямой доступ к памяти (Direct Memory Access – DMA) – более эффективный метод работы контроллеров устройств ввода-вывода, используемый для работы высокоскоростных устройств, способных передавать информацию со скоростью, близкой к скорости работы памяти Структура памяти Аппаратная защита памяти и процессора Аппаратная защита адресов памяти в системах с теговой архитектурой Организация аппаратной защиты памяти и процессора Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение В данной лекции рассмотрим более подробно архитектуру компьютерной системы. Будут рассмотрены следующие вопросы: 1. 2. 3. 4. 5. 6. функционирование компьютерной системы архитектура ввода-вывода структура памяти иерархия памяти аппаратная защита памяти общая архитектура системы. Архитектура компьютерной системы Компьютерная система имеет модульную структуру. Для каждого устройства (память, внешние устройства) в системе имеется специальное устройство управления (иначе говоря, специальный процессор), называемый контроллером устройства. Все модули (центральный процессор, память и контроллер памяти, внешние устройства и их контроллеры) соединены между собой системной шиной (system bus), через которую они обмениваются сигналами. Как мы уже знаем работой каждого контроллера управляет драйвер - специализированная низкоуровневая программа, являющаяся частью ОС. Вот типичная структура современной настольной или портативной компьютерной системы, с указанием наиболее распространенных типов устройств и их характеристик. Центральный процессор – устройство, выполняющее команды (instructions) компьютерной системы. В современных компьютерах, как правило, он является многоядерным (см. "Особенности ОС для различных классов компьютерных систем. ОС реального времени. ОС для облачных вычислений "), т.е. имеет в своем составе от 2 до 32 ядер (копий) процессора, параллельно работающих на общей памяти, либо гибридным (см. "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени "), состоящим из центрального и графического процессоров. Производительность каждого ядра – 3 – 3.2 GHz. Заметим, что под производительностью понимается в данном случае тактовая частота процессора (ядра) – время выполнения им одной самой простой машинной команды. Однако есть и другие важные факторы, определяющие общую производительность системы, - тактовая частота памяти и системной шины. Фактически итоговую производительность системы можно оценить по самой медленной из этих частей 37 системы (обычно это системная шина). Эти характеристики необходимо принимать во внимание при выборе и покупке компьютера. Диск ЦП Диск Контроллер диска Принтер Контроллер принтера Другие внешние устройства Контроллер внешнего устройства Системная плата Контроллер памяти Память Рис. 4.1. Архитектура компьютерной системы. Оперативная (основная) память, или просто память – устройство, хранящее обрабатываемые данные. Объем памяти – 1 – 16 гигабайт и более; меньший объем памяти использовать не рекомендуется, так как это может привести к значительному замедлению системы. Тактовая частота памяти – 667 MHz – 1.5 GHz. Системная шина – устройство, к которому подсоединены все модули компьютера и через которое они обмениваются сигналами, например, о прерываниях. Тактовая частота шины – 1 – 1.5 GHz (это и есть фактически некая суммарная производительность системы). Обычно используется шина типа PCI (Personal Computer Interface). К ней могут быть подсоединены процессор, память, диски, принтер, модем и другие внешние устройства. Порты – устройства с разъемами для подключения к компьютеру внешних устройств. Каждый порт имеет свой контроллер (и, соответственно, свой драйвер). Чаще всего используется порт USB (Universal Serial Bus), с характерным плоским разъемом, размером порядка 1 см, с изображением трезубца. К портам USB могут подключаться большинство видов устройств, причем для этого не требуется предварительно отключать компьютер и подключаемое устройство, что очень удобно. Имеется несколько стандартов USB с различным быстродействием. Наиболее распространен ныне стандарт USB 2.0, обеспечивающий быстродействие порта 240 – 260 килобит в секунду. Для сравнения, предыдущий стандарт – USB 1.0 – обеспечивал лишь 10 – 12 килобит в секунду (как говорится, почувствуйте разницу). Распознать тип USB-порта на Вашем компьютере можно, если вывести информацию об устройствах; в Windows: Мой компьютер / (правая кнопка мыши) Свойства / Оборудование / Диспетчер устройств / Устройства USB. При этом контроллер порта USB 2.0 будет обозначен как расширенный (enhanced). Если это не так, Вам необходимо модернизировать порты USB или сам компьютер, иначе при переписи на флэшку Вам придется ждать в 20 раз дольше (!). Существуют также "переходники" USB 1.0 > USB 2.0. Новейший стандарт USB 3.0, реализация которого только началась, обеспечит быстродействие не менее 1 гигабита в секунду. К порту USB можно подключать клавиатуру, мышь, принтеры, сканеры, внешние жесткие диски, флэшки и даже TV-тюнеры - устройства для приема телевизионного сигнала с антенны и показа телевизионного изображения на компьютере. Рекомендуется каждое устройство подключать всегда к одному и тому же порту USB, иначе для некоторых устройств (например, того же TV-тюнера) могут возникнуть проблемы. 38 Порты COM (communication ports) – порты для подключения различных коммуникационных устройств, например, модемов – устройств для выхода в Интернет и передачи информации по аналоговой или цифровой телефонной линии. Более старое название стандарта COM-порта – RS-232. В компьютерах 10-15 – летней давности с COM-порту часто подключалась мышка (сейчас она, разумеется, подключается через USB). Разъемы COM-портов имеют два формата – "большой" (с 25 контактами - pins) и "малый" (с 9 контактами). В современных компьютерах часто разъемы COM-порты отсутствуют, но операционная система, по традиции, имитирует наличие в системе виртуальных COM-портов – воображаемых COMпортов, которые ОС как бы инсталлирует в систему при установке, например, драйверов для взаимодействия через Bluetooth или через кабель компьютера с мобильным устройством. При этом физически мобильный телефон или органайзер может быть подключен к порту USB (или соединен с компьютером беспроводной связью), но все равно для взаимодействия с ним ОС использует виртуальный COM-порт, обычно с большим номером (например, 10 или 15). COM-порт иначе называют последовательным портом (serial port), так как, с точки зрения ОС и драйверов, COM-порт – это символьное устройство последовательного действия. Порт LPT (от line printer), или параллельный порт – это ныне уже устаревший вид порта для подключения принтера или сканера, с толстым в сечении кабелем и большим разъемом. Все новые модели принтеров и сканеров работают через USB-порты. Однако иногда приходится решать задачу подключения к новому компьютеру старого принтера. Если на компьютере нет LPT-порта, приходится покупать специальный переходник, подключаемый к USB или другим портам. Однако и здесь возможен сюрприз (по личному опыту автора) – разъем LPT-порта имеет несколько не совместимых друг с другом модификаций. Лучше всего иметь в домашнем "вычислительном центре" один старый компьютер с LPT-портом и через него и подключать старые принтеры, обеспечивая обращение к ним с других компьютеров через домашнюю локальную сеть. Неудобство LPT-порта в том, что он требует предварительно выгрузить ОС и выключить принтер, и только после этого выполнять подсоединение к компьютеру, иначе возможен выход из строя принтера или компьютера. LPT-порт может, как правило, работать и для ввода информации, например, со сканером, но для этого требуется в низкоуровневой утилите Setup, запустив ее при загрузке ОС (обычно – клавишей Del), установить для LPT-порта специальный режим работы: EPP – Extended Parallel Port. Порты SCSI и SCSI-устройства. SCSI (Small Computer System Interface; произносится "скАзи", с ударением на первом слоге) – интерфейс, адаптеры и порты для подключения широкого спектра внешних устройств – жестких дисков, CD-ROM / DVD-ROM, сканеров и др. Стандарт SCSI был предложен в начале 1980-х гг. и получил широкое распространение, благодаря фирме Sun, которая широко использовала его в своих рабочих станциях. Характерной удобной возможностью SCSI является возможность подключения к одному SCSIпорту гирлянды (цепочки) SCSI-устройств (до 10), каждый из которых имеет уникальный для данного соединения SCSI ID – число от 0 до 9, устанавливаемое обычно на задней панели SCSI-устройства. Например, по традиции, SCSI ID сканера обычно равен 4. На одном из концов цепочки – SCSI-порт с контроллером, на другом – терминатор – переключатель на задней панели устройства, устанавливаемый в определенное положение как признак конца SCSI-цепочки. Каждое устройство, кроме последнего, соединено со следующим SCSIустройством специальным кабелем. SCSI-разъем напоминает разъем порта LPT, однако имеет по бокам специальные металлические захваты ("лапки") для большей надежности подключения. Преимущество SCSI, кроме возможности использования гирлянд устройств, в его быстродействии, а также надежности. Ранние модели SCSI имели скорость обмена информацией до 10-12 мегабит в секунду, сейчас – 240-250 мегабит в секунду. Имеется несколько стандартов SCSI (в том числе – Wide SCSI, Ultra Wide SCSI), к сожалению, не совместимых по разъемам. Автор до сих пор использует SCSI-сканер 10-летней давности, подключенный к старому компьютеру, и имеет большой положительный опыт использования SCSI-устройств для рабочих станций SPARC. Порт VGA (Video Graphic Adapter) используется для подключения монитора (дисплея), управляемого графическим контроллером (процессором). IEEE 1394 (FireWire) – порты для подключения цифровых видеокамер или фотоаппаратов. Характерная особенность – небольшой блестящий плоский разъем шириной 3-5 мм (имеются два его стандарта). Порт работает в дуплексном режиме, т.е. позволяет управлять не только вводом информации с камеры в компьютер, но и установками самой камеры (например, перемоткой ленты) с помощью компьютерной программы (например, Windows Movie Maker). С помощью такого же порта может быть подключен также телевизор, имеющий интерфейс FireWire. Характерной особенностью современных компьютеров является то, что 39 FireWire-порты монтируются прямо на материнской плате (motherboard) – основной печатной плате компьютера, на которой смонтированы процессор и память, - столь большое значение придают производители компьютеров портам для обмена мультимедийной информацией. В таких случаях в технических характеристиках компьютера обычно указывается: "FireWire on board (на борту)". Читателям рекомендуется не путать FireWire с Wi-Fi (см. "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени ") – стандартом быстрой беспроводной связи; эти сокращения забавно напоминают друг друга из-за привязанности американцев к аббревиатурам в "детском стиле". HDMI (High Definition Multimedia Interface) – интерфейс и порт. позволяющий подключить к компьютеру телевизор или другое видеооборудование, обеспечивающее наилучшее качество воспроизведения (HD – High Definition). Разъем HDMI напоминает разъем USB. HDMI-порт входит в комплектацию всех современных портативных компьютеров. Bluetooth – устройства для беспроводного подключения (с помощью радиосвязи) к компьютеру мобильных телефонов, органайзеров, а также наушников, плейеров и многих других полезных устройств. Удобство Bluetooth в том, что компьютер и телефон остаются соединенными, даже если отойти от компьютера с телефоном на некоторое расстояние (например, в другую комнату), не более 10-15 метров (Bluetooth 2.0). Новый стандарт Bluetooth 3.0 обеспечивает взаимодействие на расстоянии 200-250 м. Обычно портативные компьютеры комплектуются встроенными адаптерами Bluetooth, либо можно приобрести адаптер Bluetooth, подключаемый через USB. Недостаток Bluetooth – относительно маленькая суммарная скорость передачи информации. Например, при пересылке на компьютер через Bluetooth с мобильного телефона Nokia 3230 цифровой фотографии объемом 500 килобайт требуется ждать порядка 10 – 15 секунд. Инфракрасный порт (IrDA) – порт для подключения ноутбука к мобильному телефону (или двух ноутбуков друг к другу) через инфракрасную связь. Неудобство портов IrDA – необходимость установки двух соединяемых устройств рядом, на расстоянии 20-30 см друг от друга, без физических препятствий между ними. Скорость передачи информации – 10-12 мегабит в секунду. Современные ноутбуки уже не комплектуются портами IrDA. Имеются также сетевые устройства – порты и адаптеры – для подключения компьютера к локальной сети. Функционирование компьютерной системы Преимущество описанного модульного подхода к аппаратуре в том, что центральный процессор, память и внешние устройства могут функционировать параллельно. Работой каждого устройства управляет специальный контроллер. При необходимости выполнения вводавывода центральный процессор генерирует прерывание, в результате которого вызывается операционная система, в свою очередь, в качестве реакции на прерывание запускающая драйвер устройства, соответственно, активизирующий его контроллер. Каждый контроллер устройства имеет локальный буфер – специализированную память для обмена информацией между компьютером и устройством. Для того, чтобы контроллер мог начать вывод на устройство, предварительно центральный процессор (точнее, драйвер устройства, запущенный на нем) должен переслать информацию из заданной области оперативной памяти в буфер устройства. Далее контроллер устройства уже выполняет вывод информации из буфера на само устройство (например, записывает ее в заданную область жесткого диска). По окончании обмена и информацией, контроллер генерирует сигнал о прерывании (interrupt) по системной шине, этим информируя процессор об окончании операции. Для того, чтобы избежать повторных пересылок больших объемов информации, в современных компьютерах применяют DMA (Direct Memory Access) – контроллеры – контроллеры с прямым доступом к оперативной памяти. Такие контроллеры используют при обмене с устройством не свою специализированную память, а напрямую область оперативной памяти, в которой и размещается буфер обмена. Обработка прерываний Операционную систему можно рассматривать как программу, управляемую прерываниями (interrupt-driven program). Прерывание центрального процессора передает управление подпрограмме обработки данного вида прерываний, являющейся частью ОС. В большинстве компьютеров этот механизм реализован через вектор прерываний (interrupt 40 vector) – резидентный массив в оперативной памяти, в котором хранятся доступные по номерам прерываний адреса подпрограмм-обработчиков прерываний (модулей ОС). При обработке прерывания аппаратура и ОС сохраняют адрес прерванной команды. При возобновлении вычислений будет вновь повторено выполнение прерванной команды. Очевидно, что при обработке прерывания, в свою очередь, может возникнуть другое прерывание. В этом случае новое входящее прерывание задерживается (disabled), и информация о нем запоминается в очереди прерываний – системной структуре ОС, обеспечивающей поочередную обработку всех возникших прерываний. Кроме прерываний, генерируемых аппаратурой неявно при вычислениях (например, отсутствие страницы в оперативной памяти), возможно также программируемое прерывание (trap; дословно – ловушка) с помощью специальной команды процессора, - например, при обнаруженной ошибке в программе. В случае такого прерывания также работает общий механизм запуска обработчика прерывания – части ОС. Таким образом, с упрощенной точки зрения, ОС можно рассматривать как набор обработчиков прерываний. При прерывании ОС сохраняет состояние процессора – значения регистров и значение счетчика команд (program counter – PC) – адреса прерванной команды. Обработчик прерывания в ОС определяет по содержимому сегмента объектного кода, какого вида прерывание возникло и какие действия по его обработке следует предпринять. Среди возможных видов прерываний, кроме фиксации различных ошибок, имеются также прерывания по таймеру – периодические прерывания через определенный квант времени, предназначенные для опроса устройств (polling) – действий операционной системы по периодической проверке состояния всех портов и внешних устройств, которое может меняться с течением времени: например, к USB-порту была подключена флэшка; принтер закончил печать и освободился, и т.д. ОС выполняет реконфигурацию системы и корректирует системные таблицы, хранящие информацию об устройствах. Архитектура ввода-вывода На рис. 4.2 изображена временная диаграмма прерываний процессора, выполняющего ввод-вывод. Рис. 4.2. Временная диаграмма прерываний процессора при вводе-выводе. На диаграмме видны моменты смены состояний процессора и устройства ввода-вывода: прерывание по запросу на ввод-вывод, обработка этого прерывания и пересылка информации из памяти в буфер устройства, вызов драйвера и контроллера, окончание обмена и прерывание контроллера, продолжение вычислений. Имеются две разновидности режима ввода-вывода – синхронный и асинхронный. Синхронный ввод-вывод – это ввод-вывод, выполнение которого приводит к переходу программы в состояние ожидания, до тех пор, пока операция ввода-вывода не будет полностью завершена. На аппаратном уровне – команда ввода-вывода переводит процессор в состоянии ожидания (idle) до следующего прерывания. При данном режиме в каждый момент 41 выполняется не более одного запроса на ввод-вывод; одновременный ввод-вывод отсутствует. Синхронный вывод выполняют всем программистам привычные операторы вида println(x). При их использовании в программах мы не задумывается над тем, что используем достаточно неэффективный вариант синхронного ввода-вывода. Однако до сих пор мышление большинства программистов – последовательное, в том смысле, что о своей программе они мыслят как о чисто последовательно выполняемой, и вообще не думают о возможности какого-либо распараллеливания. При отладке программы, либо если размер выводимой информации невелик, это обычно вполне допустимо. Асинхронный ввод-вывод – ввод-вывод, выполняемый параллельно с выполнением основной программы. После того. как начинается асинхронный ввод-вывод, управление возвращается пользовательской программе, без ожидания завершения ввода-вывода (последнее может быть выполнено специальной явной операцией). Таким образом, операция асинхронного обмена как бы разбивается на две: начать ввод-вывод и закончить вводвывод. Последняя выполняется для того, чтобы в этом месте программа все же ожидала завершения обмена, когда его результат необходим для дальнейших вычислений. Такой подход к реализации обмена более труден для понимания программистами и может привести к ошибкам (например, использована только операция начала ввода-вывода, а вызов операции его окончания забыт). Таблица состояния устройств На системном уровне, при обмене происходит следующее. Выполняется системный вызов (system call) – запрос к ОС путем вызова системной подпрограммы, в данном случае – чтобы позволить пользователю ожидать завершения ввода-вывода. Операционная система хранит таблицу состояния устройств, в которой каждому устройству соответствует элемент, содержащий тип устройства, его адрес и состояние. ОС индексирует таблицу устройств, с целью определения состояния устройства и модификации элемента таблицы для включения в нее информацию о прерывании. Архитектура синхронного (a) и асинхронного (b) ввода-вывода иллюстрируется на рис. 4.3. Рис. 4.3. Архитектура синхронного и асинхронного ввода-вывода На схеме видно, что отличительной чертой синхронного обмена является переход процессора в состояние ожидания до окончания операции ввода-вывода. На рис. 4.4 показан пример состояния таблицы устройств ввода-вывода, хранимой операционной системой. Для каждого устройства хранится информация о его имени, состоянии, а для занятых устройств – адрес начала и длина порции информации, подлежащей обмену. Если для некоторого устройства (в примере – диск3) имеется несколько запросов на вводвывод, все они организуются в очередь и обслуживаются по очереди, по мере освобождения устройства. 42 Рис. 4.4. Пример состояния таблицы внешних устройств ОС Прямой доступ к памяти (Direct Memory Access – DMA) – более эффективный метод работы контроллеров устройств ввода-вывода, используемый для работы высокоскоростных устройств, способных передавать информацию со скоростью, близкой к скорости работы памяти DMA-контроллер передает блок данных из буферной памяти непосредственно в основную память, без участия процессора. Преимущество подобного широко применяемого подхода – не только в том, чтобы избежать лишней пересылки данных из одной области памяти в другую, но также в том, что прерывание в этом случае генерируется на каждый блок пересылаемых данных (хранящийся в буфере), но не на каждый пересылаемый байт, как при более традиционном способе обмена. Структура памяти Основная (оперативная) память – единственная крупная часть памяти, к которой процессор имеет непосредственный доступ. Как известно, содержимое основной памяти не сохраняется после перезагрузки системы или после выключения компьютера. Внешняя (вторичная) память – расширение основной памяти, обеспечивающее функциональность устойчивой (сохраняемой) памяти большого объема. В качестве вторичной памяти чаще всего используются жесткие диски (hard disks). Физически они состоят из твердых пластин из металла или стекла, покрытых магнитным слоем для записи. Поверхность диска логически делится на дорожки (tracks), которые, в свою очередь, делятся на секторы. Контроллер диска определяет логику взаимодействия между устройством и компьютером. Устройство жесткого диска показано на рис. 4.5. 43 Рис. 4.5. Устройство жесткого диска Как видно из рисунка, цилиндр - это группа вертикально расположенных друг под другом секторов различных магнитных дисков с одним и тем же номером дорожки. Системы памяти организованы в иерархию, исходя их быстродействия, стоимости и возможности сохранения информации (устойчивости). Для оптимизации работы памяти любого вида используется ассоциативная память (кэш – cache), размещаемая в более быстродействующих системах памяти и хранящая наиболее часто используемые элементы более медленной памяти. С этой точки зрения, оперативную память можно рассматривать как кэш для внешней памяти. Кэш-память – это, по сути дела, ассоциативный список пар (Адрес, Значение), причем аппаратный поиск в ней происходит по адресу как по ключу. Таким образом, перед обращением к медленной внешней памяти сначала происходит поиск по заданному адресу в кэш-памяти, и только если он не привел к успеху, выполняется стандартное обращение к внешней памяти. Принцип кэширования очень важен и позволяет существенно ускорить работу со внешней памятью. Однако он требует реализации специальной политики управления кэш-памятью, так как кэширование вводит дополнительный уровень в иерархии памяти и требует согласованности данных, хранимых одновременно на разных уровнях памяти. Аппаратура и ОС поддерживают кэш команд, кэш данных, кэш жесткого диска и т.д. – для всех видов памяти. Иерархия устройств памяти (в упрощенном виде) показана на рис. 4.6 Более быстрые виды памяти на схеме расположены выше, более медленные – ниже. Схема особых комментариев не требует. Некоторые часто используемые виды внешней памяти: флэш-память (флэшка) – внешняя память компактного размера, модуль которой подключаются через USB-порт. Параметры: объем - до 128 гигабайт и более; скорость обмена через порт USB 2.0: 240 – 260 мегабит в секунду; внешний жесткий диск (ZIV drive и другие) – объем до 1 терабайта; работает также через порт USB; BluRay – диски – новая разновидность компакт-дисков большой емкости (односторонние – 25 гигабайт, двусторонние – 50 гигабайт). Для сравнения, стандартная емкость диска DVD составляет 4.7 гигабайт. 44 Рис. 4.6. Иерархия устройств памяти Аппаратная защита памяти и процессора В целях совместного использования системных ресурсов (памяти, процессора, внешних устройств) несколькими программами, требуется, чтобы аппаратура и операционная система обеспечили невозможность влияния некорректно исполняемой программы на другие пользовательские программы. Для этого необходима аппаратная поддержка, как минимум, двух режимов исполнения программ – пользовательского (непривилегированного) режима (user mode) – для выполнения программ пользователей – и системного (привилегированного, режима ядра - system mode, monitor mode) - для модулей операционной системы. Идея двух режимов в том, чтобы выполняемые в привилегированном режиме модули ОС могли выполнять распределение и выделение системных ресурсов, в частности, формировать новые адреса, а пользовательские программы, в результате ошибок или преднамеренных атак, выполняясь в обычном режиме, не могли бы обратиться в область памяти операционной системы или другой задачи, изменять их и этим нарушать их целостность. Для определения текущего режима выполнения команд в аппаратуре вводится бит режима, равный 0 для системного и 1 – для пользовательского режима. При прерывании или сбое аппаратура автоматически переключается в системный режим. Некоторые привилегированные команды, изменяющие системные ресурсы и состояние системы (например, регистр состояния процессора), должны выполняться только в системном режиме, что защитит системные ресурсы от случайной или преднамеренной порчи при выполнении этих команд обычной пользовательской программой. Для защиты ввода-вывода все команды ввода-вывода считаются привилегированными. Необходимо гарантировать, чтобы пользовательская программа никогда не получила управление в системном режиме и, в частности, не могла бы записать новый адрес в вектор прерываний, который, как уже отмечалось, содержит адреса подпрограмм обработки прерываний, в частности, связанных со вводом-выводом. Использование системного вызова для выполнения ввода-вывода иллюстрируется на рис. 4.7. На схеме системный вызов номер n вызывает программируемое прерывание (trap), вызывается ОС в привилегированном режиме, и по номеру системного вызова определяется операция ввода-вывода, которая должна быть выполнена по данному прерыванию. Затем в привилегированном режиме выполняется операция ввода-вывода, после чего происходит прерывание и возврат в пользовательскую программу, выполняемую в обычном режиме. 45 Рис. 4.7. Использование системного вызова для выполнения ввода-вывода. Для защиты памяти необходимо обеспечить защиту, по крайней мере, для вектора прерываний и подпрограмм обслуживания прерываний. Например, недопустимо разрешить пользовательской программе формировать в обычном режиме произвольный адрес и обращаться по нему, так как при этом может быть нарушена целостность системных областей памяти. Чтобы этого избежать, в аппаратуре вводятся два регистра, которые отмечают границы допустимой области памяти, выделенной пользовательской программе. Это базовый регистр (base register), содержащий начальный адрес области памяти, выделенной пользовательской программе, и регистр границы (limit register), содержащий размер пользовательской области памяти. Память вне отмеченного диапазона считается защищенной, т.е. обращения к ней из пользовательской программы не допускаются (при попытке такого обращения возникает прерывание). Использование базового регистра и регистра границы иллюстрируется на рис. 4.8. На схеме заданию 2 выделена область памяти, начиная с адреса 300040 (хранящегося в регистре базы), длиной 120900 (хранящейся в регистре границы), т.е. по адрес 420939 включительно. Обращение, например, по адресу 420940 из программы задания 2 приводит к прерыванию как недопустимое – срабатывает защита памяти. Схема аппаратной защиты адресов памяти иллюстрируется рис. 4.9. Аппаратная защита адресов памяти в системах с теговой архитектурой Более радикальные меры для защиты памяти (и не только) предприняты в системах с теговой архитектурой - МВК "Эльбрус", Burroughs 5000/6700/7700 и др. Как уже пояснялось, в такой компьютерной системе каждое слово памяти имеет тег – информацию о типе данных, хранящемся в данном слове. Специальные теги имеют любые данные – например, числа (целые и вещественные), адреса, указатели на процедуры и др. Аппаратура при выполнении команды выполняет динамический контроль типов – проверяет, соответствуют ли теги операндов выполняемой операции. Если не соответствуют – прерывание. 46 Рис. 4.8. Использование регистра базы и регистра границы для защиты памяти Рис. 4.9. Схема аппаратной защиты адресов памяти Адрес в системе с теговой архитектурой представлен специальным адресным словом дескриптором (descriptor). Кроме тега и собственно адреса начала адресуемого массива в памяти, дескриптор содержит также длину массива и 4 бита зашиты – от чтения, от записи, от выполнения и от записи адресной информации. Формирование и изменение дескриптора возможно только средствами ОС в привилегированном режиме. Пользовательская программа не может ни сформировать, ни изменить дескриптор и работает со своей областью памяти как с массивом, защищенным тегом и дескриптором, образовывая от него подмассивы и формируя их дескрипторы (такое действие разрешено). Допустимая операция над массивом - индексация a[i], в которой аппаратно проверяется, что индекс i не выходит за границы массива a. Таким образом, обращение в "чужую" область памяти в такой системе принципиально невозможно. Невозможна также адресная арифметика (в стиле C / C++), так как попытка выполнения арифметической операции над словом с тегом дескриптор приводит к немедленному прерыванию. 47 Кроме дескриптора, имеется также косвенное слово (indirect word) – тегированный адрес для обращения к элементу данных одной командой, непосредственно по адресу (без индексации). Для косвенных слов фактически выполняются те же аппаратные проверки, что и для дескрипторов. Подобная система защиты, с одной стороны, совершенна и стопроцентна, с другой, разумеется, требует больших накладных расходов на аппаратную проверку тегов, которую отключить невозможно, даже в случаях, если из кода программы, очевидно, что никаких ошибок при работе с адресной информации нет. Организация аппаратной защиты памяти и процессора Прерывания по таймеру При исполнении в привилегированном режиме ОС имеет неограниченный доступ как к памяти монитора, так и к памяти пользователя. Команды записи значений в регистры base и limit являются привилегированными. В системах с теговой архитектурой только привилегированная команда может сформировать новый дескриптор на область памяти, либо изменить поле в дескрипторе (например, адрес начала или длину). Для организации периодических прерываний в системе имеется таймер – системный регистр, содержащий некоторое установленное специальной командой значение времени, которое уменьшается через каждый квант (такт) процессорного времени. Когда значение таймера становится равным нулю, происходит прерывание. Прерывание по таймеру используется для организации периодического опроса устройств, для реализации режима разделения времени (для отсрочки неактивных задач по истечение некоторого временного интервала) и для вычисления текущего времени. Команда записи значения в таймер является привилегированной. Ключевые термины Bluetooth – интерфейс для беспроводного подключения (с помощью радиосвязи) к компьютеру мобильных телефонов, органайзеров, наушников, плейеров и многих других видов устройств. BluRay – диск – разновидность компакт-дисков большой емкости (25 – 50 ГБайт). COM (communication port, serial port, последовательный порт) – порт для подключения к компьютеру различных коммуникационных устройств, например, модемов. DMA (Direct Memory Access) – контроллеры с прямым доступом к оперативной памяти, минуя использование специализированной памяти устройства. EPP (Extended Parallel Port) – двунаправленный режим работы порта LPT, в котором он может работать не только для выводв, но и для ввода информации. HDMI (High Definition Multimedia Interface) – интерфейс и порт. позволяющий подключить к компьютеру телевизор или другое видеооборудование, обеспечивающее наилучшее качество воспроизведения (HD – High Definition). IEEE 1394 (FireWire) – порт для подключения к компьютеру цифровой видеокамеры или фотоаппарата. LPT (от line printer), или параллельный порт –устаревший вид порта для подключения принтера или сканера, с толстым в сечении кабелем и большим разъемом, требующий предварительного выключения компьютера и устройства для их безопасного соединения. PCI (Personal Computer Interface) – наиболее распространенный тип системной шины, к которой подсоединены процессор, память, диски, принтер, модем и другие внешние устройства компьютерной системы. RS-232 - другое (более старое) название порта COM. SCSI (Small Computer System Interface) – интерфейс, адаптеры и порты для подключения широкого спектра внешних устройств – жестких дисков, сканеров и др., с возможно- 48 стью обслуживания гирлянды устройств, подключенных к одному SCSI-порту и имеющих различные номера (SCSI IDs). SCSI ID – номер устройства (от 0 до 9), являющегося частью гирлянды SCSIустройств, подключенных к одному SCSI-порту. TV-тюнер - устройство для приема телевизионного сигнала с антенны и показа телевизионного изображения на компьютере. USB (Universal Serial Bus) – наиболее распространенный универсальный порт компьютера (с характерным плоским разъемом, размером порядка 1 см, с изображением трезубца), к которому могут подключаться клавиатура, мышь, внешний диск, принтер, сканер и другие внешние устройства. Асинхронный ввод-вывод – ввод-вывод, выполняемый параллельно с выполнением программы пользователя. Ассоциативная память (кэш – cache) – область памяти, размещаемая в более быстродействующей системе памяти и хранящая наиболее часто используемые элементы более медленной памяти вместе с их адресами, с целью оптимизации обращений к ним. Базовый регистр (base register) – системный регистр, используемый для защиты памяти и содержащий начальный адрес области памяти, выделенной пользовательской программе. Бит режима – бит, хранящийся в системном регистре и задающий текущий режим выполнения команд: равен 0 для системного режима и 1 – для пользовательского режима. Вектор прерываний (interrupt vector) – резидентный массив в оперативной памяти, в котором хранятся доступные по номерам прерываний адреса подпрограмм-обработчиков прерываний (модулей ОС). Виртуальный COM-порт – воображаемый COM-порт (в действительности не существующий и не имеющий разъема), который ОС как бы инсталлирует в систему при установке, например, драйвера для взаимодействия через Bluetooth или через кабель компьютера с мобильным устройством. Обычно имеет большой номер, например, 18. Внешняя (вторичная) память – расширение основной памяти, обеспечивающее функциональность устойчивой (сохраняемой) памяти большого объема. Гирлянда SCSI-устройств – цепочка устройств, подключенных к одному SCSI-порту и имеющих различные SCSI IDs (номера). Дескриптор (descriptor) – адресное слово в системах с теговой архитектурой; содержит тег дескриптор, адрес начала адресуемого массива в памяти, длину массива и 4 бита зашиты – от чтения, от записи, от выполнения и от записи адресной информации. Дорожка (track) – часть жесткого диска, расположенная между двумя концентрическими окружностями на одном из составляющих его магнитных дисков. Жесткий диск (hard disk) - разновидность внешней памяти, физически состоящая из твердых пластин из металла или стекла, покрытых магнитным слоем для записи, шпинделя и головок считывания – записи. Инфракрасный порт (IrDA) – порт для подключения ноутбука к мобильному телефону (или двух ноутбуков друг к другу) через инфракрасную связь. Контроллер устройства – специализированный процессор (устройство управления) для какого-либо устройства компьютерной системы - основной памяти или внешнего устройства. Материнская плата (motherboard) – основная печатная плата компьютера, на которой смонтированы процессор и память. Модем (аббревиатура от модулятор – демодулятор) – устройство для выхода в Интернет и передачи информации по аналоговой или цифровой телефонной линии. Опрос устройств (polling) – действия операционной системы по периодической проверке состояния всех портов и внешних устройств, которое может меняться с течением времени. 49 Основная (оперативная) память – быстродействующая память, к которой процессор имеет непосредственный доступ во время выполнения программы, хранящая программы и данные, информация в которой не сохраняется после выключения компьютера или перезапуска системы. Очередь прерываний – системная структура ОС, обеспечивающая поочередную обработку всех возникших прерываний. Пользовательский (непривилегированный) режим (user mode) – стандартный режим выполнения программ, в котором исполняются программы пользователей. В данном режиме запрещены некоторые привилегированные операции (например, изменение системных областей памяти и регистров). Порт – устройство с разъемом и контроллером для подключения к компьютеру внешних устройств. Прерывания по таймеру – периодические прерывания через определенный квант времени, предназначенные для опроса устройств и других необходимых периодических действий ОС. Программа, управляемая прерываниями (interrupt-driven program) – программа, запускаемая автоматически при возникновении прерывания центрального процессора (например, операционная система). Программируемое прерывание (trap; дословно – ловушка) – прерывание, явно генерируемое с помощью специальной команды процессора (обычно для обработки ошибки в программе). Регистр границы (limit register) – системный регистр, используемый для защиты памяти и содержащий длину области памяти, выделенной пользовательской программе. Сектор – часть жесткого диска, ограниченная дорожкой и двумя радиусами. Синхронный ввод-вывод – операция ввода-вывода, выполнение которой приводит к переходу программы в состояние ожидания, до тех пор, пока операция ввода-вывода не будет полностью завершена. Системная шина (system bus) – коммуникационное устройство, соединяющее между собой все модули компьютерной системы - центральный процессор, память и контроллер памяти, внешние устройства и их контроллеры, - которые через системную шину обмениваются сигналами. Системный вызов (system call) – явный запрос пользовательской программы к ОС путем вызова системной подпрограммы. Системный (привилегированный) режим (system mode, kernel mode, monitor mode) – особый режим выполнения команд, в котором исполняются модули ядра ОС, допускающий выполнения ряда привилегированных операций, например, изменение системных областей памяти и регистров. Состояние процессора – значения регистров и значение счетчика команд . Счетчик команд – адрес текущей выполняемой или прерванной команды процессора. Таблица состояния устройств – таблица, хранимая и используемая операционной системой, в которой каждому устройству соответствует элемент, содержащий тип устройства, его адрес и состояние, а для занятого устройства – ссылку на очередь обрабатываемых запросов к нему. Таймер – системный регистр, содержащий некоторое установленное специальной командой значение времени, которое уменьшается через каждый квант (такт) процессорного времени. Когда значение таймера становится равным нулю, происходит прерывание. Флэш-память (флэшка) – модуль внешней памяти компактного размера (как правило, – 5 см), подключаемый через USB-порт и имеющий емкость до 128 ГБайт. Цилиндр – часть жесткого диска, представляющая собой совокупность дорожек одного диаметра, находящихся на всех его параллельно расположенных магнитных дисках. 50 Краткие итоги Компьютерная система состоит из модулей – процессора, памяти и внешних устройств, каждое из которых управляется своим контроллером, соединенных между собой системной шиной. В современных компьютерных системах имеются такие модули, как процессор, память, общая шина PCI, порты – USB, COM, IEEE 1394, SCSI, HDMI и другие,. SCSI-порт допускает подключение к нему гирлянды устройств. Инфракрасный порт (IrDA) неудобен и фактически устарел. Беспроводной интерфейс Bluetooth используется для связи компьютера с мобильным устройством, наушниками, плеером. Модули компьютерной системы – процессор, память и внешние устройства с их контроллерами – функционируют параллельно. Контроллер имеет локальный буфер, через который осуществляется обмен с устройством. Оптимизация – режим DMA, при котором роль буферной памяти играет часть оперативной памяти. При необходимости выполнения ввода-вывода процессор информирует систему об этом через прерывание. По окончании операции контроллер также генерирует прерывание. Обработка прерываний осуществляется через резидентный вектор прерываний, содержащий адреса подпрограмм обработки прерываний – модулей ОС. ОС – это фактически программа, управляемая прерываниями. Она вызывается либо по прерыванию, либо по программируемому прерыванию (ловушке), либо системным вызовом подпрограммы ОС из программы пользователя. В системе имеется очередь прерываний, с помощью которой обрабатывается последовательно вся цепочка возникающих прерываний. При прерывании ОС сохраняет состояние процессора, обработчик прерывания определяет, какого типа прерывание произошло, и какие действия следует предпринять по его обработке. Возможны прерывания по таймеру с целью периодического опроса устройств. Ввод-вывод может быть синхронным и асинхронным. Для обработки ввода-вывода ОС хранит и использует таблицу состояния устройств. Устройства памяти имеют свою иерархию, от самых быстрых к наиболее медленным. Для оптимизации обращения к более медленной памяти используется ассоциативная память (кэш), организуемый в более быстрой памяти. Наиболее распространенные виды внешней памяти – жесткие диски, а также флэш-память, CD, DVD и BluRay – диски. Для защиты памяти и всей системы вводятся два режима исполнения – привилегированный (для ядра ОС) и непривилегированный (для обычных программ). Для защиты памяти используются два регистра – базы и границы, задающие границы области памяти, выделенной пользовательской программе. Все команды ввода-вывода – привилегированные. Бит режима задает текущий режим выполнения. Ввод-вывод реализуется с помощью системных вызовов. В системах с теговой архитектурой защита памяти осуществляется в помощью адресных слов со специальными тегами – дескрипторов. Дескриптор содержит адрес начала массива, длину и признаки защиты. Прерывания по таймеру организуются системой для опроса устройств и для реализации режима разделения времени. Набор для практики Вопросы 1. Назовите основные компоненты, из которых состоит настольная или портативная компьютерная система. 2. Что такое системная шина и какова ее роль в компьютерной системе? 3. Что такое контроллер? 4. Назовите и кратко охарактеризуйте основные типы портов в компьютерной системе. 5. Какие области памяти используются в операциях ввода-вывода? 6. Каким образом контроллер устройства информирует процессор об окончании операции ввода-вывода? 7. Как организована обработка прерываний? 8. Что такое вектор прерываний? 9. Как система обрабатывает ситуацию, когда при обработке прерывания возникает другое прерывание? 10. Что такое программируемое прерывание (ловушка) и когда оно генерируется? 11. Каково назначение прерывания по таймеру? 51 12. Что такое опрос устройств и какова его роль в системе? 13. Чем синхронный ввод-вывод отличается от асинхронного? 14. Что такое таблица состояния устройств и для чего она используется операционной системой? 15. В чем отличие основной памяти от внешней памяти? 16. Опишите кратко устройство жесткого диска. 17. Что такое ассоциативная память (кэш) и как она позволяет оптимизировать обращение к более медленным видам памяти? 18. Назовите основные виды внешней памяти. 19. Какова цель введения привилегированного режима и какие действия в нем разрешены, по сравнению с обычным режимом исполнения программ? 20. Каким образом система определяет текущий режим исполнения? 21. Что такое системный вызов и как они используются для организации ввода-вывода? 22. Что такое регистр базы и регистр границы и как они используются для защиты памяти? 23. Что такое таймер и как прерывания по таймеру используются операционной системой? 24. Как организована защита памяти в системах с теговой архитектурой? 25. Что такое дескриптор и для чего он предназначен? Упражнения 1. Составьте наиболее предпочтительную, с Вашей точки зрения, конфигурацию офисного настольного компьютера для Вашей повседневной работы. Укажите объем памяти, быстродействие, виды портов и внешних устройств. 2. То же – для портативного компьютера (ноутбука). 3. Предложите наиболее быстрый, надежный и удобный, с Вашей точки зрения, способ резервного копирования информации – сохранения наиболее важных файловых систем во внешней памяти. 4. Изобразите схему прерываний и активизации процессора и устройства вывода при выполнении фрагмента простой программы: x := 1; writeln(x); y := 2; writeln(y); 5. Предложите и реализуйте схему алгоритма умножения матриц m * m, хранящихся во внешней памяти, с записью результата также во внешнюю память, с использованием асинхронного ввода-вывода с целью распараллеливания программы. 6. Опишите и реализуйте алгоритм обращения к памяти с использованием кэша, с предварительным поиском адреса в кэше и его записью в кэш, в случае, если он не найден. 7. Пусть задаче выделена область памяти, начиная с адреса 400000 (содержимое регистра базы), длиной 100000 (содержимое регистра границы). Корректным ли будет обращение по адресу 400001? по адресу 500001? Опишите подробно, как происходит проверка адреса на корректность в каждом из двух случаев, и соответствующие действия системы. Темы для курсовых работ, рефератов, эссе 1. Обзор архитектуры компьютерной системы (реферат). 2. Обзор асинхронных и синхронных методов ввода-вывода в компьютерных системах (реферат). 3. Методы обработки прерываний с помощью вектора прерываний (реферат). 4. Обзор иерархии и видов внешней памяти (реферат). 5. Обзор методов защиты памяти в компьютерных системах (реферат). 52 5. Лекция: Архитектура ОС. Управление процессами: Основные понятия. Семафоры и мониторы В лекции рассматриваются: архитектура ОС и ее функциональность; управление процессами как основная функция ОС; обзор базовых механизмов синхронизации процессов - семафоров и мониторов. Содержание Введение Основные компоненты ОС Управление процессами Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение В данной и следующей лекциях рассмотрена архитектура ОС. Будут рассмотрены следующие вопросы: 1. 2. 3. 4. 5. 6. 7. 8. Компоненты системы Сервисы (службы) системы Системные вызовы Системные программы Структура системы Виртуальные машины Проектирование и реализация системы Генерация системы. Основные компоненты ОС Операционная система – весьма сложная по архитектуре программная система, в которой можно выделить следующие основные компоненты: 1. 2. 3. 4. 5. 6. 7. 8. 9. Управление процессами Управление основной памятью Управление файлами Управление системой ввода-вывода Управление внешней памятью Поддержка сетей (networking) Система защиты (protection) Система поддержки командного интерпретатора. Графическая оболочка. Рассмотрим эти компоненты подробнее. Управление процессами. Процесс – это программа пользователя в ходе ее выполнения в компьютерной системе. ОС управляет работой процессов, их распределением по процессорам и ядрам системы, порядком их выполнения и размещения в памяти, их синхронизацией при параллельном решении частей одной и той же задачи разными процессами. Управление основной памятью. Основная (оперативная) память может рассматриваться как большой массив. Операционная система распределяет ресурсы памяти между процессами, выделяет память по запросу, освобождает ее при явном запросе или по окончании процесса, хранит списки занятой и свободной памяти в системе. Управление файлами. Файл – это логическая единица размещения информации на внешнем устройстве, например, на диске. ОС организует работу пользовательских программ с файлами, создает файлы, выполняет их открытие и закрытие и операции над ними (чтение и запись), хранит ссылки на файлы в директориях (папках) и обеспечивает их поиск по символьным именам. 53 Управление системой ввода-вывода. Как уже отмечалось, в компьютерной системе имеется большое число внешних устройств (принтеры, сканеры, устройства управления компакт-дисками и др.), управляемых специальными контроллерами (спецпроцессорами) и драйверами – низкоуровневыми программами управления устройствами, выполняемыми в привилегированном режиме. ОС управляет всеми этими аппаратными и программными компонентами, обеспечивая надежность работы внешних устройств, эффективность их использования, диагностику и реконфигурацию в случае их сбоев и отказов. Для этого ОС хранит и использует таблицу состояния устройств (см. "Архитектура компьютерной системы "). Управление внешней памятью. Как уже говорилось, внешняя (вторичная) память – это расширение оперативной памяти процессора более медленными, но более емкими и постоянно хранящими информацию видами памяти (диски, ленты и др.). При управлении внешней памятью ОС решает задачи, аналогичные задачам управления основной памятью, выделение памяти по запросу, освобождение памяти, хранение списков свободной и занятой памяти и др. ОС поддерживает также использование ассоциативной памяти (кэш-памяти) для оптимизации обращения к внешней памяти. Поддержка сетей. Как неоднократно подчеркивалось, любая современная компьютерная система постоянно или временно находится в различных локальных и глобальных сетях. Операционная система обеспечивает использование сетевого оборудования (сетевых карт, или адаптеров), вызов соответствующих драйверов, поддержку удаленного взаимодействия с файловыми системами, находящимися на компьютерах сети, удаленный вход на другие компьютеры сети и использование их вычислительных ресурсов, отправку и получение сообщений по сети, защиту от сетевых атак. Система защиты. Согласно современным принципам надежных и безопасных вычислений (см. "Понятие операционной системы (ОС), цели ее работы. Классификация компьютерных систем"), при работе ОС должны быть обеспечены надежность и безопасность, т.е. защита от внешних атак, конфиденциальность личной и корпоративной информации, диагностика и исправления ошибок и неисправностей и др. ОС обеспечивает защиту компонент компьютерной системы, данных и программ, поддерживает фильтрацию сетевых пакетов, обнаружение и предотвращение внешних атак, хранит информацию обо всех действиях над системными структурами, полезную для анализа атак и борьбы с ними. Система поддержки командного интерпретатора. Любая операционная систем а поддерживает командный язык (или набор командных языков), состоящих из пользовательских команд, выполняемых с пользовательского терминала (из пользовательской консоли). Типичные команды – это получение информации об окружении, установка и смена текущей рабочей директории, пересылка файлов, компиляция и выполнение программ, получение информации о состоянии системы и выполнении своих процессов и др. В системе Windows для выполнения команд по традиции используется окно пользовательской консоли MS DOS (MS DOS Prompt), в системе Linux – специальное окно "Термиинал" (Start / System Tools / Terminal). Наиболее мощные командные процессоры имеются в системах типа UNIX (UNIX, Solaris, Linux и др.). Их командные языки позволяют писать скрипты – командные файлы, содержащие часто используемые последовательности команд ОС. В UNIX это наиболее удобно. Можно назвать такие командные языки UNIX, как sh (Bourne Shell), csh (C shell), ksh (Korn shell), bash. Каждый UNIX-программист имеет свой излюбленный командный язык и привыкает постоянно использовать скрипты и длинные нетривиальные последовательности команд, которые он выполняет с терминала. Что касается Windows, сравнительно недавно в ней появился мощный командный интерпретатор PowerShell, который и рекомендуется к использованию. Кроме того, для Windows имеется система CygWin, позволяющая выполнять команды и командные файлы UNIX в среде Windows. Типичная последовательность команд в стиле UNIX: ps –a | grep saf, которая выводит в стандартный вывод информацию об активных процессах, причем только принадлежащих пользователю saf. Вертикальная черта (p1 | p2) обозначает операцию конвейер (pipe), позволяющую использовать стандартный вывод процесса p1 как стандартный ввод процесса p2, что и используется операцией grep (фильтрация строк, содержащих заданную последовательность). Подробнее о UNIX (Linux) можно прочитать в книге [16]. Графическая оболочка – подсистема ОС, реализующая графический пользовательский интерфейс пользователей и системных администраторов с операционной системой. Разумеется, использование одного лишь командного языка и системных вызовов неудобно, поэтому простой и наглядный графический пользовательский интерфейс с ОС необходим. Имеется много известных графических оболочек для операционных систем, причем их возможности 54 очень похожи друг на друга - настолько, что подчас не вполне понятно, какая именно ОС используется. Среди графических оболочек, используемых в системах типа UNIX, можно назвать CDE, KDE, GNOME. ОС Windows и MacOS имеют собственные, весьма удобные графические оболочки. Управление процессами Процесс (process) - это пользовательская программа при ее исполнении в компьютерной системе. Для выполнения процесса требуется ряд ресурсов, включая время процессора, память, файлы, устройства ввода-вывода, сетевые устройства и др. В классической схеме UNIX, при создании процесса для него создается новое пространство виртуальной памяти, т.е. таблица страниц для отображения виртуальных адресов в физические, своя для каждого нового процесса. При этом расходуются значительные ресурсы. Если учесть, что в UNIX каждая команда пользователя (например, ls – вывод содержимого текущей директории) запускается как отдельный процесс, то становится понятным, насколько "дорога" операция создания процесса в классическом смысле. Поэтому еще в 1980-х гг. появилась концепция облегченного процесса (lightweight process) – выполняемого в том же пространстве виртуальной памяти, что и процесс-родитель. При создании нового облегченного процесса ОС создает для него только стек – системный резидентный массив в памяти, предназначенный для поддержки выполнения процедур процесса и хранящий их локальные данные и связующую информацию между ними. ОС отвечает за следующие действия, связанные с управлением процессами: Создание и удаление процессов. При создании процесса необходимо создать в памяти соответствующие системные структуры (таблицу страниц, стек и др.). При удалении процесса память, занимаемая ими, освобождается, а также выполняется закрытие всех файлов и освобождение всех других ресурсов, которые использовал процесс, если последний не сделал этого явно. Приостановка и возобновление процессов. Выполнение процесса приостанавливается при выполнении синхронного ввода-вывода, а также системного вызова или команды (типа suspend). Сразу отметим, что использовать подобные операции явной приостановки процессов следует с осторожностью, так как приостанавливаемый процесс может находиться в своей критической секции – выполнять обработку общего ресурса, к которому каждому процессу предоставляется монопольный доступ, так что при его приостановке возникает ситуация тупика (deadlock) – приостановленный процесс не может освободить ресурс, а конкурирующий процесс не может его получить. При приостановке процесса ОС сохраняет состояние его выполнения, а при возобновлении – восстанавливает. Синхронизация процессов. Процессы работают параллельно и при этом конкурируют за общие ресурсы, а также должны в некоторые моменты вычислений ожидать наступления некоторых событий. Для предотвращения возможных конфликтов и несогласованностей, например, race condition - несогласованного доступа к общим данным, при котором один процесс читает старые данные, а другой их в этот же момент обновляет, - ОС предоставляет средства синхронизации (например, семафоры и мониторы, рассмотренные в следующем разделе). Взаимодействие процессов. При своей параллельной работе процессам необходимо взаимодействие, с целью согласованного решения различных частей одной и той же задачи. Процессы могут взаимодействовать с помощью передачи сообщений друг другу, а также с помощью, так называемых условных переменных и рандеву (все эти виды взаимодействия рассмотрены позже). ОС предоставляет все эти средства, в виде системных вызовов, для организации адекватного и удобного взаимодействия процессов. Семафоры. В 1966 г. в работе [17] проф. Эдсгер Дейкстра предложил новый способ синхронизации процессов, ставший классическим, - семафоры. Двоичный семафор (binary semaphore) – переменная S, которая может находиться в двух состояниях: "открыт" и "закрыт"; над S определены две операции ( "семафорные скобки"): P(S) – закрыть, V(S) – открыть. При попытке закрыть уже закрытый семафор происходит прерывание, и ОС добавляет текущий процесс в очередь к закрытому семафору. Операция V(S) активизирует первый стоящий в очереди к S процесс, который успешно завершает операцию P(S). Если семафор S уже открыт, операция V(S) не имеет никакого эффекта. 55 Таким образом, если предположить, что аппаратура и ОС поддерживают подобную концепцию семафора, то она является удобным инструментом для синхронизации по ресурсам. Назовем критической секцией код, который может выполняться несколькими процессами параллельно и осуществляет доступ к некоторому общему для всех процессов ресурсу – глобальной области памяти, общему файлу и т.д. Обозначим код критической секции critical_section. Если допустить, что данный код может выполняться параллельно в нескольких процессах напрямую, то может возникнуть уже известная нам ситуация race condition (конкуренция за общие данные): один процесс может изменять ресурс, а второй в этот момент считывать его (некорректное) состояние, либо два процесса одновременно будут пытаться изменять один и тот же ресурс, что приведет к нарушению его целостности. Таким образом, для критических секций необходимо решить задачу взаимного исключения (mutual exclusion) – в каждый момент времени не более чем один из параллельных процессов может выполнять критическую секцию. С помощью семафоров Дейкстры эта задача решается легко и изящно: код критической секции должен иметь вид P(S); critical_section; V(S); В самом деле, предположим, что несколько процессов выполняют данный код. Первый из них, который начал выполнять операцию P(S), закрывает семафор S и получает доступ к критической секции. Все остальные процессы, которые пытаются выполнить операцию P(S) над закрытым семафором S, прерываются и попадают в очередь к закрытому семафору. Когда первый процесс закончил работу с ресурсом, он открывает семафор S операцией V(S) для первого процесса из очереди, который, выполнив P(S), вновь закрывает семафор, и т.д. Очень важное свойство операций P и V в следующем: они атомарны (atomic) для других процессов, т.е. если процесс начал выполнять операцию P(S) или V(S), то никакой другой процесс до ее завершения не может также начать выполнять аналогичную операцию. Подведем итог: для синхронизации процессов по общему ресурсу необходимы взаимное исключение выполнения критических секций и атомарность операций синхронизации. Однако следует заметить, что использование семафоров – далеко не идеальный способ синхронизации, с точки зрения надежности. При их неаккуратном использовании возможна ситуация тупика (взаимной блокировки, deadlock), при которой образуется цепочка процессов, бесконечно ждущих друг друга. Простейший способ создать deadlock – использовать два семафора S1 и S2, так, что первый параллельный процесс пытается выполнить код P(S1); P(S2), а второй – код P(S2); P(S1). Очевидно, что при любом соотношении времен выполнения операций будут закрыты оба семафора, на которых и будут "висеть" оба процесса, не в состоянии двинуться дальше. Как же избежать подобных ситуаций? Ведь ни компилятор, ни операционная система не подскажут программисту правильный способ использования семафоров. Очень легко также "забыть" вызов V(S) и, тем самым, сделать общий ресурс "навеки" недоступным для других процессов. Один из способов решения этой задачи заключается в том, чтобы использовать специальные инструменты и технологии, автоматически обеспечивающие "правильную" последовательность применения операций над семафорами. Один из таких инструментов – аспектно-ориентированное программирование [19]. Мониторы – еще один, более надежный способ синхронизации, предложенный в 1974 г. одним из классиков компьютерных наук профессором Чарльзом Хоаром [18]. Монитор – многовходовый модуль M, в котором определены общие для процессов данные D (скрытые) и (абстрактные) операции P1, … PN над этими данными (в виде процедур). В каждый момент не более чем один из параллельных процессов может вызвать какуюлибо из операций: M.Pi (X, Y, …) Вызов каждой операции монитора – атомарен (как и операции над семафором). Монитор – еще один удобный механизм синхронизации процессов по ресурсам. Он более надежен, чем семафоры, поскольку вызов операции монитора автоматически обеспечивает разблокировку ресурса после завершения вызова. Мониторы включены Ч. Хоаром в разработанный им язык Concurrent Pascal для параллельного программирования и разработки операционных систем. Подробнее о семафорах и мониторах – в специальных разделах курса, посвященных управлению процессами и синхронизации процессов. 56 Ключевые термины Race condition - несогласованный доступ из параллельных процессов к общим данным. Атомарная (atomic) операция – операция, такая, что, если один из параллельных процессов начал ее выполнять, никакой другой процесс до ее завершения не может также начать выполнять эту же операцию над теми же данными. Графическая оболочка – подсистема ОС, реализующая графический пользовательский интерфейс пользователей и системных администраторов с операционной системой. Взаимное исключение (mutual exclusion) – режим выполнения критической секции, в котором в каждый момент времени ее может выполнять не более чем один из параллельных процессов. Двоичный семафор (binary semaphore) – системная переменная, над которой определены операции открытия и закрытия, обеспечивающая в закрытом состоянии прерывание процесса, пытающегося ее закрыть, и добавление его к очереди к закрытому семафору; используется для синхронизации процессов по общим ресурсам. Конвейер (pipe) – конструкция командных языков (shell) системы UNIX, позволяющая использовать стандартный вывод процесса – первого аргумента как стандартный ввод процесса – второго аргумента. Критическая секция - код, который может выполняться несколькими процессами параллельно и осуществляет доступ к некоторому общему для всех процессов ресурсу – например, глобальной области памяти или общему файлу. Монитор (как средство синхронизации) – многовходовый модуль, в котором определены общие для параллельных процессов данные и набор операций (в виде процедур) над ними, таких, что в каждый момент времени не более чем один из параллельных процессов может выполнять какую-либо операцию монитора. Облегченный процесс (lightweight process) – процесс, выполняемый в том же пространстве виртуальной памяти, что и процесс-родитель. Процесс (process) - пользовательская программа при ее исполнении в компьютерной системе. Скрипт (script) – командный файл, содержащий часто используемые последовательности команд ОС. Стек – системный резидентный массив в памяти, создаваемый операционной системой для поддержки выполнения процедур некоторого процесса и хранящий их локальные данные и связующую информацию между ними. Тупик (взаимная блокировка, deadlock) – ситуация, при которой образуется циклическая цепочка блокированных процессов, бесконечно ждущих друг друга. Краткие итоги В данной и следующей лекциях рассмотрена архитектура операционных систем, включая следующие вопросы: компоненты системы; сервисы (службы) системы; системные вызовы; системные программы; структура системы; виртуальные машины; проектирование и реализация системы; генерация системы. Основные компоненты ОС следующие: управление процессами; управление основной памятью; управление файлами; управление системой ввода-вывода; управление внешней памятью; поддержка сетей; система защиты; система поддержки командного интерпретатора; графическая оболочка. Процесс – программа пользователя при ее исполнении. ОС поддерживает средства создания, удаления, синхронизации, приостановки и возобновления, взаимодействия процессов. Облегченный процесс исполняется в том же пространстве виртуальной памяти, что и процесс-родитель. Классические средства синхронизации процессов – семафоры и мониторы. Семафор может находиться в открытом и закрытом состояниях и в закрытом состоянии блокирует все, кроме одного, процессы, которым требуется доступ к общему ресурсу. Монитор содержит 57 описание общих для процессов данных и операций над ними, таких, что в каждый момент не более чем один параллельный процесс может выполнять какую-либо операцию монитора. Набор для практики Вопросы 1. Назовите компоненты операционной системы. 2. Какие действия по управлению процессами выполняет ОС? 3. Какие действия по управлению основной памятью выполняет ОС? 4. Какие действия по управлению файлами выполняет ОС? 5. Какие действия по управлению системой ввода-вывода выполняет ОС? 6. Какие действия по управлению внешней памятью выполняет ОС? 7. Какие действия по поддержке сетей выполняет ОС? 8. В чем заключается система защиты ОС? 9. Что такое система поддержки командного интерпретатора ОС? 10. Что такое скрипт? 11. Назовите командные процессоры системы UNIX. 12. Что такое графическая оболочка ОС? 13. Что такое процесс? 14. Что такое стек процесса? 15. Что такое облегченный процесс? 16. Что такое семафор и какие операции над ним определены? 17. Что такое критическая секция? 18. В чем суть принципа взаимного исключения критических секций? 19. Что такое атомарная операция? 20. Что такое взаимная блокировка процессов (deadlock)? 21. Что такое монитор? 22. Какое условие для выполнения своих операций обеспечивает монитор? Упражнения 1. Сформулируйте, в чем разница между файлами и системами ввода-вывода. 2. По аналогии с рассмотренным примером команды UNIX, использующей конвейер, напишите команду, которая выводит в стандартный вывод список файлов текущей директории, имена которых содержат последовательность data. 3. Пусть в системе имеется список свободных участков памяти с указанием их длин. Предложите оптимальный, с Вашей точки зрения, алгоритм выделения смежного участка памяти длины n. Дайте обоснование предложенного Вами алгоритма и оцените его сложность. 4. Пусть имеется два общих ресурса, работа с которыми реализована в виде критических секций C1 и C2. Введите семафоры S1 и S2 для работы с ними и запрограммируйте код обращения к каждому из ресурсов, синхронизация по которым выполняется с помощью этих семафоров. 5. Спроектируйте монитор для представления стека, являющегося общим ресурсом нескольких процессов, с операциями push и pop. 6. Почему, с Вашей точки зрения, стек процесса – это резидентный массив основной памяти? 7. Почему стандартный способ реализации команд ОС UNIX неэффективен? 8. На основе Вашего личного опыта, сформулируйте основные возможности, предоставляемые пользователю графической оболочкой операционной системы. 9. Почему семафоры как способ синхронизации процессов не вполне надежны? Назовите типичные возможные ошибки при использовании семафоров. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. Обзор архитектуры ОС (реферат). Обзор основных компонент ОС (реферат). Семафоры как средство синхронизации процессов (реферат). Мониторы как средство синхронизации процессов (реферат). Реализация семафоров и операций над ними на известном Вам языке программирования (курсовая работа). 6. Реализация мониторов на известном Вам языке программирования (курсовая работа). 58 6. Лекция: Обзор функций ОС: управление памятью, файлами, процессами, сетями, командными интерпретаторами, сервисы ОС, системные вызовы. Уровни абстракции ОС. Архитектура UNIX и MS-DOS В лекции рассмотрены: обзор функциональности ОС: управление памятью, файлами, процессами, сетями, командными интерпретаторами, сервисы ОС, системные вызовы; организация ОС по принципу уровней абстракции; особенности архитектуры UNIX и MS-DOS. Содержание Введение Управление основной памятью Управление файлами Управление вторичной памятью Система защиты (ptotection) Система поддержки командного интерпретатора Сервисы (службы) ОС Дополнительные функции ОС Системные вызовы (system calls) являются интерфейсом между выполняемой программой и операционной системой Исполнение программ в MS DOS Исполнение нескольких программ в UNIX Коммуникационные модели Системные программы – разновидность сервисов операционной системы Структура системы MS DOS Структура системы UNIX Уровни абстракции Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение В данной лекции мы продолжаем обзор основной функциональности операционной системы. Рассмотрены также архитектура MS-DOS и UNIX и подход к разработке операционных систем на основе уровней абстракции. Управление основной памятью Основную (оперативную) память компьютерной системы можно рассматривать как большой массив слов или байтов, каждый из которых имеет свой адрес. Память - это хранилище данных с быстрым доступом, совместно используемое процессором и устройствами вводавывода. Следует иметь в виду важную особенность основной памяти. В компьютерных архитектурах имеется два различных способа нумерации байтов в слове. По традиции будем представлять себе память как линейный массив, расположенный "слева направо", такой, что адреса слов, находящихся левее, меньше, чем адреса слов, находящихся правее. Каждое слово делится на байты, имеющие в слове свои номера – 0, 1 и т.д.. Например, в 64-разрядных системах в слове 8 байтов, с номерами от 0 до 7, в более старых 16-разрядных (x86) – два байта, с номерами 0 и 1. Если нумерация байтов в слове начинается слева, т.е. начиная со старших битов, то такую архитектуру принято называть big endian, если же справа, т.е. начиная с младших битов, то little endian. Например, при big endian – архитектуре 32разрядного процессора байты двух соседних слов памяти нумеруются так: 0, 1, 2, 3, 0, 1, 2, 3. При little endian же архитектуре нумерация будет иной: 3, 2, 1, 0, 3, 2, 1, 0. Представим теперь, что мы хотим рассматривать эти же два слова как массив байтов длиной 8 и записать туда байт за байтом символы строки: "ЭТОТЕКСТ" (всего – 8 символов). Такая операция при обеих архитектурах будет выполнена одинаково, т.е. последовательные байты получат именно эти значения. Затем рассмотрим результат снова, но уже как последовательность их 59 двух слов. Каково будет содержимое этих слов? При big endian – архитектуре сюрпризов не будет: первое слово – "ЭТОТ", второе "ЕКСТ". Однако при little endian – архитектуре результат будет совсем иным: первое слово – "ТОТЕ", второе – "ТСКЕ" ! Не забудем, что при обработке целого слова в little endian – архитектуре байты как бы "переставляются" в обратном порядке. Разумеется, это неудобно. С подобной проблемой автор столкнулся при переносе написанного им компилятора с архитектуры SPARC (big endian) на архитектуру Intel x86 (little endian), используя типы byte и word на Турбо-Паскале. Подобная операция типична для системных программ, например, таблица идентификаторов в компиляторе должна содержать как символы идентификатора (последовательность байтов), так и другую информацию о нем (длину, ссылки в различные таблицы и т.д.). Поэтому при little endian – архитектуре приходится хранить и обрабатывать байтовые массивы и массивы слов отдельно, и нельзя изменять точку зрения на одну и ту же область памяти и рассматривать ее то как массив байтов, то как массив слов. Пример little endian – архитектуры – x86. Пример big endian – архитектуры – SPARC. При программировании на языках высокого уровня разработчику, как правило, не приходится учитывать это различие. Однако если при реализации распределения памяти требуется одну и ту же область памяти рассматривать то как массив слов, то как массив байтов, то для little endian – архитектур могут быть "сюрпризы", связанные с тем, что при записи в память как в массив слов байты как бы переставляются. Основная память – это неустойчивое (volatile) устройство памяти. Ее содержимое теряется при сбое системы или при выключении питания. Для организации устойчивой памяти используются другие, более медленные технологии. ОС отвечает за следующие действия, связанные с управлением памятью: Отслеживание того, какие части памяти в данный момент используются и какими процессами. Как правило, ОС организует для каждого процесса свою виртуальную память – расширение основной памяти путем хранения ее образа на диске и организации подкачки в основную память фрагментов (страниц или сегментов) виртуальной памяти процесса и ее откачки по мере необходимости. Стратегия загрузки процессов в основную память, по мере ее освобождения. При активизации процесса и его запуске или продолжении его выполнения процесс должен быть загружен в основную память, что и осуществляется операционной системой. При этом, возможно, какие-либо не активные в данный момент процессы приходится откачивать на диск. Выделение и освобождение памяти по мере необходимости. ОС обслуживает запросы вида "выделить область основной памяти длиной n байтов" и "освободить область памяти, начинающуюся с заданного адреса, длиной m байтов". Длина участков выделяемой и освобождаемой памяти может быть различной. ОС хранит списка занятой и свободной памяти. При интенсивном использовании памяти может возникнуть ее фрагментация – дробление на мелкие свободные части, вследствие того, что при запросах на выделение памяти длина найденного сегмента оказывается немного больше, чем требуется, и остаток сохраняется в списке свободной памяти как область небольшого размера (подчас всего 1 – 2 слова). В курсе рассмотрены различные стратегии управления памятью и борьбы с фрагментацией. При исчерпании основной памяти ОС выполняет сборку мусора – поиск не используемых фрагментов, на которые потеряны ссылки, и уплотнение (компактировку) памяти – сдвиг всех используемых фрагментов по меньшим адресам, с корректировкой всех адресов. Управление файлами Файл (file) – совокупность логически взаимосвязанной информации, расположенная во внешней памяти. Как правило, файлы представляют программы (в виде исходного текста или в двоичной форме) или данные. Другой термин, использованный для обозначения файлов фирмой IBM в ее операционной системе – IBM 360/370, - набор данных (data set). ОС отвечает за следующие действия, связанные с управлением файлами. Создание и удаление файлов. Отображение файлов на внешнюю память. ОС выделяет внешнюю память при создании нового файла. Файл в большинстве файловых систем состоит из заголовка и памяти. В заголовке хранятся атрибуты файла, например, его длина, тип, ссылка на элементы файла во внешней памяти. Память файла может быть организована по-разному – как список смежных областей (блоков или записей), одна смежная 60 область, список индексных узлов, ссылающихся на блоки файла и т.д. В курсе подробно рассмотрены некоторые файловые системы. Кроме создания и удаления файла, основные операции над ним – открытие и закрытие. Открытие файла – это считывание в основную память его заголовка и, возможно, одного или нескольких соседних блоков. Оно должно быть выполнено перед выполнением операций чтения из файла или записи в файл. Закрытие файла – это обратная операция: сброс всех копий блоков на внешнюю память и освобождение областей основной памяти, занятых открытым файлом. ОС закрывает файлы процесса при его завершении, если процесс не сделал этого явно (последнее рекомендуется). При отображении файлов на внешнюю память возникают проблемы, аналогичные проблемам распределения основной памяти, - фрагментация, возможность исчерпания внешней памяти или ее раздела (partition) – смежной области внешней памяти, имеющей определенное символьное обозначение. Создание и удаление директорий. Поддержка примитивов (пользовательских команд и библиотечных вызовов) для управления файлами и директориями. Директория (directory) – это каталог (справочник) ссылок на группу файлов или других директорий, каждый (каждая) из которых имеет в данной директории свое уникальное символьное имя. Иерархия директорий позволяет организовать поиск файла по его символьному пути (path), например, в Windows: c:\doc\plan.txt – текстовый документ, содержащий план моих текущих действий, ссылка на который находится на диске C: , в директории doc. ОС управляет созданием и удалением директорий и поиском в них файлов по их путям. Следует иметь в виду, что на файл возможно несколько ссылок из разных директорий (хотя это и не рекомендуется), так что удаление элемента директории не означает и удаления файла – сам файл сохраняется, пока на него есть хотя бы одна ссылка. Более того, в некоторых файловых системах (например, FAT в Windows) ошибочно удаленный файл можно восстановить, хотя и под другим именем. В других же файловых системах (например, в UNIX, где используются индексные блоки, хранящие адреса блоков файла) удаление файла – фатальная операция, от ошибок в которой может спасти только вовремя сделанная резервная копия файловой системы на диске или флэшке. Сброс, или резервное копирование (backup) файлов на устойчивые носители (флэшпамять, компакт-диск, ленточный стример и др.), с целью их последующего восстановления при сбое или при ошибке пользователя. Значение резервного копирования для пользователей ОС трудно переоценить. Все наиболее важные документы, директории, файловые системы должны регулярно копироваться на внешнюю память (желательно делать не одну, а несколько копий на разные носители). Это должно стать непреложным правилом для каждого пользователя. Трудно даже вспомнить, сколько раз автору приходилось выслушивать сетования и жалобы студентов, аспирантов, сотрудников на то, что у них в самый ответственный момент "полетел винчестер", из-за чего они не могут показать свою программу или отчет. Рецепт очень простой: необходимо регулярно копировать важную информацию на устойчивые носители. Если Вы работаете в локальной сети фирмы, исследовательской лаборатории и т.д., то в ней должен быть системный администратор, который должен заботиться о регулярном резервном копировании всех важных файловых систем. Возможности ОС позволяют выполнять такое копирование автоматически, в определенное время, - например, ночью, когда в офисе никого нет, но компьютеры локальной сети работают. В некоторых ОС реализованы файловые системы с криптованием данных при записи в файл (например, система ZFS в Solaris). Такой подход позволяет решить проблему сохранения конфиденциальности информации (privacy) . Управление вторичной памятью Поскольку размер основной памяти недостаточен для постоянного хранения всех программ и данных, в компьютерной системе должна быть предусмотрена вторичная (внешняя) память для откачки (back up, swapping) части содержимого основной памяти. В большинстве компьютерных систем в качестве главной вторичной памяти для хранения программ и данных используются диски. ОС отвечает за выполнение следующих действий, связанных с управлением дисками: Управление свободной дисковой памятью; Выделение дисковой памяти; Диспетчеризация дисков (disk scheduling). 61 При управлении вторичной памятью возникают проблемы, аналогичные проблемам распределения основной памяти. Всякая память, даже самая большая по объему, рано или поздно может исчерпаться, либо фрагментироваться на множество мелких областей свободной памяти. О методах управления основной и внешней памятью речь пойдет подробно ниже в специальных разделах курса. Управление сетевыми (распределенными) системами. Как уже было сказано в более ранних лекциях, распределенная система – это совокупность процессоров, которые не используют общую память или часы (такты процессора). Каждый процессор имеет собственную локальную память. Процессоры в такой системе соединены в сеть. Сетевое взаимодействие выполняется по определенному протоколу (интерфейсу, набору операций). Наиболее распространенный сетевой протокол – TCP/IP, основанный на IP-адресах машин (hosts); например, 190.100.125.1. В распределенной системе ОС обеспечивает доступ пользователей к различным общим сетевым ресурсам – например, файловым системам или принтерам. Каждому общему ресурсу ОС присваивает определенное сетевое имя и управляет возможностью доступа к нему с различных компьютеров сети. ОС обеспечивает также удаленный запуск программ на другом компьютере сети – возможность входа на другой компьютер и работы на нем, с использованием памяти, процессора и диска удаленной, как правило, более мощной машины, и использованием клиентского компьютера в качестве терминала. В Windows такая возможность называется удаленный рабочий стол (remote desktop connection), в UNIX, LINUX, Solaris – rsh (remote shell) и rlogin (remote login). Доступ к общим ресурсам (shared resource) в распределенной системе позволяет: Ускорить вычисления; Расширить границы доступа к данным; Обеспечить более высокую надежность. Система защиты (ptotection) Термин защита (protection) используется для обозначения механизма управления доступом программ, процессов и пользователей к системным и пользовательским ресурсам. Механизм защиты в ОС должен обеспечивать следующие возможности: Различать авторизованный, или санкционированный (authorized) и несанкционированный (unauthorized) доступ. Под авторизацией понимается предоставление операционной системой пользователю или программе какого-либо определенного набора полномочий (permissions), например, возможности чтения или изменения файлов в файловой системе с общим доступом. Описывать предназначенные для защиты элементы управления (конфигурации). Например, в UNIX используются специальные текстовые конфигурационные файлы для представления информации о файловых системах, к которым возможен сетевой доступ, с указанием списка машин (хостов), с которых возможен доступ, и набора действий, которые могут быть выполнены. Обеспечивать средства выполнения необходимых для защиты действий (сигналы, исключения, блокировка и др.). Например, система защиты ОС должна фильтровать сетевые пакеты, получаемые извне локальной сети, выбирать и отсеивать "неблагонадежные" (получаемые с подозрительных IP-адресов), сообщать пользователю об обнаруженных и ликвидированных попытках сетевых атак с целью "взлома" Вашего компьютера (что и происходит на практике, например, при работе в Windows, когда Вы выходите с Интернет с Вашего компьютера). Если Вы нарушили условия защиты (например, Ваша программа попыталась обратиться к файлу, работать с которым у Вас нет полномочий), ОС должна выдать понятное сообщение и прекратить работу программы. В современных системах это делается с помощью генерации исключений (exceptions), например, SecurityException. Система поддержки командного интерпретатора Большинство команд для ОС задаются с помощью специальных управляющих операторов, предназначенных для выполнения следующих основных функций: 62 создания процессов и управления процессами; например, в UNIX команда ps –a выводит в стандартный вывод процесса информацию обо всех активных процессах в системе, с указанием их номеров (PID); выполнения ввода-вывода; например, в системе MS DOS команда type file_name выполняет вывод на терминал содержимого заданного текстового файла; управления вторичной памятью; например, в UNIX команда share /mydir добавляет директорию /mydir к списку совместно используемых в локальной сети файловых систем; управления основной памятью; например, команда swap в ОС Solaris позволяет управлять размекром пространства дисковой памяти для реализации виртуальной памяти (swap) и выводить информацию о его состоянии; доступа к файловой системе; например, в большинстве ОС команда cd new_dir устанавливает заданную директорию в качестве текущей (рабочей); защиты; например, в системе UNIX команда chmod 700 my_home_dir защитит Вашу домашнюю директорию от непрошенных любопытных глаз – "лазутчик" не сможет даже выполнить команду cd для этой директории и, тем более, читать в ней какие-либо файлы; управления сетью; например, команды telnet host_name и rlogin host_name (последняя доступна в системе UNIX) служат для удаленного входа на другой компьютер сети. Программа, которая читает и интерпретирует операторы управления, называется командным интерпретатором. В Windows это интерпретатор command.com, доступный для выполнения команд в окне MS DOS prompt. В UNIX, Linux, Solaris это уже упоминавшиеся всевозможные "шеллы": sh, csh, ksh, bash – процессоры для интерпретации мощных командных языков. Функция командного процессора состоит в том, чтобы прочесть и исполнить очередной управляющий оператор (команду). Сервисы (службы) ОС Операционная система предоставляет для пользователей целый ряд сервисных возможностей, или, коротко, сервисов (служб): Исполнение программ – загрузка программы в память и ее выполнение; например, в Windows при запуске программы ОС находит в файле ее двоичного кода (.exe) так называемую заглушку для исполнения (execution stub), содержащую ссылку на код головного метода main, и запускает его. В среде .NET этот же execution stub в файле двоичного кода используется системой для вызова не непосредственно исполняемой программы, а общего окружения времени выполнения – Common Language Runtime (CLR), которое обеспечивает особый режим (managed execution) выполнения программы. Поддержка ввода-вывода – обеспечение интерфейса для работы программ с устройствами ввода-вывода. Например, в UNIX у каждой программы есть свой стандартный ввод и стандартный вывод (по умолчанию это терминал). В более старых ОС, например, IBM 360, привязку программы к устройствам ввода-вывода требовалось специфицировать с помощью громоздких DD (Data Definition) – предложений на специальном языке управления заданиями. Работа с файловой системой – предоставление программам интерфейса для создания, именования, удаления файлов. Об этом уже много говорилось выше. Коммуникация – обмен информацией между процессами, выполняемыми на одном компьютере или на других системах, связанных в сеть. В операционных системах реализуется с помощью общей памяти (shared memory) или передачи сообщений. Обнаружение ошибок в работе процессора, памяти, устройств ввода-вывода и программах пользователей. Дополнительные функции ОС Данные функции реализованы не непосредственно для удобства пользователя, а для обеспечения выполнения операций системы. Это следующие возможности. Распределение ресурсов между пользователями, программами и процессами, работающими одновременно. 63 Ведение статистики использования ресурсов, с целью выставления пользователям счетов (например, за сетевой трафик) или для анализа эффективности работы системы. Защита – обеспечение того, чтобы доступ к любым ресурсам был контролируемым. Системные вызовы (system calls) являются интерфейсом между выполняемой программой и операционной системой Обычно системные вызовы доступны как специальные ассемблерные команды, например, в IBM 360 ассемблерная команда svc 10 выполняет вызов супервизора (управляющей программы ОС) с номером системной функции 10. Некоторые языки (C, C++, Java и др.) позволяют выполнять системные вызовы непосредственно, не "опускаясь" до ассемблерного уровня, с помощью вызовов специальных библиотечных функций (методов) типа System("cd my_dir"). При системном вызове ОС из программы пользователя возникает проблема передачи параметров. Используются три основных способа передачи параметров исполняемой программой операционной системе: Передача параметров в регистрах; например, в IBM 360 системная макрокоманда GETMAIN выделения области основной памяти ожидает, что ей в регистре номер 1 передана длина требуемой области памяти, а сама макрокоманда в результате своего выполнения записывает также в первый регистр адрес выделенной области основной памяти. Очевидно, что подобный интерфейс не вполне надежен – слишком много не очевидных умолчаний. А вдруг программист по ошибке запишет длину области памяти не в первый, а во второй регистр? Об этой ошибке никто ему не подскажет, и результат будет бессмысленным. Запись параметров в таблицу, расположенную в памяти, и передача адреса этой таблицы в регистре. Этот способ немного лучше, но все равно он зависит от джентльменского соглашения между автором программы и авторами ОС относительно передачи через регистр, соблюдение которого фактически никем не проверяется. Запись (проталкивание) параметров в стек программой и чтение (выталкивание) их из стека операционной системой. Такой способ гораздо лучше, так как он является стандартным способом передачи параметров при любом вызове процедуры или метода. На рис. 6.1 изображен способ передачи параметров при системном вызове через таблицу, адрес которой передается в регистре. Различаются следующие основные виды системных вызовов: Управление процессами; например, в UNIX системный вызов fork создает новый параллельный процесс с новым пространством виртуальных адресов. Управление файлами; например, в UNIX системный вызов open (f, "rw") осуществляет открытие заданного файла для чтения и записи. Управление устройствами; например, системный вызов rewind осуществляет перемотку (позиционирование) магнитной ленты на начало. Сопровождающая информация; например, системный вызов env выдает в стандартный вывод информацию о значениях переменных окружения – переменных с символьными значениями, например, PATH, задающими окружение исполняемого процесса; Коммуникации; например, системный вызов CreateSocket создает новый сокет – системную структуру для обмена информацией клиента с сервером через TCP/IP – сеть. Из примеров нетрудно видеть, что многие из этих возможностей ОС доступны также в виде выполняемых команд. Исполнение программ в MS DOS Как уже упоминалось, операционная система MS DOS была разработана в конце 1970-х гг. для 16-разрядных процессоров фирмы Intel (x86). Эта система, по сравнению с предшествующими ей по времени операционными системами для mainframe-компьютеров MULTICS, ОS IBM 360 и др., была значительно проще по возможностям, в частности, она была одноза- 64 дачной. Это сознательное упрощение было вызвано жесткими ограничениями по памяти: объем основной памяти, предоставляемый задаче для выполнения, был равен всего 640 килобайт. Схема распределения памяти при выполнении программ в системе MS DOS изображена на рис. 6.2. Рис. 6.1. Передача параметров системного вызова в таблице. Рис. 6.2. Выполнение программ в MS DOS. 65 Автор со своей командой в конце 1980-х – начале 1990-х гг. выполнял большие программные разработки для MS DOS в интегрированной среде Турбо Паскаль. Если размер программы или одного ее модуля превышал 640 K, приходилось организовывать оверлейную структуру (overlay) – разбиение программы на группы взаимосвязанных модулей, таких, что различные группы одновременно в памяти не нужны, и поочередно загружать в выделенную для задачи область памяти необходимые группы модулей, к которым происходило обращение. Такой метод был вынужденным и типичным для многих программистов при разработке больших программ в среде MS DOS. Исполнение нескольких программ в UNIX Система UNIX, первоначально, как уже говорилось, разработанная в 1970 г. для миникомпьютеров PDP 10, была многозадачной (т .е. поддерживала режим мультипрограммирования) – несмотря на ограниченный объем памяти, система могла одновременно обрабатывать несколько заданий пользователей. Система поддерживала также и режим разделения времени, а впоследствии – и сетевое взаимодействие. В UNIX работали компиляторы с нескольких языков, в том числе – Паскаль. Использовались инструментальные средства, ставшие классическими, - утилита make – для сборки проектов, утилита lex – генератор лексических анализаторов в компиляторах; yacc – генератор синтаксических анализаторов в компиляторах; grep – утилита текстового поиска и фильтрации с помощью регулярных выражений; awk – язык для обработки табличной информации; sed – потоковый редактор текстов. Была реализована, с одной стороны, развитая, с другой - унифицированная файловая система, лишенная надуманных сложностей IBM 360 и "Эльбруса". Схема размещения в памяти одновременно нескольких заданий пользователя и их обработки в режиме мультипрограммирования изображена на рис. 6.3. Рис. 6.3. Выполнение нескольких пользовательских программ в системе UNIX. Коммуникационные модели Одновременно обрабатываемые операционной системой пользовательские процессы должны иметь возможность коммуникации друг с другом. Такая коммуникация реализуется в операционных системах двумя способами – с помощью общей памяти и с помощью передачи сообщений. Обе схемы коммуникации процессов изображены на рис. 6.4. 66 Рис. 6.4. Коммуникация процессов с помощью передачи сообщений и с помощью общей области памяти. При первом способе, процесс A для передачи сообщения M процессу B выполняет системный вызов - например, send (B, M), - т.е. фактически передает это сообщение ядру ОС. Процесс B, в свою очередь, выполняет системный вызов для получения сообщения – например, M = receive (B) – т.е. фактически получает сообщение M от ядра ОС, подобно какомулибо ресурсу системы. При втором способе, оба процесса взаимодействуют через общую область памяти, адрес которой известен им обоим. Такой способ может оказаться более быстрым, но необходимо учесть, что в данном случае процессы должны позаботиться о синхронизации (см. "Архитектура ОС. Управление процессами: Основные понятия. Семафоры и мониторы "), так как общая область памяти – это общий ресурс, при обращении к которому может возникнуть race condition. Системные программы – разновидность сервисов операционной системы Системные программы обеспечивают удобное окружение для разработки и исполнения программ. Они подразделяются на программы: Управления файлами; например, файл-менеджеры типа Norton Commander и Far в MS DOS и Windows Commander – в Windows; Получения информации о состоянии; например, Task Manager – программа в системе Windows для управления процессами и получения информации об их состоянии, загрузке процессора и используемой памяти. Вызывается комбинацией клавиш Ctrl – Alt – Del. Создания и изменения файлов; например, текстовые редакторы notepad и wordpad и программа paint для создания и редактирования рисунков, поставляемые с ОС Windows. Поддержки языков программирования; например, компиляторы с языков Си (cc) и Java (javac), поставляемые с большинством операционных систем; Загрузки и исполнения программ; например, ld – загрузчик и редактор связей UNIX; Коммуникации; например, Windows Messenger – программа обмена мгновенными сообщениями, часть ОС Windows. Использование ОС большинством пользователей основано на использовании системных программ, а не системных вызовов. Причина этого в том, что уровень интерфейса системных программ несколько выше, чем уровень системных вызовов (например, не требует передачи 67 параметров через регистры процессора). Системные программы ближе к сути решаемых задач и поэтому понятнее пользователям, чем системные вызовы. Структура системы MS DOS После краткого обзора возможностей ОС проанализируем теперь особенности их структуры и архитектуры и некоторые полезные методы их разработки. Простейшим примером с этой точки зрения является MS DOS, разработанная по принципу: обеспечить максимум функциональности, используя минимум памяти (напомним об ограничении в 640 K на объем памяти для программы в MS-DOS). В MS DOS нет явного разделения на модули. Поэтому, хотя MS-DOS и имеет некоторую архитектуру, уровни функциональности и интерфейсы в ней не отделены четко друг от друга. Уровни абстракции модулей MS DOS изображены на рис. 6.5. Подробнее о концепции уровней абстракции, полезной для разработки ОС, которую мы пока используем интуитивно, - в конце данной лекции. Рис. 6.5. Уровни абстракции модулей MS DOS. В схеме можно выделить четыре уровня абстракции. Наиболее высокий – уровень пользовательской программы. Более низкий – резидентная системная программа, компонента ядра ОС. Еще ниже – уровень драйверов устройств, являющихся частью ядра MS DOS, и самый низкий – уровень драйверов, хранящихся в ROM BIOS (Read-Only Memory of the Basic Input-Output System) – постоянной памяти BIOS, системного модуля компьютера, которому передается управление непосредственно после его включения. ROM BIOS содержит наиболее важную часть драйверов, например, драйвер материнской платы (motherboard). ОС загружает и использует драйверы других устройств, например, принтера. Структура системы UNIX Хотя система UNIX и имеет более модульную структуру, чем MS DOS, ее архитектура ограничена функциональностью аппаратуры, для которой она были первоначально разработана, - миникомпьютеров. Поэтому первые версии UNIX имели ограниченное структурирование. Система UNIX состоит из двух частей: системные программы и ядро. Ядро содержит все модули, уровень абстракции которых ниже системных вызовов, но выше непосредственно аппаратных модулей. 68 UNIX обеспечивает поддержку файловой системы, диспетчеризацию процессора, управление памятью и другие основные функции ОС. Архитектура UNIX изображена на рис. 6.6. Рис. 6.6. Структура системы UNIX В архитектуре UNIX уже четко прослеживаются три уровня абстракции – пользовательский (системные программы), системных вызовов и низкоуровневых модулей взаимодействия с аппаратурой. Уровни абстракции В конце 1960-х гг., при разработке операционной системы THE (название – аббревиатура, означающая "Технический университет Эйндховена"), Э. Дейкстра предложил для своего времени весьма новый и прогрессивный принцип уровней абстракции, полезный при разработке любой сложной программной системы, в том числе – столь сложной, как операционная система. Согласно этому принципу, ОС (или другая сложная программа) реализуется в виде набора (иерархии) уровней абстракции (abstraction layers), каждый из которых реализован на основе предыдущего уровня. Уровень 0 (layer 0) образует аппаратура (hardware); самый высокий уровень N (layer N) является пользовательским интерфейсом с операционной системой. Каждый уровень абстракции N > 0 – это группа модулей, при реализации которого, согласно принципам модульного программирования, используются только модули предшествующего уровня (N-1). "Перескакивание" через уровень (т.е., например, использование при реализации модуля уровня N вызовов модулей уровня N – 2) не рекомендуется и является нарушением технологии, которое может привести к ошибкам. Подобный подход позволяет проектировать сложную программную систему шаг за шагом, снизу вверх, причем на каждом шаге (уровне K) используется все более и более удобная система обозначений уровня K-1. Это позволяет абстрагироваться от лишних деталей, что и является объяснением названия данного метода. 69 Заметим, что, по сути дела, уровни абстракции – движущая сила и принцип развития всего программного обеспечения в целом, а не только операционных систем. Каждая новая программа разрабатывается не с нуля, а на некотором достаточно высоком уровне абстракции, используя другие уже разработанные системы. Ключевые термины Big endian – архитектура памяти компьютера, при которой нумерация байтов в каждом слове памяти начинается слева, т.е. начиная со старших битов. Little endian – архитектура памяти компьютера, при которой нумерация байтов в каждом слове памяти начинается справа, т.е. начиная с младших битов. ROM BIOS (Read-Only Memory of the Basic Input-Output System) – постоянная память, входящая в состав BIOS, системного модуля компьютера, которому передается управление непосредственно после его включения; содержит часть драйверов для модулей аппаратуры. Авторизация - предоставление операционной системой пользователю или программе какого-либо определенного набора полномочий (permissions), например, возможности чтения или изменения файлов в файловой системе с общим доступом. Атрибут файла – его характеристика, например, длина и начальный адрес во внешней памяти. Блок – смежная область внешней памяти файла, как правило, считываемая или записываемая одной операцией ввода-вывода. Виртуальная память – расширение основной памяти путем хранения ее образа на диске и организации подкачки в основную память фрагментов (страниц или сегментов) памяти процесса и ее откачки на диск по мере необходимости. Директория (directory) – каталог ссылок на группу файлов или других директорий, каждый (каждая) из которых имеет в данной директории свое уникальное символьное имя. Заглушка для исполнения (execution stub) – область файла исполняемого двоичного кода, содержащая ссылку на код головного метода (процедуры), обычно – main . Заголовок файла – начальная часть файла, в которой хранятся его атрибуты . Закрытие файла – операция, обратная открытию файла: сброс всех копий блоков файла на внешнюю память и освобождение всех областей основной памяти, занятых открытым файлом. Защита (protection) - механизм управления доступом программ, процессов и пользователей к системным и пользовательским ресурсам. Командный интерпретатор - программа, читающая и интерпретирующая операторы управления операционной системы, задаваемые пользователем с терминала или в виде командного файла. Набор данных (data set) – то же, что и файл (в терминологии фирмы IBM). Неустойчивое (volatile) - устройство памяти, типичное для основной памяти компьютеров, при котором ее содержимое теряется при сбое системы или при выключении питания. Оверлейная структура (overlay) – разбиение программы на группы взаимосвязанных модулей, таких, что различные группы одновременно в памяти не нужны, с целью их поочередной загрузки в выделенную для программы область памяти. Открытие файла – считывание в основную память его заголовка и, возможно, одного или нескольких соседних блоков перед выполнением операций ввода-вывода. Память файла – совокупность его элементов, хранящихся во внешней памяти (например, на диске). Переменные окружения – набор системных переменных с символьными значениями, например, PATH, задающих окружение исполняемого процесса. Протокол – интерфейс, набор операций (например, для работы в локальной сети). Путь (path) – символьная строка для поиска файла по имени в иерархии директорий. 70 Раздел (partition) – смежная область внешней памяти, имеющая в ОС определенное символьное обозначение (например, D: ). Сброс, или резервное копирование (backup) – копирование файлов на устойчивые носители (флэш-память, компакт-диск, ленточный стример и др.), с целью их последующего восстановления при сбое или при ошибке пользователя. Сборка мусора – поиск не используемых фрагментов в памяти, на которые потеряны ссылки, и уплотнение (компактировка) памяти – сдвиг всех используемых фрагментов по меньшим адресам, с корректировкой всех адресов. Системный вызов (system call) - интерфейс между выполняемой программой и операционной системой в виде явного вызова процедуры, метода или макроса, являющегося частью ОС. Сокет (socket) – системная структура для обмена информацией клиента с сервером через TCP/IP – сеть. Удаленный запуск программ (на другом компьютере сети) – возможность входа на другой компьютер сети и работы на нем, с использованием памяти, процессора и диска удаленной (как правило, более мощной) машины и использованием клиентского компьютера в качестве терминала. Уплотнение (компактировка) памяти – сдвиг всех используемых фрагментов по меньшим адресам, с корректировкой всех адресов, при сборке мусора. Уровень абстракции (abstraction layer) - группа модулей, при реализации которых используются только модули предшествующего уровня. Файл (file) – совокупность логически взаимосвязанной информации, расположенная во внешней памяти. Фрагментация – дробление памяти на мелкие свободные части, вследствие неточного совпадения длин имеющихся свободных и требуемых пользовательскому процессу областей памяти. Краткие итоги Основная память – большой массив слов или байтов. Байты в слове могут нумероваться двумя способами, по которому различают big endian- и little endian – архитектуры. Задачи ОС по управлению памятью – отслеживание, какие области памяти используются какими процессами, стратегия загрузки процессов в основную память, выделение и освобождение памяти. Файл (набор данных) – логически взаимосвязанная совокупность информации во внешней памяти. Функции ОС по управлению файлами – создание и удаление, открытие и закрытие, управление директориями и поиском файлов в них, отображение файлов во внешнюю память, их резервное копирование. Вторичная память (например, на диске) используется как расширение основной памяти. ОС управляет свободной дисковой памятью, выделяет дисковую память и выполняет диспетчеризацию дисков. ОС поддерживает работу в распределенной системе (сети) – сетевые протоколы, взаимодействие с общими сетевыми ресурсами, удаленный запуск программ. Система защиты в ОС – механизм управления доступом программ и пользователей к системным и пользовательским ресурсам. ОС поддерживает командный интерпретатор, читающий и интерпретирующий управляющие операторы (команды), задаваемые пользователями с терминала или в виде командных файлов. Команды могут выполнять действия над файлами, процессами, основной и вторичной памятью, защиту, управление сетью. Основные сервисы ОС – исполнение программ, поддержка ввода-вывода, работа с файловой системой, коммуникация, обнаружение ошибок. Дополнительные функции ОС – распределение ресурсов, ведение статистики, защита. 71 Системный вызов – интерфейс программ с ОС в виде вызовов процедур, методов или макросов, являющихся частью ОС. Способы передачи параметров системному вызову: через регистр, через таблицу, адрес которой в регистре, или через стек. Системные вызовы выполняют управление процессами, файлами, устройствами, выдают сопровождающую информацию, осуществляют коммуникации. MS DOS – однозадачная операционная система. Одновременно система обрабатывает только одну задачу, размер памяти которой не может превышать 640 килобайт. UNIX, в отличие от MS DOS, поддерживает мультипрограммирование, т.е. может одновременно обрабатывать несколько задач и хранить их в памяти. Коммуникация между процессами может осуществляться с помощью передачи сообщений или через общую область памяти. Системные программы – более удобный и чаще применяемый пользовательский интерфейс с ОС, чем системные вызовы. Они осуществляют управление файлами, получение информации о состоянии, создание и изменение файлов, поддержку языков программирования, загрузку и исполнение программ, коммуникации. В архитектуре MS DOS нет явного разделения на модули. Различаются уровень прикладной программы, резидентной системной программы, драйверы устройств MS DOS, драйверы устройств ROM BIOS. В архитектуре системы UNIX более явно выделяются несколько уровней абстракции. Система состоит из ядра и системных программ. Для обращения к ядру используется интерфейс системных вызовов. На самом верхнем уровне пользователям доступны командные процессоры, компиляторы и интерпретаторы, системные библиотеки. Э. Дейкстра предложил подход к разработке ОС, основанный на уровнях абстракции. Каждый из них представляет собой группу модулей, в реализации которых используются только модули непосредственно предшествующего уровня. Это дает возможность более удобной разработки и позволяет абстрагироваться от лишних деталей. По сути дела, принцип уровней абстракции – движущая сила всего процесса развития программного обеспечения. Набор для практики Вопросы 1. Что такое основная (оперативная) память? 2. Что такое архитектуры памяти big endian и little endian ми в чем различие между ними? 3. Сохраняется ли состояние основной памяти после завершения программы или при отключении питания? 4. Какие действия по управлению основной памятью выполняет ОС? 5. Что такое файл? 6. Что такое набор данных? 7. Какие действия по управлению файлами и директориями выполняет ОС? 8. Что такое директория? 9. Что такое путь к файлу? 10. Какие действия по управлению вторичной памятью выполняет ОС? 11. Что такое распределенная система? 12. Что такое сетевой протокол? 13. Какие действия по управлению распределенной системой выполняет ОС? 14. Каковы преимущества доступа к общим ресурсам в сети? 15. Что такое защита и какие действия по защите данных, программ и ресурсов выполняет ОС? 16. Что такое авторизация? 17. Что такое командный интерпретатор? 18. Какие виды команд имеются в командном языке ОС? 19. Какие виды сервисов предоставляет ОС? 20. Какие дополнительные функции выполняет ОС? 21. Что такое системный вызов? 22. Какими способами могут передаваться параметры системному вызову? 23. Какие виды системных вызовов Вы знаете? 72 24. Как организовано распределение памяти в MS DOS? 25. Как организовано распределение памяти для нескольких задач в UNIX? 26. Каковы способы реализации коммуникационных моделей взаимодействия между процессами? 27. Что такое системные программы и какие функции они выполняют? 28. Какова архитектура MS DOS? 29. Какова архитектура UNIX? 30. Что такое уровни абстракции и каким образом облегчается разработка ОС на основе уровней абстракции? Упражнения 1. Пусть список свободной основной памяти в системе содержит 100 элементов по 1000 слов каждый. От процесса поступило 100 запросов на области памяти по 995 слов. Каково в результате будет состояние памяти? Каким термином обозначается подобная ситуация? 2. Пусть в директории имеется ссылка на файл под именем "F". Пользователь записал под этим же именем в директорию ссылку на другой файл. Что произойдет с первым файлом? 3. Могут ли в одной директории быть две ссылки под одним и тем же именем (например, "A")? 4. Имеется локальная сеть из трех компьютеров. Спланируйте распределение "обязанностей" между ними в сети: хранение файлов, запуск программ, предоставление принтера, обслуживание электронной почты, Web-сервер. 5. Предложите систему защиты от нежелательных обращений через сеть: она должна распознавать враждебные IP-адреса и не допускать обращений с этих адресов к Вашей локальной сети. 6. Какой командой UNIX можно защитить Ваш файл f.txt в текущей директории от нежелательного чтения или изменения другими пользователями? 7. Какая команда служит в системе Solaris для удаленного входа на машину aphrodite в Вашей локальной сети? 8. Назовите системные программы, используемые Вами постоянно при работе в Вашей любимой операционной системе на Вашем персональном компьютере. 9. Объясните, почему при использовании уровней абстракции не рекомендуется обращение из модулей уровня N к модулям уровня ниже N-1. Темы для курсовых работ, рефератов, эссе 1. Обзор архитектур основной памяти и способов адресации в компьютерных системах (реферат). 2. Обзор файловых систем и методов управления файлами в операционных системах (реферат). 3. Реализуйте с помощью обычных файлов иерархию директорий и операции над директориями. Ссылки на файлы в элементах реализуемых Вами директорий храните в символьном виде. Особое внимание уделите эффективной реализации поиска файла по символьному пути к нему (курсовая работа). 4. Обзор систем защиты в операционных системах (реферат). 5. Обзор методов организации системных вызовов и передачи им параметров в операционных системах (реферат). 6. Обзор и сравнение командных языков и командных интерпретаторов в системе UNIX (реферат). 7. Архитектура и возможности операционной системы MS DOS (реферат). 8. Архитектура и возможности операционной системы UNIX (реферат). 9. Обзор коммуникационных моделей процессов в операционных системах (реферат). 10. Обзор видов и возможностей системных программ в операционных системах (реферат). 73 74 7. Лекция: Уровни абстракции ОС. ОС с архитектурой микроядра. Виртуальные машины. Цели проектирования и разработки ОС. Генерация ОС В лекции рассматриваются следующие вопросы: методы проектирования и реализации ОС: уровни абстракции ОС; ОС с архитектурой микроядра; виртуальные машины; цели проектирования и разработки ОС с точки зрения пользователей и разработчиков; генерация ОС для конкретной компьютерной системы при ее инсталляции. Содержание Введение Уровни абстракции ОС Операционные системы с микроядром Виртуальные машины – другой распространенный подход к разработке операционных систем и их пользовательских интерфейсов Виртуальная машина Java (JVM) Цели проектирования и разработки ОС Механизмы и политики Реализация операционных систем Генерация операционной системы Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Сложность архитектуры ОС приводит к необходимости использования специальных методов для их разработки. В лекции рассмотрены наиболее популярные из таких методов. Уровни абстракции ОС Проектирование и реализация операционных систем адекватно соответствуют принципу уровней абстракции, сформулированному Э. Дейкстрой и подробно рассмотренному в "История ОС. Отечественные ОС. Диалекты UNIX. Режимы пакетной обработки, мультипрограммирования, разделения времени ". На рис. 7.1 изображены уровни абстракции при разработке ОС. Каждый новый уровень абстракции M определяет новые операции, в реализации которых используются операции предшествующего уровня M-1. Кроме того, уровень M-1 может иметь скрытые операции, используемые только на этом уровне и недоступные другим уровням. На рис. 7.2 изображены уровни абстракции операционной системы OS/2 – второй ОС (вслед за MS DOS), разработанной фирмой Microsoft (в середине 1980-х гг.) для персональных компьютеров PS/2. OS/2 является значительно более развитой ОС, чем MS DOS, как видно из рисунка. На верхнем уровне абстракции прикладные программы пользователей обращаются к интерфейсу прикладного программирования (application programming interface – API), который представляет собой набор библиотечных функций. API структурирован по подсистемам, причем набор подсистем расширяем. Нижние уровни абстракции реализуют ядро ОС, выполняющее функции управления памятью, диспетчеризации задач и управления устройствами. Наконец, на самом низком уровне абстракции реализованы драйверы устройств. 75 Рис. 7.1. Уровни абстракции ОС. Рис. 7.2. Уровни абстракции OS/2 Операционные системы с микроядром Микроядро (micro-kernel) – один из важнейших принципов разработки ОС, который заключается в переносе максимально возможного числа модулей из системного в пользовательское "пространство", т.е. ОС разрабатывается таким образом, что большинство ее модулей выполняются в пользовательском режиме. Коммуникация выполняется между пользовательскими модулями с помощью передачи сообщений. Преимущества такого подхода: 76 1. микроядро легче расширять; 2. легче переносить ОС на новые аппаратные платформы; 3. увеличивается надежность ОС, так как большее число программ выполняются в непривилегированном режиме; 4. улучшается безопасность ОС. По такому принципу разработаны все операционные системы семейства Windows NT. Структура Windows NT изображена на рис. 7.3. Рис. 7.3. Клиент –серверная структура Windows NT. Система Windows NT (от New Technology), разработанная в середине 1990-х гг., воплотила в себе новый подход Microsoft к разработке операционных систем. Его отличительные черты: модульная клиент-серверная архитектура, микроядро, обеспечение совместимости с распространенными видами приложений для других ОС (например, OS/2), расширенные сетевые возможности, повышенная надежность. Windows NT с середины 1990-х гг. широко распространилась как серверная ОС. Для совместимости с приложениями для других ОС, в Windows NT реализованы соответствующие серверы. Взаимодействие клиентских приложений с ними показано на схеме. Аббревиатура Win32 означает "библиотеки (API) ОС Windows для 32-разрядных процессоров". POSIX (Portable Operating Systems of unIX type) – стандарт для библиотек, системных вызовов и системных программ для операционных систем типа UNIX. POSIX-совместимость означает, что приложение, предназначенное для UNIX, использует только стандартные возможности. Все современные ОС (начиная с Windows NT) обеспечивают совместимость с POSIX-приложениями. Заметим, что все серверы для совместимости с другими ОС в Windows NT выполняются в непривилегированном режиме, но обращаются к микроядру. Виртуальные машины – другой распространенный подход к разработке операционных систем и их пользовательских интерфейсов Концепция виртуальной машины доводит подход, основанный на уровнях абстракции, до своего логического завершения. Согласно данной концепции, совокупность аппаратуры и ОС трактуется как машина. Виртуальная машина предоставляет интерфейс, полностью аналогичный интерфейсу обычной машины без базового программного обеспечения. ОС создает иллюзию одновременного исполнения нескольких процессов, каждого в своей (виртуальной) памяти. Вообще, виртуализация – один из наиболее современных принципов развития и использования программного обеспечения. Пример: система виртуальных машин (SVM) в ОС IBM 360/370, разработанная в конце 1980-х гг. Более современный пример: Microsoft Virtual PC – продукт, эмулирующий виртуальную машину, в которую может быть инсталлирована любая другая ОС, отличная от основной. При работе пользователей в виртуальных машинах физические ресурсы реальной компьютерной системы используются совместно для поддержки нескольких виртуальных машин. Диспетчеризация процессора создает у каждого пользователя впечатление, что он имеет 77 свой собственный процессор. Буферизация (spooling) и файловая система предоставляют виртуальные устройства ввода и вывода. Терминал обычного пользователя, характерный для более раннего режима разделения времени, действует как операторская консоль. Модели операционных систем, разработанных без использования концепции виртуальной машины и на основе концепции виртуальных машин, изображены на рис. 7.4. Рис. 7.4. Модели ОС без использования виртуальных машин и на основе виртуальных машин. Как видно из схемы, без использования виртуальных машин способ использования ОС и аппаратуры традиционен: имеется несколько пользовательских процессов, совместно использующих одно ядро ОС и, естественно, один экземпляр аппаратуры компьютера. При использовании виртуальных машин картина меняется: процесс каждого пользователя как бы получает в свое распоряжение свой персональный (виртуальный) компьютер и свой собственный экземпляр ядра ОС, работающий на этом виртуальном компьютере. Концепция виртуальной машины имеет следующие преимущества и недостатки. С одной стороны, она обеспечивает полную защиту системных ресурсов, так как каждая виртуальная машина изолирована от других, Однако такая изоляция препятствует эффективному совместному использованию ресурсов реального компьютера. Система виртуальных машин – хорошая основа для исследования и разработок в области ОС. Разработка систем выполняется над виртуальной машиной, а не на физической машине, и не нарушает нормального функционирования системы Концепцию виртуальной машины, однако, труднее реализовать, так как трудно адекватно смоделировать используемую машину. Виртуальная машина Java (JVM) Подход, основанный на виртуализации, характерен не только для разработки операционных систем, но и для реализации современных платформ т языков программирования. Причина в том, что реализаторы этих языков и платформ стремятся сделать их переносимы- 78 ми с одной реальной аппаратной платформы на другую. Такой подход принят, как широко известно, при реализации Java, но авторы Java отнюдь не первыми предложили данную идею. Программы на Java компилируются в платформонезависимый байт-код (bytecode) – команды виртуальной Java-машины, построенные на основе постфиксной записи операндов. Байт-код исполняется виртуальной машиной Java (JVM). JVM состоит из: 1. загрузчика классов (class loader), выполняющего загрузку классов в виртуальную машину во время выполнения программы; загрузчик классов может быть стандартным или может быть переопределен пользователем; 2. верификатора классов (class verifier), выполняющего при загрузке класса проверку корректности его байт-кода, контроль типов и другие необходимые проверки; 3. интерпретатора (runtime interpreter), выполняющего интерпретацию (эмуляцию) команд байт-кода – абстрактной машины Java; 4. Just-In-Time (JIT) – компилятора, выполняющего при первом вызове каждого метода его компиляцию в объектный код целевой платформы (native – код), что позволяет повысить суммарную производительность выполнения программ на Java. Аналогичную архитектуру имеет виртуальная машина VES (Virtual Execution System) платформы Microsoft.NET, однако подход .NET более открытый – поддерживается многоязыковое программирование, и байт-код (в .NET называемый CIL – Common Intermediate Language) играет роль универсального промежуточного языка, в который компилируется исходный код на любом языке, например, на C# или Visual Basic. Подробное рассмотрение этих вопросов выходит за рамки данного курса. В качестве базового учебника по Javaтехнологии рекомендую книгу "Виртуальные файловые системы (VFS). Реализации файловых систем. Сетевая файловая система NFS". Архитектура виртуальной машины Java изображена на рис. 7.5. Рис. 7.5. Архитектура виртуальной машины Java (JVM). 79 Цели проектирования и разработки ОС Точки зрения пользователей и разработчиков ОС в данном отношении несколько различаются. Цели с точки зрения пользователя: ОС должна быть удобной в использовании, простой для изучения, надежной, безопасной и быстрой. Цели с точки зрения разработчика ОС: ОС должна быть несложной для проектирования, реализации и сопровождения, а также гибкой, надежной, свободной от ошибок и эффективной. Механизмы и политики При разработке ОС, как и любой другой сложной программной системы, различают концепции механизма и политики. Механизм определяет, каким образом реализовать некоторую функциональность (например, виртуальную память). Политика определяет, что именно требуется реализовать, т.е. набор требований, целей, условий для реализации функциональности. Например, политика безопасности в ОС определяет правила, по которым программе или пользователю предоставляются некоторые полномочия (например, возможность открытия некоторого файла). Эта политика может быть реализована многими способами, например, с помощью списков управления доступом (access control lists); это понятие будет рассмотрено немного позже. Отделение механизма от политики – очень важный принцип для разработки ОС. Он допускает максимум гибкости, если "политические" решения могут быть изменены впоследствии. Реализация операционных систем Традиционно, начиная с 1950-х гг., ОС разрабатывались на низкоуровневых языках – ассемблерах. Система UNIX была первой ОС, разработанной почти полностью на языке высокого уровня – Си. Впоследствии язык Си стал одним из наиболее популярных языков системного программирования. Благодаря новаторскому подходу авторов UNIX, сложилась тенденция разработки ОС на языках высокого уровня. Преимущества использования языков высокого уровня очевидны: код на языке высокого уровня 1. может быть разработан быстрее 2. более компактен 3. легче для понимания и отладки. Кроме того, операционная система гораздо легче переносима на другие аппаратные платформы, если она разработана на языке высокого уровня. Гипотетический недостаток у языков высокого уровня, по сравнению с ассемблерами, только один – возможная неэффективность реализации высокоуровневых конструкций языка, по сравнению с "ручным" программированием на ассемблере. Однако данная проблема может быть решена путем разработки эффективного оптимизирующего компилятора с языка высокого уровня и не должна препятствовать его использованию. Близкими автору примерами разработки ОС на языках высокого уровня, помимо UNIX, является разработка на Си ОС Solaris фирмой Sun, а также разработка ОС "Эльбрус" на языке высокого уровня Эль-76 "Системы ввода-вывода ". Поставка ОС "Эльбрус" вместе с ее исходными кодами была весьма полезна для программистов и стимулировала целый ряд работ отраслевых организаций по разработке ОС реального времени на базе ОС "Эльбрус". Генерация операционной системы ОС проектируются с целью использования на любом компьютере из некоторого класса. В поставку ОС входит очень большой набор типовых модулей для различных классов компьютеров (например, настольных и портативных). Поэтому для каждого компьютера система должна быть сконфигурирована при ее инсталляции – установке ОС на конкретный компьютер. Программа генерации ОС получает информацию о специфической конфигурации компьютерной системы. 80 После генерации и инсталляции ОС система готова к работе. Следующий этап - загрузка (booting) – запуск компьютера посредством загрузки ядра ОС. При запуске компьютера первой запускается программа раскрутки (bootstrap program) – код, хранящийся в постоянной памяти (ROM) базовой системы ввода-вывода (BIOS) компьютера. Код программы раскрутки находит ядро ОС, загружает его в память и запускает. Ключевые термины Just-In-Time (JIT) – компилятор – компонента JVM, выполняющая при первом вызове каждого метода его компиляцию в объектный код целевой платформы (native – код), что позволяет повысить суммарную производительность выполнения программ на Java. OS/2 – ОС, разработанная фирмой IBM для персональных компьютеров PS/2. POSIX (Portable Operating Systems of unIX type) – стандарт для библиотек, системных вызовов и системных программ для операционных систем типа UNIX. Win32 - Библиотеки (API) ОС Windows для 32-разрядных процессоров. Байт-код (bytecode) – команды виртуальной Java-машины, построенные на основе постфиксной записи операндов. Верификатор классов (class verifier) – компонента JVM, выполняющая при загрузке класса проверку корректности его байт-кода, контроль типов и другие необходимые проверки. Виртуальная машина – программный интерфейс, полностью аналогичный интерфейсу обычного компьютера без базового программного обеспечения. Виртуальная машина Java (JVM) – виртуальная машина, исполняющая Java байт-код. Загрузка (booting) – запуск компьютера посредством загрузки ядра ОС. Загрузчик классов (class loader) – компонента JVM, выполняющая загрузку классов в виртуальную машину во время выполнения программы. Инсталляция – установка ОС на конкретный компьютер. Интерфейс прикладного программирования (application programming interface – API) - набор библиотечных функций, реализующий некоторую функциональность, используемую программой. Механизм - метод реализации некоторой функциональности в ОС. Микроядро (micro-kernel) – принцип разработки ОС, который заключается в переносе максимально возможного числа модулей из системного в пользовательское "пространство", т.е. ОС разрабатывается таким образом, что большинство ее модулей выполняются в пользовательском режиме, а размер ядра минимизируется. Политика - набор требований, целей, условий для реализации некоторой функциональности в ОС. Политика безопасности в ОС – совокупность правил, по которым программе или пользователю предоставляются некоторые полномочия для выполнения действий. Программа раскрутки (bootstrap program) – код, запускаемый первым при включении компьютера, хранящийся в постоянной памяти (ROM) базовой системы ввода-вывода (BIOS) компьютера, который находит ядро ОС, загружает его в память и запускает. Краткие итоги При разработке ОС широко применяется принцип уровней абстракции. Он применен при разработке OS/2 – второй ОС фирмы Microsoft (после MS DOS), разработанной для персональных компьютеров PS/2. OS/2 имела четыре уровня абстракции. ОС с микроядром – принцип разработки ОС, при котором минимизируется число модулей, выполнение которых необходимо в привилегированном режиме, что более безопасно, надежно и позволяет легче переносить ОС на другие платформы. 81 По принципу микроядра разработана ОС Windows NT, в которой имеются серверы для поддержки исполнения Win32- , OS/2 и POSIX-приложений. Концепция виртуальной машины позволяет предоставить пользователю ОС воображаемую персональную машину со своим набором ресурсов. Таким образом, обеспечивается изоляция и защита системных ресурсов, однако подобная ОС сложнее для разработки. ОС на базе концепции виртуальных машин – хорошая основа для исследований. В настоящее время широко используется виртуальная машина Java (JVM), выполняющая программе на Java байт-коде на реальной аппаратуре. JVM состоит из загрузчика классов, верификатора классов, интерпретатора байт-кода и just-in-time – компилятора. Цели проектирования и разработки ОС: с точки зрения пользователя – удобство, простота, надежность, безопасность, эффективность; с точки зрения разработчика ОС – простота проектирования, реализации и сопровождения, гибкостью надежность, свобода от ошибок, эффективность. При разработке ОС различают механизмы – методы реализации функциональностей – и политики – правила и требования к реализации функциональностей. Механизмы отделены от политик. Реализация ОС долгое время выполнялась на ассемблерах. Начиная с UNIX, разработка ОС ведется на языках высокого уровня, чаще всего – на языке Си. При установке ОС на конкретный компьютер происходит фактически генерация ОС, так как ОС предназначена для широкого класса машин, и в ее поставку входит широкий набор типовых модулей, из которых инсталлятор генерирует конкретную ОС для конкретной машины. Загрузка ОС – это ее запуск при включении компьютера. Она реализуется с помощью программы раскрутки, которая хранится в ROM BIOS, запускается самой первой, находит ядро ОС, загружает его в память и запускает. Набор для практики Вопросы 1. Что такое уровень абстракции и какие ограничения накладываются на реализацию его операций? 2. Какие уровни абстракции реализованы в системе OS/2? 3. Что такое микроядро и как организуются операционные системы по принципу микроядра? 4. В чем преимущество разработки ОС по принципу микроядра? 5. По каким принципам организована ОС Windows NT и с приложениями для каких платформ она поддерживает совместимость? 6. Что такое виртуальная машина и каким образом концепция виртуальной машины используется при разработке ОС? 7. В чем преимущества для пользователя при работе в персональной виртуальной машине в рамках операционной системы? 8. Что такое виртуальная машина Java (JVM) и из каких компонент она состоит? 9. Что такое загрузчик классов в JVM? 10. Что такое верификатор в JVM? 11. Что такое интерпретатор в JVM? 12. Что такое JIT-компилятор в JVM? 13. Что такое VES в платформе Microsoft.NET и в чем преимущество .NET, по сравнению с Java? 14. Каковы цели проектирования и разработки ОС, с точки зрения ее пользователей? 15. Каковы цели проектирования и разработки ОС, с точки зрения ее разработчиков? 16. Что такое механизм (при разработке ОС)? 17. Что такое политика (при разработке ОС)? 18. На каких языках высокого уровня разрабатываются ОС? 19. Почему разрабатывать ОС на языках высокого уровня удобнее, чем на ассемблере? 20. Почему при установке ОС на конкретный компьютер необходима генерация ОС именно для данного компьютера? 21. Что такое раскрутка и программа раскрутки? 22. Что такое BIOS и ROM BIOS и как они используются при раскрутке системы? 82 Упражнения 1. Предположим, что Вы – разработчик ОС для новой компьютерной системы. Предложите набор уровней абстракции для проектирования и разработки Вашей ОС и охарактеризуйте назначение каждого из уровней. 2. То же задание относительно принципа микроядра: Предложите архитектуру ОС с микроядром и опишите, какого рода модули следует отнести к ядру, а какие можно выполнять в непривилегированном режиме. 3. Предложите архитектуру ОС, реализующей систему виртуальных машин. 4. Сформулируйте, в чем принципиальные различия работы пользователя в виртуальной машине от монопольной работы на реальном компьютере, в чем достоинства и недостатки каждого из этих режимов использования компьютера. 5. Инсталлируйте на своем компьютере продукт Microsoft Virtual PC, инсталлируйте в виртуальной машине другую ОС (например, Windows 7, если у Вас на компьютере инсталлирована Windows Vista), поэкспериментируйте с ней и опишите свои впечатления. 6. Загрузите с сайта http://java.sun.com новую версию Java Development Kit (JDK), Standard Edition, инсталлируйте его и пропустите простейшие примеры с использованием JVM. 7. Запустите используемую Вами операционную систему на Вашем компьютере и проанализируйте действия системы при запуске: какие сообщения выдаются, каков порядок загрузки компонент системы, в том числе драйверов, какие драйверы хранятся в ROM BIOS, а какие являются частью ОС. Темы для курсовых работ, рефератов, эссе 1. Принцип уровней абстракции и его использование при разработке операционных систем (реферат). 2. Обзор операционной системы OS/2 и ее архитектуры (реферат). 3. Обзор операционных систем, разработанных по принципу микроядра (реферат). 4. Обзор операционной системы Windows NT и ее архитектуры (реферат). 5. Концепция виртуальной машины и операционные системы, основанные на данной концепции (реферат). 6. Обзор Java-технологии и виртуальной машины Java (реферат). 7. Анализ и подробное описание процесса запуска компьютера и загрузки операционной системы (курсовая работа). 8. Инсталляция Microsoft Virtual PC, инсталляция в ней другой ОС, пропуск в ней простых примеров программ и подробное аналитическое описание результатов работы (курсовая работа). 9. Инсталляция JDK (включающего JVM), пропуск простых тестов на Java из состава JDK и подробное аналитическое описание результатов (курсовая работа). 83 84 8. Лекция: Управление процессами. Планирование и диспетчеризация процессов В лекции рассмотрены основные концепции управления процессами, планирования и диспетчеризации процессов. Содержание Введение Понятие процесса Состояния процесса Блок управления процессом Переключение с одного процесса на другой Очереди, связанные с диспетчеризацией процессов Планировщики, выполняющие диспетчеризацию процессов Переключение контекста Создание процесса – одна из основных операций над процессами Уничтожение процесса Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Начиная с данной лекции, в курсе более подробно рассматриваются все ключевые концепции и задачи ОС и используемые для их реализации алгоритмы и структуры данных. Первая концепция, подробно рассматриваемая в данной и следующей лекциях, - концепция процесса и управления процессами. Рассматриваются следующие вопросы: понятие процесса; состояния процесса; блок управления процессом; диспетчеризация процессов; операции над процессами. Понятие процесса Процесс (process)это программа пользователя при ее выполнении. При своей работе операционная системы исполняет множество классов программ: пакетные задания; пользовательские программы в режиме разделения времени; системные программы и процессы. Имеется несколько схожих терминов, характеризующих пользовательские программы: процесс (process), задание (job), задача (task)Однако не будем здесь преувеличивать различие между ними: для лучшего понимания специфики процессов и управления ими в ОС, мы можем считать приведенные термины синонимами, как и считается ио многих учебниках по ОС. Важная особенность процесса: это единица вычислений, которая должна выполняться последовательно, т.е. каждый процесс имеет свой последовательный поток управления (control flow) – последовательность выполняемых процессом команд. Многие большие задачи успешно решаются путем параллельного выполнения процессов, но об этом речь пойдет немного позже. Процесс при его создании и управлении им операционной системой включает следующую основную информацию: Счетчик команд (program counter - PC) – адрес текущей выполняемой команды процесса; обычно хранится в специальном системном регистре аппаратуры; Стек (stack) – резидентная область основной памяти, выделяемая операционной системой при создании процесса, в которой хранятся локальные данные процедур процесса, их параметры (аргументы) и связующая информация между ними, необходимая для организации вычислений. При запуске очередной процедуры в стеке отводится запись активации (activation record), называемая также стековым фреймом 85 (stack frame) и областью локальных данных (local data area) для хранения локальных данных текущего поколения (запуска) процедуры. По окончании ее выполнения запись активации удаляется из стека; Секция данных (data section) – статическая (постоянно выделенная, неизменного размера) область основной памяти, выделяемая операционной системой процессу, в которой хранятся его глобальные переменные, массивы, структуры, объекты. Исполняемый код (команды) процесса первоначально хранится во вторичной памяти (на диске) и загружается в основную память полностью или частично при обращении к нему. Состояния процесса При исполнении процесс может изменять свое состояние следующим образом: Новый (new): Процесс создается операционной системой, но еще не начал выполняться. Исполняемый (running): Исполняются команды процесса на процессоре или процессолрах компьютерной системы под управлением ОС. Ожидающий (waiting): Процесс ожидает наступления некоторого события, например, завершения ввода-вывода. В состоянии ожидания процесс не занимает процессор. Готовый к выполнению (ready): Процесс ожидает получения ресурсов процессора для его исполнения. В состояние готовности к выполнению процесс попадает обычно либо при его создании, либо после завершения ввода-вывода (из состояния ожидания). Завершенный (terminated): Исполнение процесса завершено. Диаграмма состояний процесса представлена на рис. 8.1. Рис. 8.1. Диаграмма состояний процесса. Как видно из схемы, новый процесс, созданный в системе, проходит стадию допущен (admitted) – включается операционной системой в очередь всех процессов в системе, после чего ОС переводит его в состояние готовности к выполнению. Отметим сразу, что очередь готовых к выполнению процессов – одна из наиболее часто используемых системных структур для управления процессами. Из состояния готовности в состояние выполнения процесс переводится планировщиком ОС в результате диспетчеризации – выделения кванта процессорного времени. При выполнении процесс может быть прерван (по таймеру, в результате ошибки и т.п.), а после обработки прерывания операционной системой переходит снова в состояние готовности к выполнению. Если в процессе выполняется синхронный ввод-вывод, либо процесс должен ожидать наступления некоторого события (например, определенного момента времени), процесс переходит в состояние ожидания. При завершении ввода-вывода или при наступлении ожидаемого события процесс не получает сразу же квант процессорного времени, а переходит в состояние готовности к выполнению. Процесс переходит в завершенное состояние при завершении работы программы процесса - например, в результате си- 86 стемного вызова exit(c), где c – код завершения. Если c = 0, процесс считается благополучно завершенным. Блок управления процессом Блок управления процессом (Process Control Block – PCB) – системная структура данных, используемая ОС для управления процессом, содержащия следующую информацию, ассоциируемую с каждым процессом: Состояние процесса Текущее значение счетчика команд (используется при продолжении выполнения процесса); Значения регистров процессора (также используются при возобновлении процесса); Информация для диспетчеризации процессора (указатель на стек процесса, номер процесса); Информация для управления памятью (границы области памяти процесса); Статистическая информация (общее время выполнения процесса, оставшееся из заявленного время выполнения, суммарное время ввода-вывода и т.д.) Информация о состоянии ввода-вывода (список открытых файлов). Структура блока управления процессом изображена на рис. 8.2. Рис. 8.2. Блок управления процессом (PCB). Переключение с одного процесса на другой Операционная система при управлении процессами обеспечивает их поочередное выполнение. Эту задачу решает планировщик ОС. Схема переключения процессора с одного процесса на другой изображена на рис. 8.3. На схеме изображено два процесса – P0 и P1. При прерывании или системном вызове в процессе P0 операционная система сохраняет его состояние в его PCB и переключает процессор на процесс P1 (аналогично обрабатывается процесс P1). Показаны периоды исполнения и простаивания каждого из процессов. 87 Рис. 8.3. Переключение с одного процесса на другой. Очереди, связанные с диспетчеризацией процессов Подобно каждому гражданину в известный, ныне ушедший в прошлое период нашей истории, каждый процесс всю свою жизнь проводит в очередях. Для управления процессами ОС организует следующие очереди: Очередь заданий (job queue) – содержит множество всех процессов в системе. В нее попадает каждый новый процесс и остается в ней в течение всего пребывания в системе. Очередь готовых процессов (ready queue) – наиболее часто используемая и изменяемая очередь, содержащая множество всех процессов, находящихся в основной памяти и готовых к выполнению. В нее попадает каждый новый процесс, который система допускает к выполнению, а также каждый процесс после выполнения вводавывода или наступление ожидаемого события. Очереди процессов, ожидающих ввода-вывода (device queues) – множества процессов, ожидающих результата работы устройств ввода-вывода (для каждого устройства организуется своя очередь). Управление процессами операционной системой и поведение процессов в системе можно рассматривать как миграцию между различными очередями. На рис. 8.4 изображена схема организации очереди готовых процессов и очередей к устройствам ввода-вывода. 88 Рис. 8.4. Очередь готовых процессов и очереди к устройствам ввода-вывода. Как видно из схемы, в очереди готовых процессов находятся те процессы, ввод-вывод в которых завершен. Процессы, выполняющие ввод-вывод или ждущие возможности его выполнить (освобождения соответствующего устройства) стоят в очереди к устройству. Некоторые устройства могут быть свободны, другие – содержать более одного процесса в очереди. Следует также обратить внимание на организацию очереди, с точки зрения представления данных. Полезный прием состоит в том, что для очереди хранится не только ссылка на начало (голову), но и ссылка на конец (хвост), что позволяет более эффективно управлять очередями (например, быстро добавить элемент в конец очереди). Место процесса в очереди определяется его приоритетом, о котором речь ниже. Более подробно алгоритмы работы с очередями (как с одной из классических структур данных) описаны в монографии Д. Кнута [15]. Схема диспетчеризации процессов и работа с очередями представлена на рис. 8.5. Из очереди готовых процессов каждый процесс в конце концов попадает на процессор и выполняется. При выполнении могут возникнуть следующие ситуации, при которых выполнение приостанавливается: запрос на синхронный ввод-вывод, исчерпание выделенного процессу кванта времени, прерывание или создание дочернего процесса. Особого пояснения требует, пожалуй, лишь последняя ситуация. В классической схеме UNIX при создании дочернего процесса системным вызовом fork для дочернего процесса создается новое пространство виртуальной памяти, в которую копируется содержимое памяти процессародителя. После этого процесс-родитель уступает процессор дочернему процессу. Подобная схема создания дочернего процесса, разумеется, не всегда удобна. Стратегии распараллеливания процессов рассмотрены в следующей лекции. 89 Рис. 8.5. Графическое представление диспетчеризации процессов. Планировщики, выполняющие диспетчеризацию процессов В операционной системе диспетчеризация процессов выполняется обычно несколькими планировщиками, каждый из которых имеет свою периодичность вызовов и свою определенную задачу, которую он решает. Долговременный планировщик (планировщик заданий) определяет, какие процессы должны быть перемещены в очередь готовых процессов. Кратковременный планировщик (планировщик процессора) – определяет, какие процессы должны быть выполнены следующими и каким процессам должен быть предоставлен процессор. Для реализации режима разделения времени в систему может быть добавлен также планировщик откачки и подкачки процессов, определяющий, какие пользовательские процессы должны быть подкачаны в память или откачаны на диск. Схема работы системы, включающей такой планировщик, изображена на рис. 8.6. Рис. 8.6. Добавление в систему планировщика откачки и подкачки процессов. Особенности планировщиков и процессов. Каждый планировщик имеет свои особенности поведения, как и каждый процесс. 90 Кратковременный планировщик вызывается очень часто, по крайней мере не реже, чем по истечение очередного кванта времени процессора. Поэтому он должен быть очень быстрым, максимально эффективно реализованным. Понятно, что недопустимо, например, если время работы этого планировщика окажется сравнимым с размером самого кванта времени – слишком велики будут накладные расходы. Долговременный планировщик вызывается относительно редко, так как система не столь часто принимает решения о переводе процесса в очередь готовых процессов. Поэтому он может быть сравнительно медленным, не столь эффективно реализованным. Однако, поскольку основной задачей системы в целом остается обслуживание как можно большего числа процессов, именно долговременный планировщик определяет степень (коэффициент) мультипрограммирования – число процессов, которое обслуживает система в единицу времени. Сами процессы также могут вести себя по-разному, с точки зрения их диспетчеризации. Процессы могут быть: Ориентированными на ввод-вывод (I/O-bound) – процессы, которые тратят больше времени на ввод-вывод, чем на вычисления. Такие процессы обычно расходуют много коротких квантов процессорного времени. Ориентированные на использование процессора (CPU-bound) – процессы, которые тратят основное время на вычисления. Такие процессы расходуют небольшое число долговременных квантов процессорного времени. Переключение контекста Когда процессор переключается на другой процесс, система должна сохранить состояние старого процесса и загрузить сохраненное состояние для нового процесса. Такое действие системы называется переключением контекста (context switch). Переключение контекста относится к накладным расходам (overhead), так как система не выполняет никаких полезных действий при переключении с одного процесса на другой. Время переключения контекста зависит от аппаратной поддержки. Выше мы рассматривали необходимые действия системы в таких случаях – сохранение состояния приостанавливаемого процесса в его PCB и восстановление состояния возобновляемого процесса из его PCB. Например, в системе "Эльбрус" контекстное переключение выполнялось всего одной аппаратной командой - СМСТЕК (сменить стек, т.е. переключиться с одного облегченного процесса на другой). Однако следует отметить, что такая аппаратная оптимизация была возможна, так как понятие процесса в "Эльбрусе" было фактически сведено к понятию облегченного процесса (lightweight process). Создание процесса – одна из основных операций над процессами Процесс-родитель создает дочерние процессы, которые, в свою очередь, создают другие процессы, тем самым формируя дерево процессов. Возможны различные подходы к созданию процессов, с точки зрения возможности совместного использования (разделения) ресурсов процессом-родителем и дочерним процессом, с точки зрения возможности их параллельного выполнения и с точки зрения адресации и использования памяти. Разделение ресурсов. Возможны следующие подходы: Процесс-родитель и дочерние процессы разделяют все ресурсы; Дочерние процессы разделяют подмножество ресурсов процесса-родителя; Процесс-родитель и дочерний процесс не имеют общих ресурсов. Исполнение. Возможны следующие подходы: Процесс-родитель и дочерние процессы исполняются совместно; Процесс-родитель ожидает завершения дочерних процессов. Адресация и использование памяти. Возможны следующие подходы: 91 Адресное пространство дочернего процесса копирует адресное пространство процесса-родителя; у дочернего процесса имеется программа, загруженная в него; Дочерний процесс исполняется в том же пространстве памяти, что и процесс-родитель (облегченный процесс). В системе UNIX сформулированные вопросы решены следующим образом. fork – системный вызов, создающий новый процесс. Он клонирует память процесса-родителя и создает для дочернего процесса новое виртуальное адресное пространство. После этого выполняется еще один системный вызов - exec (execve) – системный вызов, с целью замены пространства памяти процесса новой программой. Дочерний процесс продолжает выполняться вместо процесса родителя. На рис. 8.7 изображено дерево процессов в системе UNIX. Рис. 8.7. Дерево процессов в системе UNIX. При запуске системы создается корневой процесс root. Он, в свою очередь, создает три дочерних процесса: init – инициализация системы; pagedaemon – процесс-демон (процесс, постоянно находящийся в системе до ее перезапуска), управляющей страничной организацией памяти; swapper – процесс, управляющий откачкой и подкачкой. Процесс init после инициализации системы запускает пользовательские процессы. Последние, в свою очередь, могут запускать новые и т.д. Уничтожение процесса Это также одна из основных операций над процессами. Как правило, процесс уничтожается (завершается), когда он исполняет заключительный оператор и обращается к ОС для своей ликвидации с помощью системного вызова exit. При этом возможна передача данных от дочернего процесса процессу-родителю – например, чпрез файлы, созданные дочерним процессом. Ресурсы процесса освобождаются операционной системой. При своей работе процесс-родитель может уничтожить дочерние процессы системным вызовом abort (UNIX). Это возможно в следующих случаях: Дочерний процесс превысил выделенные ему ресурсы; Решения задачи, порученной дочернему процессу, больше не требуется; Происходит выход из процесса-родителя, поэтому дочерние процессы также должны бать завершены. ОС не допускает продолжения исполнения дочернего процесса, если его процесс-родитель уничтожается. Последний феномен носит название каскадное уничтожение процессов. Ключевые термины Блок управления процессом (Process Control Block – PCB) – системная структура данных, используемая ОС для управления процессом. Готовый к выполнению (ready) – Состояние процесса, при котором он ожидает получения ресурсов процессора для его исполнения. 92 Диспетчеризация – поочередное выделение планировщиком операционной система процессам квантов процессорного времени. Долговременный планировщик (планировщик заданий) - планировщик ОС, определяющий, какие процессы должны быть перемещены в очередь готовых процессов. Допущен (admitted) - статус процесса, который он получает от ОС после его допуска в систему (включения в очередь всех процессов). Завершен (terminated) – состояние процесса, при котором исполнение его программы завершено. Запись активации (другие названия: activation record, стековый фрейм - stack frame, область локальных данных - local data area) – область памяти в стеке, в которой хранятся локальные данные текущего поколения (запуска) процедуры. Исполняемый (running) - Состояние процесса, при котором исполняются его команды на процессоре или процессолрах компьютерной системы под управлением ОС. Каскадное уничтожение процессов - групповое уничтожение процессов в результате рекурсивного применения правила автоматического уничтожения дочерних процессов при завершении или уничтожении процесса-родителя. Кратковременный планировщик (планировщик процессора) – планировщик ОС, определяющий, какие процессы должны быть выполнены следующими и каким процессам должен быть предоставлен процессор. Новый (new) - Состояние процесса, при котором он создан операционной системой, но еще не начал выполняться. Ожидающий (waiting) – состояние процесса, при котором он ожидает наступления некоторого события, например, завершения ввода-вывода. В состоянии ожидания процесс не занимает процессор. Ориентированный на ввод-вывод (I/O-bound) – процесс, который тратит больше времени на ввод-вывод, чем на вычисления. Ориентированный на использование процессора (CPU-bound) – процесс, который тратит основное время на вычисления. Очереди процессов, ожидающих ввода-вывода (device queues) – множества процессов, ожидающих результата работы устройств ввода-вывода (для каждого устройства организуется своя очередь). Очередь готовых процессов (ready queue) – очередь, содержащая множество всех процессов, находящихся в основной памяти и готовых к выполнению. Очередь заданий (job queue) – очередь, содержащая множество всех процессов в системе. Переключение контекста (context switch) – действия ОС при переключении с одного процесса на другой по сохранению состояние старого процесса и загрузки сохраненного состояния для нового процесса. Планировщик (scheduler) - компонента ОС, планирующая и осуществляющая перевод процессов из состояния готовности в состояние выполнения. Планировщик откачки и подкачки процессов – планировщик ОС, определяющий, какие пользовательские процессы должны быть подкачаны в память или откачаны на диск. Поток управления (control flow) – последовательность выполняемых процессом команд. Процесс (process)– программа пользователя при ее выполнении. Процесс-демон - процесс, постоянно находящийся в системе до ее перезапуска. Секция данных (data section) – статическая (постоянно выделенная, неизменного размера) область основной памяти, выделяемая операционной системой процессу, в которой хранятся его глобальные переменные, массивы, структуры, объекты. Стек (stack) – резидентная область основной памяти, выделяемая операционной системой при создании процесса, в которой хранятся локальные данные процедур процесса, их 93 параметры (аргументы) и связующая информация между ними, необходимая для организации вычислений. Степень (коэффициент) мультипрограммирования – число процессов, которое обслуживает система в единицу времени. Счетчик команд (program counter - PC) – адрес текущей выполняемой команды процесса; обычно хранится в специальном системном регистре аппаратуры. Краткие итоги Процесс – программа пользователя при ее выполнении. Различаются пакетные и интерактивные процессы. Процесс включает счетчик команд, стек и секцию данных. Процесс может находиться в следующих состояниях: новый, готовый к выполнению, ожидающий, исполняемый, завершенный. Для управления процессом ОС создает блок управления процессом (PCB), содержащий состояние процессора, счетчик команд, регистры процессора, информацию для его диспетчеризации, информацию для управления памятью, статистику, информацию о состоянии ввода-вывода. PCB используется для сохранения и восстановления этой информации о процессах при переключении с одного процесса на другой. Для управления процессами ОС использует следующие очереди: очередь заданий (всех процессов в системе), очередь готовых к выполнению процессов, очереди (к каждому устройству) процессов, ожидающих ввода-вывода. Планировщики ОС планируют поочередное выделение процессам квантов процессорного времени. Долговременный планировщик определяет, какие процессы должны быть перемещены в очередь готовых процессов. Кратковременный планировщик определяет, какие процессы должны быть выполнены следующими на процессорах компьютерной системы. Планировщик откачки и подкачки определяет, какие процессы должны быть откачаны на диск или подкачаны в память. Кратковременный планировщик вызывается чаще всего и должен быть максимально эффективным. Долговременный, вызываемый реже, может быть относительно медленным. Именно долговременный планировщик определяет коэффициент мультипрограммирования. По их поведению процессы можно классифицировать как ориентированные на вводвывод и ориентированные на вычисления (использование процессора). Переключение контекста (время, расходуемое ОС при переключении с одного процесса на другой) относится к накладным расходам системы. Оно зависит от аппаратной поддержки. При создании процессов процессы-родители создают дочерние процессы, которые затем создают свои дочерние процессы, и т.д. В результате формируется дерево процессов в системе. При создании процесса процесс-родитель и дочерний процесс могут разделять все ресурсы, разделять подмножество ресурсов или не иметь общих ресурсов. Процесс-родитель может исполняться совместно с дочерним процессом или ожидать завершения дочернего процесса. При создании дочернего процесса может создаваться новое адресное пространство, копируемое с процесса-родителя; облегченный дочерний процесс работает в том же адресном пространстве, что и процесс-родитель. В системе UNIX эти действия реализуются системными вызовами fork и exec. Уничтожение процесса происходит, когда его программа завершается системным вызовом exit, либо он как дочерний процесс автоматически уничтожается при завершении иои уничтожении процесса-родителя (каскадное уничтожение процессов). Дочерний процес может быть уничтожен, если он превысил выделенные ему ресурсы, превысил свой квант времени, либо его выполнение больше не требуется. Набор для практики Вопросы 1. 2. 3. 4. 5. Что Что Что Что Что такое такое такое такое такое процесс? пакетный процесс? интерактивный процесс? счетчик команд процесса? стек процесса? 94 6. Что такое секция данных процесса? 7. В каких состояниях может находится процесс? 8. Дайте определение состояния новый. 9. Дайте определение состояния готовый к выполнению. 10. Дайте определение состояния выполняемый. 11. Дайте определение состояния ожидающий. 12. Дайте определение состояния завершенный. 13. Что такое блок управления процессом и какая информация хранится в нем? 14. Как используется блок управления процессом при переключении с одного процесса на другой? 15. Какие очереди использует ОС для управления процессами? 16. Что такое очередь заданий? 17. Что такое очередь готовых процессов? 18. Что такое очереди на ввод-вывод? 19. Что такое планировщик? 20. Какие функции выполняет долговременный планировщик? 21. Какие функции выполняет кратковременный планировщик? 22. Какие функции выполняет планировщик откачки и подкачки? 23. Какой из планировщиков определяет степень мультипрограммирования ОС? 24. Как можно классифицировать процессы, с точки зрения выполнения ими вычислений на процессоре и ввода-вывода? 25. Что такое переключение контекста? 26. Как происходит создание процесса? 27. Что такое дерево процессов? 28. Какими способами может быть организовано разделение ресурсов процессомродителем и дочерним процессом? 29. Каким образом может быть организовано исполнение родительского и дочернего процессов? 30. Какое адресное пространство используют родительский и дочерний процессы? 31. Что такое облегченный процесс? 32. Какие системные вызовы используются в UNIX при создании процессов? 33. Из каких основных процессов состоит дерево процессов в системе UNIX? 34. Как и в каких случаях происходит уничтожение процесса? 35. Что такое каскадное уничтожение процессов? Упражнения 1. Реализуйте представление данных о состоянии процесса и алгоритмы переключения процесса из одного состояния в другое в типовых ситуациях (диаграмму состояний процесса). 2. Реализуйте блок управления процессом и основные операции над ним. 3. Реализуйте алгоритм переключения контекста. 4. Реализуйте системные очереди и основные операции над ними. 5. Предложите и реализуйте стратегию выбора из системных очередей долговременным планировщиком процесса, который должен быть перемещен в очередь готовых процессов. 6. Предложите и реализуйте стратегию выбора кратковременным планировщиком процесса, которому должен быть в данный момент предоставлен квант процессорного времени. 7. Реализуйте алгоритм создания процесса – его PCB, стека и статической области данных. 8. Запустите систему UNIX (Linux) и исследуйте информацию, выдаваемую на терминал, о процессах, создаваемых операционной системой при ее запуске. 9. Реализуйте алгоритм уничтожения процесса. 10. Реализуйте алгоритм каскадного уничтожения процессов. Темы для курсовых работ, рефератов, эссе 1. Понятие процесса, виды процессов и его состояния (реферат). 2. Реализация системных структур ОС для управления процессами (блок управления процессом, системные очереди) и операций над ними (курсовая работа). 3. Реализация алгоритма переключения контекста (курсовая работа). 95 4. Реализация стратегий кратковременного и долговременного планировщиков ОС (курсовая работа). 5. Реализация алгоритмов создания и уничтожения процессов (курсовая работа). 6. Обзор подходов к созданию дочерних процессов и разделению ресурсов дочерним и родительским процессами в операционных системах (реферат). 96 9. Лекция: Методы взаимодействия процессов В лекции рассматриваются: взаимодействие процессов: проблема ограниченного буфера; проблема "производитель – потребитель"; прямая и косвенная связь процессов; клиентсерверная взаимосвязь; сокетная связь; удаленный вызов процедуры (RPC) и удаленный вызов метода (RMI); выстраивание параметров (marshaling). Содержание Введение Независимые и взаимодействующие процессы Виды организации взаимосвязи процессов Парадигма (шаблон) взаимодействия процессов: производитель – потребитель Коммуникация процессов Непосредственная коммуникация процессов Косвенная коммуникация процессов Буферизация и очередь сообщений Клиент-серверная взаимосвязь – один из наиболее распространенных видов коммуникации процессов Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Взаимодействие процессов – основа для распараллеленного, эффективного решения задач с помощью группы процессов, координирующих свои действия друг с другом. В лекции рассмотрены некоторые классические схемы взаимодействия процессов при решении типовых задач (например, схема производитель – потребитель), а также виды взаимодействия процессов между собой с помощью передачи сообщений, сокетов, удаленных вызовов процедур и методов. Независимые и взаимодействующие процессы С точки зрения взаимосвязи, процессы подразделяются на независимые и взаимодействующие. Независимый процесс – процесс, никак не связанный с другими процессами, который не может влиять на исполнение других процессов или испытывать их влияние. Взаимодействующий (совместный) процесс – процесс, который может влиять на исполнение других процессов или испытывать их влияние. Преимущества взаимодействующих процессов очевидны: Совместное использование данных; процессы могут работать с общими данными, при условии их синхронизации (рассматриваемой в следующих лекциях); Ускорение вычислений; Модульность: организация взаимодействующих процессов – это метод параллельного решения задачи, декомпозируемой на относительно независимые части, части, каждую из которых решает один из взаимодействующих процессов Удобство. Виды организации взаимосвязи процессов С точки зрения видов взаимосвязи родительского и дочернего процессов, процессы подразделяются на независимые, подчиненные и сопроцессы. Подчиненный процесс – процесс, зависящий от процесса-родителя. Подчиненный процесс уничтожается при уничтожении родительского процесса, как в системах UNIX и ОС "Эльбрус". Процесс-родитель перед своим завершением должен ожидать завершения всех своих подчиненных процессов. Независимый процесс – дочерний процесс, выполняемый независимо от процессародителя. Типичные примеры: процессы-демоны в UNIX, запускаемые начальным процес- 97 сом init. Например, cron – процесс-демон, организующий вызов заданных в специальной таблице crontab действий с заданной периодичностью (автоматическое резервное копирование всех файловых систем на ленту в полночь); smbd – процесс-демон, управляющий серверным программным обеспечением SAMBA для сетевого доступа с Windows-машин к файлам UNIX-машины. Сопроцесс (coprocess, coroutine) – процесс, равноправно взаимодействующий с другими такими же процессами; хранит свое текущее локальное управление (program counter); взаимодействует с другим сопроцессом Q с помощью операций resume (Q). Взаимодействие нескольких сопроцессов друг с другом операторами resume полностью равноправно. Данный механизм взаимодействия принципиально отличается от вызова процедуры. Операция detach (открепить) переводит сопроцесс в пассивное состояние, в котором могут быть доступны только его глобальные данные, но его программа уже завершена и не подлежит повторному запуску. Сопрограммное взаимодействие реализовано в языке СИМУЛА-67, который, как известно, стал родоначальником и объектно-ориентированного подхода. Классификация процессов, близкая к приведенной в данном разделе, реализована в ОС "Эльбрус". Парадигма (шаблон) взаимодействия процессов: производитель – потребитель Реализация взаимодействия процессов может быть основана на одной из классических парадигм (шаблонов), сложившейся за десятилетия развития программирования. В данном разделе рассмотрим одну из наиболее распространенных из парадигм взаимодействия процессов - производитель – потребитель: процесс-производитель (producer) генерирует в некотором буфере информацию, которая используется процессом-потребителем (consumer). При реализации данной парадигмы возможны схемы с неограниченным и ограниченным буфером, используемым для связи двух процессов. Схема с неограниченным буфером (unbounded buffer) подразумевает, что на размер используемого буфера теоретически нет ограничений. Схема с ограниченным буфером (bounded buffer) предполагается определенное ограничение размера буфера, например, константой BUFFER_SIZE. При реализации следует учесть, что схема с ограниченным буфером, с точки зрения принципов надежных и безопасных вычислений (trustworthy computing, см. "Понятие операционной системы (ОС), цели ее работы. Классификация компьютерных систем"), представляет опасность атаки "переполнение буфера"(buffer overrun) – ошибочного или преднамеренного превышения размера буфера. Чтобы избежать этой уязвимости, при заполнении буфера необходимо проверять его размер. Реализуем ограниченный буфер следующим образом. Информация хранится в массиве с двумя указателями: in - для считывания и использования очередного элемента информации процессом-потребителем и out - для записи очередного сгенерированного элемента информации процессом-производителем. При считывании из буфера очередной элемент удаляется, и указатель in, соответственно, продвигается. При записи в буфер продвигается указатель out. Для удобства будем считать буфер циклическим, т.е. при его заполнении следующим заполняемым элементом будет нулевой (если он освободился), следующим после него – первый и т.д. Таким образом, процесс-производитель должен вычислять индекс в буфере, по которому он записывает следующий элемент, по формуле (out + 1) % BUFFER_SIZE, где "%" операция взятия остатка от деления. Аналогично, процесс-потребитель должен вычислять индекс следующего элемента информации в буфере по формуле (in + 1) % BUFFER_SIZE. Учтем также две возможных ситуации: переполнение буфера (при генерации производителем числа элементов, большего длины буфера) и исчерпание буфера (в случае, если потребитель взял из буфера последний на данный момент сгенерированный элемент). Чтобы избежать обращения за границы буфера, при переполнении буфера производитель должен будет ждать, пока в буфере не освободится хотя бы один элемент, а при исчерпании буфера должен будет ждать потребитель, пока хотя бы один новый элемент не появится в буфере. Реализация представления буфера на языке Си может иметь вид: #define BUFFER_SIZE 1000 /* или другое конкретное значение */ typedef struct { 98 . . . } item; item buffer[BUFFER_SIZE]; int in = 0; int out = 0; Реализация схемы алгоритма процесса-производителя имеет вид: item nextProduced; /* следующий генерируемый элемент */ while (1) { /* бесконечный цикл */ while (((in + 1) % BUFFER_SIZE) == out) ; /* ждать, пока буфер переполнен */ buffer[in] = nextProduced; /* генерация элемента */ in = (in + 1) % BUFFER_SIZE; } Соответственно, реализация процесса-потребителя будет иметь вид: item nextConsumed; /* следующий используемый элемент */ while (1) { /* бесконечный цикл */ while (in == out) ; /* ждать, пока буфер пуст */ nextConsumed = buffer[out]; /* использование элемента */ out = (out + 1) % BUFFER_SIZE; } Данный код может быть использован как шаблон (pattern) для реализации схемы производитель – потребитель в любой системе. Коммуникация процессов Рассмотрим теперь возможные механизмы для непосредственной коммуникации процессов и синхронизации их действий. Наиболее распространенный их них - система сообщений; при этом процессы взаимодействуют между собой без обращений к общим переменным (сравните с алгоритмами производителя и потребителя раздела 9.4). Средства коммуникации между процессами обеспечивают две операции вида: send (message) – отправка сообщения message; размер сообщения может быть постоянным или переменным; receive (message) – получение сообщения в буфер message. Если процессам P и Q требуется взаимодействовать между собой, им необходимо: Установить связь (communication link) друг с другом Обменяться сообщениями вида send/receive. Реализация связи может быть физической (общая память, аппаратная шина) или логической (например, логические свойства). При реализации коммуникационного механизма между процессами необходимо решить следующие вопросы: Как устанавливается связь? Можно ли установить связь более чем двух процессов? Сколько связей может быть установлено между двумя заданными процессами? Какова пропускная способность линии связи? Является ли длина сообщения по линии связи постоянной или переменной? Является ли связь ненаправленной или двунаправленной (дуплексной)? Будем использовать данный контрольный список вопросов при анализе различных способов коммуникации процессов. Непосредственная коммуникация процессов При непосредственной коммуникации (direct communication) процессы именуют друг друга явно – по именам или по адресам (указателям), которые указываются в вызовах коммуникационных примитивов, например: 99 send (P, message) – послать сообщение процессу P; receive (Q, message) – получить сообщение от процесса Q. При данном способе коммуникации свойства линии связи, согласно контрольному списку раздела 9.5, следующие: Связь устанавливается автоматически (ее реализуют операционная система или отдельные коммуникационные инструменты). Связь ассоциируется только с одной парой взаимодействующих процессов. Между каждой парой процессов всегда только одна связь. Связь может быть ненаправленной, но, как правило, она двунаправленная (процесс может получить сообщение от другого явно заданного процесса и принять от него сообщение).. Косвенная коммуникация процессов При косвенной коммуникации (indirect communication) сообщения направляются и получаются через почтовые ящики (mailboxes), или порты (ports) – системные структуры, предназначенные для приема, хранения и передачи сообщений. Для определенности будем использовать термин почтовый ящик. Каждый почтовый ящик имеет уникальный идентификатор. Процессы могут взаимодействовать, только если они имеют общий почтовый ящик. Свойства линии связи, согласно списку раздела 9.4, в этом случае следующие: Связь устанавливается, только если процессы имеют общий почтовый ящик. Связь одного процесса может быть установлена со многими процессами (которым доступен тот же почтовый ящик). Каждая пара процессов может иметь несколько линий связи (так как сообщения могут посылаться через различные почтовые ящики). Связь может быть ненаправленной или двунаправленной. При косвенном способе коммуникации процессы используют набор операций вида: Создать новый почтовый ящик. Отправить (принять) сообщение через почтовый ящик. Удалить почтовый ящик Основные операции коммуникации принимают вид: send (A, message) – послать сообщение в почтовый ящик A. receive (A, message) – получить сообщение из почтового ящика A. Как мы видим, в данном случае не используются адреса или имена процессовкорреспондентов; вместо них задаются имена почтовых ящиков. Чтобы лучше осознать суть и особенности данного метода коммуникации, проведем следующую аналогию. Представьте себе очень привычную для Вас электронную почту, которой Вы пользуетесь каждый день. Вы имеете один или несколько почтовых ящиков (emailадресов) и можете послать через любой из них электронное письмо Вашему корреспонденту. При приеме электронной почты Вы обычно задаете режим типа "receive all" (принять все сообщения со всех адресов), т.е. устанавливаете последовательно несколько линий связи с корреспондентами. Аналогичным образом и взаимодействуют процессы при косвенном способе коммуникации. Понятны и возможные проблемы, и способы их решения в обоих случаях: например, если один адрес (почтовый ящик) не работает, можно попытаться послать сообщение через другой. Однако есть и отличия: при отправке электронной почты через некоторый почтовый ящик Вы все же явно указываете email-адрес получателя. С процессами дело обстоит иначе, из-за чего могут возникнуть проблемы. Вот возможная проблема, возникающая при использовании общего почтового ящика. Пусть процессы P1, P2, и P3 используют почтовый ящик A. P1, посылает сообщение; P2 и P3 принимают. Возникает вопрос: кто (какой из процессов) получает сообщение? Выражаясь более научно, возникает недетерминированная ситуация, что создает ненадежность и небезопасность. Как решить данную проблему? Вот возможные решения: Ограничить связь только двумя процессами; Разрешить только одному процессу в каждый момент исполнять операцию получения; 100 Разрешить системе произвольным образом определить получателя; Отправитель нотифицируется, кто является получателем. Очевидно, что каждое из решений имеет свои достоинства и недостатки. При косвенной связи процессов может оказаться необходимой синхронизация. Дело в том, что передача сообщений может выполняться с блокировкой (синхронно) или без блокировки (асинхронно). Соответственно, основные операции send и receive могут быть с блокировкой или без блокировки. Буферизация и очередь сообщений С коммуникационной линией связывается очередь сообщений, реализованная одним из трех возможных способов: 1. Нулевая емкость очереди сообщений означает, что сообщения не могут храниться в очереди. Поэтому при использовании данного способа отправитель должен ждать получателя. Такая схема коммуникации называется рандеву (rendezvous) и используется, например, в языке Ада. 2. Ограниченная емкость очереди сообщений – конечная длина очереди, в которой может храниться максимум n сообщений. Данный способ является общеупотребительным, однако в данном случае, как уже отмечалось, необходимо предотвратить опасность атаки "buffer overrun", т.е. в любой операции проверять длину буфера (очереди). Отправитель должен ждать, если очередь заполнена. 3. Неограниченная емкость очереди сообщений – (теоретически) она имеет бесконечную длину. В данном случае получатель никогда не ждет. Клиент-серверная взаимосвязь – один из наиболее распространенных видов коммуникации процессов Используются, в частности, следующие ее разновидности, которые мы и рассмотрим: Сокеты (Sockets) Удаленные вызовы процедур (Remote Procedure Calls – RPC) Удаленные вызовы методов (Remote Method Invocation – RMI). Сокеты – наиболее распространенный способ связи клиента и сервера в сети. Впервые они были реализованы в UNIX BSD 4.2. Сокет можно определить как отправную (конечную) точку для коммуникации - endpoint for communication. Сокет создается клиентом для взаимодействия с сервером. Сокет связан с определенным номером порта, через который клиент и сервер обмениваются информацией, используя числовой или символьный последовательный поток. Сервер, со своей стороны, прослушивает порт с заданным номером и создает для этого серверный сокет. По сути дела, сокет можно представлять как конкатенацию IP-адреса и порта. Например, сокет 161.25.19.8:1625 ссылается на порт 1625 на машине (хосте) 161.25.19.8. Коммуникация осуществляется между парой сокетов – клиентским и серверным. Она изображена на рис. 9.1. Удаленные вызовы процедур (Remote Procedure Calls – RPC) впервые предложены фирмой Sun и реализованы в ОС Solaris. Удаленный вызов процедуры (RPC) – абстракция вызова процедуры между процессами в сетевых системах. Он основан на следующей идее. В клиентской части создаются заглушка (proxy, stub) – локальная процедура, осуществляющая связь с фактической процедурой, находящейся на сервере. Заглушка в клиентской части находит сервер и выстраивает (marshals) параметры для их передачи на сервер по сети. Проблема здесь в том, что адресация на клиенте и на сервере различная, и передавать адрес в памяти каких-либо данных с одного хоста на другой не имеет смысла. Поэтому приходится использовать особую форму передачи информации в виде последовательного потока байтов. Заглушка в серверной части принимает сообщение, распаковывает параметры, преобразует их к нормальному виду и выполняет процедуру на сервере. Схема организации удаленного вызова процедуры изображена на рис. 9.2. 101 Рис. 9.1. Взаимодействие с помощью сокетов. Рис. 9.2. Исполнение RPC. 102 Удаленный вызов метода (Remote Method Invocation, RMI) – механизм в Javaтехнологии, аналогичный RPC, но в объектно-ориентированной форме. RMI позволяет Java-приложению на одной машине вызвать метод удаленного объекта. Схема RMI изображена на рис. 9.3. Рис. 9.3. Удаленный вызов метода в Java. Схема выстраивания параметров и результатов при удаленных вызовах изображена на рис. 9.4. Рис. 9.4. Выстраивание параметров при удаленном вызове. Ключевые термины Send – операция отправки сообщения другому процессу. Receive – операция получения сообщения от другого процесса. Взаимодействующий (совместный) процесс – процесс, который может влиять на исполнение других процессов или испытывать их влияние. 103 Выстраивание (marshaling) – механизм преобразования параметров удаленной процедуры (метода) для их передаче по сети в виде последовательного потока. Косвенная коммуникация (indirect communication) – способ взаимодействия процессов с помощью сообщений, при котором сообщения направляются и получаются через почтовые ящики, или порты. Независимый процесс – процесс, никак не связанный с другими процессами, который не может влиять на исполнение других процессов или испытывать их влияние. Непосредственная коммуникация (direct communication) – способ взаимодействия процессов с помощью сообщений, при котором они именуют друг друга явно – по именам или по адресам (указателям), которые указываются в вызовах коммуникационных примитивов. Очередь сообщений (message queue) – системная структура (буфер) для хранения сообщений между процессами. Переполнение буфера (buffer overrun) – ошибочное или преднамеренное превышения размера буфера, которое может привести к обращению в чужую область памяти и используется для внешних атак. Подчиненный процесс – процесс, зависящий от процесса-родителя; уничтожается при уничтожении родительского процесса; процесс-родитель перед своим завершением должен ожидать завершения всех своих подчиненных процессов. Почтовый ящик (порт) – системная структура, предназначенные для приема, хранения и передачи сообщений. Производитель – потребитель (producer – consumer) - парадигма взаимодействия процессов, при которой процесс-производитель (producer) генерирует в некотором буфере информацию, которая используется процессом-потребителем (consumer). Рандеву (rendezvous) – механизм коммуникации процессов, при котором оба процесса приостанавливаются до момента окончания передачи сообщения. Сокет (socket) – метод клиент-серверного сетевого взаимодействия процессов, при котором информация передается через последовательный поток через порт с определенным номером. Сопроцесс (coprocess, coroutine) – процесс, равноправно взаимодействующий с другими такими же процессами по управлению с помощью операций типа resume (Q), возобновляющих приостановленный процесс. Переходит в завершенное состояние операцией detach. Удаленный вызов метода (Remote Method Invocation – RMI) – разработанный фирмой Sun объектно-ориентированный механизм Java-технологии для вызова метода Java на другом компьютере сети, аналогичный удаленному вызову процедуры. Удаленный вызов процедуры (Remote Procedure Call – RPC) – разработанный фирмой Sun механизм вызова процедуры на другом компьютере локальной сети с использованием процедур-заглушек на клиенте и на сервере, передающих информацию и выстраивающих параметры и результат удаленной процедуры. Краткие итоги Процессы могут быть независимыми друг от друга и взаимодействующими. Преимущества взаимодействующих процессов – совместное использование данных, модульность, ускорение вычислений. Дочерний процесс по отношению к процессу-родителю может быть подчиненным (зависящим от родителя), независимым, либо сопроцессом. Сопроцессы – равноправная группа процессов, взаимодействующая между собой операторами явного переключения управления. Парадигма производитель – потребитель – классическая схема взаимодействия процессов: производитель генерирует информационные элементы в буфере, а потребитель использует их и удаляет из буфера. Буфер может быть неограниченным или иметь ограниченную длину. 104 Коммуникация процессов может осуществляться с помощью сообщений. Коммуникация бывает непосредственная (с явным указанием адресов или имен процессов-адресатов) и косвенная (через почтовые ящики). При анализе коммуникации процессов весьма важны способ установления связи, число связей между двумя процессами, пропускная способность линии связи, длина сообщений, ненаправленный или двунаправленный (дуплексный) характер связи. При косвенной связи могут возникнуть проблемы с недетерминизмом при получении сообщений, если несколько процессов используют общий почтовый ящик. При коммуникации передача сообщений может быть синхронной (с блокировкой) или асинхронной (без блокировки). С коммуникационной линией связывается очередь сообщений, которая может иметь нулевую длину (процессы взаимодействуют через механизм рандеву), ограниченную или теоретически неограниченную длину. Основные виды клиент-серверной коммуникации процессов – сокеты, удаленные вызовы процедур и методов. Сокеты, предназначены для взаимодействия между клиентом и сервером в сетях TCP/IP через порт с определенным номером, при котором информация передается через последовательные потоки. Удаленный вызов процедуры позволяет вызвать процедуру на другом компьютере локальной сети с использованием процедур-заглушек. осуществляющих выстраивание и передачу параметров и результатов. Удаленный вызов метода – объектно-ориентированный механизм Java-технологии, аналогичный удаленному вызову процедуры. Набор для практики Вопросы 1. Что такое независимый процесс? 2. Что такое взаимодействующие процессы? 3. В чем преимущества взаимодействующих процессов перед независимыми? 4. Что такое подчиненный процесс? 5. Что такое сопроцессы (сопрограммы) и какими операциями они взаимодействуют? 6. В чем суть парадигмы производитель – потребитель? 7. Какие действия выполняет процесс-производитель? 8. Какие действия выполняет процесс-потребитель? 9. Какие проблемы могут возникнуть при использовании буфера ограниченной длины? 10. Каким образом осуществляется коммуникация процессов? 11. Что такое непосредственная и косвенная коммуникация? 12. Какими операциями осуществляется коммуникация? 13. Какие вопросы анализируются при анализе реализации коммуникационной линии между процессами? 14. Как осуществляется непосредственная коммуникация процессов? 15. Как осуществляется косвенная коммуникация процессов? 16. Что такое почтовый ящик и как он используется при коммуникации процессов? 17. В чем особенности синхронной и асинхронной передачи сообщений? 18. Что такое очередь сообщений и какие ее разновидности используются? 19. Что такое рандеву процессов? 20. Какие Вы знаете способы клиент-серверной коммуникации процессов? 21. Что такое сокет и как осуществляется сокетная коммуникация процессов? 22. Что такое удаленный вызов процедуры и как он осуществляется? 23. Что такое удаленный вызов метода? 24. Что такое заглушка (proxy) и как она используется при удаленном вызове процедуры? 25. Что такое выстраивание параметров при удаленном вызове процедуры? Упражнения 1. Реализуйте модель механизма сопроцессов с операциями resume / detach. 2. Реализуйте парадигму производитель – потребитель. 105 3. Реализуйте набор операций непосредственной коммуникации процессов. 4. Реализуйте набор операций косвенной коммуникации процессов. 5. Предложите и реализуйте детерминированную модель косвенной коммуникации процессов с использованием общего почтового ящика. 6. Реализуйте очередь сообщений неограниченной длины и ограниченной длины и операции над ней. 7. Реализуйте механизм рандеву процессов. 8. Реализуйте модель сокетной взаимосвязи. 9. Проанализируйте работу удаленного вызова процедур в системе Linux или Solaris на простом примере и опишите свои выводы. 10. Проанализируйте работу удаленного вызова методов в Java на простом примере и опишите свои выводы. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. 6. 7. 8. 9. Обзор механизмов взаимодействия процессов (реферат). Сопроцессы (сопрограммы) в различных системах и их взаимодействие (реферат). Парадигма производитель – потребитель (реферат). Методы коммуникации процессов с помощью сообщений (реферат). Организация очередей сообщений в операционных системах (реферат). Механизм сокетов, его реализации и использование (реферат). Удаленный вызов процедуры, его реализация и использование (реферат). Удаленный вызов метода, его реализация и использование (реферат). Реализация модели механизма сопроцессов с операциями resume / detach (курсовая работа). 10. Реализаций парадигма производитель – потребитель (курсовая работа). 11. Реализация набора операций непосредственной коммуникации процессов. (курсовая работа) 12. Реализация набора операций косвенной коммуникации процессов (курсовая работа). 13. Разработка и реализация детерминированной модели косвенной коммуникации процессов с использованием общего почтового ящика (курсовая работа). 14. Реализация очередь сообщений неограниченной длины и ограниченной длины и операций над ней (курсовая работа). 15. Реализация механизма рандеву процессов (курсовая работа). 16. Реализация модели сокетной взаимосвязи (курсовая работа). 106 10. Лекция: Потоки (threads) и многопоточное выполнение программ (multi-threading) В лекции рассматриваются понятие потока (thread) и многопоточное выполнение (multithreading); модели многопоточности; пользовательские потоки и потоки ядра; потоки в "Эльбрусе", Solaris, Linux, POSIX, Windows 2000, Java. Содержание Введение Однопоточные и многопоточные процессы История многопоточности Пользовательские потоки и потоки ядра Проблемы многопоточности Потоки POSIX (Pthreads) Потоки и процессы в Solaris Потоки в Windows 2000 Потоки в Linux Потоки в Java Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Многопоточность (multi-threading) – одна из наиболее интересных и актуальных тем в данном курсе и, по-видимому, в области ИТ вообще, и, кроме того, одна из излюбленных тем автора. Актуальность данной темы особенно велика, в связи с широким распространением многоядерных процессоров. В лекции рассмотрены следующие вопросы: Исторический обзор многопоточности Модели многопоточного исполнения Проблемы, связанные с потоками Потоки в POSIX (Pthreads) Потоки в Solaris 2 Потоки в Windows 2000/XP Потоки в Linux Потоки в Java и .NET. Однопоточные и многопоточные процессы К сожалению, до сих пор мышление многих программистов при разработке программ остается чисто последовательным. Не учитываются широкие возможности параллелизма, в частности, многопоточности. Последовательный (однопоточный) процесс – это процесс, который имеет только один поток управления (control flow), характеризующийся изменением его счетчика команд. Поток (thread) – это запускаемый из некоторого процесса особого рода параллельный процесс, выполняемый в том же адресном пространстве, что и процессродитель. Схема организации однопоточного и многопоточного процессов изображена на рис. 10.1. Как видно из схемы, однопоточный процесс использует, как обычно, код, данные в основной памяти и файлы, с которыми он работает. Процесс также использует определенные значения регистров и стек, на котором исполняются его процедуры. Многопоточный процесс организован несколько сложнее. Он имеет несколько параллельных потоков, для каждого из которых ОС создает свой стек и хранит свои собственные значения регистров. Потоки работают в общей основной памяти и используют то же адресное пространство, что и процессродитель, а также разделяют код процесса и файлы. 107 Рис. 10.1. Однопоточный и многопоточный процессы. Многопоточность имеет большие преимущества: Увеличение скорости (по сравнению с использованием обычных процессов). Многопоточность основана на использовании облегченных процессов (lightweight processes), работающих в общем пространстве виртуальной памяти. Благодаря многопоточности, не возникает больше неэффективных ситуаций, типичных для классической системе UNIX, в которой каждая команда shell (даже команда вывода содержимого текущей директории ls исполнялась как отдельный процесс, причем в своем собственном адресном пространстве. В противоположность облегченным процессам, обычные процессы (имеющие собственное адресное пространство) часть называют тяжеловесными (heavyweight). Использование общих ресурсов. Потоки одного процесса используют общую память и файлы. Экономия. Благодаря многопоточности, достигается значительная экономия памяти, по причинам, объясненным выше. Также достигается и экономия времени, так как переключение контекста на облегченный процесс, для которого требуется только сменить стек и восстановить значения регистров, значительно быстрее, чем на обычный процесс (см. "Методы взаимодействия процессов "). Использование мультипроцессорных архитектур. Это особенно важно в настоящее время, в период широкого использования многоядерных гибридных и многопроцессорных систем. Именно многопоточность программ, основанная на многоядерности процессора, дает возможность, наконец, почувствовать реальные преимущества параллельного выполнения. История многопоточности Как небезынтересно отметить, один из первых шагов на пути к широкому использованию многопоточности, по-видимому, был сделан в 1970-е годы советскими разработчиками компьютерной аппаратуры и программистами. МВК "Эльбрус-1", разработанный в 1979 году, поддерживал в аппаратуре и операционной системе эффективную концепцию процесса, которая была близка к современному понятию облегченного процесса. В частности, процесс в "Эльбрусе" однозначно характеризовался своим стеком. Иначе говоря, все процессы были облегченными и исполнялись в общем пространстве виртуальной памяти – других процессов в "Эльбрусе" просто не было! 108 Концепция многопоточности начала складываться, по-видимому, с 1980-х гг. в системе UNIX и ее диалектах. Наиболее развита многопоточность была в диалекте UNIX фирмы AT&T, на основе которого, как уже отмечалось в общем историческом обзоре, была разработана система Solaris. Все это отразилось и в стандарте POSIX, в который вошла и многопоточность, наряду с другими базовыми возможностями UNIX. Далее, в середине 1990-х гг. была выпущена ОС Windows NT, в которую была также включена многопоточность. Однако в разных операционных системах API для многопоточности существенно отличались. Поэтому многопоточные программы, даже написанные на языках высокого уровня, оказались не переносимыми с одной платформы на другую, что, разумеется, создавало большие неудобства. По-видимому, именно по причине различий в спецификациях и реализациях многопоточности в различных системах профессор Бьярн Страуструп не включил многопоточность в созданный им язык C++, ставший столь популярным, и его базовый набор библиотек. Программисты на языке C++ были вынуждены по-прежнему использовать многопоточность на уровне системных вызовов и библиотек конкретных операционных систем. Важный шаг вперед сделали авторы языка Java и Java-технологии, первая версия реализации которых была выпущена в 1995 г. Именно в Java впервые многопоточность была реализована на уровне конструкций языка и базовых библиотек. В частности, в Java введен класс Thread, представляющий поток, и операции над ним в виде специальных методов и конструкций языка. Платформа .NET, появившаяся в 2000 г., предложила свой механизм многопоточности, который фактически является развитием идей Java. Различие подходов к многопоточности в разных ОС и на разных платформах разработки программ сохраняется и до настоящего времени, что приходится постоянно учитывать разработчикам. Для прикладных программ мы рекомендуем реализовывать многопоточность на платформе Java или .NET, что наиболее удобно и позволяет использовать высокоуровневые понятия и конструкции. Однако в нашем курсе, посвященном операционным системам, мы, естественно, больше внимания уделяем системным вопросам многопоточности и ее реализации в операционных системах. Пользовательские потоки и потоки ядра Модели многопоточности. Реализация многопоточности в ОС, как и многих других возможностей, имеет несколько уровней абстракции. Самый высокий из них – пользовательский уровень. С точки зрения пользователя и его программ, управление потоками реализовано через библиотеку потоков пользовательского уровня (user threads). Подробнее конкретные операции над пользовательскими потоками будут рассмотрены немного позже. Пока отметим лишь, что существует несколько моделей потоков пользовательского уровня, среди которых: POSIX Pthreads – потоки, специфицированные стандартом POSIX и используемые в POSIX-приложениях (рассмотрены позже в данной лекции); Mac C-threads – пользовательские потоки в системе MacOS; Solaris threads – пользовательские потоки в ОС Solaris (рассмотрены позже в данной лекции). Низкоуровневые потоки, в которые отображаются пользовательские потоки, называются потоками ядра (kernel threads). Они поддержаны и используются на уровне ядра операционной системы. Как и подходы к пользовательским потокам, подходы к архитектуре и реализации системных потоков и к отображению пользовательских потоков в системные в разных ОС различны .Например, собственные модели потоков ядра со своей спецификой реализованы в следующих ОС: Windows 95/98/NT/2000/XP/2003/2008/7; Solaris; Tru64 UNIX; BeOS; Linux. 109 Существуют различные модели многопоточности – способы отображения пользовательских потоков в потоки ядра. Теоретически возможны (и на практике реализованы) следующие модели многопоточности: - Модель много / один (many-to-one) – отображение нескольких пользовательских потоков в один и тот же поток ядра. Используется в операционных системах, не поддерживающих множественные системные потоки (например, с целью экономии памяти). Данная модель изображена на рис. 10.2. Рис. 10.2. Схема модели многопоточности "много / один". - Модель один / один (one-to-one) – взаимно-однозначное отображение каждого пользовательского потока в определенный поток ядра. Примеры ОС, использующих данную модель, - Windows 95/98/NT/2000/XP/2003/2008/7; OS/2. Данная модель изображена на рис. 10.3. Рис. 10.3. Схема модели многопоточности "один / один". 110 - Модель много / много (many-to-many) – модель, допускающая отображение нескольких пользовательских потоков в несколько системных потоков. Такая модель позволяет ОС создавать большое число системных потоков. Характерным примером ОС, использующей подобную модель, является ОС Solaris, а также Windows NT / 2000 / XP / 2003 / 2008 / 7 с пакетом ThreadFiber. Данная модель изображена на рис. 10.4. Рис. 10.4. Схема модели многопоточности "много / много". Проблемы многопоточности Многопоточность – весьма сложная, еще не полностью изученная и, тем более, не полностью формализованная область, в которой имеется много интересных проблем. Рассмотрим некоторые из них. Семантика системных вызовов fork() и exec(). Как уже отмечалось, в классической ОС UNIX системный вызов fork создает новый "тяжеловесный" процесс со своим адресным пространством, что значительно "дороже", чем создание потока. Однако, с целью поддержания совместимости программ снизу вверх, приходится сохранять эту семантику, а многопоточность вводить с помощью новых системных вызовов. Прекращение потоков. Важной проблемой является проблема прекращения потоков: например, если родительский поток прекращается, то должен ли при этом прекращаться дочерний поток? Если прекращается стандартный процесс, создавший несколько потоков, то должны ли прекращаться все его потоки? Ответы на эти вопросы в разных ОС неоднозначны. Обработка сигналов. Сигналы в UNIX – низкоуровневый механизм обработки ошибочных ситуаций. Примеры сигналов: SIGSEGV - нарушение сегментации (обращение по неверному адресу, чаще всего по нулевому); SIGKILL – сигнал процессу о выполнении команды kill его уничтожения. Пользователь может определить свою процедуру-обработчик сигнала системным вызовом signal. Проблема в следующем: как распространяются сигналы в многопоточных программах и каким потоком они должны обрабатываться? В большинстве случаев этот вопрос решается следующим образом: сигнал обрабатывается потоком, в котором он сгенерирован, и влияет на исполнение только этого потока. В более современных ОС (например, Windows 2000 и более поздних версиях Windows), основанных на объектноориентированной методологии, концепция сигнала заменена более высокоуровневой концепцией исключения (exception). Исключение распространяется по стеку потока в порядке, обратном порядку вызовов методов, и обрабатывается первым из них, в котором система 111 находит подходящий обработчик. Аналогичная схема обработки исключений реализована в Java и в .NET. Группы потоков. В сложных задачах, например, задачах моделирования, при числе разнородных потоков, возникает потребность в их структурировании и помощью концепции группы потоков – совокупности потоков, имеющей свое собственное имя, над потоками которой определены групповые операции. Наиболее удачно, с нашей точки зрения, группы потоков реализованы в Java (с помощью класса ThreadGroup). Следует отметить также эффективную реализацию пулов потоков (ThreadPool) в .NET. Локальные данные потока (thread-local storage - TLS) – данные, принадлежащие только определенному потоку и используемые только этим потоком. Необходимость в таких данных очевидна, так как многопоточность – весьма важный метод распараллеливания решения большой задачи, при котором каждый поток работает над решением порученной ему части. Все современные операционные системы и платформы разработки программ поддерживают концепцию локальных данных потока. Синхронизация потоков. Поскольку потоки, как и процессы (см. "Методы взаимодействия процессов ") могут использовать общие ресурсы и реагировать на общие события, необходимы средства их синхронизации. Эти средства подробно рассмотрены позже в данном курсе. Тупики (deadlocks) и их предотвращение. Как и процессы (см. "Методы взаимодействия процессов "), потоки могут взаимно блокировать друг друга (т.е. может создаться ситуация deadlock), при их неаккуратном программировании. Меры по борьбе с тупиками подробно рассмотрены позже в данном курсе. Потоки POSIX (Pthreads) В качестве конкретной модели многопоточности рассмотрим потоки POSIX (напомним, что данная аббревиатура расшифровывается как Portable Operating Systems Interface of uniX kind – стандарты для переносимых ОС типа UNIX). Многопоточность в POSIX специфицирована стандартом IEEE 1003.1c, который описывает API для создания и синхронизации потоков. Отметим, что POSIX-стандарт API определяет лишь требуемое поведение библиотеки потоков. Реализация потоков оставляется на усмотрение авторов конкретной POSIXсовместимой библиотеки. POSIX-потоки распространены в ОС типа UNIX, а также поддержаны, с целью совместимости программ, во многих других ОС, например, Solaris и Windows NT. Стандарт POSIX определяет два основных типа данных для потоков: pthread_t – дескриптор потока; pthread_attr_t – набор атрибутов потока. Стандарт POSIX специфицирует следующий набор функций для управления потоками: pthread_create(): создание потока pthread_exit(): завершение потока (должна вызываться функцией потока при завершении) pthread_cancel(): отмена потока pthread_join(): заблокировать выполнение потока до прекращения другого потока, указанного в вызове функции pthread_detach(): освободить ресурсы занимаемые потоком (если поток выполняется, то освобождение ресурсов произойдёт после его завершения) pthread_attr_init(): инициализировать структуру атрибутов потока pthread_attr_setdetachstate(): указать системе, что после завершения потока она может автоматически освободить ресурсы, занимаемые потоком pthread_attr_destroy(): освободить память от структуры атрибутов потока (уничтожить дескриптор). Имеются следующие примитивы синхронизации POSIX-потоков с помощью мюьтексов (mutexes) – аналогов семафоров – и условных переменных (conditional variables) – оба эти типа объектов для синхронизации подробно рассмотрены позже в данном курсе: - pthread_mutex_init() – создание мюьтекса; - pthread_mutex_destroy() – уничтожение мьютекса; - pthread_mutex_lock() – закрытие мьютекса; - pthread_mutex_trylock() – пробное закрытие мьютекса (если он уже закрыт, вызов игнорируется, и поток не блокируется); 112 - pthread_mutex_unlock() – открытие мьютекса; pthread_cond_init() – создание условной переменной; pthread_cond_signal() – разблокировка условной переменной; pthread_cond_wait() – ожидание по условной переменной. Рассмотрим пример использования POSIX-потоков на языке Си. #include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> static void wait_thread(void) { time_t start_time = time(NULL); while (time(NULL) == start_time) { // никаких действий, кроме занятия процессора на время до 1 с. } } static void *thread_func(void *vptr_args) { int i; for (i = 0; i < 20; i++) { fputs(" b\n", stderr); wait_thread(); } return NULL; } int main(void) { int i; pthread_t thread; if (pthread_create(&thread, NULL, thread_func, NULL) != 0) { return EXIT_FAILURE; } for (i = 0; i < 20; i++) { puts("a"); wait_thread(); } if (pthread_join(thread, NULL) != 0) { return EXIT_FAILURE; } return EXIT_SUCCESS; } Пример иллюстрирует параллельное выполнение основного потока, выдающего в стандартный вывод последовательность букв "a", и дочернего потока, выдающего в стандартный поток ошибок (stderr) последовательность букв "b". Обратите внимание на особенности создания потока (pthread_create), указания его тела (исполняемой процедуры потока thread_func) и ожидания завершения дочернего потока (pthread_join). Потоки и процессы в Solaris В ОС Solaris, как уже было отмечено, используется модель потоков много / много. Кроме того, в системе используется также уже известное нам понятие облегченный процесс (lightweight process промежуточное между концепцией пользовательского потока и системного потока. Таким образом, в ОС Solaris каждый пользовательский поток отображается в свой облегченный процесс, который, в свою очередь, отображается в поток ядра; последний может исполняться на любом процессоре (или ядре процессора) компьютерной системы. Схема организации потоков в Solaris изображена на рис. 10.5. На рис. 10.6 изображена схема организации процесса в ОС Solaris. На схеме видно, что каждый процесс содержит, кроме стандартной информации блока управления процессом, также список всех своих облегченных процессов для управления ими. 113 Рис. 10.5. Потоки в Solaris. Рис. 10.6. Процессы в Solaris. Потоки в Windows 2000 Как уже отмечалось, в системе Windows реализована модель многопоточности "один / один". Каждый поток содержит: идентификатор потока (thread id); набор регистров отдельные стеки для пользовательских и системных процедур; область памяти для локальных данных потока (thread-local storage – TLS). Потоки в Linux В системе Linux потоки называются tasks (задачами), а не threads. Поток создается системным вызовом clone (). Данный системный вызов позволяет дочерней задаче использовать общее адресное пространство с родительской задачей (процессом). 114 Потоки в Java Как уже отмечалось, Java – первая платформа для разработки программ, в которой многопоточность поддержана на уровне языка и базовых библиотек. Потоки в Java могут быть созданы следующими способами: Как расширения класса Thread Как классы, реализующие интерфейс Runnable, который содержит единственный метод run – исполняемое тело потока. Потоки в Java управляются JVM. Возможно создание групп потоков и иерархии таких групп. Возможные состояния потоков в Java изображены на рис. 10.7. Подобно потокам в ОС, поток в Java создается и находится в состоянии новый, затем – выполняемый; при вызове методов типа wait, sleep и др. поток переходит в состояние ожидания; при завершении метода run поток завершается. Рис. 10.7. Состояния потоков в Java. Ключевые термины Mac C-threads – пользовательские потоки в системе MacOS. POSIX Pthreads – потоки, специфицированные стандартом POSIX и используемые в POSIX-приложениях. Solaris threads – пользовательские потоки в ОС Solaris. Thread – класс, представляющий поток, в языке Java. Атрибуты потока pthread_attr_t. – совокупность атрибутов POSIX-потока, описываемая типом Группа потоков (thread group) – совокупность потоков, имеющей свое собственное имя, над потоками которой определены групповые операции. Дескриптор потока – ссылка на POSIX-поток, описываемая типом pthread_t. Задача (task) – название потока в Linux. Исключение (exception) – высокоуровневый механизм обработки ошибочных ситуаций в объектно-ориентированных языках и операционных системах. Локальные данные потока (thread-local storage - TLS) – данные, принадлежащие только определенному потоку и используемые только этим потоком. Модель многопоточности – способ отображения пользовательских потоков в потоки ядра. Модель много / много - модель многопоточности, при которой различные пользовательские потоки могут быть отображены в различные потоки ядра. Модель много / один - модель многопоточности, при которой несколько пользовательских потоков могут быть отображены в один поток ядра. 115 Модель один / один – модель многопоточности, при которой каждый пользовательский поток отображается в один определенный поток ядра. Мьютекс (mutex) – аналог семафоров, обеспечивающий взаимное исключение, используемый в операционных системах. Облегченный процесс (lightweight process) – процесс, работающий в общем пространстве виртуальной памяти с процессом-родителем. Поток (thread) – запускаемый из какого-либо процесса более эффективный вариант параллельного процесса, выполняемый в том же адресном пространстве, что и процессродитель. Поток пользовательского уровня (user thread) - высокоуровневый поток, операции над которым включены в интерфейс пользователя ОС. Поток ядра (kernel thread) - низкоуровневый системный поток, поддержанный и использующийся на уровне ядра операционной системы; используется для реализации потоков пользовательского уровня. Пул потоков (ThreadPool) – эффективный механизм структурирования потоков в группы в .NET. Сигналы (в UNIX) – низкоуровневый механизм обработки ошибочных ситуаций. "Тяжеловесный" (heavyweight) процесс – название классического процесса, работающего в собственном адресном пространстве, в противоположность облегченному процессу. Условная переменная (conditional variable) - синхронизирующий объект, используемый в операционных системах, с операциями wait и signal. Краткие итоги Многопоточность (multi-threading) – современное направление программирования, особенно актуальное в связи с широким распространением параллельных компьютерных архитектур. Поток – особый вид процесса, выполняемый в общем адресном пространстве с процессом-родителем. Поток характеризуется своим стеком, потоком управления и значениями регистров. Облегченный процесс (lightweight process) – механизм, с помощью которого реализуются потоки в ОС. Впервые понятие процесса, близкое современной концепции потока, было реализовано в системе "Эльбрус" в конце 1970-х гг. Многопоточность появилась в UNIX, затем – в Solaris и Windows NT. В различных ОС архитектуры библиотек поддержки многопоточности различаются. В Java-технологии, а вслед за ней – в .NET, впервые многопоточность была реализована на уровне языка и базовых библиотек. Архитектура потоков – многоуровневая: потоки пользовательского уровня реализуются с помощью системных потоков (потоков ядра). Существуют различные модели многопоточности (способы отображения пользовательских потоков в системные) – один-один, один-много, много-один. Многопоточность ставит ряд интересных проблем: семантика системных вызовов fork и exec; прекращение потоков; обработка сигналов; структуризация потоков в группы; поддержка локальных данных потока (TLS); синхронизация потоков; тупики (взаимная блокировка потоков) и их предотвращение. POSIX threads (Pthreads) - стандартизация API для поддержки многопоточности для операционных систем типа UNIX. Поток характеризуется своим дескриптором и атрибутами. Для синхронизации потоков используются мьютексы и условные переменные. Потоки в ОС Solaris отличаются тем, что явно присутствует понятие облегченного процесса, наряду с понятиями пользовательского и системного потоков. Каждый традиционный процесс хранит список созданных в нем облегченных процессов Используется модель многопоточности "много-много". В Windows 2000 используется модель многопоточности "один-один". Каждый поток содержит свой номер, набор регистров, отдельные стеки для пользовательских и системных процедур, локальную память потока (TLS). 116 В Linux потоки называются задачами (tasks) и создаются системным вызовом clone. Потоки в Java поддержаны на уровне языка и базовых библиотек. Представляются объектами класса Thread и его подклассов. Управляются виртуальной машиной Java. Возможно создание групп потоков. Состояния потоков аналогичны используемым в ОС. Набор для практики Вопросы 1. 2. 3. 4. Что такое поток? Чем отличаются однопоточные и многопоточные процессы? В чем преимущества многопоточности? В какой системе впервые было реализовано понятие процесса, близкое современному понятию потока? 5. В какой ОС многопоточность впервые появилась "официально"? 6. На какой платформе разработки программ многопоточность впервые была реализована на уровне языка и базовых библиотек? 7. Что такое пользовательские потоки? 8. Что такое системные потоки и чем они отличаются от пользовательских? 9. Какие существуют модели многопоточности? 10. В чем суть модели много/много? 11. В чем суть модели много/один? 12. В чем суть модели один/один? 13. Каковы проблемы многопоточности? 14. Что такое сигнал и как он обрабатывается в многопоточной программе? 15. Что такое исключение и как оно обрабатывается в многопоточной программе? 16. Что такое группа потоков? 17. Что такое пул потоков? 18. Что такое локальная память (данные) потока? 19. Что такое Pthread? 20. Какими типами данных описывается поток в POSIX? 21. Какие средства синхронизации потоков используются в POSIX? 22. В чем отличие потоков в Solaris от потоков в других системах? 23. Что такое облегченный процесс? 24. В чем отличие потоков в Windows 2000? 25. В чем отличие потоков в Linux? 26. Как представляются потоки в Java, каковы операции над ними и состояния потоков? Упражнения 1. 2. 3. 4. 5. Проанализируйте и опишите преимущества, недостатки и проблемы многопоточности. Реализуйте модель многопоточности один/один. Реализуйте модель многопоточности много/один. Реализуйте модель многопоточности много/много. Напишите на Си программу параллельного умножения матриц с использованием POSIX-потоков. 6. Напишите на Си программу параллельного умножения матриц с использованием потоков Solaris. 7. Напишите на Java программу параллельного умножения матриц с использованием Java-потоков. Темы для курсовых работ, рефератов, эссе 1. История концепции потока и многопоточности в операционных системах и языках программирования (реферат). 2. Обзор многопоточности в UNIX, Linux, Solaris (реферат). 3. Обзор многопоточности в POSIX (реферат). 4. Обзор многопоточности в MacOS (реферат). 5. Обзор многопоточности в Java (реферат). 6. Обзор многопоточности в .NET (реферат). 7. Обзор многопоточности в Windows 2000 / XP / 2003 / 2008 / 7. 8. Разработка на Си программы параллельного умножения матриц с использованием POSIX-потоков. 117 9. Разработка на Си программы параллельного умножения матриц с использованием потоков Solaris. 10. Разработка на Java программы параллельного умножения матриц с использованием Java-потоков. 118 11. Лекция: Стратегии и критерии диспетчеризации процессов В лекции рассмотрены: планирование и диспетчеризация процессора; критерии диспетчеризации; стратегии диспетчеризации (FCFS, SJF, RR); многоуровневые очереди, диспетчеризация мультипроцессорных систем и систем реального времени. Содержание Введение Основные понятия диспетчеризации процессов Планировщик процессора Собственно диспетчер процессора Критерии диспетчеризации Стратегия First-Come-First-Served (FCFS) Стратегия Shortest Job First (SJF) Предсказание длины следующего периода активности Диспетчеризация по приоритетам Стратегия Round Robin (RR) Многоуровневая очередь Многоуровневые аналитические очереди Планирование загрузки многопроцессорных систем Планирование загрузки процессоров в системах реального времени Планирование в Solaris Планирование в Windows 2000 Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Планирование и диспетчеризация процессора – одна из важнейших функций операционной системы. В лекции рассмотрены следующие вопросы: Основные понятия диспетчеризации процессов Критерии диспетчеризации Алгоритмы диспетчеризации Диспетчеризация нескольких процессоров Диспетчеризация в реальном времени Многоуровневые очереди. Основные понятия диспетчеризации процессов Диспетчеризация процессора – распределение его времени между процессами в системе. Цель диспетчеризации – максимальная загрузка процессора, достигаемая с помощью мультипрограммирования. Исполнение любого процесса можно рассматривать как цикл CPU / I-O – чередование периодов использования процессора и ожидания ввода-вывода. Распределение периодов активности процессора (bursts) и ввода-вывода изображено на рис. 11.1. На рис. 11.2 изображена примерная гистограмма периодов активности процессора, основанная на анализе реального поведения процессов в операционных системах. Из схемы видно, что чем короче период активности, тем выше частота таких периодов, и наоборот, т.е. частота периодов активности обратно пропорциональна их длительности. Планировщик процессора Планировщик – компонента ОС, которая выбирает один из нескольких процессов, загруженных в память и готовых к выполнению, и выделяет процессор для одного из них. 119 Рис. 11.1. Последовательность активных фаз процессора и фаз ввода-вывода. Рис. 11.2. Гистограмма периодов активности процессора. Решения по диспетчеризации могут быть приняты в случаях, если процесс: 1. 2. 3. 4. Переключается из состояния выполнения в состояние ожидания. Переключается из состояния выполнения в состояние готовности к выполнению. Переключается из состояния ожидания в состояние готовности. Завершается. Диспетчеризация типов 1 и 4 обозначается термином диспетчеризация без прерывания процесса (non-preemptive). 120 Диспетчеризация типов 2 и 3 обозначается термином диспетчеризация с прерыванием процесса (preemptive). Собственно диспетчер процессора Диспетчер процессора – компонента ОС, предоставляющая процессор тому процессу, который был выбран планировщиком. Диспетчер выполняет последовательность действий: Переключает контекст Переключает процессор в пользовательский режим Выполняет переход по соответствующему адресу в пользовательскую программу для ее рестарта. Скрытая активность (латентность) диспетчера (dispatch latency) – время, требуемое для диспетчера, чтобы остановить один процесс и стартовать другой. Разумеется, система должна стремиться минимизировать это время, однако набор критериев диспетчеризации более сложен. Критерии диспетчеризации Имеется пять основных критериев диспетчеризации процессора, которые так или иначе должны учитываться системой. Использование процессора (CPU utilization) – поддержание его в режиме занятости максимально возможный период времени. Критерий оптимизации: максимизация данного показателя. Пропускная способность системы (throughput) – (среднее) число процессов, завершающих свое выполнение за единицу времени. Критерий оптимизации: максимизация. Время обработки процесса (turnaround time) – время, необходимое для исполнения какого-либо процесса. Критерий оптимизации: минимизация. Время ожидания (waiting time) – время, которое процесс ждет в очереди процессов, готовых к выполнению. Критерий оптимизации: минимизация. Время ответа (response time) – время, требуемое от момента первого запроса до первого ответа (данный показатель, как мы обсуждали ранее в лекции 1, наиболее важен для среды разделения времени). Критерий оптимизации: минимизация. Как и при любой оптимизации, независимо от стратегии, удовлетворить всем критериям одновременно невозможно. Далее рассмотрим различные стратегии диспетчеризации и проанализируем их достоинства и недостатки, с точки зрения достижения оптимальности указанных критериев. Стратегия First-Come-First-Served (FCFS) Стратегия First-Come-First-Served (обслуживание в порядке поступления) – наиболее простая стратегия диспетчеризации, при которой ресурсы процессора предоставляются процессам в порядке их поступления (ввода) в систему, независимо от потребляемых ими ресурсов, в частности, от заявленного процессом времени, требуемого для его выполнения. При рассмотрении этой и других стратегий будем использовать диаграммы Ганта (Gantt charts) изображающие имена процессов и временные диапазоны их выполнения, выраженные в некоторых единицах времени. Рассмотрим следующий пример. Пусть процессы P 1, P2 и P3 введены в систему в указанном порядке со следующими периодами активности: Процесс Период активности P1 24 P2 3 P3 3 Тогда при использовании стратегии FCFS для их диспетчеризации первым получит процессор первый процесс, несмотря на то, что он – наиболее долгий. Распределение процессора между процессами в данном случае изображено на рис. 11.3. 121 Рис. 11.3. Схема диспетчеризации по стратегии FCFS (пример 1). Таким образом, время ожидания для P1 = 0; P2= 24; P3 = 27. Среднее время ожидания: (0 + 24 + 27)/3 = 17. Если порядок процессов иной: P2 , P3 , P1 (последний введенный в систему процесс – самый долгий), то результат их диспетчеризации будет совершенно иным (рис. 11.4). Рис. 11.4. Схема диспетчеризации по стратегии FCFS (пример 2). Время ожидания процессов в данном случае: P1 = 6; P2 = 0; P3 = 3. Среднее время ожидания: (6 + 0 + 3)/3 = 3 Данный результат много лучше, чем в предыдущем случае. Эффект, продемонстрированный первым примером, носит название эффекта сопровождения (convoy effect) – увеличение среднего времени ожидания процессов в случаях, если короткий процесс обслуживается после долгого процесса. Стратегия Shortest Job First (SJF) Стратегия Shortest Job First (SJF, обслуживание самого короткого задания первым) – стратегия диспетчеризации процессора, при которой процессор предоставляется в первую очередь наиболее короткому процессу из имеющихся в системе. В данном случае с каждым процессом связывается длина его очередного периода активности. Эта длина используется для того, чтобы первым обслужить самый короткий процесс . Возможны две схемы применения данной стратегии: 5. Без прерывания процессов – пока процессу предоставляется процесс, он не может быть прерван, пока не истечет его квант времени. 6. С прерыванием процессов – если приходит новый процесс, время активности которого меньше, чем оставшееся время активного процесса, - прервать активный процесс. Эта схема известна под названием Shortest-Remaining-Time-First (SRTF). Нетрудно видеть, что стратегия SJF оптимальна, в том смысле, что она обеспечивает минимальное среднее время ожидания для заданного набора процессов. Рассмотрим пример применения стратегии SJF без прерывания процессов. Пусть набор процессов, времен их появления в системе и времен их активности следующие: Процесс Время появления Время активности P1 0.0 7 P2 2.0 4 P3 4.0 1 P4 5.0 4 Схема их диспетчеризации по стратегии SJF без прерывания процессов приведена на рис. 11.5. 122 Рис. 11.5. Схема диспетчеризации процессов по стратегии SJF без прерывания. В данном случае среднее время ожидания = (0 + 6 + 3 + 7)/4 = 4. Теперь применим к тем же процессам стратегию SJF с прерыванием и проанализируем, как изменится среднее время ожидания. Результат применения стратегии изображен на рис. 11.6. Рис. 11.6. Схема диспетчеризации процессов по стратегии SJF с прерываниями. В данном случае принцип прерывания процесса в момент поступления в систему более короткого процесса применяется несколько раз: в момент 2 прерывается процесс 1 и начинает исполняться более короткий процесс 2; в момент 4 прерывается процесс 2 и начинает исполняться более короткий процесс 3. Из диаграммы видно, что, вследствие применения принципа прерывания процессов, периоды непрерывного выполнения процесса на процессоре могут быть не смежными и перемежаться с периодами выполнения других процессов. В данном случае среднее время ожидания = (9 + 1 + 0 +2)/4 = 3, т.е. оно, как и следовало предполагать, оказалось меньше, чем без применения принципа прерывания процессов. Предсказание длины следующего периода активности Попытаемся теперь предложить и применить формулы для предсказания следующего периода активности процесса. Подобные оценки помогли бы разработчикам ОС реализовать оптимальную стратегию диспетчеризации. Используем уже известные фактические длины предыдущих периодов активности и принцип экспоненциального усреднения. Пусть: tn – фактическая длина n-го периода активности процесса; τn – предсказанная длина n-го периода активности процесса. Будем искать значение τn+1 для предсказания следующего периода активности процесса как следующую линейную комбинацию tn и τn: τn+1 = ) τn . tn + (1 – где – число между 0 и 1. Коэффициент характеризует, в какой степени при предсказании учитывается недавняя история вычислений. Пример предсказания следующего периода активности по приведенной формуле приведен на рис. 11.7. При =0 τn+1 = τn, т.е. недавняя история не учитывается. При =1 τn+1 = tn т.е. учитывается только фактическая длина последнего периода активности. Если обобщить приведенную формулу, получим: τn+1 = tn+(1 - ) tn -1 + … +(1 - )j tn -1 + … +(1 - ) n+1 tn τ0. Поскольку и (1 - ) не превосходят 1, каждый последующий терм имеет меньший вес, чем его предшественник. 123 Рис. 11.7. Пример предсказания следующего периода активности. Диспетчеризация по приоритетам При данной стратегии с каждым процессом связывается его приоритет (целое число). Процессор выделяется процессу с наивысшим приоритетом (будем считать, что меньшее число означает более высокий приоритет процесса, т.е. наиболее высокий приоритет процесса равен 1). Данная стратегия, как и предыдущая, имеет варианты с прерыванием и без прерывания. Более того, стратегию SJF можно рассматривать как диспетчеризацию по приоритетам, в которой приоритетом является очередное время активности. При диспетчеризации по приоритетам возникает проблема "голодания" (starvation) ситуации, когда процессы с низким приоритетом могут никогда не исполниться и бесконечно ждать. Традиционным способом решение данной проблемы в операционных системах является учет возраста процесса (aging): c течением времени приоритет процесса повышается системой. Стратегия Round Robin (RR) Стратегия Round Robin (RR, круговая система) – это предоставление всем процессам по очереди одинаковых квантов времени. Название стратегии происходит от названия популярной в США карточной игры. При данной стратегии каждый процесс получает небольшой квант процессорного времени, обычно – 10-100 миллисекунд. После того, как это время закончено, процесс прерывается и помещается в конец очереди готовых процессов. Если всего имеется n процессов в очереди готовых к выполнению, и квант времени равен q, то каждый процесс получает 1/n процессорного времени порциями самое большее по q единиц за один раз. Ни один процесс не ждет больше, чем (n-1) q единиц времени. Производительность данной стратегии зависит от коэффициента q: если q велико, то стратегия фактически эквивалентна стратегии FCFS; если q мало, то q должно быть большим, чем время контекстного переключения, иначе слишком велики окажутся накладные расходы на переключения с одного процесса на другой. 124 Рассмотрим пример применения стратегии RR. Пусть в системе имеются следующие процессы со следующими временами активности: Процесс Время активности P1 53 P2 17 P3 68 P4 24 Схема диспетчеризации процессора по стратегии RR с квантом времени q = 20 приведена на рис. 11.8. Рис. 11.8. Пример применения стратегии RR (q = 20). Обычно стратегия RR имеет худшее время оборота, чем SJF (так как каждый процесс должен ждать до предоставления следующего кванта времени, пока кванты времени будут предоставлены всем другим процессам), но лучшее время ответа. На рис. 11.9 иллюстрируется зависимость числа контекстных переключений от кванта времени: чем меньше квант, тем больше число переключений контекста. Рис. 11.9. Квант времени процессора и время переключения контекста. На рис. 11.10 приведен пример зависимости времени оборота от кванта времени. В данном случае зависимость носит более сложный характер. Многоуровневая очередь Поскольку процессы в системе могут иметь различную специфику (например, пакетные и интерактивные), на практике в операционных системах очередь готовых к выполнению процессов делится на две очереди: основная (интерактивные процессы) фоновая (пакетные процессы). Каждая очередь имеет свой собственный алгоритм диспетчеризации: основная –RR, фоновая – FCFS. При данной смешанной стратегии необходима также диспетчеризация между очередями, т.е. стратегия выбора процессов из той или иной очереди. Различаются следующие виды диспетчеризации между очередями: С фиксированным приоритетом - обслуживание всех процессов из основной очереди, затем – из фоновой. При этом имеется вероятность "голодания". 125 Выделение отрезка времени – каждая очередь получает некоторый отрезок времени ЦП, который она может распределять между процессами; например, 80% - на RR в основной очереди; 20% на FCFS в фоновой очереди. Рис. 11.10. На рис. 11.11 приведен реалистичный пример структуры многоуровневой очереди для диспетчеризации процессов. Наивысший приоритет имеют системные процессы, далее – интерактивные, еще меньший – интерактивные с вызовами текстовых редакторов (они занимают значительно больше времени из-за медленной работы пользователей); затем следуют пакетные и, наконец, студенческие процессы. Такова реальная ситуация, хотя автор и не считает справедливым "дискриминацию" студенческих процессов: возможны ситуации, когда именно им следует отдавать наивысший приоритет после системных – например, незадолго до защит дипломных работ. Рис. 11.11. 126 Многоуровневые аналитические очереди Для более гибкой диспетчеризации процессов в операционных системах организуются многоуровневые аналитические очереди (multi-level feedback queues), в которых обслуживаются процессы нескольких классов, причем каждый из классов имеет различные кванты времени. Самый быстрый (приоритетный) класс процессов получает минимальный квант. Если процесс не завершается за этот квант времени, ОС перемещает его в очередь процессов другого класса с большей величиной кванта, и т.д. Если процесс не завершается и за самый большой из выделяемых системой квантов времени, ОС перемещает его в класс пакетных процессов, обслуживаемых по стратегии FCFS. На рис. 11.12 приведен пример организации многоуровневой аналитической очереди с квантами времени 8 (очередь Q0) и 16 (очередь Q1) и пакетными процессами по стратегии FCFS (очередь Q2). Первоначально процесс помещается в очередь Q0; если он не завершается за 8 единиц времени, то он перемещается в очередь Q1; если не завершается и за 16 единиц времени – то перемещается в очередь Q2. Рис. 11.12. Многоуровневая аналитическая очередь. Планирование загрузки многопроцессорных систем Планирование загрузки процессора более сложно, если в системе имеется несколько процессоров. При симметричном мультипроцессировании (нескольких однородных процессорах в системе) ОС пытается равномерно распределить загрузку между процессорами. При асимметричном мультипроцессировании только одному процессу доступны системные структуры данных. что исключает необходимость в синхронизации по общим данным. Планирование загрузки процессоров в системах реального времени Как уже отмечалось, системы реального времени делятся на два класса – hard real-time и soft real-time. В первом случае решение основной (критической) задачи требуется за фиксированный интервал времени (response time), что и учитывается при планировании. Во втором случае требование более слабое: критические процессы, решающие основную задачу системы, должны иметь более высокий приоритет, чем остальные процессы. На рис. 11.13 иллюстрируются особенности диспетчеризации и латентность диспетчера для систем реального времени. Интервал ответа, который не может быть превышен, складывается из времени обработки прерывания, периода латентности диспетчера при переключении контекста (времени разрешения конфликтов и собственно времени диспетчеризации) и времени исполнения критического процесса реального времени. 127 Рис. 11.13. Латентность диспетчера в системах реального времени. Планирование в Solaris На рис. 11.14 иллюстрируются принципы планирования в ОС Solaris. Система обслуживает несколько классов процессов, в порядке убывания приоритетов: реального времени, системные, интерактивные и с разделением времени. Более высокоприоритетные процессы планируются и диспетчеризуются первыми. Для каждого класса процессов имеется свой планировщик. Планирование в Windows 2000 В таблица 1 изображены классы процессов и принципы распределения их приоритетов в Windows 2000. Классы процессов представлены столбцами таблицы, их приоритеты – строками. Рекомендуем обратить внимание, что даже простаивающий процесс реального времени имеет гораздо больший приоритет, чем простаивающие процессы других классов. Таблица 1. реального времени критический 31 высокий выше нормального нормальный ниже нормального приоритет простаивающего процесса 15 15 15 15 15 наивысший 26 15 12 10 8 6 выше нормального 25 14 11 9 7 5 нормальный 24 13 10 8 6 4 ниже нормального 23 12 9 7 5 3 низший 22 11 8 6 4 2 1 1 1 1 1 простаиваю- 16 щий 128 Рис. 11.14. Планирование в Solaris. Ключевые термины Возраст (aging) процесса – повышение операционной системой приоритета длительное время находящегося в системе процесса. Время обработки процесса (turnaround time) – время, необходимое для исполнения какого-либо процесса. Время ожидания (waiting time) – время, которое процесс ждет в очереди процессов, готовых к выполнению. Время ответа (response time) – время, требуемое от момента запроса (команды) пользователя до первого ответа системы. Голодание (starvation) - ситуация в системе, когда процессы с низким приоритетом длительное время ждут и не получают квантов времени процессора. Диаграмма Ганта (Gantt chart) – схема в виде "временной линейки", изображающая имена процессов и временные диапазоны их выполнения, выраженные в некоторых единицах времени. Диспетчеризация (процессора) – распределение времени процессора между процессами в системе путем поочередного выделения планировщиком операционной системы процессам квантов процессорного времени. 129 Диспетчеризация без прерывания процессов (non-preemptive) – стратегии диспетчеризации, не использующие прерывания работы процессов при поступлении в систему более коротких или более приоритетных. Диспетчеризация с прерыванием процессов (preemptive) – стратегии диспетчеризации, использующие прерывания работы процессов при поступлении в систему более коротких или более приоритетных. Использование процессора (CPU utilization) – поддержание его в режиме занятости максимально возможный период времени. Многоуровневая очередь – совокупность системных очередей, содержащих в отдельных очередях процессы различных классов и приоритетов (например, пакетные и интерактивные). Планировщик (scheduler) – компонента ОС, которая выбирает один из нескольких процессов, загруженных в память и готовых к выполнению, и выделяет процессор для одного из них. Пропускная способность системы (throughput) – (среднее) число процессов, завершающих свое выполнение за единицу времени. Скрытая активность (латентность) диспетчера (dispatch latency) – время, требуемое для диспетчера, чтобы остановить один процесс и стартовать другой. Стратегия First-Come-First-Served (обслуживание в порядке поступления) – стратегия диспетчеризации, при которой ресурсы процессора предоставляются процессам в порядке их поступления в систему, независимо от потребляемых ими ресурсов. Стратегия Round Robin (RR, круговая система) – стратегия диспетчеризации, при которой всем процессам по очереди предоставляются одинаковые кванты времени. Стратегия Shortest Job First (SJF, обслуживание самого короткого задания первым) – стратегия диспетчеризации процессора, при которой процессор предоставляется в первую очередь наиболее короткому процессу из имеющихся в системе. Стратегия Shortest-Remaining-Time-First (SRTF, обслуживание процесса с минимальным оставшимся временем выполнения) - стратегия диспетчеризации процессора, при которой процессор предоставляется в первую очередь процессу с минимальным оставшимся временем выполнения. Цикл CPU / I-O – чередование периодов использования процессора и ожидания вводавывода. Краткие итоги Диспетчеризация процессора – предоставление всем процессам в системе по очереди в определенном порядке квантов процессорного времени. Главной целью диспетчеризации является максимальная загрузка процессора. Работа любого процесса в системе представляется как последовательность чередований фаз активности процессора и активности ввода-вывода. Частота периодов активности процессора обратно пропорциональна их длительности. Планировщик – компонента ОС, планирующая выделение квантов времени процессам по определенной стратегии. Различаются стратегии с прерыванием процессов (когда при вводе нового более короткого или более приоритетного процесса в систему текущий процесс прерывается) и без прерывания процессов. Диспетчер – компонента ОС, выполняющая само переключение процессора с одного процесса на другой. Время, которое на это требуется, называется скрытой активностью (латентностью) диспетчера и должно быть минимизировано. Основные критерии диспетчеризации – использование процессора (максимилизируется), пропускная способность системы (максимилизируется), среднее время обработки одного процесса (максимилизируется), среднее время ожидания одним процессом (минимизируется), среднее время ответа системы (минимизируется). Для иллюстрации стратегий диспетчеризации используются диаграммы Ганта с изображением временной линейки, имен и периодов активности каждого процесса. 130 Стратегия диспетчеризации First-Come-First-Served (FCFS) – предоставление ресурсов процессора процессам в порядке их ввода в систему, независимо от их длительности. При этом время ожидания может оказаться большим, особенно если первым в систему вводится более длительный процесс (что называется эффектом сопровождения). Ситуация, когда первыми вводятся более короткие процессы, более благоприятна. Стратегия Shortest-Job-First (SJF) – предоставление ресурсов процессора более которкому процессу или процессу, оставшееся время выполнения которого минимально (ShortestRemaining-Time-First, SRTF). Данная стратегия обеспечивает минимальное среднее время ожидания процессов. Метод экспоненциального усреднения позволяет вычислить предсказываемую длину следующего периода активности по фактическим и предсказанным длинам предыдущих периодов активности. Диспетчеризация по приоритетам предоставляет первым ресурсы процессора более высокоприоритетному процессу. Чтобы избежать ситуации "голодания", ОС постепенно повышает приоритеты процессов, длительное время находящихся в системе. Стратегия Round Robin (RR) предоставляет всем процессам по очереди одинаковые кванты времени процессора. Квант времени не должен быть слишком мал, иначе накладные расходы на переключение процессов оказываются сравнимыми с полезным временем процессора. Стратегия RR обеспечивает лучшее время ответа, чем SJF, но худшее время оборота. Число переключений контекста с процесса на процесс возрастает с уменьшением выделяемого кванта времени. Время оборота зависит от кванта времени более сложным образом. Для обработки процессов различных классов и приоритетов (например, пакетных и интерактивных) ОС создает многоуровневые аналитические очереди процессов, каждая из которых обслуживается по различным стратегиям и (или) предоставляет процессам кванты времени различного размера. Процесс при необходимости может быть переведен из одной очереди в другую. При планировании загрузки многопроцессорных систем учитывается их симметричность или асимметричность. Планирование их загрузки гораздо более сложно. В асимметричных системах не требуется синхронизировать процессы по системным структурам данных, так как они доступны процессу только на одном процессоре. Для систем реального времени наиболее важным является предоставление наивысших приоритетов критическим процессам реального времени, решающим основную задачу системы. В ОС Solaris и Windows 2000 выделяются процессы нескольких классов, для которых, соответственно, выделяются различные приоритеты. В системе Solaris для каждого класса процессов имеется свой планировщик. Набор для практики Вопросы 1. 2. 3. 4. 5. 6. Что такое диспетчеризация процессора? В чем основная цель диспетчеризации процессора? Что такое цикл CPU – I/O? Как зависит частота периодов активности процессора от их длительности? Что такое планировщик? Какие разновидности стратегий, с точки зрения прерывания или избежание прерывания процессов, использует планировщик? 7. Что такое стратегия без прерывания процессов? 8. Что такое стратегия с прерыванием процессов? 9. Что такое диспетчер? 10. Что такое латентность диспетчера и каким образом следует оптимизировать данный показатель? 11. Каковы основные критерии диспетчеризации? 12. Что такое использование (утилизация) процессора и как следует оптимизировать данный показатель? 13. Что такое пропускная способность системы и как следует оптимизировать данный показатель? 131 14. Что такое время обработки и как следует оптимизировать данный показатель? 15. Что такое время ожидания и как следует оптимизировать данный показатель? 16. Что такое время ответа и как следует оптимизировать данный показатель? 17. Что такое диаграмма Ганта? 18. В чем суть стратегии FCFS и каковы ее недостатки? 19. В чем суть стратегии SJF (и SRTF) и оптимальность по какому критерию она обеспечивает? 20. Каким образом и по каким формулам вычисляется предсказание длины следующего периода активности процессора? 21. В чем суть диспетчеризации по приоритетам? 22. Что такое проблема голодания процессов и каково ее решение в ОС? 23. В чем суть стратегии RR, оптимальность по какому критерию она обеспечивает и по какому критерию она хуже, чем SJF? 24. Как зависит число контекстных переключений от величины кванта времени? 25. Как зависит время оборота от величины кванта времени? 26. Что такое многоуровневая аналитическая очередь и процессы каких классов обрабатываются с помощью многоуровневых очередей? 27. Каковы особенности планирования загрузки многопроцессорных систем? 28. Каковы особенности планирования в системах реального времени? Упражнения 1. Реализуйте модель поведения процесса с чередованием периодов активности ЦП и ввода-вывода (времена периодов изменяются по какому-либо случайному закону) и визуализацией их в виде графических схем и гистограмм зависимости частоты периодов активности от их длительности. 2. Реализуйте модель представления процесса в системе и алгоритм диспетчера, выполняющего переключение контекста между процессами. 3. Реализуйте стратегию диспетчеризации FCFS с визуализацией ее результатов в виде диаграмм Ганта. 4. Реализуйте стратегию диспетчеризации SJF с визуализацией ее результатов в виде диаграмм Ганта. 5. Реализуйте стратегию диспетчеризации RR с визуализацией ее результатов в виде диаграмм Ганта. 6. Реализуйте стратегию диспетчеризации по приоритетам с визуализацией ее результатов в виде диаграмм Ганта. 7. Реализуйте вычисление предсказываемой длины следующего периода активности по методу экспоненциального усреднения. 8. Реализуйте многоуровневую очередь для пакетных и интерактивных процессов и алгоритм диспетчеризации с помощью многоуровневой очереди. Темы для курсовых работ, рефератов, эссе 1. Обзор методов и стратегий диспетчеризации процессора в ОС (реферат). 2. Обзор реализаций планировщиков и диспетчеров в операционных системах с открытым исходным кодом (реферат). 3. Анализ критериев диспетчеризации и методов их оптимизации в операционных системах (реферат). 4. Методы предсказания длины следующего периода активности процесса при диспетчеризации процессов в ОС (реферат). 5. Реализация модели поведения процесса с чередованием периодов активности ЦП и ввода-вывода (времена периодов изменяются по какому-либо случайному закону) и визуализацией их в виде графических схем и гистограмм зависимости частоты периодов активности от их длительности (курсовая работа). 6. Реализация модели представления процесса в системе и алгоритм диспетчера, выполняющего переключение контекста между процессами (курсовая работа). 7. Реализация стратегии диспетчеризации FCFS с визуализацией ее результатов в виде диаграмм Ганта (курсовая работа). 8. Реализация стратегии диспетчеризации SJF с визуализацией ее результатов в виде диаграмм Ганта (курсовая работа). 9. Реализация стратегии диспетчеризации RR с визуализацией ее результатов в виде диаграмм Ганта (курсовая работа). 132 10. Реализация стратегии диспетчеризации по приоритетам с визуализацией ее результатов в виде диаграмм Ганта (курсовая работа). 11. Реализация вычисления предсказываемой длины следующего периода активности по методу экспоненциального усреднения (курсовая работа). 12. Реализация многоуровневой очереди для пакетных и интерактивных процессов и алгоритма диспетчеризации с помощью многоуровневой очереди (курсовая работа). 13. Планирование и диспетчеризация процессоров в системе Solaris (реферат). 14. Планирование и диспетчеризация процессов в системе Windows 2000 (реферат). 133 134 12. Лекция: Методы синхронизации процессов В лекции рассмотрена синхронизация процессов: критические секции; алгоритмы решения проблемы взаимного исключение критических секций; двоичные и общие семафоры; решение проблем "ограниченный буфер", "читатели-писатели", "обедающие философы"; мониторы; синхронизация в Solaris и Windows 2000. Содержание Введение История синхронизации Анализ проблемы производитель – потребитель с точки зрения синхронизации по общему буферу Синхронизация процессов по критическим секциям Алгоритм решения проблемы критической секции Алгоритм булочной (bakery algorithm) Синхронизация на основе аппаратной поддержки атомарных операций Синхронизация на основе общих семафоров Реализация семафоров Семафоры как общее средство синхронизации Общие и двоичные семафоры Вариант операции wait (S) для системных процессов ("Эльбрус") Реализация общего семафора с помощью двоичных семафоров Решение классических задач синхронизации с помощью семафоров Решение с помощью семафоров задачи "читатели – писатели" Решение с помощью семафоров задачи "обедающие философы" Критические области Решение с помощью критических областей задачи "ограниченный буфер" Схема реализации критических областей с помощью семафоров Мониторы Решение задачи "обедающие философы" с помощью мониторов Реализация мониторов с помощью семафоров Синхронизация в ОС Solaris Синхронизация в Windows 2000 Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение В лекции рассматривается синхронизация процессов – одна из интереснейших и наиболее актуальных тем, в связи с широким распространением параллельных вычислительных систем и параллельных алгоритмов решения задач, требующих синхронизации параллельных процессов и потоков по общим ресурсам и событиям. В лекции рассмотрены следующие вопросы: История синхронизации процессов Проблема критической секции Аппаратная поддержка синхронизации Семафоры Классические проблемы синхронизации Критические области Мониторы Синхронизация в Solaris и в Windows. История синхронизации Методы синхронизации процессов рассматривались еще в 1960-х гг. в пионерской работе Э. Дейкстры [17]. Было отмечено, что совместный доступ параллельных процессов к общим данным может привести к нарушению их целостности. Поддержание целостности общих данных требует реализации и использования механизмов упорядочения работы взаимодействующих процессов (или потоков). 135 Анализ проблемы производитель – потребитель с точки зрения синхронизации по общему буферу Вернемся к уже рассмотренной нами проблеме (парадигме) взаимодействия процессов производитель – потребитель (см. "Методы взаимодействия процессов "). Имеется общий буфер ограниченной длины. Процесс-производитель добавляет в него сгенерированные элементы, процесс-потребитель использует и удаляет использованные элементы. Добавим в представление ограниченного буфера переменную counter, которую увеличивает процесспроиводитель, добавляя очередной элемент к буферу, и уменьшает процесс-потребитель, используя и удаляя элемент из буфера. Вспомним представление ограниченного буфера на языке Си (см. "Методы взаимодействия процессов ") и расширим его переменной counter : #define BUFFER_SIZE 1000 /* или другое конкретное значение */ typedef struct { . . . } item; item buffer[BUFFER_SIZE]; int in = 0; int out = 0; int counter = 0; Теперь модифицируем реализации процесса-производителя и процесса-потребителя (см. "Методы взаимодействия процессов ") , добавив соответствующие изменения переменной counter: Процесс-производитель: item nextProduced; /* следующий генерируемый элемент */ while (1) { /* бесконечный цикл */ while (counter == BUFFER_SIZE) == out) ; /* ждать, пока буфер переполнен */ buffer[in] = nextProduced; /* генерация элемента */ in = (in + 1) % BUFFER_SIZE; counter++; } Процесс-потребитель: item nextConsumed; /* следующий используемый элемент */ while (1) { /* бесконечный цикл */ while (counter == 0) ; /* ждать, пока буфер пуст */ nextConsumed = buffer[out]; /* использование элемента */ out = (out + 1) % BUFFER_SIZE; counter--; } Возникает вопрос: насколько корректны модифицированные алгоритмы, использующие переменную counter ? Не вполне. Проблема в том, что counter фактически является общим ресурсом, к которому одновременно обращаются два параллельных процесса. Если при этом обращение произойдет одновременно, то переменная counter может в итоге оказаться в некорректном состоянии. Поэтому необходимо, чтобы каждый из процессов при увеличении или уменьшении ее значения имел бы к ней монопольный доступ, и другой процесс не мог бы в это время "испортить" значение переменной. Иными словами, операции counter++ и counter— должны выполняться атомарно (см. главу 9). Напомним, что атомарная операция – это такая операция, которая должна быть выполнена полностью, без каких-либо прерываний; при этом операция, выполняемая одним из процессов, должна быть неделимой, с точки зрения другого процесса. Операции count++ и count— могут быть реализованы на языке ассемблерного уровня следующим образом: count++ : register1 = counter register1 = register1 + 1 counter = register1 136 count--: register1 = counter register1 = register1 - 1 counter = register1 где register1 – регистр аппаратуры. Проблема в том, что если и производитель, и потребитель пытаются изменить переменную counter одновременно, то указанные ассемблерные операторы тоже должны быть выполнены совместно (interleaved). Конкретная реализация такого совместного выполнения зависит от того, каким образом происходит планирование для процессов – производителя и потребителя, а также от применения (или неприменения) в каждом из случаев аппаратных оптимизаций, например, увеличения (уменьшения) значения регистра одной командой за один такт (increment / decrement). Рассмотрим эффект interleaving на конкретном примере. Предположим, что начальное значение переменной counter в некоторый момент равно 5. Исполнение процессов в совместном режиме (interleaving) может привести к следующему эффекту: производитель: register1 = counter (register1 = 5) производитель: register1 = register1 + 1 (register1 = 6) потребитель: register2 = counter (register2 = 5) потребитель: register2 = register2 – 1 (register2 = 4) производитель: counter = register1 (counter = 6) потребитель: counter = counter2 (counter = 4) Таким образом, значение counter в итоге может оказаться равным 6 или 4, в то время как правильное значение counter равно 5. Ситуация, при которой взаимодействующие процессы могут параллельно (одновременно) обращаться к общим данным, называется конкуренцией за общие данные (race condition). Для предотвращения подобных ситуаций процессы следует синхронизировать. Синхронизация процессов по критическим секциям Рассмотрим проанализированную проблему в общем виде. Пусть имеются n параллельных процессов, каждый из которых может обратиться к общим для них данным. Назовем критической секцией фрагмент кода каждого процесса, в котором происходит обращение к общим данным. Проблема синхронизации процессов по критическим секциям заключается в том, чтобы обеспечить следующий режим выполнения: если один процесс вошел в свою критическую секцию, то до ее завершения никакой другой процесс не смог бы одновременно войти в свою критическую секцию. Можно показать, что для решения проблемы критической секции необходимо и достаточно выполнение следующих трех условий: 1. Взаимное исключение. Если некоторый процесс исполняет свою критическую секцию, то никакой другой процесс не должен в этот момент исполнять свою. 2. Прогресс. Если в данный момент нет процессов, исполняющих критическую секцию, но есть несколько процессов, желающих начать исполнение критической секции, то выбор системой процесса, которому будет разрешен запуск критической секции, не может продолжаться бесконечно. 3. Ограниченное ожидание. В системе должно существовать ограничение на число раз, которое процессам разрешено входить в свои критические секции, начиная от момента, когда некоторый процесс сделал запрос о входе в критическую секцию, и до момента, когда этот запрос удовлетворен. При этом предполагается, что каждый процесс исполняется с ненулевой скоростью, но не делается никаких предположений о соотношении скоростей процессов. Алгоритм решения проблемы критической секции Пусть для простоты имеется только два процесса – P0 и P1. Общая структура i - го процесса должна иметь вид: do { 137 вход в критическую секцию критическая секция выход из критической секции остальная часть кода } while (1) Процессы могут использовать общие переменные для синхронизации своих действий. Алгоритм 1. Предпримем первую попытку решения проблемы. Введем целую переменную turn (очередь), значение которой turn == i будет обозначать, что наступила очередь процесса номер i войти в свою критическую секцию. Первоначально turn == 0. Алгоритм процесса Pi имеет вид: do { while (turn != i); критическая секция turn = j; /* j != i: если i == 0, j == 1; если i == 1, j == 0 */ остальная часть кода } while (1) Очевидно по построению, что данный алгоритм удовлетворяет принципу взаимное исключение. Однако он не удовлетворяет принципу прогресс: алгоритм не предпринимает никаких мер, чтобы ограничить время выбора процесса, желающего начать критическую секцию. Причина в следующем: алгоритм не хранит информацию о том, какие процессы желают войти в свои критические секции. Алгоритм 2. Будем хранить не номер процесса, допущенного к критической секции, а массов булевских флагов flag [2], такой, что flag[i] == true, если i-й процесс готов войти в свою критическую секцию. Алгоритм процесса Pi примет вид: do { flag[i] = true; while (flag[j]); /* j!=i: если i==0, j==1; если i == 1, j == 0 */ критическая секция flag[i] = false; остальная часть кода } while (1) Данный вариант алгоритма также удовлетворяет принципу взаимного исключения, так как перед входом в критическую секцию процесс ждет, пока не останется других процессов, желающих войти в свои критические секции. Однако данный алгоритм также не удовлетворяет принципу прогресс, Причина в том, что алгоритм не различает информацию о том, что процесс еще только готов войти в свою критическую секцию, и о том, что он в нее уже вошел. Алгоритм 3. Модифицируем алгоритм, используя в нем одновременно и переменную turn, и массив флагов flag. Алгоритм процесса примет вид: do { flag[i] = true; turn = j; while (flag[j] and turn == j); критическая секция flag[i] = false; остальная часть кода } while (1) Можно проверить, что данный вариант алгоритма удовлетворяет всем трем принципам и решает проблему синхронизации по критическим секциям. Формальное доказательство предоставляем студентам. Идея данного варианта алгоритма в том, что перед входом в критическую секцию процесс сначала заявляет о своем намерении в нее войти, но затем пытается предоставить право на вход в критическую секцию другому процессу и только после того, как другой процесс ее выполнил и больше не желает в нее войти, входит сам в свою критическую секцию. 138 Алгоритм булочной (bakery algorithm) Автор данного алгоритма – Л. Лампорт (L. Lamport). Рассмотрим другой алгоритм, решующий проблему синхронизации по критическим секциям. Происхождение названия следующее: алгоритм как бы воспроизводит стратегию автомата в (американской) булочной, где каждому клиенту присваивается его номер в очереди. В нашей российской реальности, данный алгоритм более уместно было бы назвать по этой же причине "алгоритм Сбербанка". В алгоритме для n процессов используется булевский массив choosing[n]: значение choosing[i] == true будет означать, что в данный момент система определяет номер в очереди i-го процесса. Используется также целочисленный массив number[n]: number[i] будет обозначать вычисленный порядковый номер в очереди (приоритет) i-го процесса. Алгоритм булочной (для i-го процесса) имеет вид: do { choosing[i] = true; number [i] = max (number[0], number[1], …, number[n-1]) + 1; while (flag[j] and turn == j); choosing[i] = false; for (j = 0; j < n; j++) { while choosing[j]; while ((number[j] != 0) && (number[j] < number[j])); } критическая секция number [i] = 0; остальная часть кода } while (1) По построению, номер, присваиваемый процессу, будет гарантированно больше, чем номер любого другого процесса в системе. Прежде чем войти в критическую секцию, процесс ждет, пока завершится процесс выбора номера для всех процессов и пока в системе есть хотя бы один выбранный процесс, номер которого меньше. По окончании критической секции процесс обнуляет свой номер. Данный алгоритм также решает проблему синхронизации процессов по критическим секциям. Синхронизация на основе аппаратной поддержки атомарных операций Рассмотренные алгоритмы синхронизации, не использующие каких-либо специальных синхронизирующих примитивов, достаточно сложны для понимания, разработки и сопровождения. Более простым (с точки зрения разработчика программ) решением для синхронизации была бы аппаратная и системная поддержка каких-либо простых атомарных операций, на основе которой реализовать синхронизацию процессов было бы проще. Рассмотрим одну из этих операций, традиционно используемых для синхронизации, операцию TestAndSet, которая атомарно выполняет считывание и запоминание значения переменной, затем изменяет его на заданное значение, но в результате выдает первоначальное значение переменной. Предположим, что в системе имеется аппаратная поддержка следующей атомарной операции: boolean TestAndSet (boolean & target) { boolean rv = target; target = true; return rv; } С помощью данной операции реализовать синхронизацию процессов по критическим секциям очень просто. Введем в качестве блокировщика общую булевскую переменную: boolean lock = false; Код i-го процесса будет иметь вид: do { while (TestAndSet (lock)); 139 критическая секция lock = false; остальная часть кода } while (1) Значение переменной lock, равное true, означает, что вход в критическую секцию заблокирован. Каждый процесс ждет, пока он не разблокируется, затем, в свою очередь, выполняет блокировку и входит в критическую секцию. При ее завершении процесс разблокирует критическую секцию присваиванием lock значения false. Другое распространенное аппаратное решение для синхронизации – атомарная операция Swap, выполняющая перестановку значений двух переменных: void Swap (Boolean * a, Boolean * b) { Boolean temp = * a; a = * b; * b = temp; } Взаимное исключение по критическим секциям с помощью атомарной операции Swap реализуется следующим образом (приведен код i-го процесса) : /* общие данные */ boolean lock = false; Boolean key = false; /* код процесса i */ do { key = true; while (key) { Swap (&lock, &key); } критическая секция lock = false; остальная часть кода } while (1) При данной реализации, условием ожидания процесса перед входом в критическую секцию является условия (key == true), которое фактически означает то же, что и в предыдущей реализации, - закрытое состояние блокировщика, т.е., то, что другой процесс находится в своей критической секции. Когда критическая секция освободится (освобождение осуществляется присваиванием lock = false после завершения критической секции в исполнившем ее процессе), ее начнет исполнять текущий процесс. Синхронизация на основе общих семафоров Мы уже начали рассматривать семафоры Дейкстры как средство синхронизации в обзорной части курса. Здесь мы рассмотрим их более подробно в общем виде. Общий семафор (counting semaphore), по Э. Дейкстре, - это целая переменная S, над которой определены две атомарных семафорных операции wait (S) и signal (S) со следующей семантикой: wait (S): while (S <= 0) do no-op; S--; signal (S): S++; Фактически, если начальное значение общего семафора равно n (> 0), то это число задает количество процессов, которые могут беспрепятственно выполнить над семафором операцию wait. Синхронизация по критическим секциям с помощью общего семафора осуществляется следующим образом: /* общие данные */ semaphore mutex = 1; do { wait (mutex); критическая секция 140 signal (mutex); остальная часть кода } while (1) Реализация семафоров Семафор, по существу, является структурой из двух полей – целого значения и указателя на список ждущих процессов: typedef struct { int value; struct process * L; } semaphore; При реализации операций над семафором будем предполагать наличие в системе следующих простейших примитивов, и использовать их: block - задерживает исполнение процесса, выполнившего эту операцию; wakeup (P) – возобновляет исполнение приостановленного процесса P. Определим семафорные операции следующим образом: wait (S): S.value--; if (S.value < 0) { добавление текущего процесса к S.L; block; } signal (S): S.value++; if (S.value <= 0) { удаление процесса P из S.L; wakeup (P); } Семафоры как общее средство синхронизации Наиболее простой вид синхронизации действий, выполняемых в двух процессах, - это исполнение действия B в процессе Pj после того, как действие A исполнено в процессе Pi . Рассмотрим, как такую синхронизацию осуществить с помощью семафоров. Используем семафор flag, инициализированный 0. Код процесса Pi: . . . A; signal (flag); Код процесса Pj: . . . wait (flag); B; Общие и двоичные семафоры Из рассмотренного ясно, что имеется два вида семафоров: общий - целая переменная с теоретически неограниченным значением - и двоичный - целая переменная, значениями которой могут быть только 0 или 1. Преимуществом двоичного семафора является его возможная более простая аппаратная реализация. Например, в системах "Эльбрус" и Burroughs 5000 реализованы команды атомарного семафорного считывания с проверкой семафорного бита. Очевидно, что общий семафор может быть реализован с помощью двоичного семафора. 141 Вариант операции wait (S) для системных процессов ("Эльбрус") Для системного процесса лишние прерывания нежелательны, и может оказаться важным удерживать процессор за собой некоторое время (например, для быстрого выполнения планирования и диспетчеризации процессов). С этой целью в системе "Эльбрус" реализованаа, в дополнение к операции ждать (S) русифицированной версии wait(S), операция жуж(S) "жужжать" на процессоре, т.е. ждать на закрытом семафоре, но не прерываться и не отдавать процессор, пока семафор не будет открыт операцией открыть(S) Реализация общего семафора с помощью двоичных семафоров Общий семафор может быть представлен тройкой из двух двоичных семафоров и целой переменной: binary-semaphore S1 = 1; binary-semaphore S2 = 0; int C = начальное значение общего семафора S; Операция wait: wait (S1); C--; if (C < 0) { signal (S1); wait (S2); } signal (S1); Операция signal: wait (S1); C++; if (C >= 0) { signal (S2); }; signal (S1); В данной реализации семафор S1 используется для взаимного исключения доступа к общей целой переменной C. Семафор S2 используется для хранения очереди ждущих процессов в случае, если общий семафор переходит в закрытое состояние. Решение классических задач синхронизации с помощью семафоров Задача "ограниченный буфер". Имеются три классических задачи синхронизации процессов, решения которых с помощью семафоров мы рассмотрим: ограниченный буфер (bounded buffer problem) читатели – писатели (readers – writers problem) - обедающие философы (dining philosophers problem). В данном разделе рассмотрим реализацию с помощью семафоров задачи ограниченный буфер: имеются процесс-производитель и процесс-потребитель, взаимодействующие с помощью циклического буфера ограниченной длины; производитель генерирует элементы информации и записывает в буфер; потребитель использует информационные элементы из буфера и удаляет их. Будем использовать три общих семафора: semaphore full = n; semaphore empty = 0; semaphore mutex = 1; Семафор full сигнализирует о переполнении буфера, empty – об исчерпании буфера, mutex – используется для взаимного исключения действий над буфером. 142 Код процесса-производителя имеет вид: do { . . . сгенерировать элемент в nextp . . . wait (full); wait (mutex); . . . добавить nextp к буферу . . . signal (mutex); signal (empty); } while (1); Код процесса-потребителя: do { wait (empty); wait (mutex); . . . взять и удалить элемент из буфера в nextc . . . signal (mutex); signal (full); . . . использовать элемент из nextc . . . } while (1); Поясним использование семафоров. Семафор mutex используется "симметрично"; над ним выполняется пара операций: wait … signal – семафорные скобки. Его роль – чисто взаимное исключение критических секций. Семафор empty сигнализирует об исчерпании буфера. В начале он закрыт, так как элементов в буфере нет. Поэтому при закрытом семафоре empty потребитель вынужден ждать. Открывает семафор empty производитель, после того, как он записывает в буфер очередной элемент. Семафор full сигнализирует о переполнении буфера. В начале он равен n – максимальному числу элементов в буфере. Производитель перед записью элемента в буфер выполняет операцию wait (full), гарантируя, что, если буфер переполнен, записи нового элемента в буфер не будет. Открывает семафор full потребитель, после того, как он освободил очередной элемент буфера. Заметим, что даже в такой сравнительно простой задаче использование семафоров весьма нетривиально и не вполне надежно – очень легко сделать ошибку. Стоит забыть открыть семафор, либо перепутать два семафора при операциях, и в программе может возникнуть взаимная блокировка процессов. Решение с помощью семафоров задачи "читатели – писатели" Суть задачи читатели-писатели в следующем: имеется общий ресурс и две группы процессов: читатели (которые могут только читать ресурс, но не изменяют его) и писатели (которые изменяют ресурс). В каждый момент работать с ресурсом может сразу несколько читателей (когда ресурс не изменяется писателями), но не более одного писателя. Необходимо синхронизировать их действия над ресурсом и обеспечить взаимное исключение соответствующих критических секций. Будем использовать два семафора и целую переменную: semaphore mutex = 1; semaphore wrt = 1; int readcount = 0; Семафор mutex используется читателями для взаимного исключения операций над переменной readcount (счетчиком читателей). Семафор wrt используется для взаимного исключения писателей. Реализация процесса-писателя особых комментариев не требует: wait (wrt); 143 . . . изменение ресурса . . . signal (wrt); Реализация процесса-читателя несколько более сложна: wait (mutex); readcount++; if (readcount == 1) { wait (wrt); } signal (mutex); . . . чтение ресурса . . . wait (mutex); readcount--; if (readcount == 0) { signal (wrt); } Процесс-читатель, во-первых, должен увеличить значение readcount, причем обеспечить взаимное исключение для действий над readcount с помощью семафора mutex. Далее, если процесс является первым читателем, он должен закрыть семафор wrt, чтобы исключить одновременное с чтением изменение ресурса писателями. По окончании чтения ресурса, читатель в аналогичном стиле вновь уменьшает readcount. Если при этом оно обнуляется (т.е. это последний на данный момент читатель), то читатель открывает семафор wrt, сигнализируя писателям, что они могут изменять ресурс. Решение с помощью семафоров задачи "обедающие философы" Суть задачи обедающие философы в следующем. Имеется круглый стол, за которым сидят пять философов (впрочем, их число принципиального значения не имеет – для другого числа философов решение будет аналогичным). Перед каждым из них лежит тарелка с едой, слева и справа от каждого – две китайские палочки. Философ может находиться в трех состояниях: проголодаться, думать и обедать. На голодный желудок философ думать не может. Но начать обедать он может, только если обе палочки слева и справа от него свободны. Требуется синхронизировать действия философов. В данном случае общим ресурсом являются палочки. Иллюстрацией условий задачи является рис. 12.1. Данная задача является одной из излюбленных задач профессора Ч. Хоара, который использовал ее, как пример в своих работах по параллельному программированию. При решении задачи будем использовать массив семафоров chopstick, описывающий текущее состояние палочек: chopstick[i] закрыт, если палочка занята, открыт – если свободна: semaphore chopstick [5] = { 1, 1, 1, 1, 1}; Алгоритм реализации действий философа i имеет вид: do { wait (chopstick [i]); /* взять левую палочку */ wait (chopstick [(I + 1) % 5]); /* взять правую палочку */ . . . обедать . . . signal (chopstick [i]); /* освободить левую палочку */ signal (chopstick [(i+1) % 5]); /* освободить правую палочку */ . . . думать . . . while (1); Решение данной задачи с помощью семафоров оказывается особенно простым и красивым. 144 Рис. 12.1. Задача "обедающие философы". Критические области Критические области (critical regions) – более высокоуровневая и надежная конструкция для синхронизации, чем семафоры. Общий ресурс описывается в виде особого описания переменной: v: shared T Доступ к переменной v возможен только с помощью специальной конструкции: region v when B do S где v – общий ресурс; B – булевское условие, S – оператор (содержащий действия над v). Семантика данной конструкции следующая. Пока B ложно, процесс, ее исполняющий, должен ждать. Когда B становится истинным, процесс получает доступ к ресурсу v и выполняет над ним операции S. Пока исполняется оператор S, больше ни один процесс не имеет доступа к переменной v. Решение с помощью критических областей задачи "ограниченный буфер" Опишем буфер как структуру: struct buffer { int pool [n]; int count, in, out } buf: shared buffer; Алгоритм процесса-производителя: region buf when (count < n) { pool [in] = nextp; in = (in+1) % n; 145 count++; } Заметим, что проверка переполнения буфера выполняется при входе в конструкцию region, и потребитель ждет, пока в буфере освободится хотя бы один элемент. Алгоритм процесса-потребителя: region buf when (count > 0) { nextc = pool [out]; out = (out+1) % n; count--; } Нельзя не отметить, насколько проще и надежнее оказывается решение задачи с использованием данной конструкции, по сравнению с использованием семафоров. Схема реализации критических областей с помощью семафоров Будем использовать для реализации конструкции region x when B do S следующие семафоры и целые переменные: semaphore mutex, first-delay, second-delay; int first-count, second-count; Семафор mutex используется для взаимного исключения доступа к критической секции S. Семафор first-delay используется для ожидания процессов, которые не могут войти в критическую секцию S, так как условие B ложно. Число таких процессов хранится в переменной first-count. Семафор second-delay используется для ожидания тех процессов, которые вычислили условие B один раз и ожидают, когда им будет позволено повторно вычислить B (second-count – счетчик таких процессов). Реализация предоставляется студентам в качестве упражнения. Мониторы Конструкция монитор предложена в 1974 г. Ч. Хоаром [18]. Она является более высокоуровневой и более надежной конструкцией для синхронизации, чем семафоры. Описание монитора имеет вид: monitor monitor-name { описания общих переменных procedure body P1 ( … ) { . . . } procedure body P2 ( … ) { . . . } . . . procedure body Pn( … ) { . . . } { код инициализации монитора } } Монитор является многовходовым модулем особого рода. Он содержит описания общих для нескольких параллельных процессов данных и операций над этими данными в виде процедур P1, …, Pn. Пользователи монитора – параллельные процессы – имеют доступ к описанным в нем общим данным только через его операции, причем в каждый момент времени не более чем один процесс может выполнять какую-либо операцию монитора; остальные процессы, желающие выполнить операцию монитора, должны ждать, пока первый процесс закончит выполнять мониторную операцию. 146 По сути дела, концепция монитора явилась развитием предложенной также Ч. Хоаром концепции абстрактного типа данных (АТД)– определения типа данных как совокупности описания его конкретного представления и абстрактных операций над ним (в виде процедур). Концепция монитора добавляет к АТД возможность синхронизации процессов по общим данным. Для реализации ожидания внутри монитора по различным условиям, вводятся условные переменные (condition variables) – переменные с описаниями вида condition x,y, доступ к которым возможен только операциями wait и signal: например, x.wait(); x.signal(). Операция x.wait() означает, что выполнивший ее процесс задерживается до того момента, пока другой процесс не выполнит операцию x.signal(). Операция x.signal() возобновляет ровно один приостановленный процесс. Если приостановленных процессов нет, она не выполняет никаких действий. Схематическое изображение монитора приведено на рис. 12.2. Рис. 12.2. Схематическое изображение монитора. Схема монитора с условными переменными приведена на рис. 12.3. Решение задачи "обедающие философы" с помощью мониторов Реализуем решение задачи "обедающие философы" (см. Решение с помощью семафоров задачи "обедающие философы") с помощью монитора. Для каждого философа определим состояния (голодный, обедает, думает), и для их хранения будем использовать массив state. Для управления переходом философа из состояния в состояние используем массив условных переменных self. Для каждого философа определим операции pickup – взять палочку; putdown – освободить палочку; test – проверить состояние философа и, если это возможно и если он голоден, перевести его в состояние eating. 147 Рис. 12.3. Монитор с условными переменными. Код монитора, реализующего решение задачи: monitor dp { enum {thinking, hungry, eating} state [5]; condition self [5]; void pickup (int i) { state [i] = hungry; test (i); if (state[i] != eating) { self[i].wait (); } } /* pickup */ void putdown (int i) { state [i] = thinking; test ((i+4) % 5)); test ((i-1) % 5)); /* когда палочка свободна, проверить соседей */ } /* putdown */ void test (int i) { if (state((i+4)%5) != eating && state [i] = hungry && state((i+1)%5) != eating)) { state[i] = eating; self[i].signal; void init () { for (int i = 0; i < 5; i++) { state[i] = thinking; } } Реализация мониторов с помощью семафоров Используем семафоры mutex – для взаимного исключения процессов, next – для реализации очереди входа в монитор; переменную next-count – счетчик процессов в очереди на вход: 148 semaphore mutex = 1; semaphore next = 0; int next-count = 0; Каждую внешнюю процедуру монитора F реализуем следующим кодом: wait (mutex); . . . тело F; . . . if (next-count > 0) { signal next; } else { signal mutex; } Таким образом, будет обеспечено взаимное исключение внутри монитора. Каждую условную переменную x реализуем следующим образом: semaphore x-sem = 0; int x-count = 0; Реализация операции x.wait(): x-count++; if (next-count > 0) { signal (next); } else { signal (mutex); } wait(x-sem); x-count--; Реализация операции x.signal(): if (x-count > 0) { next-count++; signal (x-sem); wait (next); next-count--; } Таким образом, обеспечивается, что процесс, освобожденный из очереди к условной переменной, помещается во входную очередь монитора. Дополнительная операция над монитором, обеспечивающая организацию очереди к условной переменной по приоритетам, - x.wait(с), где c – целочисленный параметр, играющий роль приоритета. При выполнении операции signal первым будет освобожден из очереди процесс с меньшим значением приоритета. При реализации монитора необходимо проверять следующие условия: процессы должны выполнять вызовы операций монитора в правильной последовательности, своевременно вызывая все семафорные операции; никакой процесс не пытается обратиться к общим данным непосредственно, минуя протокол взаимодействия с монитором. Синхронизация в ОС Solaris Система Solaris предоставляет разнообразные виды блокировщиков для поддержки многозадачности, многопоточности (включая потоки реального времени) и мультипроцессирования. Используются адаптивные мюьтексы (adaptive mutexes) – эффективное средство синхронизации доступа к данным при их обработке короткими сегментами кода. Для более длинных сегментов кода используются условные переменные и блокировщики читателейписателей (reader-writer locks; rwlocks). Для синхронизации потоков используются "вертушки" (turnstiles) – синхронизирующие примитивы, которые позволяют использовать либо adaptive mutex, либо rwlock. 149 Синхронизация в Windows 2000 Для защиты доступа к данным на однопроцессорных системах используются маски прерываний. Для многопроцессорных систем используются spinlocks («вертящиеся замки»). В системе реализованы также объекты-диспетчеры, которые могут функционировать как мьютексы и как семафоры. Объекты-диспетчеры генерируют события, семантика которых аналогична семантике условной переменной. Ключевые термины Interleaving – одновременное выполнение нескольких машинных команд, работающих с общими данными. Абстрактный тип данных (АТД) – определение типа данных как совокупности описания его конкретного представления и абстрактных операций над ним. Адаптивный мюьтекс (adaptive mutex) – эффективное средство синхронизации доступа к данным при их обработке короткими сегментами кода в операционной системе Solaris. Алгоритм булочной (bakery algorithm) – алгоритм синхронизации процессов (Л. Лампорт), основанный на присвоении каждому процессу уникального номера в очереди (приоритета). Блокировщик читателей-писателей (reader-writer lock; rwlock) – средство синхронизации в ОС Solaris для поддержки схем синхронизации типа "читатели-писатели". "Вертушка" (turnstile) – синхронизирующий примитив в ОС Solaris, который позволяет использовать для синхронизации, при необходимости, либо адаптивный мьютекс, либо блокировщик читателей-писателей. "Вертящийся замок" (spinlock) - средство синхронизации в ОС Windows 2000, используемое в многопроцессорных системах. Взаимное исключение – режим совместного выполнения процессов, при котором, если некоторый процесс исполняет свою критическую секцию, то никакой другой процесс не должен в этот момент исполнять свою. жуж - В системе "Эльбрус": "жужжать" на процессоре; Специализированная операция (для системных процессов) ожидания на закрытом семафоре без прерываний; занятие процессора, пока семафор не будет открыт операцией открыть (S). Конкуренция за общие данные (race condition) - ситуация, при которой взаимодействующие процессы могут параллельно (одновременно) обращаться к общим данным без какой-либо синхронизации. Критическая область (critical region) – высокоуровневая конструкция для синхронизации, основанная на описаниях разделяемых (shared) ресурсов и конструкции region, обеспечивающей взаимное исключение при работе с общим ресурсом. Монитор – высокоуровневый механизм синхронизации: многовходовый модуль, который содержит описания общих данных и операций над этими данными в виде процедур; пользователи монитора – параллельные процессы – имеют доступ к общим данным только через его операции; в каждый момент не более чем один процесс может выполнять операцию монитора; остальные желающие процессы должны ждать, пока первый процесс закончит выполнять мониторную операцию. Обедающие философы (dining philosophers) – классическая задача синхронизации следующего содержания: имеется круглый стол, за которым пять философов. Перед каждым из них тарелка с едой, слева и справа – две китайские палочки. Философ может находиться в трех состояниях: проголодаться, думать и обедать. На голодный желудок философ думать не может. Начать обедать философ может, только если обе палочки слева и справа от него свободны. Общий семафор (counting semaphore) - целая переменная S, над которой определены две атомарных семафорных операции wait (S) и signal (S). 150 Объект-диспетчер (dispatcher object) – средство синхронизации в ОС Windows 2000, которое может функционировать как мьютекс и как семафор; генерирует события, семантика которых аналогична семантике условной переменной. Ограниченный буфер (bounded buffer): схема взаимодействия процессов, при которой имеются процесс-производитель и процесс-потребитель, взаимодействующие с помощью циклического буфера ограниченной длины; производитель генерирует элементы информации и записывает в буфер; потребитель использует информационные элементы из буфера и удаляет их. Семафорный бит – В вычислительных комплексах Burroughs 5000 и "Эльбрус": особый бит слова, над которым выполняется команда семафорного считывания; по определенному значению бита (например, 1) происходит прерывание. Синхронизация процессов по критическим секциям - обеспечение режима параллельного выполнения процессов, при котором, если один процесс вошел в свою критическую секцию, то до ее завершения никакой другой процесс не сможет одновременно войти в свою критическую секцию. Условная переменная (condition variable) – часть конструкции монитор: Переменная с описанием вида condition x, доступ к которой возможен только операциями wait и signal; операция x.wait() задерживает выполнивший ее процесс до момента, пока другой процесс не выполнит операцию x.signal(). Читатели-писатели: схема взаимодействия процессов, при которой имеется общий ресурс и две группы процессов: читатели (которые могут только читать ресурс, но не изменяют его) и писатели (которые изменяют ресурс). В каждый момент работать с ресурсом может сразу несколько читателей (когда ресурс не изменяется писателями), но не более одного писателя. Краткие итоги Синхронизация процессов – актуальная задача, исследование которой началось с работ Э. Дейкстры в 1960-х гг. Совместный доступ процессов к общим данным (race condition) может привести к нарушению их целостности, поэтому необходима их синхронизация. При решении задачи ограниченного буфера, переменная counter (счетчик числа элементов в буфере) играет роль общего ресурса для производителя и потребителя, по которому необходима их синхронизация. Если ее не использовать, переменная может принять некорректное значение из-за совместного исполнения операций над ней в двух процессах (interleaving). Операции над ней должны быть атомарны, и должно быть обеспечено их взаимное исключение. В общем случае, если имеется n процессов, у каждого из них есть своя критическая секция – фрагмент кода, работающий с общим ресурсом, и необходимо обеспечить взаимное исключение исполнения критических секций. Для решения проблемы критических секций необходимо выполнение трех условий: взаимное исключение, прогресс (выбор системой за конечное время одного из процессов для исполнения критической секции), ограниченное ожидание (ограничение на время ожидания от момента заявки процесса на исполнение критической секции до момента ее удовлетворения). Рассмотрены три алгоритма решения проблемы критических секций. Первый использует переменную для номера текущего процесса, исполняющего критическую секцию (не удовлетворяет условию прогресс). Второй хранит информацию о процессах-претендентах на исполнение критических секций, но не хранит информацию о номере текущего процесса (также не удовлетворяет условию прогресс). Третий использует комбинацию этих подходов и решает проблему, однако он оказывается достаточно сложным для понимания и реализации. Алгоритм булочной – еще один подход к решению проблемы критических секций. Использует присвоение уникального номера в очереди (приоритета) каждому процессу. Алгоритмы синхронизации более просты, если они используют аппаратную поддержку атомарных операций – проверка и установка (test-and-set) и перестановка значений двух переменных (swap). Приведена реализация синхронизации процессов с использованием обеих операций. 151 Общий семафор (по Э. Дейкстре) – синхронизирующий примитив: целая переменная, над которой определены семафорные операции wait и signal. Приведено решение проблемы критических секций с помощью семафоров. Семафор реализуется в виде структуры из двух полей: счетчик и ссылка на список ждущих процессов. Для реализации операций над семафором достаточно двух примитивов: block – блокировка текущего процесса, wakeup(P) – разблокировка процесса P. Семафоры могут использоваться как общее средство синхронизации по ресурсам и по событиям. Используются две разновидности семафоров – общие (с целым значением) и двоичные (значениями могут быть только 0 и 1). Общий семафор может быть реализован с помощью двоичных семафоров. В системе "Эльбрус" имеется вариант операции ожидания жуж (жужжать на процессоре) для системных процессов – без прерывания, с удержанием процессора до момента разблокировки. Имеются при классических задачи (схемы) синхронизации процессов – ограниченный буфер, читатели-писатели и обедающие философы. Рассмотрены решения этих задач с использованием семафоров. Критические области – высокоуровневая конструкция для синхронизации, основанная на описаниях разделяемых ресурсов (shared) и конструкции region, обеспечивающей взаимное исключение критических секций более удобным и надежным способом, чем семафоры. Рассмотрено решение задачи "ограниченный буфер" с помощью критических областей. Рассмотрена схема реализации критических областей с использованием семафоров. Монитор (по Ч. Хоару) – высокоуровневая конструкция для синхронизации: многовходовый модуль, содержащий описание общих данных и операций над ними в виде процедур. Обеспечивается взаимное исключение исполнения мониторных операций. Монитор может также содержать условные переменные, для которых определены операции wait и signal для организации дополнительных очередей процессов. Рассмотрено решение задачи "обедающие философы" с использованием монитора. Описана реализация монитора и условных переменных с помощью семафоров. В системе Solaris для синхронизации используются адаптивные мьютексы, блокировщики читателей-писателей, условные переменные и "вертушки" (turnstiles), позволяющие сочетать применение адаптивных мьютексов и блокировщиков читателей-писателей. В системе Windows 2000 для синхронизации используются вертящиеся замки (spinlocks) и объекты-диспетчеры, генерирующие события (аналогичные условным переменным). Набор для практики Вопросы 1. Почему необходима синхронизация параллельных процессов? 2. В чем суть задачи "ограниченный буфер"? 3. Почему необходимы атомарность и взаимное исключение операций над счетчиком числа элементов в буфере? 4. Что такое interleaving и в чем его опасность при использовании общих переменных параллельными процессами? 5. Что такое конкуренция за общие данные (race condition)? 6. Сформулируйте в общем виде проблему критических секций. 7. Какие условия необходимы для решения проблемы критических секций? 8. Что такое взаимное исключение? 9. В чем суть условия "прогресс" для решения проблемы критических секций? 10. В чем суть условия "ограниченное ожидание" для решения проблемы критических секций? 11. Что такое алгоритм булочной и на какой идее упорядочения процессов он основан? 12. Какие атомарные операции, поддержанные аппаратно, используются для синхронизации и каким образом? 13. Что такое общий семафор и какие операции над ним определены? 14. Как реализуются семафоры и операции над ними? 15. Как использовать семафоры для синхронизации по событиям? 152 16. Как используются семафоры для решения проблемы критических секций? 17. Что такое двоичный семафор? 18. Что такое семафорный бит? 19. В чем суть операции ЖУЖ для системных процессов и в чем ее отличие от операции ЖДАТЬ? 20. Как реализуются общие семафоры и операции над ними с использованием двоичных семафоров? 21. Какие Вы знаете классические задачи (схемы) синхронизации? 22. Как реализуется решение задачи ограниченный буфер с использованием семафоров? 23. Как реализуется решение задачи читатели-писатели с использованием семафоров? 24. Как реализуется решение задачи обедающие философы с использованием семафоров? 25. Что такое критические области? 26. Как реализуется решение задачи ограниченный буфер с использованием критических областей? 27. Как реализуются критические области с использованием семафоров? 28. Что такое мониторы (как средство синхронизации)? 29. Какие условия должны выполняться при исполнении операций монитора? 30. Что такое условные переменные и какие операции над ними определены? 31. Как реализуется решение задачи обедающие философы с использованием монитора? 32. Как реализуются мониторы, их операции и условные переменные с использованием семафоров? 33. Какие средства синхронизации используются в системе Solaris? 34. Какие средства синхронизации используются в системе Windows 2000? Упражнения 1. Реализуйте алгоритм решения задачи ограниченный буфер со взаимным исключением критических секций. 2. Реализуйте алгоритм булочной. 3. Реализуйте алгоритмы синхронизации процессов с использованием операций TestAndSet и Swap (в предположении, что они атомарны). 4. Реализуйте общие семафоры и операции над ними. 5. Реализуйте двоичные семафоры и операции над ними. 6. Реализуйте алгоритм синхронизации критических секций с использованием семафоров. 7. Реализуйте общие семафоры с использованием двоичных семафоров. 8. Реализуйте алгоритм решения задачи ограниченный буфер с использованием семафоров. 9. Реализуйте алгоритм решения задачи читатели-писатели с использованием семафоров. 10. Реализуйте алгоритм решения задачи, обедающие философы с использованием семафоров. 11. Реализуйте алгоритм решения задачи читатели-писатели с использованием критических областей. 12. Реализуйте алгоритм решения задачи, обедающие философы с использованием критических областей. 13. Реализуйте общие области и конструкцию region с использованием семафоров. 14. Реализуйте алгоритм решения задачи ограниченный буфер с использованием мониторов. 15. Реализуйте алгоритм решения задачи читатели-писатели с использованием мониторов. 16. Реализуйте мониторы и условные переменные с использованием семафоров. Темы для курсовых работ, рефератов, эссе 1. История синхронизации процессов (реферат). 2. Сравнение возможностей достоинств и недостатков различных средств синхронизации процессов (реферат). 3. Концепция семафора и ее использование для синхронизации процессов (реферат). 4. Концепция монитора и ее использование для синхронизации процессов (реферат). 5. Концепция критической области и ее использование для синхронизации процессов (реферат). 153 6. 7. 8. 9. Классические задачи и схемы синхронизации процессов и их решение (реферат). Средства синхронизации в ОС Solaris (реферат). Средства синхронизации в ОС Windows 2000 (реферат). Реализация алгоритмов решения задачи ограниченный буфер со взаимным исключением критических секций (курсовая работа). 10. Реализация алгоритма булочной (курсовая работа). 11. Реализация алгоритмов синхронизации процессов с использованием операций TestAndSet и Swap (в предположении, что они атомарны) (курсовая работа). 12. Реализация общих семафоров и операций над ними (курсовая работа). 13. Реализация двоичных семафоров и операций над ними (курсовая работа). 14. Реализация алгоритма синхронизации критических секций с использованием семафоров (курсовая работа). 15. Реализация общих семафоров с использованием двоичных семафоров (курсовая работа). 16. Реализация алгоритма решения задачи ограниченный буфер с использованием семафоров (курсовая работа). 17. Реализация алгоритма решения задачи читатели-писатели с использованием семафоров (курсовая работа). 18. Реализация алгоритма решения задачи, обедающие философы с использованием семафоров (курсовая работа). 19. Реализация алгоритма решения задачи читатели-писатели с использованием критических областей (курсовая работа). 20. Реализация алгоритма решения задачи, обедающие философы с использованием критических областей (курсовая работа). 21. Реализация критических областей и конструкции region с использованием семафоров (курсовая работа). 22. Реализация алгоритма решения задачи ограниченный буфер с использованием мониторов (курсовая работа). 23. Реализация алгоритма решения задачи читатели-писатели с использованием мониторов (курсовая работа). 24. Реализация мониторов и условных переменных с использованием семафоров (курсовая работа). 154 13. Лекция: Тупики (deadlocks), методы предотвращения и обнаружения тупиков В лекции вводится понятие тупика (deadlock), рассматриваются модель системы, граф распределения ресурсов, граф wait-for, методы обработки и предотвращения тупиков. Содержание Введение Проблема тупиков Модель системы Граф распределения ресурсов Поиск тупиков по графу распределения ресурсов Методы обработки тупиков Предотвращение тупиков Избегание тупиков Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Одна из важных задач операционной системы – распределение ресурсов компьютера между процессами. С данной задачей тесно связано понятие тупика (deadlock). В лекции введены базовые понятия, касающиеся распределения ресурсов и обнаружения тупиков. Рассмотрены следующие вопросы: Модель системы Граф распределения ресурсов Характеристика тупиков Обработка тупиков Предотвращение тупиков. Проблема тупиков Тупик (deadlock) – множество заблокированных процессов, каждый из которых владеет некоторым ресурсом и ожидает ресурса, которым владеет какой-либо другой процесс из этого множества. Простой пример тупика легко смоделировать с помощью семафоров (см. "Методы синхронизации процессов"). Пусть в системе есть два внешних устройства A и B, к которым обращаются два процесса P1 и P2. С каждым из внешних устройств с целью синхронизации связан семафор, которые будем обозначать также A и B. Семафоры изначально открыты. Пусть каждому из процессов необходимы оба устройства, но они обращаются к ним в противоположном порядке: P1: wait(A); wait (B) P2: wait(B); wait (A). В данном случае будет иметь место тупик: процесс P1, закрыв семафор A и заблокировав первое устройство, никогда не дождётся, когда откроется семафор B, связанный со вторым устройством, так как его уже успел закрыть процесс P2. Аналогично, процесс P2 никогда не дождется, когда откроется семафор A. Модель системы Для описания и исследования подобных ситуаций введем формальную модель системы в общем виде. С помощью модели будем представлять информацию о запросах процессов к ресурсам, о фактическом владении процессов ресурсами и об освобождении ресурсов. Пусть в системе имеется m видов ресурсов (например, процессор, память, устройства ввода-вывода). Будем обозначать типы ресурсов в системе R1, R2, … Rm. Пусть каждый тип ресурса Ri имеет Wi экземпляров. 155 Каждый процесс может использовать ресурс одним из следующих способов: запрос (request) использование (use) освобождение (release). Тупик может возникнуть, если одновременно выполняются следующие четыре условия: 1. взаимное исключение: только один процесс в каждый момент времени может получить доступ к ресурсу; 2. удержание и ожидание: процесс, удерживающий один ресурс, ожидает приобретения других ресурсов, которыми обладают другие процессы; 3. отсутствие прерываний: процесс может освободить ресурс только добровольно, когда завершит свою работу; 4. циклическое ожидание: существует множество {P0, P1, … P0}, такое, что P0 ожидает ресурса, которым обладает P1; P1 ожидает ресурса, которым обладает P2 … Pn ожидает ресурса, которым обладает P0. Граф распределения ресурсов Введем в рассмотрение граф распределения ресурсов, состоящий из множества вершин V и множества дуг E. V подразделяется на два типа вершин: вершина-процесс и вершина-ресурс. Иначе говоря, V подразделяется на вершины типа P = {P1, P2, … ,Pn} множество всех процессов в системе, и вершины типа R = {R1, R2, … ,Rm} Введем два типа дуг: дуга типа "запрос" (request edge) – направленная дуга типа Pi -> Rj дуга типа "присваивание" (assignment edge) – направленная дуга типа Pi -> Rj. Смысл различных направленностей дуг в следующем. Если процесс претендует на какойлибо ресурс, то дуга проводится из вершины-процесса в вершину-ресурс. Когда же конкретная единица ресурса уже выделена какому-либо конкретному процессу, то дуга, в знак этой принадлежности, и проводится из вершины-ресурса в вершину процесс. Уточним особенности вводимого графа и его вершин. В современной терминологии, граф данного вида называется reserved graph. Его вершина-процесс имеет обычный вид, а вершина-ресурс, соответствующая ресурсу Rj, состоит из Wj подвершин, каждая из которых обозначает конкретную единицу ресурса. В теории reserved graphs такие вершины иногда называют супервершинами (super-vertices). Таким образом, дуга запроса ведет из вершины-процесса в вершину-ресурс в целом, а дуга присваивания ведет из соответствующей подвершины вершины-ресурса в вершину-процесс. Пример вершины-процесса приведен на рис. 13.1. Рис. 13.1. Пример вершины-процесса в графе распределения ресурсов. Пример (супер)вершины-ресурса с четырьмя экземплярами приведен на рис. 13.2: каждому экземпляру ресурса соответствует своя подвершина. Рис. 13.2. Пример вершины-ресурса с четырьмя экземплярами. Пример графа распределения ресурсов приведен на рис. 13.3. 156 Рис. 13.3. Пример графа распределения ресурсов. Данный граф изображает систему с тремя процессами и четырьмя видами ресурсов: ресурсы видов 1 и 3 имеют по одному экземпляру, ресурс вида 2 – два экземпляра, ресурс вида 4 – три экземпляра. Процесс 1 претендует на ресурс 1, который занят процессом 2. Процесс 2 претендует на ресурс 3, который занят процессом 3. Две единицы ресурса 2 отданы процессам 1 и 2. Ресурс 4 не распределялся (все три единицы свободны). Поиск тупиков по графу распределения ресурсов Очевидно, что цикл в таком графе может означать наличие тупика. На рис. 13.4 приведен пример графа с тупиком. Имеется ситуация циклического ожидания между процессами 1, 2 и 3. Процесс 1 претендует на ресурс, которым владеет процесс 2. Процесс 2 претендует на ресурс, которым владеет процесс 3. Процесс 3 претендует на ресурс, одна единица которого отдана процессу 1, а вторая – процессу 2. Рис. 13.4. Пример графа распределения ресурсов с тупиком. Однако не всегда наличие цикла в графе распределения ресурсов означает наличие тупика. На рис. 13.5 приведен пример графа распределения ресурсов с циклом, но без тупика. Рис. 13.5. Пример графа распределения ресурсов с циклом, но без тупика. 157 В данном случае (рис. 13.5) имеется четыре процесса и два вида ресурсов. В цикле участвуют вершины-процессы 1 и 3. Однако, благодаря тому, что каждого ресурса имеется по две единицы, тупика удается избежать: процесс 1, ожидающий ресурса 1, сможет его получить, когда завершится процесс 2 (а не процесс 1), обладающий одной единицей данного ресурса и не входящий в цикл ожидания. Аналогично, процесс 3, претендующий на ресурс 2, сможет его получить после его освобождения процессом 4 (а не 1). Таким образом, можно сформулировать следующие утверждения: Если граф распределения ресурсов не содержит циклов, то в системе тупиков нет; Если граф распределения ресурсов содержит цикл, то возможно два случая: o Если ресурсов каждого вида имеется только по одному экземпляру, то имеет место тупик; o Если ресурсов по несколько экземпляров, то тупик возможен. Методы обработки тупиков Теоретически возможны следующие методы обработки тупиков: Убедиться в том, что система никогда не войдет в состояние тупика; Допустить, чтобы система могла входить в состояние тупика, но предусмотреть возможность восстановления после тупика. К сожалению, на практике во многих ОС (включая UNIX) используется и третий "метод" борьбы с тупиками: проблема тупиков игнорируется, но авторы ОС без каких-либо обоснований претендуют на то, что в системе тупики невозможны. Предотвращение тупиков Проанализируем, какие методы предотвращения тупиков возможны. Основная идея – ограничить методы запросов ресурсов со стороны процессов. Чтобы ограничить возможность взаимного исключения владения ресурсами (первое условие тупика), необходимо заметить, что оно требуется не для всех ресурсов. Для разделяемых ресурсов (например, массивов констант, кодов, файлов) оно не требуется. Чтобы ограничить возможность удержания и ожидания (второе условие тупика), можно потребовать, чтобы процесс, запрашивающий некоторый ресурс, не обладал бы больше никакими ресурсами. Альтернативным вариантом является требование, чтобы все процессы приобретали все необходимые им ресурсы до фактического начала их исполнения. К сожалению, реализация обоих этих требований приводит к недостаточности использования ресурсов и возможности "голодания" (starvation). Более разумной представляется стратегия перераспределения ресурсов при каждом ожидании процессом ресурса. Если процесс обладает некоторым ресурсом A и запрашивает другой ресурс B, который не может быть ему немедленно выделен, то процесс должен ждать. При этом ресурс A, занимаемый процессом, должен быть немедленно освобожден. Ресурс A добавляется к списку ресурсов, которые ожидает процесс. Процесс может быть возобновлен, только если ему могут быть выделены одновременно все старые ресурсы, которыми он обладал, и те новые ресурсы, которых он ожидает. Для предотвращения ситуации циклического ожидания самое простое решение – ввести упорядочение по номерам всех видов ресурсов и требовать, чтобы процесс запрашивал ресурсы только в порядке возрастания их номеров. На практике подобное решение вряд ли применимо и удобно, так как специфика потребляемых и требуемых типов ресурсов никак не зависит ни от какой возможной нумерации, и потребность в ресурсе с любым номером может возникнуть по мере необходимости. Избежание тупиков Методы избегания тупиков требуют, чтобы система обладала дополнительной априорной информацией о процессе и его потребностях в ресурсах с момента ввода каждого процесса в систему. Наиболее простая и полезная модель требует, чтобы каждый процесс при вводе в систему указывал максимальный объем ресурсов каждого типа, которые могут ему понадобиться. Данный подход был реализован даже в ранних ОС и носит название паспорт задачи – спи- 158 сок максимальных потребностей процесса в ресурсах каждого типа – оперативной и внешней памяти, времени выполнения, листах печати и др. Например, в ОС ДИСПАК для БЭСМ-6 (еще в 1960-х гг.) паспорт задания мог иметь вид: ЛИСТ 0-37^ТРАК 50^ВРЕМ 240^АЦПУ 10^ где ЛИСТ – диапазон листов (страниц) основной памяти, ТРАК – требуемый объем внешней памяти на магнитном барабане, ВРЕМ – максимальное время выполнения (2 минуты 40 секунд, что соответствовало одному из быстрых классов заданий), АЦПУ – максимальный объем выдачи на печатающее устройство в листах. При попытке превышения хотя бы одного из указанных ограничений операционная система снимала задачу со счета с соответствующим диагностическим сообщением для пользователя. Вернемся к избеганию тупиков. Алгоритм избегания тупиков должен анализировать состояние распределения ресурсов, чтобы убедиться, что никогда не может возникнуть ситуация циклического ожидания. Состояние распределения ресурсов описывается как объем доступных ресурсов, объем распределенных ресурсов и максимальные требования процессов. В следующей лекции рассмотрены конкретные методы и алгоритмы избегания тупиков и определения безопасности состояния системы, основанные на данных принципах. Ключевые термины Reserved graph – ориентированный граф, содержащий, кроме обычных вершин, также супервершины; дуга в таком графе может вести из обычной вершины в супервершину или из подвершины супервершины в обычную вершину. Вершина-процесс – вершина в графе распределения ресурсов, изображающая процесс. Вершина-ресурс – супервершина в графе распределения ресурсов, изображающая каждую единицу ресурса какого-либо типа. Взаимное исключение – одно из необходимых условий тупика: только один процесс в каждый момент времени может получить доступ к ресурсу. Граф распределения ресурсов – граф, описывающий состояние распределения ресурсов в системе, состоящий из множества вершин (типа вершина-процесс и вершинаресурс) и множества дуг (дуги типа запрос и дуги типа присваивание). Дуга типа "запрос" (request edge) – направленная дуга из вершины-процесса в вершину-ресурс. Дуга типа "присваивание" (assignment edge) – направленная дуга из подвершины, изображающей конкретную единицу ресурса, в вершину-процесс. Запрос (request) - действие процесса по запросу к ОС о необходимости выделения ему ресурса какого-либо вида. Использование (use) – владение и потребление процессом полученной от ОС единицей некоторого вида ресурса. Освобождение (release) – возврат процессом операционной системе единицы использованного и более не требующегося процессу ресурса. Отсутствие прерываний – одно из необходимых условий тупика: процесс может освободить ресурс только добровольно, когда завершит свою работу. Паспорт задачи – в ранних ОС: список максимальных потребностей процесса в ресурсах каждого типа – оперативной и внешней памяти, времени выполнения, листах печати и др. Супервершина (в составе reserved graph) – структурированная вершина, содержащая одну или несколько подвершин, из которых могут вести дуги. 159 Тупик (deadlock) – циклическая последовательность заблокированных процессов, каждый из которых владеет некоторым ресурсом и ожидает ресурса, которым владеет какойлибо другой процесс из этого множества. Удержание и ожидание – одно из необходимых условий тупика: процесс, удерживающий один ресурс, ожидает приобретения других ресурсов, которыми обладают другие процессы. Циклическое ожидание – одно из необходимых условий тупика: существует множество {P0, P1, … P0}, такое, что P0 ожидает ресурса, которым обладает P1; P1 ожидает ресурса, которым обладает P2 … Pn ожидает ресурса, которым обладает P0. Краткие итоги Тупик – ситуация взаимной блокировки процессов, при которой существует циклическая потребность процессов, такая что первый процесс ожидает некоторого ресурса, которым обладает второй процесс, ... n-й процесс ожидает некоторого ресурса, которым обладает первый процесс. Простой пример тупика – два процесса, каждый из которых пытается закрыт последовательно два одних и тех же семафора, но в одном из процессов вызовы операций закрытия семафоров переставлены местами. Тупик может возникнуть, если выполнены четыре условия: взаимное исключение, удержание и ожидание, отсутствие прерываний, циклическое ожидание. Для анализа тупиков и разработки методов их обработки и избежание вводится формальная модель системы. Она основана на графе распределения ресурсов с вершинамипроцессами и вершинами-ресурсами. Вершина-ресурс может иметь несколько подвершин, если ресурса данного типа в системе больше одной единицы. Дуги запроса ведут из вершины-процесса в вершину-ресурс, дуги присваивания – из подвершины-ресурса в вершинупроцесс. Если в графе распределения ресурсов нет циклов, то в системе нет тупиков. Если цикл присутствует, то имеет место тупик, если каждого ресурса в системе только по одному экземпляру; если есть ресурсы с количеством экземпляров более одного, то имеет место возможность тупика. Возможны графы распределения ресурсов с циклом, но без тупика. Возможны следующие методы обработки тупиков: либо убедиться, что система не может войти в состояние тупика, либо допускать состояние тупика, но предусматривать меры по восстановлению системы из тупика. На практике авторы многих ОС голословно утверждают, что в их системе тупики невозможны, чем фактически игнорируют эут проблему. Для предотвращения тупиков необходимо ограничивать методы запросов процессами системных ресурсов. Разделяемые ресурсы не требуют взаимного исключения владения ими. Методы, при которых от процесса требуется, чтобы он, запрашивая некоторый ресурс, ничем больше не обладал, либо чтобы каждый процесс приобретал все ресурсы до момента своего исполнения, могут привести к недостаточному использованию ресурсов и к "голоданию". Более разумна стратегия с перераспределением ресурсов, при которой, если процесс не может немедленно получить запрашиваемый ресурс, то он должен отдать все остальные ресурсы, которыми он обладает, которые также добавляются к списку его неудовлетворенных потребностей. Процесс возобновляется только в случае, если он может получить назад все старые ресурсы вместе с новыми запрашиваемыми ресурсами. Не вполне реалистичным представляется метод, при котором все типы ресурсов перенумеровываются, и от процессов требуется, чтобы они запрашивали ресурсы только в порядке возрастания номеров. Наиболее простая и полезная модель избегание тупиков требует, чтобы для каждого процесса при его вводе в систему указывались бы все его максимальные потребности в системных ресурсах каждого типа (как в паспорте задачи в ранних ОС). Алгоритм избегание тупиков должен анализировать состояния системы и не допускать, чтобы система перешла в небезопасное (с точки зрения возможности тупиков) состояние. Состояние системы описывается как объем доступных и распределенных ресурсов, а также максимальные потребности каждого из процессов. 160 Набор для практики Вопросы 1. Что такое тупик? 2. Приведите простой пример тупика с двумя процессами и двумя внешними устройствами. 3. Какие предположения о процессах и ресурсах в системе делаются для построения ее формальной модели? 4. Какие действия над ресурсом может выполнять процесс? 5. Каковы условия возникновения тупика? 6. Что такое взаимное исключение (как условие возникновения тупика)? 7. Что такое удержание и ожидание (как условие возникновения тупика)? 8. Что такое отсутствие прерываний (как условие возникновения тупика)? 9. Что такое циклическое ожидание (как условие возникновения тупика)? 10. Что такое граф распределения ресурсов? 11. Что такое вершина-процесс? 12. Что такое (супер) вершина-ресурс? 13. Какого типа дуги ведут из вершин-процессов в вершины-ресурсы? 14. Какого типа дуги ведут из подвершин-ресурсов в вершины-процессы? 15. Есть ли в системе тупик, если граф распределения ресурсов не содержит циклов? 16. Есть ли в системе тупик, если граф распределения ресурсов содержит цикл, и в системе каждого ресурсам имеется только по одному экземпляру? 17. Какие методы обработки тупиков возможны? 18. Какую ошибку совершают авторы многих ОС по отношению к проблеме тупиков? 19. Какие ограничения на запросы процессами ресурсов возможны для предотвращения тупиков? 20. Как перераспределять ресурсы процесса, чтобы избежать ситуации удержания и ожидания? 21. Какую информацию о процессах необходимо указать при их вводе в систему, чтобы можно было применить методы избежание тупиков? 22. Как определяется состояние распределения ресурсов в системе? Упражнения 1. Предложите свой простой пример тупика, основанный на использовании семафоров. 2. Реализуйте модель системы, состоящей из процессов и ресурсов, и граф ее распределения ресурсов. 3. Приведите свои примеры графа распределения ресурсов с тупиком и графа распределения ресурсов с циклом, но без тупика. Темы для курсовых работ, рефератов, эссе 1. Методы обработки, предотвращения и избегание тупиков при распределении ресурсов в операционных системах (реферат). 2. Граф распределения ресурсов в ОС и его использование для анализа тупиков (реферат). 3. Реализация модели системы, состоящей из процессов и ресурсов, и граф ее распределения ресурсов (курсовая работа). 161 162 14. Лекция: Алгоритм банкира В лекции рассмотрены понятие безопасного состояния системы, алгоритм банкира, алгоритмы обнаружения тупиков. Содержание Введение Безопасное состояние системы Модифицированный вариант графа распределения ресурсов для стратегии избегания тупиков Принципы алгоритма банкира Структуры данных для алгоритма банкира Алгоритм проверки состояния системы на безопасность Алгоритм запроса ресурсов для процесса Pi – основная часть алгоритма банкира Пример использования алгоритма банкира Методы обнаружения тупиков Граф wait-for Обнаружение тупиков для случая ресурсов с множественными экземплярами Алгоритм обнаружения тупиков Пример применения алгоритма обнаружения тупиков Использование алгоритма обнаружения тупиков Восстановление после тупика Комбинированный подход к обработке тупиков Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение В данной лекции продолжается изложение темы, начатой в "Тупики (deadlocks), методы предотвращения и обнаружения тупиков ", - методы и алгоритмы борьбы с тупиками при распределении ресурсов операционной системой. Рассмотрены следующие вопросы: Определение безопасного состояния системы Алгоритм построения графа распределения ресурсов Алгоритм банкира для безопасного распределения ресурсов (с избежанием тупиков) Принципы обнаружения тупиков Граф wait-for Алгоритм обнаружения тупиков и его использование Восстановление после тупика Комбинированный подход к обработке тупиков. Безопасное состояние системы Безопасным состоянием назовем такое состояние, перевод системы в которое не приведет к появлению тупиков. Общий принцип избегания тупиков состоит в следующем. Когда процесс запрашивает доступный ресурс, система должна определить, приведет ли немедленное выделение данного ресурса к безопасному состоянию системы. Система находится в безопасном состоянии, если существует безопасная последовательность, состоящая из всех процессов в системе. Безопасной последовательностью процессов называется последовательность процессов <P1, … Pn>, такая, что для каждого процесса Pi ресурсы, которые он может еще запросить, могут быть выделены из текущих доступных ресурсов и ресурсов, удерживаемых процессами Pj , где j < i. Если последовательность процессов безопасна, то система может придерживаться следующей безопасной стратегии, с точки зрения распределения ресурсов и исполнения процессов: 163 Если потребности процесса Pi в ресурсах не могут быть немедленно удовлетворены, то процесс может подождать, пока завершатся процессы P j (где j < i), удерживающие требуемые ресурсы; Когда процессы Pj завершены, процесс Pi может получить требуемые ресурсы, выполниться, вернуть удерживаемые ресурсы и завершиться; После завершения процесса Pi , процесс Pi+1 может получить требуемые им ресурсы, и т.д. Таким образом, справедливы следующие утверждения: Если система в безопасном состоянии, тупиков нет; Если системы в небезопасном состоянии, тупики возможны; Для того, чтобы избежать тупиков, необходимо проверять перед выделением ресурсов, что система никогда не придет в небезопасное состояние. Модифицированный вариант графа распределения ресурсов для стратегии избежания тупиков Граф распределения ресурсов рассмотрен в "Тупики (deadlocks), методы предотвращения и обнаружения тупиков ". Для реализации стратегии избегания тупиков к данному графу необходимо добавить информацию не только о фактических, но и о возможных в будущем запросах ресурсов со стороны процессов. Для этого, в дополнение к дугам запросов и присваиваний, введем в рассмотрение дугу потребности (claim edge), которая ведет из вершины-процесса Pi в вершину-ресурс Rj, обозначается пунктирной линией и означает, что процесс Pi может потребовать ресурс Rj. Когда процесс фактически запрашивает данный ресурс, дуга потребности преобразуется в дугу запроса (пунктирная линия заменяется сплошной). Когда процесс освобождает ресурс, дуга присваивания преобразуется обратно в дугу потребности. Цель данной модификации графа – обеспечить, чтобы потребность в ресурсах была априорно известна системе. Пример графа распределения ресурсов для стратегии избегания тупиков приведен на рис. 14.1. Рис. 14.1. Пример графа распределения ресурсов для стратегии избегания тупиков. Легко видеть, что небезопасные состояния системы отображаются циклами в модифицированном графе распределения ресурсов. Пример небезопасного состояния на графе распределения ресурсов приведен на рис. 14.2. Принципы алгоритма банкира Алгоритм банкира для безопасного распределения ресурсов операционной системой (с избеганием тупиков) был предложен Э. Дейкстрой и впервые реализован в операционной системе THE в конце 1960-х гг. Происхождение названия связано с тем, что поведение алгоритма напоминает осторожную стратегию банкира при проведении банковских операций. Принципы алгоритма банкира следующие. 164 Каждый процесс должен априорно обозначить свои потребности в ресурсах по максимуму. Когда процесс запрашивает ресурс, ему, возможно придется подождать (выделение ресурсов по запросу не всегда может произойти немедленно). Когда процесс получает требуемые ресурсы, он должен их вернуть системе за ограниченный период времени. Рис. 14.2. Пример небезопасного состояния на графе распределения ресурсов. Структуры данных для алгоритма банкира Пусть в системе имеется n процессов и m типов ресурсов. Вектор Available длины m содержит информацию о доступных ресурсах. Если Avaliable[j] = k, то в системе в данный момент доступно k единиц ресурса j. Матрица Max (n * m) отображает максимальные потребности процессов в ресурсах. Если Max [i, j] = k, то процесс i может запросить, самое большее, k единиц ресурса j. Матрица Allocation (n * m) отображает фактическое выделение системой ресурсов. Если Allocation [i, j] = k, то процессу i в данный момент выделено системой k единиц ресурса j. Матрица Need (n * m) отображает оставшиеся потребности процессов в ресурсах. Если Need [i, j] = k, то процессу i могут потребоваться еще k единиц ресурса j для завершения работы. Имеет место следующее соотношение между элементами матриц: Need [i, j] = Max [i, j] – Allocation [i, j]. Алгоритм проверки состояния системы на безопасность В обозначениях раздела Структуры данных для алгоритма банкира, рассмотрим алгоритм проверки состояния системы на то, является ли оно безопасным. Введем целочисленный вектор Work (длины m) и булевский вектор Finish (длины n). Вектор Work отображает пробные выделения ресурсов. Вектор Finish представляет информацию о завершаемости процессов при данном состоянии системы. Алгоритм безопасности. Шаг 1. Инициализация. Work = Available Finish [i] = false для i = 1, …, n. Здесь и в дальнейшем все присваивания и сравнения, в которых участвуют векторы или матрицы, выполняются поэлементно. Шаг 2. Находим i, такое, что: Finish [i] = false Need [i] <= Work Если такого i нет, переходим к шагу 4. Шаг 3. 165 Work = Work + Allocation [i] Finish [i] = true Переход к шагу 2. Шаг 4. Если Finish[i] = true для всех i = 1, …, n, то система в безопасном состоянии. Необходимые пояснения к алгоритму: Алгоритм строит безопасную последовательность номеров процессов i, если она существует. На каждом шаге, после обнаружения очередного элемента последовательности, алгоритм моделирует освобождение i - м процессом ресурсов после его завершения. На шаге 1 присваивание векторов выполняется поэлементно. На шаге 2, Need – матрица потребностей (n * m); Need[i] - строка матрицы, представляющая вектор потребностей (длины m) процесса i. Сравнение выполняется поэлементно, и его результат считается истинным, если соотношение выполнено для всех элементов векторов. Проверяемое условие означает, что потребности процесса i с найденным номером могут быть удовлетворены немедленно, и процесс может получить их и завершиться. На шаге 3, Allocation [i] – строка матрицы Allocation, обозначающая текущие ресурсы, выделенные процессу i. С помощью вектора Work моделируется освобождение ресурсов i – м процессом, после чего процессу присваивается признак завершаемости. Формальное доказательство корректности алгоритма и оценку его сложности предоставляем студенту. Алгоритм запроса ресурсов для процесса Pi – основная часть алгоритма банкира Для основного алгоритма введем вектор Requesti (длины m) – вектор запросов для процесса Pi . Если Requesti [j] = k, то процесс Pi запрашивает k экземпляров ресурса Rj. Шаг 1. Если Requesti <= Need[i], перейти к шагу 2. Иначе – сгенерировать исключительную ситуацию (процесс превысил свои максимальные потребности). Шаг 2. Если Requesti <= Available, перейти к шагу 3. Иначе процесс должен ждать, так как ресурс недоступен. Шаг 3. Спланировать выделение ресурса процессу P i , модифицируя состояние системы следующим образом: Available = Available - Requesti Allocation = Allocation + Requesti Need [i] = Need [i] - Requesti Вызвать алгоритм проверки безопасности полученного состояния. Если состояние безопасно, выделить ресурс процессу Pi . Выход. Если состояние небезопасно, восстановить предыдущее состояние; процесс должен ждать. Пример использования алгоритма банкира Пусть имеется 5 процессов – P0 , …, P4 , и 3 типа ресурсов – ресурс A (10 экземпляров), ресурс B (5 экземпляров) и ресурс C (7 экземпляров). Пусть состояние системы в момент T0 следующее: Allocation Max Available A B C ABC A P0 0 1 0 7 5 3 3 P1 2 0 0 3 2 2 P2 3 0 2 9 0 2 P3 2 1 1 2 2 2 P4 0 0 2 4 3 3 B 3 C 2 Вычислим матрицу потребностей Need = Max – Allocation: 166 Need ABC P0 7 4 3 P1 1 2 2 P2 6 0 0 P3 0 1 1 P4 4 3 1 Нетрудно видеть, что система – в безопасном состоянии. Последовательность процессов <P1, P3, P4, P2, P0> удовлетворяет критерию безопасности. Проверку предоставляем студенту. В продолжение примера, предположим, что процесс P 1 сделал запрос (1 0 2). Проверяем, что Request <= Available: <(1 0 2) <= (3 3 2) = true. Удовлетворяем запрос. Состояние системы принимает вид: Allocation Max Available A B C ABC A P0 0 1 0 7 4 3 2 P1 3 0 2 0 2 0 P2 3 0 1 6 0 0 P3 2 1 1 0 1 1 P4 0 0 2 4 3 1 B 3 C 0 Исполнение алгоритма безопасности показывает, что последовательность процессов <P 1, P3, P4, P0, P2> удовлетворяет критерию безопасности. Предоставляем студенту проверку корректности данных преобразований и предлагаем ответить на следующие дополнительные вопросы: может ли быть удовлетворен запрос (3 3 0) для процесса P4 ? может ли быть удовлетворен запрос (0 2 0) для процесса P0 ? Методы обнаружения тупиков Как уже отмечалось в "Тупики (deadlocks), методы предотвращения и обнаружения тупиков ", альтернативным подходом к решению проблемы тупиков является обнаружение тупиков. При таком подходе система может позволить себе войти в состояние тупика. После этого применяется алгоритм обнаружения тупиков. После обнаружения тупика применяется схема восстановления после тупика. Граф wait-for В дополнение к графу распределения ресурсов, введем более простой по струтуре граф wait-for: вершины в нем соответствуют процессам, и дуга проводится из вершины P i в вершину Pj, если процесс Pi ожидает процесса Pj . Если каждый тип ресурса в системе существует в единственном экземпляре, то очевидно, что цикл в данном графе означает тупик. Система для обнаружения тупиков должна периодически проверять отсутствие циклов в графе wait-for. Как известно, алгоритм обнаружения цикла в графе требует O(n2) операций, где n – число вершин в графе. На рис. 14.3 приведен пример графа распределения ресурсов и соответствующего ему графа wait-for для системы с тупиком. 167 Рис. 14.3. Граф распределения ресурсов и граф wait-for. Обнаружение тупиков для случая ресурсов с множественными экземплярами В общем случае для построения алгоритма обнаружения тупиков будем использовать те же структуры, что и для алгоритма банкира: Вектор Available длины m содержит информацию о доступных ресурсах. Если Avaliable[j] = k, то в системе в данный момент доступно k единиц ресурса j. Матрица Allocation (n * m) отображает фактическое выделение системой ресурсов. Если Allocation [i, j] = k, то процессу i в данный момент выделено системой k единиц ресурса j. Вектор Requesti (длины m) – вектор запросов для процесса Pi . Если Requesti [j] = k, то процесс Pi запрашивает k экземпляров ресурса Rj. Алгоритм обнаружения тупиков Аналогично алгоритму безопасности (раздел 14.6), введем целочисленный вектор Work (длины m) и булевский вектор Finish (длины n). Вектор Work отображает пробные выделения ресурсов. Вектор Finish представляет информацию о завершаемости процессов при данном состоянии системы. Шаг 1. Инициализация. Work = Available Для i = 1, …, n, если Allocation [i] != 0 то finish [i] = false иначе finish [i] = true. Шаг 2. Находим i, такое, что: Finish [i] = false Request [i] <= Work Если такого i нет, переходим к шагу 4. Шаг 3. Work = Work + Allocation [i] Finish [i] = true Переход к шагу 2. Шаг 4. Если Finish[i] = false для некоторого i от 1 до n, то система в состоянии тупика. Более того, если Finish[i] = false, то процесс Pi – в состоянии тупика. Обоснование и доказательство корректности алгоритма предоставляем студенту. Алгоритм требует O (m * n2) операций для определения того, находится ли система в состоянии тупика. 168 Пример применения алгоритма обнаружения тупиков Пусть имеется 5 процессов – P0 , …, P4 , и 3 типа ресурсов – ресурс A (7 экземпляров), ресурс B (2 экземпляра) и ресурс C (6 экземпляров). Пусть состояние системы в момент T0 следующее: Allocation Request A B C A B C P0 0 1 0 0 0 0 P1 2 0 0 2 0 2 P2 3 0 3 0 0 0 P3 2 1 1 1 0 0 P4 0 0 2 0 0 2 В данном состоянии системы последовательность процессов <P 0, P2, P3, P1, P4> безопасна (проверьте это!). В продолжение примера, пусть процесс P2 запрашивает дополнительный ресурс типа C: Request A B C P0 0 0 0 P1 2 0 1 P2 0 0 1 P3 1 0 0 P4 0 0 2 В данном случае имеет место тупик, в котором находятся процессы P 1, P2, P3, P4 . Проверьте это. Использование алгоритма обнаружения тупиков Как часто и в каких ситуациях системе следует использовать рассмотренный алгоритм обнаружения тупиков, зависит от того, как часто, по всей вероятности, будет иметь место тупик и сколько процессов будет необходимо откатить назад, чтобы выйти из тупика. Ответ на последний вопрос: по одному процессу для каждого из не пересекающихся циклов. Если алгоритм обнаружения тупиков будет вызываться произвольным образом, то в графе распределения ресурсов будет много циклов, и не будет возможности с достоверностью утверждать, какой из многих заблокированных процессов вызвал данный тупик. Восстановление после тупика Для выхода из тупика, очевидно, система должна прекратить все заблокированные процессы и освободить занимаемые ими ресурсы. Для более оптимального выполнения данного действия, система может прекращать на каждом шаге по одному процессу и после этого анализировать, ликвидирован ли тупик. Важный вопрос – в каком порядке необходимо прекращать процессы? Существуют различные подходы: В порядке приоритетов процессов; В зависимости то того, насколько долго процесс уже выполняется и сколько времени осталось до его завершения; В зависимости от объема ресурсов, которые удерживал процесс; В зависимости от объема ресурсов, требуемого для завершения процесса; В зависимости от того, сколько всего процессов требуется прекратить; В зависимости от того, является ли процесс интерактивным или пакетным. 169 После выбора процесса-"жертвы" с минимальной стоимостью (по одному из приведенных критериев), система прекращает выбранный процесс (процессы), освобождает их ресурсы и выполняет перераспределение ресурсов. Система выполняет "откат" к какому-либо предыдущему безопасному состоянию. В результате многократного выполнения подобных действий системы, возможно "голодание", так как в качестве жертвы может многократно выбираться один и тот же процесс. Комбинированный подход к обработке тупиков Скомбинируем три рассмотренных базовых подхода – предотвращение, избежание и обнаружение тупиков. Это позволит использовать оптимальный подход для каждого из системных ресурсов. Ресурсы могут быть разделены на иерархически упорядоченные классы, и система сможет использовать наиболее подходящий метод для обработки тупиков внутри каждого класса. Ключевые термины Алгоритм банкира (banker’s algorithm) - алгоритм Э. Дейкстры для избежания тупиков при распределении ресурсов операционной системой. Безопасная последовательность процессов – такая последовательность процессов <P1, … Pn>, что для каждого процесса Pi ресурсы, которые он может запросить, могут быть выделены из текущих доступных ресурсов и ресурсов, удерживаемых процессами P j, где j < i. Безопасное состояние – состояние, перевод системы в которое не приведет к появлению тупиков. Граф wait-for - ориентированный граф, вершины, в которой соответствуют процессам, а дуга проводится из вершины Pi в вершину Pj, если процесс Pi ожидает процесса Pj . Дуга потребности (claim edge) – дуга в графе распределения ресурсов, которая ведет из вершины-процесса в вершину-ресурс, обозначается пунктирной линией и означает, что данный процесс может потребовать данный ресурс. Краткие итоги Безопасное состояние системы – такое состояние, перевод системы в которое не приведет к созданию тупиков. Система в безопасном состоянии, если существует безопасная последовательность их всех процессов в системе. Безопасная последовательность – последовательность исполнения процессов, при которой каждый процесс использует только свободные ресурсы, либо ресурсы, освобождаемые процессом с меньшим номером после его завершения. Таким образом, если система в безопасном состоянии, тупиков нет. Если система в небезопасном состоянии, тупики возможны. Избежание тупиков – стратегия, обеспечивающая, чтобы система никогда не могли прийти в небезопасное состояние. Добавим к графу распределения ресурсов (лекция 13) новый вид дуг – дуги потребности. Она ведет из вершины-процесса в вершину-ресурс, обозначается пунктиром и означает, что процесс может потребовать данный ресурс. Дуга потребности преобразуется в дугу присваивания, когда система фактически выделяет данный ресурс процессу. При освобождении ресурса дуга присваивания преобразуется обратно в дугу потребности. Алгоритм банкира (Э. Дейкстра) – алгоритм распределения ресурсов операционной системой, обеспечивающий избежание тупиков. Его условия и принципы: возможны множественные экземпляры ресурсов; каждый процесс должен априорно обозначить свои максимальные потребности в ресурсах; при запросе ресурса возможно ожидание процесса; после получения ресурсов процесс должен вернуть их за ограниченный период времени. Для работы алгоритма используются вектор доступности ресурсов каждого вида, матрица максимальных потребностей процессов, матрица фактического выделения системой ресурсов процессам, матрица оставшихся потребностей процессов в ресурсах. Алгоритм безопасности определяет, является ли состояние системы безопасным, путем построения безопасной последовательности процессов. Алгоритм моделирует последовательное освобождение ресурсов процессами после их завершения. 170 Основной алгоритм банкира – алгоритм запроса ресурсов для процесса. Он проверяет, не превысил ли процесс свои максимальные потребности (иначе – исключительная ситуация). Далее проверяется, не превышает ли запрос имеющихся объемов доступных ресурсов, иначе – ожидание процессом их освобождения. Если все необходимые ресурсы для удовлетворения запроса имеются, алгоритм вычисляет новое состояние после удовлетворения запроса и проверяет его безопасность. Если новое состояние безопасно, запрос удовлетворяется. Если нет, происходит откат, и процесс ожидает освобождения необходимых ресурсов. Другая возможная стратегия – обнаружение тупиков: позволить системе войти в состояние тупика, применить алгоритм обнаружения тупиков и выполнить схему восстановления после тупика. Если каждый ресурс существует в единственном экземпляре, для обнаружения тупиков используется граф wait-for, в котором вершины соответствуют процессам, а дуга ведет из вершины A в вершину B, если процесс A ожидает процесса B. Сложность алгоритма обнаружения цикла в графе wait-for – O(n**2), где n – число процессов. Если имеются множественные экземпляры ресурсов, то для обнаружения тупиков используется алгоритм, аналогичный алгоритму построения безопасной последовательности процессов. Его сложность – O (m * n**2), где m – число типов ресурсов. После обнаружения тупиков система определяет, какое минимальное число процессов необходимо прекратить для ликвидации тупика. Для выбора процесса-жертвы существует ряд критериев, например, приоритет процесса или оставшееся время его выполнения. При прекращении процесса его ресурсы освобождаются. При применении данной стратегии возможно голодание, если в качестве жертвы система все время выбирает один и тот же процесс. Комбинированный подход к обработке тупиков сочетает в себе все три рассмотренных стратегии – предотвращение, избежание и обнаружение. Система подразделяет ресурсы на иерархически упорядоченные классы. Для каждого класса используется наиболее оптимальная стратегия. Набор для практики Вопросы 1. Что такое безопасное состояние системы? 2. Что такое безопасная последовательность процессов? 3. Есть ли в системе тупики, если система находится в безопасном состоянии? 4. Возможны ли в системе тупики, если она находится в небезопасном состоянии? 5. В чем суть стратегии избегания тупиков? 6. Что такое дуга потребности в графе распределения ресурсов? 7. В какую дугу преобразуется дуга потребности при фактическом выделении ресурса? 8. В какую дугу преобразуется дуга присваивания при освобождении ресурса? 9. Каковы основные принципы алгоритма банкира? 10. Какие структуры данных используются для алгоритма банкира? 11. В чем идея и каковы основные шаги алгоритма определения того, является ли состояние системы безопасным? 12. В чем идея и каковы основные шаги алгоритма удовлетворения запроса процесса? 13. В каких случаях в алгоритме банкира процесс должен ждать освобождения ресурсов? 14. В какой момент проверяется безопасность следующего состояния в алгоритме банкира? 15. В чем основные принципы стратегии обнаружения тупиков? 16. Что такое граф wait-for и как он используется для обнаружения тупиков? 17. В чем идея и каковы основные шаги алгоритма обнаружения тупиков для ресурсов с множественными экземплярами? 18. Как происходит восстановление системы после тупика? 19. По каким принципам выбирается процесс-жертва, который необходимо прекратить для ликвидации тупика? 20. Почему при многократном выборе процессов-жертв для выхода из тупиков возможно голодание процессов? 171 Упражнения 1. Реализуйте граф распределения ресурсов с дугами потребностей, запросов и присваиваний и операциями преобразования дуги потребностей и дугу присваивания и обратно. 2. Реализуйте алгоритм проверки безопасности состояния системы. 3. Реализуйте основной алгоритм банкира – удовлетворение запроса процесса. 4. Ответьте на вопросы в примере использования алгоритма банкира. 5. Реализуйте граф wait-for и алгоритм обнаружения циклов в нем. 6. Реализуйте алгоритм обнаружения тупиков. Темы для курсовых работ, рефератов, эссе 1. Алгоритм банкира (реферат). 2. Методы обработки тупиков при распределении ресурсов в операционных системах (реферат). 3. Реализация графа распределения ресурсов с дугами потребностей, запросов и присваиваний и операциями преобразования дуги потребностей и дугу присваивания и обратно (курсовая работа). 4. Реализация алгоритма проверки безопасности состояния системы (курсовая работа). 5. Реализация основного алгоритма банкира – удовлетворение запроса процесса (курсовая работа). 6. Реализация графа wait-for и алгоритма обнаружения циклов в нем (курсовая работа). 7. Реализация алгоритма обнаружения тупиков (курсовая работа). 172 15. Лекция: Управление памятью В лекции рассмотрены следующие вопросы: принципы управления памятью; устройство управления памятью; логическое и физическое адресные пространства; динамическая линковка; оверлейная структура программы. Содержание Введение Основные положения размещения процессов в памяти Связывание программ и данных с адресами в памяти Многоэтапная обработка пользовательской программы Логическое и физическое адресное пространство Устройство управления памятью Динамическая загрузка и динамическая линковка Оверлейная структура программы Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Управление памятью, наряду с управлением процессами и ресурсами, - одна из наиболее важных функций операционной системы. Задача ОС заключается в том, чтобы размещать в памяти пользовательские процессы, их данные, обслуживать запросы процессов на области памяти заданных размеров. В данной лекции рассмотрены базовые понятия и механизмы, связанные с управлением памятью, в частности, этапы загрузки программ в память и их связывание с адресами в памяти. Две основные стратегии управления памятью – страничная организация и сегментная организация – рассмотрены в следующих двух лекциях "Страничная организация памяти" и "Сегментная организация памяти". Основные положения размещения процессов в памяти Любая программа, введенная в систему, должна быть размещена в памяти и оформлена в виде процесса для ее выполнения. Каждая программа при вводе в систему помещается во входную очередь – совокупность процессов на диске, ожидающих размещения в памяти для выполнения своих программ. До своего выполнения пользовательские программы проходят в системе несколько стадий. Связывание программ и данных с адресами в памяти Перед загрузкой данных или кода в память они должны быть в какой-либо момент связаны с определенными адресами в памяти. Связывание может выполняться на разных этапах: Связывание во время компиляции (compile-time). Если адрес в памяти априорно известен, компилятором может быть сгенерирован код с абсолютными адресами. При любом изменении размещения программы в памяти должна быть выполнена перекомпиляция. Данный подход более характерен для ранних компьютерных систем с небольшим объемом памяти, либо для обработки и выполнения системных модулей – частей ядра ОС, для которых характерно использование резидентных абсолютных адресов. Для пользовательских программ такой подход неудобен, так как не обеспечивает достаточной гибкости, в частности, возможности без изменений перезагрузить код в другую область памяти. Связывание во время загрузки (load-time). Загрузка программы в память – стадия ее обработки системой, предшествующая выполнению программы. Чтобы начальный адрес области памяти, куда загружается программа, можно было менять, и это не привело бы к необходимости изменения кода программы, применяется следующий метод. Генерируется перемещаемый код (relocatable code) – код, в котором адресация происходит относительно значения регистра перемещения (relocation register), и адрес в памяти равен сумме значения регистра перемещения и адреса, 173 вычисляемого в команде. Таким образом, при необходимости загрузки кода на другое место в памяти требуется изменить только значение регистра перемещения. Подобный подход широко используется для программ, написанных на традиционных языках программирования. Связывание во время исполнения (runtime), или динамическое (позднее) связывание. Используется, если процесс во время выполнения может быть перемещен из одного сегмента памяти в другой. Для реализации связывания во время исполнения требуется аппаратная поддержка отображения адресов – например, регистры базы и границы. В большинстве систем для пользовательских программ используется, главным образом, именно связывание во время исполнения. Многоэтапная обработка пользовательской программы Чтобы лучше представлять себе все детали адресации и размещения программы в памяти, рассмотрим общую схему многоэтапной обработки пользовательской программы, используемую в любой ОС. Схема представлена на рис. 15.1. Рис. 15.1. Многоэтапная обработка пользовательской программы. Исходный код программы (в форме текстового файла) на языке высокого уровня или на ассемблере преобразуется компилятором или ассемблером в объектный модуль, содержащий бинарные выполняемые машинные команды и таблицу символов, определенных и использованных в данном модуле кода. Рассмотренная фаза называется временем компиляции. Однако объектный модуль не может непосредственно исполняться, так как он содержит неразрешенные ссылки на внешние модули и их компоненты. Следующая фаза обработки 174 программы – редактирование связей. Редактор связей (linker) – системная программа, которая получает на вход один или несколько объектных модулей, а на выходе выдает загрузочный модуль – двоичный код, образованный кодом нескольких объектных модулей, в котором разрешены все межмодульные ссылки - для каждого символа, внешнего для данного объектного модуля A, найден соответствующий символ (процедуры, переменной и т.д.) из другого модуля B, на который ссылается модуль A, и код соответственно откорректирован, т.е. он правильно адресует внешний символ. Загрузочный модуль может быть загружен в память для исполнения с помощью еще одной системной программы – загрузчика (loader), который получает на вход загрузочный модуль и файлы с бинарными кодами системных библиотек, которые использует программа. Загрузчик, объединяя код программы с кодами системных библиотек, создает бинарный образ программы в памяти. Фаза вызова редактора связей и загрузчика носит общее название время загрузки. Во многих ОС функции редактора связей и загрузчика, с целью экономии времени обработки программы в системе, объединены в одной системной программе – редакторе связей и загрузчике (linker and loader). Например, в системе UNIX редактор связей и загрузчик называется ld (Linker and loaDer). Объединенному загрузчику и редактору связей на вход передается список объектных модулей и список библиотек, и в результате он генерирует исполняемый код. Фаза редактирования связей и загрузки часто на программистском слэнге называется линковкой (linking). Будем далее использовать именно этот короткий и выразительный термин. Вот пример последовательности фаз обработки программы в терминах команд системы UNIX: сс –c program.c // Компиляция исходного кода на Си. // В рабочей директории – объектный модуль program.o ld program.o mylibrary.a // редактирование связей и загрузка // В рабочей директории – исполняемый код с именем по умолчанию a.out a.out // Исполнение программы // В стандартный вывод (по умолчанию – на консоль) // выдаются результаты программы В примере предполагается, что в файле program.c хранится исходный код программы на Си, которая использует библиотечные функции из библиотеки mylibrary.a. Отметим соглашения в системе UNIX о расширениях имен файлов: .c – исходный код на Си, .o – объектный модуль, .a – бинарный файл статически линкуемой библиотеки (аббревиатура от термина archive). Исполняемый код (executable) в UNIX не имеет стандартного расширения имени, но имеет полное имя по умолчанию – несколько архаичное имя a.out (аббревиатура от asembler output). В Windows соглашения о расширениях имен файлов несколько иные: .obj – объектный модуль, .exe – исполняемый код, .lib – статически линкуемая библиотека. Отличить объектный модуль от загрузочного очень просто: они сильно отличаются по своему размеру. Объясняется это тем, что в загрузочном модуле присутствует полностью или частично код статически линкуемых библиотек, а также гораздо больше, чем у объектного модуля, таблица символов – она содержит все символы библиотек и других объектных модулей, слинкованных в единую исполняемую программу. На этапе выполнения, при первом обращении к ним из программы, в память загружаются динамически линкуемые библиотеки (dymanically linked libraries). Данная разновидность библиотек, реализованная во всех современных ОС, позволяет сэкономить память, занимаемую образом исполняемого кода, который при статической линковке с библиотеками оказывается очень велик. Подробнее об этом – позже в данной лекции. Логическое и физическое адресное пространство Концепция логического адресного пространства, связанного с соответствующим физическим адресным пространством, является одной из основных для управления памятью. Логическим адресом называется адрес, генерируемый процессором при выполнении машинной команды. 175 Физический адрес – это реальный адрес в памяти, который "видит" и "понимает" устройство управления памятью (Memory Management Unit – MMU). Логические адреса совпадают с физическими при связывании адресов во время компиляции или во время загрузки (т.е. до исполнения программы). Однако при связывании адресов во время выполнения логические адреса отличаются от физических. Далее рассмотрим этот вопрос подробнее. Устройство управления памятью Как уже отмечалось во вводной лекции, устройство управления памятью (Memory Management Unit – MMU) – это один из модулей аппаратуры, отвечающий за адресацию памяти и связанный с процессором и другими устройствами системной шиной. С точки зрения поддержки описанных концепций адресации, устройство управления памятью – это аппаратура, преобразующая логический адрес (полученный по общей шине от процессора) в физический (реальный адрес в памяти, по которому и происходит обращение). Аппаратура MMU использует значение регистра перемещения, содержащего адрес начала области памяти, выделенной ОС для программы пользователя. MMU добавляет значение регистра перемещения к (логическому) адресу, сгенерированному пользовательской программой, получая в результате физический адрес. Программа пользователя работает только с логическими адресами и не "видит" физических адресов. Схема адресации и преобразования логического адреса в физический с использованием регистра перемещения изображена на рис. 15.2. Рис. 15.2. Адресация с использованием регистра перемещения. Динамическая загрузка и динамическая линковка Под динамической загрузкой понимается загрузка подпрограммы в память при первом обращении к ней из пользовательской программы. Это весьма полезный принцип, если требуется сэкономить память, поскольку никакой "лишний" код в этом случае в память не загружается. При статической линковке объем исполняемого кода может оказаться очень большим, именно за счет того, что к файлу бинарного кода добавлен полностью код всех используемых библиотек. При динамической загрузке никакой специальной поддержки от ОС не требуется на этапе разработки программы. С динамической загрузкой вызываемых подпрограмм тесно связан другой родственный механизм – динамическая линковка: линковка во время исполнения программы. Разумеется, это не означает, что во время выполнения область кода программы расширяется, и к ней добавляется код динамически линкуемой подпрограммы. Используется иная схема. В коде программы размещается заглушка для исполнения (execution stub) – небольшой 176 фрагмент кода, выполняющий системный вызов модуля ОС, размещающего в памяти код динамически линкуемой библиотечной подпрограммы. При первом вызове заглушка заменяет себя на код обращения по адресу динамически размещенной в памяти подпрограммы. Операционная система при вызове динамически линкуемого модуля должна проверить, размещен ли его код в адресном пространстве процесса. Очевидно, что динамическая линковка наиболее целесообразна для библиотек. Файл бинарного кода динамически линкуемой библиотеки имеет в системе UNIX расширение имени .so (аббревиатура термина shared object), в системе Windows – расширение имени .dll (аббревиатура от dynamically linked library). Возникает, однако, вовсе не философский вопрос: каково должно быть оптимальное соотношение статической и динамической линковки в системе? Следует ли ограничиваться только статической или только динамической загрузкой и линковкой? Н наш взгляд, следует соблюдать "золотую середину". В операционных системах прошлых лет в этом отношении принимались подчас самые экзотические решения. В ОС "Эльбрус", например, разработчики пошли по чересчур радикальному, на наш взгляд, пути – вообще исключили статическую линковку и все независимые программы загружали только динамически (с помощью механизва ПРОГР, который в "Эльбрусе" назывался открытием программы, или динамическим знакомством). К чему это привело на практике, хорошо помнят мои коллеги из СПбГУ – разработчики математических пакетов прикладных программ, которые мы с ними в 1980-х гг. переносили с ЕС ЭВМ на "Эльбрус". Они быстро освоили новую конструкцию ПРОГР и обращения ко всем независимо компилируемым модулям оформили именно таким образом. В результате очень сильно замедлилось суммарное время выполнения программы. Это и понятно: реализация каждой математической функции как динамически загружаемой программы – слишком "дорогая" операция, требующая вмешательства ОС, по крайней мере, при первом обращении к каждой такой программе, по сравнению с обычным обращением, например, к функции sin как к подпрограмме (процедуре), элементу статически линкуемой библиотеки, обычной машинной командой вызова процедуры. Оверлейная структура программы Как мы уже отмечали во вводных лекциях, в ранних ОС, в особенности – для персональных компьютеров, для пользовательского процесса были вынужденно введены очень жесткие ограничения по памяти, - например, в MS DOS – не более 640 килобайт. При таком дефиците основной памяти, если программа оказывается настолько велика, что полностью не помещается в память максимально разрешенного объема, необходимо предпринимать специальные меры при разработке программы, чтобы разбить ее на непересекающиеся группы модулей, такие. что в каждой группе модули логически взаимосвязаны и должны присутствовать в памяти одновременно, модули же разных групп не обязательно должны вместе загружаться в память. Во время исполнения такой программы должен использоваться специальный системный механизм, называемый оверлейная структура (overlay, дословно – наложение), обеспечивающий поочередную загрузку в одну и ту же область памяти то одной, то другой исполняемой группы модулей. Простая программа, которая выполняет эти действия, называется драйвер оверлея (overlay driver). Интегрированная среда разработки Турбо Паскаль обеспечивала специальные опции компилятора, которые позволяли явно указывать модули, входящие в каждый оверлей. Типичный для ранних компьютеров и ОС пример программы с оверлейной структурой – двухпросмотровый ассемблер. На первом просмотре он преобразует исходный ассемблерный код в промежуточное представление, которое программа второго просмотра ассемблера получает на входе. Полностью весь ассемблер (оба просмотра) в память не помещался, и пришлось применить оверлейную структуру. Данный пример иллюстрируется на рис. 15.3. Ключевые термины ld (linker and loader) – редактор связей и загрузчик в системе UNIX. Бинарный образ программы в памяти – файл, содержащий образ программы для ее считывания в память и запуска, формируемый загрузчиком. Время (фаза) загрузки, или линковка (linking) - фаза вызова редактора связей и загрузчика для получения бинарного образа программы в памяти. Время (фаза) компиляции – этап обработки программы, на котором исходный код программы компилируется в объектный модуль. 177 Рис. 15.3. Оверлейная структура двухпросмотрового ассемблера. Входная очередь – совокупность процессов на диске, ожидающих размещения в памяти для выполнения своих программ. Динамическая загрузка - загрузка подпрограммы в память при первом обращении к ней из пользовательской программы. Динамическая линковка - линковка во время исполнения программы. Динамически линкуемые библиотеки (dymanically linked libraries) – библиотеки подпрограмм, загружаемые в память во время исполнения, при первом обращении к ним из пользовательской программы. Драйвер оверлея (overlay driver) – системная программа, выполняющая поочередную загрузку в одну и ту же область памяти то одной,то другой группы модулей из пользовательской программы. Заглушка для исполнения (execution stub) – фрагмент кода в бинарном коде программы, выполняющий системный вызов модуля ОС, размещающего в памяти код динамически линкуемой библиотечной подпрограммы. Загрузчик (loader) – системная программа, которая получает на вход загрузочный модуль и файлы с бинарными кодами системных библиотек, используемых программой и, объединяя код программы с кодами системных библиотек, создает бинарный образ программы в памяти. Исходный код (source code) – код программы (в виде текстового файла) на языке высокого уровня или на языке ассемблера. Линковка (linking) – то же, что и редактирование связей и загрузка. Логический адрес - адрес, генерируемый процессором при выполнении машинной команды. Объектный модуль – файл бинарного кода программы, генерируемый компилятором, содержащий выполняемые машинные команды и таблицу символов. Оверлейная структура (overlay) – организация программы при недостаточном объеме основной памяти, при которой система выполняет поочередную загрузку в одну и ту же область памяти то одной, то другой исполняемой группы модулей программы. Перемещаемый код (relocatable code) – код, в котором адресация происходит относительно значения регистра перемещения, и адрес в памяти равен сумме значения регистра перемещения и адреса, вычисляемого в команде. 178 Регистр перемещения (relocation register) – регистр, содержащий начальный адрес области памяти, отведенной операционной системой для загруженной в память программы. Редактирование связей (linking) – этап обработки программы, на котором редактор связей формирует из объектных модулей загрузочный модуль, разрешая все межмодульные ссылки. Редактор связей (linkage editor) – систeмная программа, формирующая из объектных модулей загрузочный модуль, разрешая все межмодульные ссылки. Редактор связей и загрузчик (linker and loader) - системная программа, в которой объединены функции редактора связей и загрузчика. Связывание адресов во время загрузки (load-time) – схема адресации, при которой генерируемый код адресует данные и программу относительно регистра перемещения, значение которого определяется при загрузке программы. Связывание адресов во время исполнения (runtime), или динамическое (позднее) связывание – гибкая схема адресации, при которой абсолютный адрес программы или данных определяется только во время выполнения программы; для реализации используется аппаратная поддержка отображения адресов – например, регистры базы и границы. Связывание адресов во время компиляции (compile-time) - если адреса программы и данных в памяти априорно известны, генерация компилятором кода с абсолютными адресами. Cтатически линкуемая библиотека – библиотека подпрограмм, код которой объединяется с кодом использующих ее объектных модулей в загрузочный модуль на этапе редактирования связей и загрузки. Таблица символов – таблица в объектном модуле или загрузочном модуле, содержащая символы (переменных, процедур и др.), определенные или используемые в данном модуле кода. Устройство управления памятью (Memory Management Unit – MMU) – модуль аппаратуры, выполняющий адресацию памяти и связанный с процессором и другими устройствами системной шиной; преобразует логические адреса в физические адреса. Физический адрес – реальный адрес в памяти, который "видит" и "понимает" устройство управления памятью. Краткие итоги Управление памятью – одна из важнейших функций операционной системы, которая выполняет размещение в памяти пользовательских программ и их данных для их выполнения. Первоначально введенные в систему пользовательские программы помещаются во входную очередь на диске. Связывание команд и данных с адресами в памяти может выполняться во время компиляции, во время загрузки или во время выполнения. Пользовательская программа проходит следующие фазы обработки: из исходного кода – компиляция в объектный модуль, затем – генерация из нескольких объектных модулей загрузочного модуля (редактором связей); генерация из загрузочного модуля и библиотек загрузчиком двоичного образа программы в памяти (линковка). Различаются логические и физические адреса. Логический адрес генерируется процессором при выполнении команд. Физический адрес генерируется устройством управления памятью как сумма логического адреса и значения регистра перемещения. Устройство управления памятью – модуль аппаратуры, выполняющий преобразование логических адресов в физические и обращения по физическим адресам памяти. Динамическая загрузка – загрузка вызываемой подпрограммы в память при первом ее вызове, при исполнении пользовательской программы. Динамическая линковка – линковка во время выполнения программы. Библиотеки подразделяются на статически и динамически линкуемые. Для динамической линковки в бинарном коде хранится заглушка, которая вызывает ОС для поиска и загрузки динамически линкуемой библиотеки, с последующей заменой кода заглушки на код обращения к библиотеке. 179 Оверлейная структура – метод организации программы, не помещающейся целиком в основную память, при котором программа при разработке делится на непересекающиеся группы модулей, необходимые одновременно в памяти, а при исполнении драйвер оверлея по очереди загружает в одну и ту же область памяти то одну, то другую группы модулей. Набор для практики Вопросы 1. В чем заключается задача управления памятью? 2. Что такое входная очередь заданий? 3. Что такое связывание адресов и на каких этапах обработки программы оно может выполняться? 4. Какие этапы обработки проходит программа на пути от исходного кода к двоичному образу в памяти? 5. Что такое компиляция? 6. Что такое редактирование связей? 7. Что такое загрузка? 8. Что такое линковка? 9. Что такое объектный модуль? 10. Что такое таблица символов? 11. Что такое загрузочный модуль? 12. Что такое библиотека? 13. Что такое бинарный образ программы в памяти? 14. Что такое редактор связей? 15. Что такое загрузчик? 16. Что такое ассемблер? 17. Что такое логический адрес и какой компонентой системы он генерируется? 18. Что такое физический адрес и какой компонентой системы он генерируется? 19. Что такое устройство управления памятью? 20. Что такое регистр перемещения? 21. Что такое перемещаемый код? 22. Что такое динамическая загрузка? 23. Что такое динамическая линковка? 24. Что такое статически линкуемая библиотека? 25. Что такое динамически линкуемая библиотека? 26. Что такое оверлейная структура программы? 27. Что такое драйвер оверлея? Упражнения 1. Проанализируйте структуру бинарного кода для используемого Вами компьютера и классифицируйте используемую схему адресации (связывание во время компиляции, во время загрузки или во время выполнения). 2. Разработайте и выполните в системах UNIX (Linux) и Windows последовательность команд, реализующую на командном языке последовательность фаз обработки программы от исходного кода до двоичного образа исполняемого кода в памяти. 3. Используйте статически и динамически линкуемые библиотеки в коде Вашей программы и проанализируйте ассемблерный (бинарный) код обращения к ним в коде Вашей программы. 4. Организуйте с помощью используемой вами системы программирования и интегрированной среды программу с оверлейной структурой. Темы для курсовых работ, рефератов, эссе 1. Методы управления памятью в операционных системах (реферат). 2. Методы адресации в компьютерных системах (реферат). 3. Этапы обработки программы от исходного кода к исполняемому в операционных системах (реферат). 4. Физическая и логическая адресация в компьютерных системах (реферат). 5. Организация оверлейной структуры программ (реферат). 180 16. Лекция: Страничная организация памяти В лекции рассматриваются: откачка и подкачка (swapping); стратегии динамического распределения памяти; фрагментация; принципы страничной организации; таблица страниц; использование ассоциативной памяти; двухуровневые, иерархические, хешированные и инвертированные таблицы страниц; разделяемые страницы. Содержание Введение Откачка и подкачка Смежное распределение памяти Общая задача распределения памяти и стратегии ее решения Фрагментация Страничная организация Реализация таблицы страниц Оценка среднего времени доступа к памяти с использованием TLB Защита памяти Структура таблицы страниц Хешированные таблицы страниц Инвертированные таблицы страниц Разделяемые страницы Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Страничная организация памяти (paging) – наиболее распространенная стратегия управления памятью, используемая практически во всех операционных системах. В данной лекции рассматриваются общие проблемы управления памятью, принципы страничной организации и ее различные формы. Откачка и подкачка Пользовательский процесс может находиться в различных состояниях во время обработки системой. В частности, процесс может быть некоторое время неактивным, если, например, он исполняется в режиме разделения времени, и пользователь за терминалом обдумывает следующую команду или редактирует исходный код своей программы. В подобных случаях процесс может быть откачан операционной системой на диск, в связи с тем, что занимаемая им память оказывается необходимой в данный момент для другого, активного, процесса. Откачка и подкачка (swapping) – это действия операционной системы по откачке (записи) образа неактивного процесса на диск или подкачке (считыванию) активного процесса в основную память. Необходимость выполнения подобных действий вызвана нехваткой основной памяти. Файл откачки (backing store) - область дисковой памяти, используемая операционной системой для хранения образов откачанных процессов. Файл откачки организуется максимально эффективно: обеспечивается прямой доступ ко всем образам процессов в памяти (например, через таблицу по номеру процесса). Популярная разновидность стратегии откачки и подкачки – roll out / roll in: откачка и подкачка на базе приоритетов; более приоритетные процессы исполняются, менее приоритетные – откачиваются на диск. Наибольшие временные затраты на откачку – это затраты на передачу данных: полный образ процесса может занимать большую область памяти. Общее время откачки пропорционально размеру откачиваемых данных. В распространенных ОС – UNIX, Linux, Windows и др. – реализованы различные стратегии откачки и подкачки. Схема откачки и подкачки изображена на рис. 16.1. 181 Рис. 16.1. Схема откачки и подкачки. Смежное распределение памяти Наиболее простая и распространенная стратегия распределения памяти – смежное распределение памяти – распределение памяти для пользовательских процессов в одной смежной области памяти. Основная память разбивается на две смежных части (partitions), которые "растут" навстречу друг другу: резидентная часть ОС и вектор прерываний – по меньшим адресам, пользовательские процессы – по адресам. Для пользовательских процессов память распределяется в одном и том же смежном участке памяти. Для каждого процесса регистр перемещения указывает на начало выделенной ему области памяти, регистр границы содержит длину диапазона логических адресов. Каждый логический адрес должен быть меньше содержимого регистра границы. Физический адрес вычисляется аппаратно как сумма логического адреса и значения регистра перемещения. Схема адресации с аппаратной поддержкой регистров перемещения и границы изображена на рис. 16.2. Рис. 16.2. Адресация с аппаратной поддержкой регистров перемещения и границы. 182 Общая задача распределения памяти и стратегии ее решения В общем случае, в операционных системах может использоваться смежное распределение памяти в нескольких смежных областях. Свободная область – это смежный блок свободной памяти. Свободные области могут быть произвольно разбросаны по памяти. При загрузке процесса ему предоставляется память из любой свободной смежной области, которая достаточно велика для его размещения. При этом операционная система хранит список свободных областей памяти и список занятых областей памяти. Все эти области могут быть произвольно расположены в памяти и иметь различную длину. Возникает общая задача распределения памяти: Имеется список свободных областей памяти и список занятых областей разного размера. Разработать и реализовать оптимальный (по некоторому критерию) алгоритм выделения свободного смежного участка памяти длины n (слов или байтов). Для решения данной задачи применяются следующие стратегии: метод первого подходящего (first-fit), метод наиболее подходящего (best-fit) и метод наименее подходящего (worst-fit). Рассмотрим каждую из них подробнее. Метод первого подходящего: Выбирается первый по списку свободный участок подходящего размера (не меньшего, чем n). На первый взгляд, данная стратегия оптимальна, но далее мы увидим, что это не всегда так. Метод наиболее подходящего: Выбирается из списка наиболее подходящий свободный участок (минимального размера, не меньшего, чем n). В отличие от предыдущего метода, требует просмотра всего списка, если список не упорядочен по размеру областей. Применение метода приводит к образованию оставшейся части самого маленького размера. Метод наименее подходящего: Выбирается из списка подходящая область наибольшего размера. Почему наибольшего? Чтобы избежать фрагментации (проблема фрагментации подробно рассмотрена далее в данной лекции). Применение первой и второй стратегий лучше со следующих точек зрения: скорость выполнения и минимальность объема использованной памяти. Однако их применение может создать фрагментацию. Фрагментация Фрагментация – это дробление памяти на мелкие не смежные свободные области маленького размера. Фрагментация возникает после выполнения системой большого числа запросов на память, таких, что размеры подходящих свободных участков памяти оказываются немного больше, чем требуемые. Например, если имеется 100 смежных свободных областей памяти по 1000 слов, то после выполнения 100 запросов на память по 999 слов каждый в списке свободной памяти останутся 1000 областей по одному слову. Фрагментация бывает внутренняя и внешняя. При внешней фрагментации имеется достаточно большая область свободной памяти, но она не является непрерывной. Внутренняя фрагментация может возникнуть вследствие применения системой специфической стратегии выделения памяти, при которой фактически в ответ на запрос память выделяется несколько большего размера, чем требуется, - например, с точностью до страницы (листа), размер которого – степень двойки. Страничная организация памяти подробно рассматривается далее в данной лекции. Внешняя фрагментация может быть уменьшена или ликвидирована путем применения компактировки (compaction) – сдвига или перемешивания памяти с целью объединения всех не смежных свободных областей в один непрерывный блок. Компактировка может выполняться либо простым сдвигом всех свободных областей памяти, либо путем перестановки занятых областей, с выбором на каждом шаге подходящей свободной области методом наиболее подходящего. Компактировка возможна, только если связывание адресов и перемещение (см. лекцию 15) происходит динамически. Компактировка выполняется во время исполнения программы. При компактировке памяти и анализе свободных областей может быть выявлена проблема зависшей задачи: какая-либо задача может "застрять" в памяти, так как выполняет ввод-вывод в свою область памяти (по этой причине откачать ее невозможно). Решение данной проблемы: ввод-вывод должен выполняться только в специальные буфера, выделяемой для этой цели операционной системой. 183 Страничная организация Страничная организация (paging) – стратегия управления памятью, при которой: логическая память делится на страницы – смежные области одинаковой длины, обычно – степень 2 (например, 512 слов); физическая память, соответственно, делится на фреймы такого же размера; распределение логической памяти происходит с точностью до страницы; физическая память процесса может не быть непрерывной; связь между логической и физической памятью процесса осуществляется с помощью таблицы страниц – системной структуры, выделяемой процессу для трансляции его логических адресов в физические. При страничной организации ОС хранит информацию обо всех свободных фреймах. Поскольку память выделяется с точностью до страницы, возможна внутренняя фрагментация (см. п. 16.5). Цели страничной организации – обеспечить возможность не смежного распределения физической памяти для процессов, а также расширить пространство логической памяти. При страничной организации логический адрес обрабатывается системой особым образом – как структура (p, d): его старшие разряды обозначают номер страницы, младшие – смещение внутри страницы. Номер страницы (p) трактуется как индекс в таблице страниц, соответствующий элемент которой содержит базовый адрес начала страницы в физической памяти. Смещение внутри страницы (d) добавляется к ее базовому адресу. В результате формируется физический адрес, передаваемый в устройство управления памятью. Архитектура трансляции адресов при страничной организации изображена на рис. 16.3. Рис. 16.3. Архитектура трансляции адресов при страничной организации. На рис. 16.4 приведен пример страничной организации, который демонстрирует, что, в отличие от непрерывной логической памяти процесса, соответствующие фреймы страниц в основной памяти могут быть расположены не смежно: логической странице 0 соответствует фрейм 1, странице 1 – фрейм 4, странице 2 – фрейм 3, странице 3 – фрейм 7. 184 Рис. 16.4. Пример страничной организации. На рис. 16.5 приведен другой возможный пример страничной организации: логическая и физическая память разбита на блоки по 4 страницы подряд; в таблице страниц хранится не номер страницы, а номер блока страниц. Например, в элементе 0 таблицы страниц хранится номер блока 5, по которому адрес начала блока вычисляется домножением содержимого элемента таблицы страниц на размер блока, равный 4 (результат – 20). Рис. 16.5. Пример страничной организации блоками по 4 страницы. 185 Использования списка свободных фреймов иллюстрируется на рис. 16.6. Рис. 16.6. Список свободных фреймов. Первоначально список состоит из 5 фреймов. При вводе в систему нового процесса с логической памятью из 4 страниц, после загрузки процесса в память, последовательные логические страницы процесса размещаются в первых по списку физических фреймах. В результате в списке свободных фреймов остается один элемент. Реализация таблицы страниц Использование ассоциативной памяти. Таблица страниц – непрерывная область физической памяти. В системе имеется базовый регистр таблицы страниц (page table base register – PTBR), указывающий на таблицу страниц и хранящий ее длину. Таким образом, при страничной организации любой доступ к памяти требует фактически не одного, а двух обращений в память – одно в таблицу страниц, другое – непосредственно к данным или команде. В этом – некоторый недостаток и неэффективность страничной организации, по сравнению с более простыми методами управления памятью. В системах с теговой архитектурой, например, "Эльбрус", регистр таблицы страниц (регистр таблицы страниц пользователя – РТСП) содержит дескриптор таблицы страниц, который, кроме ее адреса, содержит также ее длину. Проблема двух обращений решается введением ассоциативной памяти (cache) страниц, называемой также буфер трансляции адресов (translation lookaside buffer – TLB). Ассоциативная память, по существу, является ассоциативным списком пар вида: (номер страницы, номер фрейма). Ее быстродействие значительно выше, чем у основной памяти и у регистров. Схема трансляции адресов с использованием ассоциативной памяти изменяется: если номер страницы из логического адреса найден в ассоциативной памяти, то из ее элемента извлекается соответствующий номер фрейма. Если же номер страницы отсутствует в ассоциативной памяти, он выбирается обычным образом из таблицы страниц, но заносится в ассоциативную память. Таким образом, в ассоциативной памяти накапливается информация о наиболее часто используемых страницах. Модифицированная схема трансляции адресов с использованием TLB иллюстрируется рис. 16.7. 186 Рис. 16.7. Схема трансляции адресов с использованием ассоциативной памяти. Оценка среднего времени доступа к памяти с использованием TLB Предположим, что ассоциативный поиск в среднем требует ε единиц времени. Цикл памяти примем за 1. Введем также еще один показатель – число от 0 до 1 (hit ratio), характеризующее, сколько раз (в среднем) номер страницы будет найден в TLB, - эмпирическую вероятность нахождения номера страницы в ассоциативной памяти. Вычислим математическое ожидание времени доступа – Effective Access Time (EAT). Вероятность того, что номер страницы не будет найден в TLB, равна 1 – . Тогда получим: EAT = (1 + ε) + (1 + ε + 1) (1 – ) = 2 + ε – Защита памяти При адресации с помощью страничной организации возможно, что логический адрес сформирован неверно, и его номер страницы выходит за пределы логической памяти процесса. Защита от неверной адресации может быть реализована хранением и проверкой дополнительного бита valid-invalid в каждом элементе таблицы страниц. Значение valid указывает, что страница с данным номером принадлежит логической памяти процесса, значение invalid – что это не так. Организация защиты памяти процесса с помощью бита valid-invalid иллюстрируется на рис. 16.8. В примере процесс имеет 6 логических страниц с номерами от 0 до 5. Таблица страниц имеет длину 8 (с элементами от 0 до 7). Элементы 6 и 7 не соответствуют логическим страницам процесса, поэтому в них биты valid-invalid установлены в значение invalid. Поэтому при попытке обращения по логическому адресу с номером страницы 6 или 7 произойдет прерывание по неверной адресации. Структура таблицы страниц Иерархические таблицы страниц. Таблицы страниц в операционных системах могут быть по-разному организованы, при сохранении общих принципов их использования, описанных ранее. Рассмотрим далее три основных способа организации таблиц страниц – иерархические таблицы страниц, хешированные таблицы страниц и инвертированные таблицы страниц. Чаще всего используются иерархические таблицы страниц. При их использовании логическое адресное пространство разбивается на несколько таблиц страниц (иначе говоря, 187 используются таблицы таблиц страниц). Наиболее простой и распространенный метод – двухуровневая таблица страниц. Рис. 16.8. Бит valid-invalid в таблице страниц. При обычной организации таблицы страниц, логический адрес (для 32-разрядной архитектуры, при размере страницы 4 килобайта = 4096 байтов) разбивается на номер страницы (20 битов) и смещение внутри страницы (12 битов). При двухуровневой организации таблицы страниц, таблица страниц верхнего уровня сама делится на страницы, поэтому логический адрес будет иметь вид: (p1, p2, d), где p1 – индекс во внешней таблице страниц, p2 – смещение внутри страницы для внешней таблицы страниц, d – смещение внутри страницы (адресуемой по внутренней таблице страниц). При тех же предположениях об архитектуре и размере страницы, p1 и p2 будут занимать по 10 битов. Организация двухуровневых таблиц страниц изображена на рис. 16.9. Схема адресной трансляции по двухуровневой таблице страниц иллюстрируется рис. 16.10. Хешированные таблицы страниц Структура таблицы страниц, описанная в данном разделе, базируется на понятии хешфункции (hash function) [24] - целочисленной функции hash, определенной на элементах s некоторого пространства поиска S (строках, больших числах и др.) и принимающей значения из отрезка [0, H-1] где H – натуральное число. Общая идея поиска с помощью хешфункций заключается в следующем: пространство поиска разбивается на H непересекающихся подмножеств (списков) Sh, в каждом из которых хранятся элементы, имеющие одинаковое значение хеш-функции, равное h. Таким образом, применение хеш-функции позволяет сократить поиск в среднем в H раз: при поиске элемента s сначала вычисляем hash(s), а затем выполняем поиск только в списке Shash(s) Для облегчения доступа к хеш-спискам хранится также хеш-оглавление – таблица, индексируемая значением хешфункции, каждый элемент которой содержит ссылку на начало соответствующего списка. 188 Рис. 16.9. Организация двухуровневых таблиц страниц. Рис. 16.10. Схема адресной трансляции по двухуровневой таблице страниц. Хешированные таблицы страниц используются, если адресное пространство 64-битное или большей разрядности. Очевидно, что в этом случае, при прямолинейном подходе, размеры таблиц страниц оказались бы слишком велики. Поэтому используется другой метод. Логический номер страницы хешируется (т.е. для него вычисляется хеш-функция). Полученное число (реальный номер страницы) используется как индекс в хеш-оглавлении, ссылающемся на список страниц, хешируемых в один и тот же номер. В найденном таким образом списке и выполняется поиск нужной страницы. Данный способ организации таблицы страниц и схема адресации иллюстрируются рис. 16.11. 189 Рис. 16.11. Хешированные таблицы страниц. Инвертированные таблицы страниц Данный способ организации таблиц страниц предназначен для сокращения размеров таблиц страниц. В таблице страниц хранится один элемент для каждой реальной страницы, находящейся в памяти. К логическому адресу добавляется номер процесса (pid) владеющего данной страницей. По паре (номер процесса = pid, номер страницы = p) выполняется ассоциативный поиск в таблице страниц. Индекс найденного элемента таблицы i конкатенируется со смещением d внутри страницы, в результате получается физический адрес. Инвертированные таблицы страниц иллюстрируются рис. 16.12. Рис. 16.12. Инвертированные таблицы страниц. Разделяемые страницы Разделяемые (совместно используемые) страницы – логические страницы, используемые несколькими процессами и имеющие один и тот же номер в таблице страниц каждого из процессов. Данный механизм полезен для экономии памяти, так как позволяет загружать в память в единственном экземпляре не изменяемую информацию, необходимую нескольким процессам – например, код и массивы констант. 190 Пример использования разделяемых страниц тремя процессами приведен на рис. 16.13. Три процесса используют одни и те же коды трех редакторов ed1, ed2, ed3, логические страницы которых имеют для обоих процессов номера 0, 1 и 2. Кроме того, каждый процесс использует свои индивидуальные данные data1, data2, data3. Рис. 16.13. Разделяемые страницы. Ключевые термины Roll out / roll in - откачка и подкачка на базе приоритетов; более приоритетные процессы исполняются, менее приоритетные – откачиваются на диск. Ассоциативная память (кэш) страниц, буфер трансляции адресов (translation lookaside buffer – TLB) – сверхбыстродействующая ассоциативная память, содержащая номера наиболее часто используемых страниц и их адреса в основной памяти. Бит valid-invalid – бит в элементе таблицы страниц, указывающий, принадлежит ли страница логической памяти процесса. Внешняя фрагментация – ситуация, когда в системе имеется достаточно большая область свободной памяти, но она не является непрерывной. Внутренняя фрагментация – ситуация в системе, при которой неэффективно расходуется свободная память, вследствие применения стратегии выделения памяти с точностью до страницы. Иерархическая таблица страниц – организация таблиц страниц в виде иерархии (как правило, двухуровневой), результатом доступа к которой является адрес фактической страницы физической памяти. Инвертированная таблица страниц – таблица страниц, при обращении к которой выполняется поиск требуемой физической страницы по номеру процесса и логическому номеру страницы. Компактировка (compaction) – сдвиг или перемешивание памяти с целью объединения всех не смежных свободных областей в один непрерывный блок. Метод наиболее подходящего – метод решения общей задачи распределения памяти, при котором выбирается по списку свободный участок минимального размера, не меньшего, чем n. 191 Метод наименее подходящего – метод решения общей задачи распределения памяти, при котором выбирается по списку свободный участок максимального размера, не меньшего, чем n. Метод первого подходящего – метод решения общей задачи распределения памяти, при котором выбирается первый по списку свободный участок подходящего размера (не меньшего, чем n). Общая задача распределения памяти - Имеется список свободных областей памяти и список занятых областей разного размера; реализовать оптимальный алгоритм выделения свободного смежного участка памяти длины n. Откачка (swap out) - запись образа неактивного процесса на диск. Откачка и подкачка (swapping) – действия операционной системы по откачке (записи) образа неактивного процесса на диск или подкачке (считыванию) активного процесса в основную память. Подкачка (swap in) - считывание активного процесса с диска в основную память. Разделяемые страницы – страницы, совместно используемые несколькими процессами и имеющие в их таблицах страниц одинаковые логические номера. Регистр таблицы страниц (page table base register – PTBR) – регистр, указывающий на таблицу страниц и хранящий ее длину. Регистр таблицы страниц пользователя (РТСП) – в системе "Эльбрус": регистр, содержащий дескриптор таблицы страниц. Cмежное распределение памяти – распределение памяти для пользовательских процессов в одной смежной области основной памяти. Среднее время доступа (Effective Access Time - EAT) – оценка математического ожидания числа обращений к памяти при страничной организации. Страничная организация (paging) – стратегия управления памятью, при которой логическая и физическая память делится на страницы одинаковой длины, и в основной памяти образы логических страниц могут размещаться произвольным образом. Страницы – смежные области логической и физической памяти одинаковой длины, обычно – степень 2, используемые при страничной организации. Таблица страниц (page table) – системная структура, выделяемой процессу операционной системой для трансляции его логических адресов в физические. Файл откачки (backing store) - область дисковой памяти, используемая операционной системой для хранения образов откачанных процессов. Фрагментация – дробление памяти на мелкие несмежные свободные области маленького размера как результат выполнения системой большого числа запросов на память, таких, что размеры подходящих свободных участков памяти оказываются немного больше, чем требуемые. Фрейм – образ страницы в основной памяти. Хешированная таблица страниц – таблица страниц, при обращении к которой выполняется поиск, основанный на хешировании номера логической страницы. Краткие итоги Откачка и подкачка – механизм сброса образов неактивных процессов на диск и, при их активизации, считывания обратно в основную память. Файл откачки – пространство на диске, где система хранит образы откачанных процессов. Смежное распределение памяти – отведение памяти для всех процессов из одной смежной области памяти. Регистр перемещения используется для преобразования логического адреса в физический (суммируется с логическим адресом). При распределении памяти в общем случае ОС хранит список свободных и занятых областей. Возникает общая задача распределения памяти – разработка оптимального алгоритма удовлетворения запроса на выделение области памяти заданной длины. Три стратегии 192 решения этой задачи – методы первого подходящего, наиболее подходящего и наименее подходящего. Первая и вторая эффективнее, третья позволяет уменьшить фрагментацию. Фрагментация – дробление свободной памяти на мелкие несмежные области. Внешняя фрагментация – ситуация, при которой имеется большая область свободной памяти, но она не является непрерывной. Внутренняя фрагментация – выделение "лишних" участков свободной памяти вследствие применения стратегии выделения памяти с точностью до страницы. Внешняя фрагментация может быть ликвидирована с помощью компактировки – перемешивания или сдвига свободной памяти с целью преобразования ее в одну смежную область. Страничная организация – метод управления памятью, при котором логическая и физическая память делится на страницы одинаковой длины (степень двойки). Физические страницы (фреймы), выделяемые для логических страниц процесса, могут располагаться произвольным образом. Для трансляции логических адресов в физические используется таблица страниц процесса. Логический адрес состоит из номера страницы и смещения внутри страницы. ОС хранит список свободных фреймов в основной памяти. Для реализации таблицы страниц в системе имеется регистр таблицы страниц, содержащий ее адрес и длину. Для ускорения трансляции адресов используется ассоциативная память страниц (TLB). Для защиты памяти процесса используется бит valid – invalid в каждом элементе таблицы страниц, указывающий, принадлежит ли страница логической памяти процесса. Таблицы страниц бывают различной структуры – иерархические, хешированные и инвертированные. Хешированные таблицы страниц требуют поиска нужной страницы по хешсписку. Инвертированные таблицы страниц требуют поиска нужной физической страницы по номеру процесса и логическому номеру страницы. Разделяемые страницы используется для совместного использования процессами одних и тех же областей памяти. Они имеют одинаковые логические номера в таблицах страниц процессов. Набор для практики Вопросы 1. Что такое откачка и подкачка? 2. Что такое файл откачки? 3. Как организовано смежное распределение памяти? 4. Как используется регистр перемещения для адресации? 5. Какие методы решения общей задачи распределения памяти Вам известны? 6. Что такое метод первого подходящего? 7. Что такое метод наиболее подходящего? 8. Что такое метод наименее подходящего? 9. Что такое фрагментация? 10. Что такое внешняя и внутренняя фрагментация? 11. Что такое компактировка и как с ее помощью избавиться от внешней фрагментации? 12. Что такое страничная организация? 13. Что такое страница? 14. Что такое таблица страниц? 15. Что такое фрейм? 16. Как осуществляется трансляция адресов при страничной организации? 17. Что такое список свободных фреймов? 18. Что такое регистр таблицы страниц? 19. Как используется ассоциативная память для ускорения трансляции адресов при страничной организации? 20. Что такое среднее время доступа? 21. Что такое бит valid-invalid и как он используется для защиты памяти? 22. Какие Вам известны виды структур таблицы страниц? 23. Что такое иерархическая таблица страниц? 24. Что такое хешированная таблица страниц? 25. Что такое инвертированная таблица страниц? 26. Что такое разделяемые страницы и каково их назначение? 193 Упражнения 1. Реализуйте смежное распределение памяти. 2. Реализуйте методы первого подходящего, наиболее подходящего и наименее подходящего. 3. Реализуйте алгоритм компактировки основной памяти. 4. Реализуйте структуру таблицы страниц и алгоритм трансляции адресов при страничной организации. 5. Реализуйте ассоциативную память страниц и операции над ней. 6. Реализуйте двухуровневые таблицы страниц. 7. Реализуйте хешированные таблицы страниц. 8. Реализуйте инвертированные таблицы страниц. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. Обзор методов откачки и подкачки в операционных системах (реферат). Обзор стратегий распределения основной памяти (реферат). Обзор архитектур таблиц страниц (реферат). Реализация смежного распределения памяти (курсовая работа). Реализация методов первого подходящего, наиболее подходящего и наименее подходящего (курсовая работа). 6. Реализация алгоритма компактировки основной памяти (курсовая работа). 7. Реализация структуры таблицы страниц и алгоритм трансляции адресов при страничной организации (курсовая работа). 8. Реализация ассоциативной памяти страниц и операции над ней (курсовая работа). 9. Реализация двухуровневых таблиц страниц (курсовая работа). 10. Реализация хешированных таблицы страниц (курсовая работа). 11. Реализация инвертированные таблицы страниц (курсовая работа). 194 17. Лекция: Сегментная организация памяти В лекции рассмотрены: сегментная организация памяти; cегментно-страничная организация памяти (MULTICS, "Эльбрус", Intel x86). Содержание Введение Принципы сегментной организации памяти Архитектура сегментной организации памяти Пример сегментной организации памяти Пример использования разделяемых сегментов Сегментно-страничная организация памяти в системах MULTICS и "Эльбрус" Сегментно-страничная организация памяти в системе Intel 386 Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение В лекции рассмотрена сегментная организация памяти – альтернатива страничной организации. Дано обоснование сегментной организации и ее связи с логической структурой программы. Рассмотрена смешанная – сегментно-страничная – организация памяти, применяемая во многих системах. Принципы сегментной организации памяти Сегментная организация памяти (segmentation) - схема распределения памяти в виде сегментов переменной длины, соответствующая пользовательской трактовке распределения памяти, т.е. логической структуре программ и данных. С точки зрения пользователя (разработчика программы), программа – это набор модулей кода и данных, каждому из которых должен соответствовать свой сегмент в памяти. Сегмент – логическая единица распределения памяти, предназначенная для размещения в памяти одного модуля программного кода или данных. Например, в виде сегментов памяти могут быть представлены: основная программа; процедура; функция; метод; объект; набор локальных переменных; набор глобальных переменных; общий блок данных (например, COMMON-блок в языке FORTRAN); стек; таблица символов; массив. рис. 17.1 иллюстрирует данную точку зрения на программу как на набор сегментов в памяти. Архитектура сегментной организации памяти Многие принципы архитектуры сегментной организации схожи с принципами страничной организации (см. "Страничная организация памяти"), однако во всех случаях приходится учитывать, что длина сегмента переменна, и хранить ее в явном виде в таблицах. Логический адрес при сегментной организации памяти - пара: <segment-number, offset>, где segment-number – номер сегмента, offset – смещение в сегменте. 195 Рис. 17.1. Программа как набор сегментов. Таблица сегментов – служит для отображения логических адресов в физические при сегментной организации памяти. Каждый ее элемент содержит следующую информацию: base – начальный адрес сегмента в оперативной (физической) памяти; limit – длину сегмента. Базовый регистр таблицы сегментов - segment-table base register (STBR) содержит адрес таблицы сегментов в памяти. Регистр длины таблицы сегментов - segment-table length register (STLR) содержит число сегментов, используемое программой. Номер сегмента s корректен, если s < STLR. Перемещение (relocation) программ и данных при сегментной организации динамическое, т.е. выполняется во время исполнения программы с помощью таблицы сегментов. Возможен общий доступ (sharing) нескольких процессов к одному и тому же сегменту, т.е. поддерживается концепция разделяемых сегментов. При этом логический номер общего сегмента для разных процессов будет одним и тем же. Стратегии распределения памяти при сегментной организации: метод первого подходящего или метод наиболее подходящего (см. "Страничная организация памяти"). Метод наименее подходящего при сегментной организации смысла не имеет, так как он не улучшает ситуацию с фрагментацией (ввиду переменной длины сегментов). Соответственно, при сегментной организации возможна внешняя фрагментация, для борьбы с которой применяется компактировка (см. "Страничная организация памяти"). Защита при сегментной организации организована аналогично защите при страничной организации, однако, ввиду того, что каждый сегмент выполняет определенную логическую функцию в программе, дополнительно с каждым сегментом связываются его признаки защиты. Таким образом, в каждом элементе таблицы сегментов хранятся: validation-бит (аналогично страничной организации): значение бита, равное 0, означает, что сегмент неверный, т.е. не принадлежит логической памяти процесса; 196 полномочия чтения (read) / записи (write) / исполнения (execute) – каждое кодируется одним битом; значение бита, равное 0, означает, что процесс не имеет данных полномочий. Например, если сегмент является сегментом данных, то система устанавливает в таблице сегментов бит защиты от исполнения равным 0. Если это сегмент кода, то целесообразна установка в 0 битов защиты от чтения и от записи. Биты защиты связываются с сегментами. Совместный доступ к коду осуществляется на уровне сегментов. В системе "Эльбрус" к стандартному набору признаков защиты был добавлен еще один: защита от записи в сегмент адресной информации (данный признак целесообразен, если, например, сегмент предназначен для записи в файл). Поскольку сегменты различаются по длине, распределение памяти в виде сегментов – это общая задача динамического распределения памяти (см. "Страничная организация памяти"). На рис. 17.2 приведена схема адресации при сегментном распределении памяти. Логический адрес (s, d), где s – номер сегмента, d – смещение внутри сегмента, обрабатывается следующим образом. По номеру сегмента s происходит обращение в таблицу сегментов, и определяется база сегмента – его начальный адрес в основной памяти. Смещение d сравнивается с длиной (границей) сегмента. Если оно меньше, то оно складывается с базой, и в результате получается физический адрес, по которому и происходит обращение в память. Если смещение больше или равно базе, происходит прерывание – ошибка адресации. На схеме не показана еще одна проверка – для номера сегмента s проверяется, что он не превосходит значения регистра длины таблицы сегментов, иначе – прерывание. Рис. 17.2. Схема адресации при сегментной организации памяти. Пользователи систем UNIX, Linux, Solaris наверняка по ассоциации вспомнят часто встречающееся системное сообщение: Segmentation violation (нарушение сегментации) при прерывании. Причина подобного сообщения обычно следующая: программа пытается обратиться по пустому (нулевому) указателю, номер сегмента в котором, естественно, равен 0, а номер сегмента 0 считается в системе недопустимым. Таким образом, через проверку номера сегмента, UNIX защищает от такой часто встречающейся ошибки, как обращение по пустому указателю. Аналогично, по той же самой причине, если программа пытается практически любое другое число (например, 5) рассматривать как адрес и обращаться по нему, то также генерируется прерывание и сигнал SIGSEGV (segmentation violation). 197 Пример сегментной организации памяти Рис. 17.3. Пример сегментной организации памяти. В примере программа использует пять сегментов с номерами от 0 до 4: сегмент 0 – подпрограмма, сегмент 1 – стандартные подпрограммы (sqrt и др.), сегмент 2 – основная программа, сегмент 3 – стек, сегмент 4 – таблица символов. Показано размещение сегментов в памяти. Пример использования разделяемых сегментов В примере два процесса используют общий сегмент – код редактора, который имеет в таблицах сегментов обоих процессов один и тот же номер – 0. Кроме того, каждый из процессов имеет собственный сегмент данных с номером 1, однако эти сегменты, естественно, у обоих процессов разные. Сегментно-страничная MULTICS и "Эльбрус" организация памяти в системах Сегментное распределение памяти, как видно из предыдущих пунктов, имеет свои неоспоримые преимущества. Однако, к сожалению, проблема внешней фрагментации при чисто сегментной организации памяти весьма серьезна. Поэтому в системе MULTICS [25] проблемы внешней фрагментации и длительного времени поиска решены путем страничной организации памяти для сегментов. Данное решение отличается от чисто сегментной организации тем, что элемент таблицы сегментов содержит не базовый адрес сегмента, а базовый адрес таблицы страниц для данного сегмента. В системе "Эльбрус" данные проблемы решены по-другому: в системе используется страничная организация для математической (виртуальной, логической) памяти и сегментная организация – для физической памяти. Математическая память (т.е. образ памяти на диске) распределяется с точностью до страницы, а физическая – с точностью до слова. 198 Кроме того, как уже отмечалось, для адресации в системе "Эльбрус" используются дескрипторы массивов, содержащие начальный адрес, длину и признаки защиты массива. Рис. 17.4. Пример использования разделяемых сегментов. Схема трансляции адресов в MULTICS приведена на рис. 17.5. Логический адрес (s, d) используется следующим образом. Номер сегмента s складывается с содержимым регистра STBR, после чего происходит обращение по полученному адресу в таблицу сегментов. Смещение d сравнивается с длиной сегмента; если оно больше или равно длине сегмента,то прерывание. Из элемента таблицы сегментов извлекается адрес базы таблицы страниц данного сегмента, который складывается со старшими разрядами смещения (p). Младшие разряды смещения используются как смещение внутри страницы, адрес которой извлекается из таблицы страниц данного сегмента. Нельзя не отметить, что данная схема, на наш взгляд, несколько усложнена. Система MULTICS, в которой этот и многие другие механизмы доведены, казалось бы, до совершенства, вызвала противоположную тенденцию в развитии ОС – к упрощению. Как мы уже говорили, даже название следующей системы – UNIX – выбрано как противоположность MULTICS, что говорит о многом. Таковы тенденции развития во многих областях, в том числе и в операционных системах. Сегментно-страничная организация памяти в системе Intel 386 В более современных системах, чем MULTICS, также используется сегментно-страничная организация. Например, в системе Intel 386 используется сегментно-страничная организация памяти с двухуровневой схемой страничной организации (см. рис. 17.6). 199 Рис. 17.5. Схема трансляции адресов в MULTICS. Ключевые термины Базовый регистр таблицы сегментов - segment-table base register (STBR) – регистр, содержащий адрес таблицы сегментов в памяти. Логический адрес при сегментной организации памяти - пара: <segment-number, offset> где segment-number – номер сегмента, offset – смещение в сегменте. Признаки защиты – информация для защиты сегмента в элементе таблицы сегментов: validation-бит (признак корректности номера сегмента для процесса), биты защиты от записи, от чтения и от исполнения. Разделяемые (общие) сегменты – сегменты, общие для нескольких процессов и имеющие одинаковые логические номера в их таблицах сегментов. Регистр длины таблицы сегментов - segment-table length register (STLR) – регистр, содержащий число сегментов, используемое программой. Сегмент – логическая единица распределения памяти, предназначенная для размещения в памяти одного модуля программного кода или данных. Сегментная организация памяти (segmentation) - схема распределения памяти в виде сегментов переменной длины, соответствующая пользовательской трактовке распределения памяти, т.е. логической структуре программ и данных. Сегментно-страничная организация памяти – модификация сегментной организации памяти для борьбы с фрагментацией, основанная на страничной организации каждого сегмента. Таблица сегментов – системная таблица для отображения логических адресов в физические при сегментной организации памяти. Каждый ее элемент содержит начальный адрес сегмента в физической памяти, длину сегмента и признаки защиты. 200 Рис. 17.6. Сегментно-страничная организация памяти в Intel 386. Краткие итоги Сегментная организация памяти – стратегия распределения памяти сегментами переменной длины, каждый из которых выполняет определенную логическую функцию в программе как модуль программы или данных – стек, массив, подпрограмма и т.д. При сегментной организации логический адрес имеет вид: (номер сегмента, смещение внутри сегмента). Организуется системная таблица сегментов, каждый элемент которой содержит базовый адрес сегмента, его длину и признаки защиты – validation-бит, определяющий корректность номера сегмента, биты защиты от записи, чтения и исполнения. Базовый регистр таблицы сегментов содержит начальный адрес таблицы сегментов, регистр длины таблицы сегментов содержит ее длину. Перемещение при сегментной организации осуществляется динамически, во время выполнения программы. Возможен общий доступ нескольких процессов к одному и тому же сегменту с одним логическим номером (разделяемые сегменты). Стратегии распределения памяти при сегментной организации – методы первого подходящего и наиболее подходящего. Возможна внешняя фрагментация. 201 При адресации по логическому адресу для сегментной организации смещение внутри сегмента сравнивается с длиной сегмента из элемента таблицы сетментов. В случае превышения – прерывание. Для борьбы с фрагментацией в некоторых системах (MULTICS, "Эльбрус|", Intel 386) применяется смешанная, сегментно-страничная организация памяти, при которой для каждого сегмента организуется собственная таблица страниц. Набор для практики Вопросы 1. Что такое сегментная организация памяти? 2. Что такое сегмент? 3. Приведите примеры модулей кода и данных, память для которых распределяется в виде отдельных сегментов. 4. Какую структуру имеет логический адрес при сегментной организации памяти? 5. Что такое таблица сегментов? 6. Какая информация хранится в элементе таблицы сегментов? 7. Что такое регистр базы таблицы сегментов? 8. Что такое регистр длины таблицы сегментов? 9. На какой фазе (во время загрузки или исполнения) осуществляется перемещение при сегментной организации? 10. Какие стратегии распределения памяти применяются при сегментной организации? 11. Какие признаки защиты хранятся в элементе таблицы сегментов? 12. Какое условие для номера сегмента проверяется при адресации? 13. Что такое сегментно-страничная организация и для какой цели она используется? Упражнения 1. Реализуйте представление логического адреса при сегментной организации памяти, модель таблицы сегментов и схемы адресации. 2. Реализуйте представление логического адреса при сегментно-страничной организации памяти, модель таблицы сегментов и схемы адресации. Темы для курсовых работ, рефератов, эссе 1. Обзор методов сегментной организации памяти в компьютерных системах (реферат). 2. Обзор методов сегментно-страничной организации памяти в компьютерных системах (реферат). 3. Реализация представления логического адреса при сегментной организации памяти, модели таблицы сегментов и схемы адресации (курсовая работа). 4. Реализация представления логического адреса при сегментно-страничной организации памяти, модели таблицы сегментов и схемы адресации (курсовая работа). 202 18. Лекция: Виртуальная память В лекции рассмотрены следующие вопросы: концепция виртуальной памяти; страничная организация виртуальной памяти; обработка отсутствия страницы в памяти (page fault); обработка страниц по требованию; совместное использование страниц процессами; файлы, отображаемые в память (memory-mapped files); стратегии замещения страниц; алгоритмы FIFO и LRU; алгоритм "второго шанса"; алгоритмы со счетчиком; выделение фреймов – фиксированное и с приоритетами; thrashing; страничная организация в Windows NT и Solaris. Содержание Введение Мотивировка концепции виртуальной памяти Страничная организация по требованию Обработка ситуации отсутствия страницы в памяти Отсутствие свободного фрейма. Оценка производительности стратегии обработки страниц по требованию. Преимущества виртуальной памяти при создании процессов Проблема замещения страниц Алгоритмы замещения страниц Оптимальный алгоритм замещения страниц Алгоритм Least Recently Used (LRU) Алгоритмы, близкие к LRU Алгоритмы со счетчиком Выделение фреймов Thrashing Модель рабочего множества Страничная организация по требованию в Windows NT Страничная организация в Solaris Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Виртуальная память – распространенная стратегия распределения памяти, используемая во всех современных операционных системах, основанная на идее расширения физической памяти путем размещения расширенной памяти на диске и использования таблиц страниц (или сегментов) для трансляции адресов. В лекции рассмотрены следующие вопросы: Мотивировка концепции виртуальной памяти; Потребность в страничной организации; Создание процесса и его пространства виртуальной памяти; Замена страницы; Размещение фреймов; Thrashing; Примеры организации виртуальной памяти в различных ОС. Мотивировка концепции виртуальной памяти Концепция виртуальной памяти основана на идеях отделения логической памяти пользователя от физической памяти и расширения логической памяти путем хранения ее образа на диске. При исполнении программы только часть ее кода и данных, к которым происходит обращение, в каждый момент требует размещения в физической памяти. Поэтому, естественно, возникает идея расширить пространство логической памяти, которое может быть реализовано намного большего размера, чем физическая память. Это и есть основной принцип организации виртуальной памяти. Виртуальная память поддерживает совместное использование одного и того же адресного пространства более чем одним процессом, создание и исполнение облегченных процессов в общем пространстве виртуальной памяти. 203 Виртуальная память допускает более эффективное создание процесса, чем предшествующие схемы организации памяти и процессов. Заметим, что концепция виртуальной памяти непосредственно не связана ни со страничной, ни с сегментной стратегиями распределения памяти. Виртуальная память может быть реализована различными способами, например, с помощью: страничной организации по требованию (paging on demand); сегментной организации по требованию (segmentation on demand). В приведенных терминах подчеркивается динамический характер управления виртуальной памятью: термин по требованию означает, что страница или сегмент будут размещены в физической памяти только в случае, если к ним реально происходит обращение из программы пользователя. Причем если размер обрабатываемой области виртуальной памяти (например, массива) очень велик – например, 1000 страниц, то в физической памяти будет размещена только та его страница, к которой обращается пользовательская программа. Принцип управления виртуальной памятью иллюстрируется рис. 18.1. Рис. 18.1. Виртуальная память и физическая память. Из схемы видно, что виртуальная память, как предполагается, больше, чем физическая память. Взаимодействие между частями виртуальной памяти и физической памяти происходит через отображение памяти – системную таблицу (сегментов, страниц и т.п.). Образ виртуальной памяти процесса хранится на диске. Страничная организация по требованию Принцип реализации виртуальной памяти в виде страничной организации по требованию заключается в том, что каждая страница загружается в память, только если она реально требуется при выполнении программы – содержит код или данные, к которым произошло обращение. Преимущества данного подхода: Меньший объем ввода-вывода: В память подкачивается только минимально необходимый объем данных (например, одна страница большого массива, а не весь многостраничный массив); 204 Меньший объем памяти: При данном способе расходуется минимально необходимый объем физической памяти; Более быстрая реакция системы: Поскольку объем пересылаемых данных меньше, система в среднем быстрее реагирует на каждый запрос к памяти; Система может обслуживать большее число пользователей: Ввиду экономии физической памяти и времени обращения, система в состоянии при данном подходе обслуживать большее число пользовательских процессов. Основные принципы страничной организации по требованию: 1. Если страница требуется программе, на нее имеется ссылка из программы. 2. Если ссылка на страницу неверна (например, страницы с данным номером не существует), происходит прерывание. 3. Если требуемая страница отсутствует в памяти, то она подкачивается в память. Механизм подкачки реализуется через прерывание (page fault – отказ страницы). Рис. 18.2 иллюстрирует размещение виртуальной памяти на диске и ее откачку и подкачку. Рис. 18.2. Преобразование страничной памяти в непрерывное дисковое пространство. Из схемы видно, что, с точки зрения каждой программы, пространство ее виртуальной памяти непрерывно. Оно преобразуется в непрерывную область дисковой памяти. С помощью механизма откачки – подкачки в нужный момент страница виртуальной памяти размещается в основной памяти. С каждым элементом таблицы страниц связывается бит "valid/invalid", однако, в отличие от организации логической памяти, он играет несколько иную роль – он указывает на присутствие или отсутствие страницы в основной памяти. Значение бита равно 1, если страница в памяти, и 0, если ( страница отсутствует в памяти. Первоначально для всех элементов таблицы страниц бит valid/invalid полагается равным 0. Если в процессе трансляции адреса бит "valid/invalid" в таблице страниц оказыется равным 0, то происходит прерывание по отсутствию страницы в памяти (page fault). 205 На рис. 18.3 приведен пример таблицы страниц, в которой не все страницы присутствуют в основной памяти. Рис. 18.3. Пример таблицы страниц, в которой не все страницы в памяти. На схеме логическая память процесса состоит из 6 страниц с номерами от 0 до 5. Однако только страницы 0, 2, 5 размещены в основной памяти (бит valid/invalid имеет значение v = 1). Страницы 1, 3, 4 в основной памяти отсутствуют (бит valid/invalid равен i = 0). Обработка ситуации отсутствия страницы в памяти Если в таблице страниц имеется ссылка на страницу, отсутствующую в памяти, первое же обращение по такой ссылке приведет к прерыванию и вызову ОС (ситуации page fault – отсутствие страницы в памяти) ОС по таблицам определяет, что именно произошло: Если имеет место неверная ссылка (на страницу, отсутствующую в логической памяти), то работа программы прекращается. Если же имеет место обычное отсутствие страницы в памяти, то ОС должна разместить его в основной памяти. Для этого ОС выполняет следующий алгоритм: Найти незанятый фрейм в основной памяти;. Считать содержимое страницы в данный фрейм; Изменить элемент таблицы страниц: validation-бит установить равным 1; Продолжить работу программы. Напомним, что программа после прерывания продолжается с той же команды, которая была прервана из-за отсутствия страницы. Поэтому теперь программа продолжит нормально выполняться, и обращение к странице произойдет успешно. Этапы обработки ситуации отсутствия страницы в памяти показаны на рис. 18.4. Этап 1 – выполнение команды load M, которая прерывается по отсутствию страницы в памяти; 2 – прерывание и вызов ОС; 3 – обращение к странице, находящейся в файле откачки на диске; 4 – считывание страницы в память на свободный фрейм; 5 – изменение элемента таблицы страниц; 6 – повторное (успешное) выполнение команды. 206 Рис. 18.4. Обработка ситуации отсутствия страницы в памяти. Отсутствие свободного фрейма. Оценка производительности стратегии обработки страниц по требованию. На этапе 4 (рис. 18.4) возможна ситуация отсутствия свободного фрейма в основной памяти. При этом ОС должна выполнить замещение страницы (page replacement) – найти страницу, загруженную в память, но реально не используемую, и откачать ее. Для оптимальной реализации стратегии замещения страниц требуется алгоритм, приводящий к наименьшему возможному числу отказов страниц. Возможные решения мы рассмотрим немного позже в данной лекции. Дадим общую оценку производительности обработки страниц по требованию. Введем коэффициент отказов страниц (Page Fault Rate) p: > 0 p 1.0. Если p = 0, то имеет место отсутствие отказов страниц. Если p = 1, то каждое обращение к странице приводит к отказу. Оценим теперь эффективное время доступа (Effective Access Time - EAT): EAT = (1 – p) * время доступа к памяти + p * (время реакции на отказ + [ время откачки страницы ] + время подкачки страницы + время рестарта) Дадим необходимые пояснения к данной формуле. Оценка времени складывается из двух слагаемых. Первое слагаемое соответствует ситуации, когда отказ страницы не имеет места, и оценивает среднее время доступа к странице в этом случае. Второе слагаемое вычисляет оценку времени в случае отказа страницы. В нем первая компонента – суммарное время реакции аппаратуры и ОС на отказ страницы, вторая (необязательная) – время откачки страницы (если она требуется для замещения страниц), третья – время подкачки страницы, четвертая – время рестарта программы. Если коэффициент p рассматривать как вероят- 207 ность отказа страницы, то величина EAT будет математическим ожиданием общего времени доступа к странице. Преимущества виртуальной памяти при создании процессов Благодаря механизму виртуальной памяти, могут быть использованы следующие оптимизации расходования памяти при создании процессов: Копирование по записи (Copy-on-Write) Отображение файлов в память (Memory-Mapped Files). Принцип совместного использования страниц процессами (или копирование по записи Copy-On-Write, COW) позволяет первоначально родительскому и дочернему процессам использовать одни и те же страницы памяти. Если какой-либо процесс модифицирует разделяемую страницу, то только в этом случае данная страница копируется. Принцип COW обеспечивает более эффективное создание процесса, так как копируются только модифицируемые страницы. Свободные страницы распределяются из списка страниц, инициализированных нулями. Использование при вводе-выводе файлов, отображаемых в память, позволяет рассматривать файловый ввод-вывод как обычное обращение к памяти путем отображения блока на диске в страницу памяти. Первоначально файл читается с использованием запроса страниц по требованию. Часть файла размером с одну страницу читается из файла в физическую страницу (фрейм). Последующие чтения из файла и записи в файл трактуются как обычные обращения к памяти. Это упрощает доступ к файлу, по сравнению с системными вызовами read() и write(). Это позволяет также нескольким процессам отображать в память один и тот же файл, по тому же принципу, как они совместно используют какие-либо страницы. На рис. 18.5 иллюстрируется концепция файла, отображаемого в память. Рис. 18.5. Файлы, отображаемые в память. Процессы A и B совместно используют файл, причем каждому блоку файла соответствует страница в памяти. Эти страницы имеют одним и те же номера в таблицах страниц виртуальной памяти процессов. Страницы, присутствующие в памяти, фактически являются частями файла, обрабатываемого при вводе-выводе, благодаря этому, гораздо быстрее, чем обычный 208 файл. По окончании обмена, при закрытии файла, система записывает все его измененные части на диск. Подобный механизм имеется в большинстве операционных систем. Например, в системе Solaris он реализуется командой и системным вызовом mmap (memory map). Проблема замещения страниц Для предотвращения переполнения памяти, подпрограмма обслуживания отказов страниц дополняется поддержкой замещения страниц. Для сокращения времени передачи страниц используется бит модификации в таблице страниц: только модифицированные страницы откачиваются на диск. Замещение страниц дополняет картину и стратегию разделения между виртуальной и физической памятью – большая виртуальная память может быть отображена на небольшую физическую память. Пример замещения страниц приведен на рис. 18.6. Рис. 18.6. Пример замещения страниц. В примере имеются два пользовательских процесса, каждый из которых использует по 4 страницы виртуальной памяти. Однако имеется только 6 фреймов в основной памяти, выделенных для пользовательских процессов, (начальные фреймы занимает резидентный монитор ОС). В процессе 1 происходит обращение к данным M, расположенным на странице 3 виртуальной памяти, отсутствующей в основной памяти. В процессе 2 точно так же может произойти обращение к данным B на странице виртуальной памяти 1, которой также нет в основной памяти. Следовательно, ОС должна выполнить замещение страниц, т.е. решить две задачи: по какому принципу выбирать "жертвы", т.е. страницы для откачки, находящиеся в оперативной памяти, для освобождения необходимых фреймов? в каком порядке обслужить процессы 1 и 2, в каждом из которыз возникла необходимость в свободном фрейме? Кратко алгоритм замещения страниц можно сформулировать следующим образом: 1. Найти, где размещается требуемая страница на диске. 2. Найти свободный фрейм: o Если есть свободный фрейм, использовать его. 209 Если нет свободных фреймов, использовать алгоритм замещения страниц для выбора фрейма -"жертвы". 3. Прочитать содержимое требуемой страницы во вновь освобожденный фрейм. Модифицировать таблицы фреймов и страниц. 4. Продолжить выполнение процесса. o На рис. 18.7 иллюстрируется момент замещения страниц, с предварительной откачкой страницы-жертвы на диск. Рис. 18.7. Замещение страниц с откачкой жертвы на диск. Этапы замещения страниц: 1 – откачка жертвы; 2 – изменение ее элемента таблицы страниц (бит valid заменяется на invalid); 3 – подкачка на освободившееся место желаемой страницы; 4 – изменение элемента таблицы страниц для новой страницы (бит invalid заменяется на valid; запоминается физический адрес подкачанной страницы). Алгоритмы замещения страниц Как видно из рассмотренного выше, поиск оптимального алгоритма замещения страниц должен быть основан на следующем критерии: необходимо добиваться уменьшения коэффициента отказов страниц p. Оценка алгоритма может быть выполнена путем опробования его на конкретной строке обращений к памяти (строке запросов) и определения числа отказов страниц при данной строке запросов. Во всех приводимых ниже в данном разделе примерах из области страничной организации строка запросов имеет вид: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5. График зависимости числа отказов страниц от числа фреймов в основной памяти изображен на рис. 18.8. В целом, как и подсказывает здравый смысл, зависимость обратно пропорциональная: чем больше имеется фреймов, тем меньше отказов страниц. Однако случаются и аномалии в этом законе, рассмотренные далее. 210 Рис. 18.8. Зависимость числа отказов страниц от числа фреймов. Алгоритм FIFO (First-In-First-Out). Наиболее простой алгоритм замещения страниц – в качестве жертвы всегда выбирается фрейм, первым из имеющихся считанный в основную память. Рассмотрим пример использования данного алгоритма. Пусть строка запросов имеет вид: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5. Случай 1: 3 фрейма (3 страницы могут быть одновременно в памяти для одного процесса). Пусть имеются три процесса. Их таблицы страниц примут вид: (1, 2, 3) (4, 1, 2) (5, 3, 4). В данном случае имеет место 9 отказов страниц (проверьте в качестве упражнения). Случай 2: 4 фрейма. Пусть имеются по-прежнему три процесса. Таблицы страниц в данном случае будут иметь вид: (1, 2, 3, 4) (5, 1, 2, 3) (4, 5) Нетрудно проверить, что в данном случае имеет место 10 (!) отказов страниц, несмотря на то, что процесс может иметь больше свободных фреймов, чем в предыдущем случае. Данная аномалия называется аномалией Belady. В целом же, как уже говорилось, зависимость такова, что чем больше фреймов может иметь процесс (при достаточно большом числе фреймов), тем меньше отказов страниц. Пример работы алгоритма FIFO для замещения страниц, при максимальном числе фреймов для процесса, равном 3, приведен на рис. 18.9. На рис. 18.10 изображен график зависимости числа отказов страниц от числа фреймов при алгоритме FIFO, отображающий аномалию Belady. Оптимальный алгоритм замещения страниц Одна из возможных стратегий замещения страниц следующая: Замещается та страница, которая не использовалась в течение наибольшего периода времени. Это вполне оправдано с точки зрения здравого смысла: чем раньше страница последний раз использовалась, тем, по-видимому, меньше она необходима в основной памяти. Рассмотрим пример применения данного алгоритма с той же строкой запроса и с четырьмя максимально возможными фреймами у каждого процесса: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 211 Рис. 18.9. Пример работы алгоритма FIFO. Рис. 18.10. Аномалия Belady при использовании алгоритма FIFO замещения страниц. Нетрудно видеть, что будет иметь место всего 6 отказов страниц (в отличие от алгоритма FIFO с 10 отказами страниц). Пример использования оптимального алгоритма замещения страниц с той же строкой запроса, которая применялась на рис. 18.9 для алгоритма FIFO, приведен на рис. 18.11. Рис. 18.11. Пример использования оптимального алгоритма замещения страниц. Алгоритм Least Recently Used (LRU) Данный алгоритм замещения страниц основан на следующем принципе: Замещается та страница, которая раньше всего использовалась. Для примера со строкой запросов: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 число отказов страниц равно всего 4. 212 Однако следует иметь в виду, что использование системой информации о времени последнего обращения к странице требует хранения в каждом элементе таблицы страниц значения времени последнего обращения (time stamp). Каждый элемент таблицы страниц содержит счетчик. Каждый раз при обращении к странице через некоторый элемент таблицы страниц содержимое системных часов (clock) копируется в его поле счетчика. Если требуется изменение в конфигурации страниц, необходимо проанализировать поля счетчиков всех элементов таблицы страниц, чтобы определить, какую именно страницу следует заместить. Для определения элемента таблицы страниц с минимальным счетчиком требуется применить алгоритм поиска минимального элемента в массиве, сложность которого O(n), где n – длина таблицы страниц. Пример использования алгоритма замещения страниц LRU с той же строкой запроса, что и на рис. 18.9 и рис. 18.11 для других алгоритмов, приведен на рис. 18.12. Рис. 18.12. Пример использования алгоритма замещения страниц LRU. Для оптимизации данного алгоритма, чтобы избежать поиска минимального элемента таблицы страниц при каждом замещении страниц, используется стековая реализация – стек номеров страниц хранится в форме двухсвязного списка. При обращении к странице она перемещается в начало списка (для этого требуется изменить 6 указателей). Преимущества данной модификации алгоритма в том, что при замещении страниц не требуется поиска. На рис. 18.13 приведен пример использования стека в алгоритме LRU для хранения самых недавних обращений к страницам. Рис. 18.13. Использование стека в алгоритме LRU для хранения самых недавних обращений к страницам. Алгоритмы, близкие к LRU Имеется несколько алгоритмов, близких к алгоритму LRU, в которых реализованы различные идеи улучшений или упрощений, направленные на то, чтобы уменьшить недостатки LRU. 213 1. Бит ссылки (reference bit). В данном алгоритме с каждой страницей связывается бит, первоначально равный 0. При обращении к странице бит устанавливается в 1. Далее, при необходимости замещения страниц, заменяется та страница, у которой бит равен 0 (если такая существует), т.е. страница, к которой не было обращений. Данная версия алгоритма позволяет избежать поиска по таблице страниц. Однако она, очевидно, менее оптимальна, чем LRU. 2. Второй шанс (second chance). В данной версии алгоритма используются ссылочный бит и показания часов, которые хранятся в каждом элементе таблицы страниц. Замещение страниц основано на показаниях часов. Если страница, которую следует заместить (по показаниям часов), имеет ссылочный бит, равный 1, то выполняются следующие действия: o Установить ссылочный бит в 0; o Оставить страницу в памяти; o Заместить следующую страницу (по показаниям часов), по тем же самым правилам. Данный алгоритм имеет следующее эвристическое обоснование. Странице, которая дольше всего не использовалась, как бы дается второй шанс на то, что она будет использована, т. е. делается эвристическое предположение, что, по мере возрастания времени, вероятность обращения к странице, к которой давно не было обращений, возрастает. Схема алгоритма второго шанса изображена на рис. 18.14. Рис. 18.14. Алгоритм второго шанса. Алгоритмы со счетчиком Идея, родственная идее алгоритма LRU, - хранить счетчики числа обращений к каждой странице. На основе этой идеи существуют два алгоритма: - Алгоритм Least Frequently Used (LFU): замещать страницы с минимальным значением счетчика (к которым было меньше всего обращений); - Алгоритм Most Frequently Used (MFU): замещать страницы с максимальным значением счетчика. Данный алгоритм основан на соображении, что страница с минимальным счетчиком – возможно, лишь недавно загружена, и, видимо, в дальнейшем будет активно использоваться, поэтому она оставляется в памяти. 214 Выделение фреймов До сих пор мы рассматривали алгоритмы замещения страниц при определенном числе фреймов, выделенных каждому процессу. Рассмотрим теперь стратегии выделения фреймов. При их выделении ОС исходит из того, чтобы каждому процессу выделить минимально необходимое число страниц. Однако различные аппаратные платформы имеют свои особенности, что тоже приходится учитывать. Например, в системе IBM 370 требуется 6 (!) страниц, чтобы обработать команду MOVE (пересылки) формата SS (Storage-Storage). В самом деле, длина команды - 6 байтов, так что она может, размещается на двух соседних страницах. Кроме того, максимум две страницы требуются для обработки источника и максимум две страницы – для обработки получателя. Разумеется, подобный казус не может произойти в RISC-системах. В операционных системах используются две основных схемы выделения фреймов - фиксированное выделение и выделение по приоритетам. Фиксированное выделение фреймов. Наиболее простой вариант - равномерное распределение фреймов процессам. Например, если имеется 100 фреймов и 5 процессов, каждому выделяется по 20 страниц. Используется также пропорциональное распределение – выделять фреймы в соответствии со следующим принципом: если общее число фреймов m, размер процесса – s, а общий размер всех процессов – S, то общее число фреймов, выделенных процессу, равно: a = m * (s / S). Выделение по приоритетам. Принцип данного распределения фреймов следующий: применять схему пропорционального распределения, но используя приоритеты, а не размер. Если процесс генерирует отказ страницы, то для замещения выделяется фрейм из процесса с более низким приоритетом. Глобальное и локальное распределение. Глобальное замещение фреймов означает, что процесс выбирает фрейм для замещения среди всех существующих фреймов всех процессов, т.е. один процесс может взять фрейм у другого. Локальное замещение фреймов, наоборот, гарантирует, что каждый процесс выбирает фрейм для замещения только из числа выделенных ему фреймов. Thrashing Данный термин буквально означает метание, тряска. Если процессу не выделено достаточное число страниц, коэффициент отказов страниц очень высок. Это приводит к тому, что процесс занят в основном откачкой и подкачкой страниц. При этом ОС может сделать неверное заключение о низкой производительности использования процессора и, следовательно ... принять решение об увеличении степени мультипрограммирования, т.е. о добавлении нового процесса к системе. Неформально, thrashing означает катастрофическую нехватку фреймов в основной памяти. На практике для пользователя это выглядит следующим образом (автор сам неоднократно испытывал подобные ощущения, вынужденный работать на SPARC-станции с очень малым объемом памяти): жесткий диск буквально "надрывается" от непрерывных обращений, а процесс исполняется крайне медленно. Интересно отметить, что SPARC-станция с 32 мегабайтами памяти и ОС Solaris успешно выдерживали эти экстремальные нагрузки (причем на данной конфигурации пропускалась достаточно большая Java-программа). Это говорит о высокой надежности системы Solaris. Другой реальный пример – использование ОС Windows XP (Service Pack 3) на компьютере с 512 мегабайтами памяти. При этом возникает почти такое же ощущение - сначала кажется, что неисправен жесткий диск, но затем сразу осознаешь, что все дело в нехватке памяти: самые простые программы, такие как Internet Explorer, Windows Explorer и др., будучи вызванными одновременно (что является обычной практикой) переполняют основную память и вынуждают операционную систему при любом дополнительном действии пользователя (даже при простом передвижении полосы прокрутки по именам файлов в Windows Explorer) непрерывной откачкой и подкачкой. На рис. 18.15 приведен график зависимости использования процессора от коэффициента мультипрограммирования. При очень большом числе обрабатываемых процессов полезность 215 использования процессора резко падает из-за постоянных откачек и подкачек. Это и есть thrashing. Рис. 18.15. Модель рабочего множества Если более глубоко проанализировать ситуацию с thrashing, то возникает вопрос, с какой целью используется страничная организация. При использовании локальной модели распределения фреймов, процесс мигрирует от одной локальной модели к другой. Однако локальные модели различных процессов могут пересекаться. Выражаясь более простым языком, thrashing происходит, если сумма размеров локальных потребностей процессов в основной памяти больше общего размера памяти. Для борьбы с подобными явлениями в операционных системах для распределения фреймов используется модель рабочего множества. Обозначим через Δ (рабочее множество) фиксированное число обращений к страницам. Рассмотрим WSSi (рабочее множество процесса Pi) - общее число обращений к страницам в самой недавней Δ (меняется в зависимости от времени). Если Δ очень мало, не рассматриваем полную локальную потребность. Если Δ слишком велико, рассматриваем несколько локальных потребностей. Если Δ = ∞, рассматриваем всю программу. Вычислим величину D = WSSi- общий объем требований фреймов всех процессов. Пусть m – размер основной памяти. Если D > m то Thrashing (m - общий размер памяти). Политика ОС по борьбе с thrashing’ом заключается в том, чтобы, если D > m, приостановить один из процессов. Пример использования рабочего множества и вычисления WSSiприведен на рис. 18.16. Рис. 18.16. Пример использования рабочего множества. 216 Страничная организация по требованию в Windows NT ОС Windows NT использует страничную организацию "по требованию" и кластеризацию, т.е. подкачку страниц, смежных с затребованной. Процессам выделяются минимальное и максимальное рабочие множества. Минимальное рабочее множество – это набор страниц, которые процесс гарантированно имеет в памяти. Процесс может иметь в памяти число страниц до максимума рабочего множества. Если объем свободной памяти в системе становится меньше некоторого порогового значения (threshold), то ОС выполняет сокращение рабочих множеств процессов (working set trimming). Сокращение рабочих множеств – это изъятие у процессов "лишних" страниц в оперативной памяти, которые превышают минимальный размер их рабочих множеств. Страничная организация в Solaris В ОС Solaris поддерживается список свободных страниц для выделения процессам, в которых происходят отказы страниц. Используется lotsfree – пороговый параметр для начала подкачки страниц. Управление страницами выполняет процесс pageout. Процесс pageout сканирует страницы, используя модифицированный алгоритм, основанный на показаниях часов. Используется также scanrate – коэффициент, характеризующий процесс сканирования. Диапазон - от slowscan до fastscan. Процесс pageout вызывается более часто, в зависимости от размера свободной памяти. Ключевые термины mmap (memory map) – команда и системный вызов в ОС Solaris для организации файла, отображаемого в память. Thrashing – ситуация критической нехватки основной памяти в системе, при которой процессор занят в основном откачкой и подкачкой страниц. Алгоритм FIFO (First-In-First-Out) замещения страниц - наиболее простой алгоритм замещения страниц, при котором в качестве жертвы всегда выбирается фрейм, первым из имеющихся считанный в основную память. Алгоритм Least Frequently Used (LFU) замещения страниц – алгоритм, при котором замещается страница с минимальным значением счетчика обращений (к которой было меньше всего обращений). Алгоритм Least Recently Used (LRU) замещения страниц – алгоритм, при котором замещается та страница, которая раньше всего использовалась. Алгоритм Most Frequently Used (MFU) замещения страниц – алгоритм, при котором замещается страница с максимальным значением счетчика обращений (к которой было больше всего обращений). Алгоритм второго шанса (second chance) при замещении страниц – алгоритм, в котором замещается не та страница, к которой дольше всего не было обращения, а следующая за ней по списку страниц, упорядоченному в порядке возрастания времен обращений. Аномалия Belady – рост числа отказов страниц в алгоритме FIFO при четырех свободных фреймах у процесса, по сравнению с числом отказов страниц при трех свободных фреймах. Бит модификации - бит элемента таблицы страниц, указывающий на модификацию страницы, с целью откачки на диск только модифицированных страниц. Бит ссылки (reference bit) – бит элемента таблицы страниц, равный 0, если к странице не было обращения, и 1, если обращение к странице было. Бит "valid/invalid" – бит элемента таблицы страниц, указывающий на присутствие или отсутствие страницы в основной памяти. Виртуальная память – метод управления памятью, основанный на принципах отделения логической памяти пользователя от физической памяти и расширения логической памяти путем хранения ее образа на диске. 217 Выделение фреймов по приоритетам – выделение процессам фреймов страниц в основной памяти, в соответствии с приоритетами процессов: при замещении страниц замещается страница процесса с более низким приоритетом. Глобальное выделение фреймов – выделение процессам фреймов страниц в основной памяти, при котором набор свободных фреймов – общий для всех процессов, так что один процесс может взять фрейм у другого. Замещение страницы (page replacement) – подкачка операционной системой страницы, к которой произошло обращение, вместо другой страницы, с откачкой последней, если она требуется. Копирование при записи (Copy-on-Write) – стратегия создания процесса, при которой новый процесс разделяет адресное пространство с процессом-родителем до первой записи в адресное пространство, после чего для дочернего процесса создается новое адресное пространство – копия родительского. Коэффициент отказов страниц (Page Fault Rate) – число от 0 до 1, характеризующее вероятность отказа страницы. Локальное выделение фреймов – выделение процессам фреймов страниц в основной памяти, при котором наборы свободных фреймов выделяются для каждого процесса отдельно. Оптимальный алгоритм замещения страниц - алгоритм замещения страниц, при котором замещается та страница, которая не использовалась в течение наибольшего периода времени. Отказ страницы (page fault) – прерывание по отсутствию страницы в основной памяти. Пропорциональное выделение фреймов – выделение процессам фреймов страниц в основной памяти, пропорционально размерам процессов в памяти. Рабочее множество – набор страниц, используемых процессом. Сегментная организация по требованию (segmentation on demand) – метод организации виртуальной памяти, основанный на сегментной организации, при котором каждый сегмент загружается в память, только если он реально требуется при выполнении программы – содержит код или данные, к которым произошло обращение. Страничная организация по требованию (paging on demand) – метод организации виртуальной памяти, основанный на страничной организации, при котором каждая страница загружается в память, только если она реально требуется при выполнении программы – содержит код или данные, к которым произошло обращение. Файл, отображаемый в память (Memory-Mapped File) – файл, блоки которого отображены в основную память через таблицу страниц. Фиксированное выделение фреймов – выделение фреймов страниц в основной памяти процессам либо равномерно, либо пропорционально размерам процессов в памяти. Эффективное время доступа (Effective Access Time - EAT) – математическое ожидание времени доступа к странице. Краткие итоги Виртуальная память – метод распределения памяти, при котором логическая память процесса отделена от физической, превышает физическую по объему, ее образ хранится во вторичной памяти, а конкретный фрагмент памяти подкачивается в основную память при обращении к нему. Такой метод позволяет расширить адресное пространство, обеспечить совместное использование памяти, сэкономить память при создании процессов. Виртуальная память может быть реализована путем страничной или сегментной организации по требованию. Страничная организация по требованию – схема страничной организации, при которой страница подкачивается в основную память только при обращении к ней. При отсутствии адресуемой страницы в основной памяти происходит прерывание – отказ страницы (page fault). 218 Бит valid-invalid элемента таблицы страниц указывает, присутствует ли страница в основной памяти. При обработке ситуации отказа страницы ОС находит фрейм в основной памяти и подкачивает в него страницу с диска. При отсутствии свободного фрейма выполняется алгоритм замещения страниц – выбор фрейма-жертвы (по какому-либо критерию), откачка его на диск и подкачка на освободившееся место адресуемой страницы. Виртуальная память дает возможность оптимизировать при создании процесса (дочерний процесс может использовать пространство памяти родительского, если он его не изменяет), а также организовать совместно используемые файлов, отображаемые в память. При замещении страниц на диск откачиваются только модифицированные страницы (для их указания используется бит модификации в элементе таблицы страниц). Число отказов страниц обратно пропорционально зависит от числа свободных фреймов у каждого процесса: чем больше фреймов, тем меньше отказов страниц. Исключение – аномалия Belady: возрастание числа отказов при четырех фреймах, по сравнению с тремя в алгоритме FIFO. Используются следующие алгоритмы замещения страниц: FIFO (замещается страница, загруженная в память раньше всех); оптимальный алгоритм (замещается страница, которая не использовалась в течение наибольшего периода времени); LRU (замещается страница, к которой раньше всего было обращение); LRU с использованием стека страниц с самой ранней по обращению страницей на вершине; замещение страниц с нулевым битом ссылки; алгоритм второго шанса (замещение второй по давности обращений страницы, с сохранением первой в памяти); LFU – замещение реже всего используемой страницы; MFU – замещение чаще всего используемой страницы. Выделение процессам фреймов в основной памяти для размещения страниц выполняется равномерно (выделяется одинаковое число фреймов), пропорционально размерам процессов, по приоритетам, локально (для каждого процесса свой список свободных фреймов) или глобально (общий список свободных фреймов для всех процессов). Thrashing – ситуация катастрофической нехватки фреймов в основной памяти, когда процессор занят в основном откачкой и подкачкой. Для борьбы с thrashing реализуется стратегия управления рабочими множествами. Рабочее множество – набор фреймов и страниц, используемых процессом. В Windows NT каждый процесс имеет минимум и максимум элементов рабочего множества. Если объем свободной памяти меньше некоторого критического порога, рабочие множества всех процессов сокращаются. В системе Solaris имеется пороговое значение для подкачки страниц; управление страницами выполняется на основе модифицированных показаний часов. Набор для практики Вопросы 1. 2. 3. 4. 5. 6. 7. 8. Что такое виртуальная память? Какие преимущества дает применение метода виртуальной памяти? Какие два способа используются для организации виртуальной памяти? Что такое страничная организация по требованию? Что такое сегментная организация по требованию? Что такое отказ страницы (page fault) и как ОС обрабатывает эту ситуацию? Что такое бит valid-invalid? Какие действия выполняет ОС при отсутствии свободного фрейма при обработке отказа страницы? 9. Что такое эффективное время доступа к странице и как оно вычисляется? 10. Что такое копирование при записи (copy-on-write)? 11. Что такое файл, отображаемый в память? 12. Что такое бит модификации и как он используется при откачке замещаемых страниц? 13. Каковы этапы алгоритма замещения страниц? 14. Что такое фрейм-жертва? 15. Что такое коэффициент отказов страниц? 16. Как зависит число отказов страниц от числа свободных фреймов? 219 17. Каковы принципы алгоритма FIFO замещения страниц? 18. Что такое аномалия Belady? 19. Что такое оптимальный алгоритм замещения страниц? 20. Каковы принципы алгоритма LRU замещения страниц? 21. Каковы принципы алгоритма на основе бита ссылки для замещения страниц? 22. Каковы принципы алгоритма второго шанса для замещения страниц? 23. Каковы принципы алгоритма LFU замещения страниц? 24. Каковы принципы алгоритма MFU замещения страниц? 25. Что такое выделение фреймов и по каким принципам оно может осуществляться? 26. Что такое равномерное выделение фреймов? 27. Что такое пропорциональное выделение фреймов? 28. Что такое выделение фреймов по приоритетам? 29. Что такое глобальное и локальное выделение фреймов? 30. Что такое thrashing и в каких случаях он происходит? 31. Что такое рабочее множество? 32. Каковы особенности страничной организации в Windows NT? 33. Каковы особенности страничной организации в Solaris? Упражнения 1. Реализуйте модель страничной организации по требованию. 2. Реализуйте алгоритмы замещения страниц, рассмотренные в лекции. 3. Реализуйте модель стратегии рабочего множества с оценкой размеров рабочих множеств процессов и их сокращением, если объем памяти меньше порогового значения. 4. Реализуйте модель файла, отображаемого в память, и его взаимосвязи с таблицами страниц разделяющих его процессов. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. 6. 7. 8. 9. Обзор методов реализации виртуальной памяти в операционных системах (реферат). Страничная организация по требованию (реферат). Сегментная организация по требованию (реферат). Сравнительный анализ алгоритмов замещения страниц (реферат). Методы выделения фреймов и организации рабочих множеств процессов в операционных системах (реферат). Реализация модели страничной организации по требованию (курсовая работа). Реализация алгоритмов замещения страниц, рассмотренных в данной лекции (курсовая работа). Реализация модели стратегии рабочего множества с оценкой размеров рабочих множеств процессов и их сокращением, если объем памяти меньше порогового значения (курсовая работа). Реализация модели файла, отображаемого в память, и его взаимосвязи с таблицами страниц разделяющих его процессов (курсовая работа). 220 19. Лекция: Системы файлов В лекции рассмотрены следующие вопросы: интерфейс с системой файлов; структура файла и операции над файлом; типы файлов; отличия файловых систем в ОС MULTICS и "Эльбрус" от файловых систем в ОС для ПЭВМ; файлы последовательного и прямого доступа; директория, способы организации директорий; монтирование файловых систем; защита файлов; блок управления файлом; принципы реализации файловых систем. Содержание Введение Понятие файла Структура файла Атрибуты файла Операции над файлами Типы файлов – имена и расширения Методы доступа к файлам Директории Особенности системы файлов в "Эльбрусе" Типичная организация файловой системы изображена на рис. 19.3. Операции над директориями Логическая организация директорий Монтирование файловых систем Общий доступ к файлам Защита файлов Реализация файловых систем Структура файловой системы Системные структуры в памяти для управления файловой системой Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Файл – совокупность логически объединенных данных во внешней памяти. Управление файлами – одна из важных задач ОС, так как в виде файлов в системе хранится практически любая информация – программы и данные. В лекции рассмотрены следующие вопросы: Понятие файла Методы доступа Структура директорий Монтирование файловых систем Общий доступ к файлам Защита файлов Принципы реализации файловых систем Блок управления файлом. Понятие файла Файл (file) – это смежная область логического адресного пространства. Как правило, файлы хранятся во внешней памяти. Немного о терминологии. Слово файл уже несколько десятков лет используется как русское – один из многочисленных примеров программистских неологизмов. Первоначально, когда около 50 лет назад появился данный английский термин, в русскоязычной литературе специалисты пытались ввести другую терминологию – слово file переводили как фонд и даже тека (в смысле хранилище). Однако исторически сложилось иное решение – слово файл стало русским. В английском языке слово file имеет много других значений: например, подшитый в папку бумажный документ и даже стадо (например, слонов) – в последнем случае, как можно предположить, размер "файла" может быть очень велик. У всех в памяти название легендарного сериала "X files" (в вольном русском переводе – "Секретные материалы"). 221 Фирма IBM в документации по своей системе IBM 360 в 1960-х гг. использовала иной термин – набор данных (data set) – для обозначения этого же понятия, однако он не пережил операционную систему, в которой использовался. Каждый файл имеет свой тип, определяющий, какая информация хранится в файле. Основные типы файлов – программа (код) или данные. Данные подразделяются на числовые, символьные (текстовые) и двоичные (произвольная информация). Структура файла В различных системах приняты различные точки зрения на структуру файлов. В ряде систем структура файла привязывалась к типу устройства, на котором он находится. В некоторых других системах структура файла была искусственно усложнена. Однако наиболее простую и унифицированную точку зрения из них предложили авторы системы UNIX: файл – это последовательность слов или байтов. Казалось бы, это очевидно, но преимущество данного подхода к файлам в том, что базовое представление файла и базовые операции над ним (read, write) не зависят от типа устройства. В свое время для программистов нашего поколения такой подход к файлам был откровением, после сложностей системы файлов IBM 360, а затем – "Эльбруса". Можно сказать, что файлы в своем развитии прошли путь, аналогичный развитию архитектур компьютеров – сначала в сторону значительных усложнений, затем – упрощения и унификации. Файлы можно условно подразделять на файлы простой и сложной структуры (хотя точка зрения на структуру файла зависит от той программы, которая его обрабатывает). Файлы простой структуры состоят из последовательности записей (records) – элементарных единиц, в терминах которых выполняются операции обмена с файлом. Записи могут быть: строками, если это текстовый файл; двоичными данными фиксированной длины; двоичными данными переменной длины. Файлы сложной структуры могут быть самого разного вида, например: отформатированным документом Microsoft Office (такой файл, кроме собственно текста, содержит управляющие символы переключения шрифтов, цветов и т.д.); загрузочным модулем реального или виртуального двоичного кода, например, portable executable (PE) -файлом для платформы .NET; class-файлом для платформы Java; подобные файлы состоят из нескольких секций, содержат внутренние ссылки и таблицы и т.д. Сложная структура файла может быть смоделирована записями путем добавления соответствующих управляющих символов. Файлы интерпретируются операционная система или программами их обработки. Атрибуты файла Практически в любой системе файлов можно считать, что файл состоит из заголовка и памяти. В заголовке файла хранятся его атрибуты – общие свойства, описывающие содержимое файла, память файла – это его записи, строки, секции и т.д., содержащие собственно хранимую в нем информацию. Различаются следующие основные атрибуты файла: Имя (Name) – название файла в символьной форме, воспринимаемое пользователем. Тип (Type) – тип хранимой в файле информации. Отдельный атрибут тип необходим для систем, которые поддерживают различные типы файлов. Например, в системе "Эльбрус" значением атрибута тип файла является число, кодирующее тип: 0 – данные, 2 – код, 3 – текст и т.д. Однако более общепринятым подходом является подход, принятый в систем ах MS DOS, Windows, UNIX: тип файла кодируется расширением имени, например, book.txt – текстовый файл (.txt), содержащий текст книги. Размещение (Location) – указатель на размещение файла на устройстве. Размер (Size) – текущий размер файла. 222 Защита (Protection) – управляющая информация, задающая полномочия чтения, изменения и исполнения файла. Время и дата. Например, во всех системах хранится дата создания файла и дата последней модификации файла. Последняя играет важную роль при компиляции (сборке) больших программных проектов, так как утилиты для сборки проектов (например, make) определяют по соотношению дат последней модификации файлов исходного кода и двоичного кода, следует ли перекомпилировать исходный файл. В ОС UNIX дату модификации файла можно изменить командой touch f, где f – имя файла. Touch дословно означает потрогать. Кроме изменения времени модификации, больше никаких действий над файлом не производится. Идентификация пользователя. В любой системе поддерживается понятие хозяин (создатель) файла (owner). Именно хозяин вправе задавать другим пользователям полномочия для работы с файлом. Информация о файлах хранится в структуре директорий (или справочников directories), иногда, например, в системе Windows, называемых также папками (folders) – структурами во внешней памяти, содержащими символьные имена файлов и ссылки на них. Важнейшая концепция директории подробно рассматривается далее в данной лекции. Операции над файлами Хотя набор операций над файлами и особенно их обозначений различается от системы к системе, можно выделить следующие основные операции над файлами. Создание файла (Create). Создается заголовок файла; первоначально его содержимое (память) пусто. Запись в файл (Write). Как правило, происходит записями (records) или блоками – более крупными логическими единицами информации, объединяющими несколько записей, с целью оптимизации операций ввода-вывода. Чтение из файла (Read). Обычно также выполняется записями или блоками. Поиск позиции внутри файла (позиционирование) (Seek). Позиция задается номером записи или блока, либо специальными именами, обозначающими начало файла (позиция перед первой записью) или конец файла (позиция после последней записи). Удаление файла (Delete). В зависимости от реализации системы файлов, ошибочное удаление файла может быть фатальным (UNIX) или исправимым (MS DOS). Сокращение файла (Truncate). Открытие файла (Open) – поиск файла в структуре директорий по его символьному имени (пути) и считывание его заголовка и одного или нескольких смежных блоков в буфера в основной памяти. Закрытие файла (Close) – запись содержимого буферов в блоки файла; обновление файла во внешней памяти в соответствии с его текущим состоянием; освобождение всех структур в основной памяти, связанных с файлом. Для выполнения операций обмена с файлом (read, write), как правило, файл необходимо открыть. Закрытие файла является обязанностью пользовательского процесса; однако, если он по како-либо причине этого не выполняет, то закрывает все файлы, открытые процессом, операционная система после завершения или прекращения процесса. Типы файлов – имена и расширения В таблица 19.1 приведены некоторые наиболее употребительные типы файлов и соответствующие им расширения имен. Смысл их ясен из приведенной таблицы. Следует заметить, что унифицированных расширений имен, принятых в различных ОС, очень мало – по-видимому, только .txt (текст) и расширения для исходных кодов на языках программирования, например, .c – Си, .p или .pas – Паскаль и др. Объектные модули называются по-разному (в Windows – .obj, в UNIX .o), библиотеки – тоже: статически линкуемые в Windows - .lib, в UNIX - .a; динамически линкуемые в Windows - .dll, в UNIX – .so. Интересно отметить, что для исполняемого кода в Windows есть стандартное расширение - .exe, а в UNIX – нет, зато есть весьма экзотическое полное стандартное имя: a.out (assembler output). Унифицированы расширения имен для различных текстовых процессоров: .doc - Microsoft Word, .pdf – Adobe Acrobat и др. 223 Таблица 19.1. Типы файлов – имена и расширения тип файла расширение имени функциональность исполняемый код (загрузочный модуль) exe, com, bin или отсутствует готовая к выполнению программа в бинарном машинном коде обьектный модуль obj, о откомпилированная программа в бинарном коде, но не слинкованная исходный код на языке программирования с, сс, Java, pas, asm, а исходный код на различных языках (Си, Паскаль и др.) командный файл bat, sh файл с командами для командного интерпретатора текст txt, doc текстовые данные, документы документ для текстового процессора wp, tex, rrf, doc документе формате какого-либо текстового процессора библиотека lib, a, so, dll, mpeg, библиотеки модулей для программирования mov, rm файл для печати или визу- arc, zip, tar ализации ASCII или бинарный файл в формате для печати или визуализации архив arc, zip, tar несколько файлов, сгруппированных в один файл, для архивации или хранения мультимедиа mpeg, mov, rm бинарный файл, содержащий аудио- или видео/аудиоинформацию Методы доступа к файлам Традиционно различаются файлы последовательного доступа и прямого доступа. Файл последовательного доступа – это файл, доступ к которому возможен только позиционированием на начало и конец и затем операциями обмена вида считать или обновить следующую (предыдущую) запись. Файл прямого доступа – это файл, для которого возможен непосредственный доступ по номеру записи и операция обмена с явным указанием номера записи. В любом случае, при выполнении обмена с файлом всегда существует некоторая текущая позиция по файлу, указывающая на некоторую запись, на позицию перед началом или после конца файла. В операциях над файлом последовательного доступа произвольная установка позиции не допускается, а разрешены только операции, автоматически передвигающие текущую позицию на следующую (предыдущую) запись. Подобная особенность связана с различием устройств, на которых размещены файлы (например, магнитная лента – по сути дела, последовательное устройство), однако необходимость организации последовательных или прямых файлов может быть связана с сутью задачи. По-видимому, последовательный доступ используется чаще: именно так происходит ввод данных, вывод результатов на печать или на экран. Типичные операции последовательного доступа: read next write next reset – установка на начало файла для чтения rewrite – установка на начало файла для записи. Типичные операции прямого доступа: read n write n position to n – позиционирование на запись с номером n read next write next rewrite n, где n - относительный номер блока (записи). 224 Описанная трактовка последовательных файлов и операций над ними иллюстрируется рис. 19.1. Рис. 19.1. Файл последовательного доступа. При необходимости можно смоделировать операции последовательного доступа для файла с прямым доступом. Способ моделирования показан в таблица 19.2. Таблица 19.2. Моделирование последовательного доступа для файла с прямым доступом последовательный доступ reset реализация для файла с прямым доступом cp=0; read next read cp; cp=cp+1; write next write cp; cp=cp+1; Указатель на текущую позицию, характерный для последовательного доступа, для файла прямого доступа моделируется переменной cp, а операции последовательного доступа – операциями прямого доступа с указанием cp в качестве номера блока. Для ускорения доступа к файлу большого объема может использоваться индексный файл, содержащий ссылки на записи основного (относительного) файла. рис. 19.2 изображен пример основного файла, содержащего упорядоченные по фамилиям анкетные данные людей. Индексный файл для данного основного файла содержит ссылки на первые логические записи анкет с заданной фамилией, например, Smith. Рис. 19.2. Индексный файл и основной файл. Директории Директория (directory, folder) - узел, содержащий информацию о файлах – их имена и ссылки на файлы и на другие директории во внешней памяти. Таким образом, возможна организация иерархии директорий или их более сложных взаимосвязей, вплоть до произвольных графов. Как структура директорий, так и файлы хранятся на диске. С помощью ди- 225 ректорий поддерживается именование файлов с помощью путей (paths) – многослоговых имен, состоящих из имени корневой директории (или логического диска) и последовательности имен директорий последующих уровней. Например, в системе Windows c:\doc\plan.txt – путь доступа к файлу, задающий его расположение – на логическом диске C: , в директории doc (документы), и имя файла – plan.txt. Имя содержит расширение, указывающее на тип файла. Резервное копирование (back-up) файлов и директорий выполняется на специальные предназначенные для этого носители – например, на ленту (стример), flash-память, внешний переносной жесткий диск, компакт-диск (CD, DVD). Настоятельно рекомендуется регулярно копировать на внешний носитель (или на несколько внешних носителей) наиболее важные директории. Особенности системы файлов в "Эльбрусе" Говоря о структуре директорий и именовании файлов, нельзя не упомянуть столь экзотическую систему файлов, как в МВК "Эльбрус". Это будет полезно читателям, чтобы сравнить и лучше оценить разнообразие подходов к системам файлов. Основные концепции системы файлов МВК "Эльбрус" – это файлы, контейнеры, справочники. Понятие контейнера в "Эльбрусе" близко к современным понятиям тома и контейнера в системах Windows и Solaris: контейнер – это хранилище файлов на одном или нескольких дисках. Понятие справочника близко к понятию директории в традиционных файловых системах. Файл в "Эльбрусе" состоит из заголовка и памяти. В заголовке хранятся атрибуты файла, число которых – порядка 100 (!). Существенным отличием файловой системы "Эльбруса" является то, что возможно создание файла и управление им без присваивания ему имени, т.е. без отображения его в справочниках (директориях). Такой временный файл создается в программе, ссылка на файл хранится в глобальной или локальной переменной, и по окончании выполнения программы файл уничтожается, если на него не была сохранена ссылка в справочнике на диске. Кроме того, файлы могут ссылаться друг на друга (по прямой "физической" файловой ссылке, а не с помощью символьных путей) через справочники внешних ссылок (СВС). СВС имеется у каждого файла. Его элементы адресуются по номерам, а не по именам. Типичный пример: файл объектного кода (ФОК) ссылается через свой СВС на файл дополнения к файлу объектного кода (ДФОК), содержащий в унифицированном виде таблицы именованных сущностей, определенных в программе и ее процедурах. Выражаясь современным языком, ДФОК содержит метаданные. Эта взаимосвязь используется при диагностике ошибок времени выполнения и для многих других целей. К недостаткам файловой системы "Эльбруса" можно отнести усложненную структуру файлов, большое число атрибутов, зависимость логической структуры файла и набора операций над ним от типа внешнего устройства, на котором он расположен. По сравнению с системой файлов "Эльбруса", система файлов в UNIX гораздо проще и удобнее, но нисколько не уступает по функциональности. Типичная организация файловой системы изображена на рис. 19.3. Файловые системы организуются на дисках. Каждый диск поделен на разделы (partitions) – смежные области дисковой памяти, имеющие свои логические имена (обычно в виде первых букв латинского алфавита). Однако возможна и организация раздела, занимающего несколько дисков. Для деления диска на разделы рекомендуем утилиту Partition Magic. В разделах хранятся директории и файлы. Каждый раздел имеет корневую директорию, у которой при необходимости могут быть организованы поддиректории, на которые она ссылается. Следует иметь в виду, что в разных разделах могут быть установлены различные операционные системы, использующие разное форматирование и разные файловые системы для своей работы. Даже если на компьютере установлена только одна ОС, различные разделы могут использовать различные типы файловых систем, например, в Windows раздел A может использовать файловую систему FAT32, а раздел B – файловую систему NTFS. В разделе C 226 может быть инсталирована ОС Linux, использующая свою собственную файловую систему Ext2Fs. Рис. 19.3. Организация файловой системы. Операции над директориями Над директориями определен ряд операций, которые аналогичны друг другу во всех операционных системах, хотя по именам могут отличаться. Операции над директориями доступны как из командного языка, так и через специализированный API. В своем изложении мы будем использовать команды для работы с файлами. Аналогичные действия могут быть выполнены с помощью GUI через графическую оболочку ОС. Установка текущей (рабочей) директории. При работе с директориями основным является понятие текущей (рабочей) директории, которая устанавливается в командных языках командой cd (change directory), например, если в данный момент текущей является корневая директория диска C: , то команда: cd doc установит в качестве текущей поддиректорию doc. Текущая директория в командном языке обозначается точкой (.) . Поиск файла. Как уже отмечалось, поиск файла выполняется с помощью символьного пути (path), образованного последовательностью имен директорий, например, C:\doc\plan.txt. Если требуется найти файл в текущей директории, указывается его имя. Например, в Windows команда: type plan.txt выводит содержимое файла plan.txt в текущей директории (C:\doc) на консоль. Создание файла. Как правило, создание файла в текущей директории выполняется программой, которая в дальнейшем будет работать с этим файлом – например, в Windows – текстовыми редакторами notepad, wordpad, Microsoft Word. Многие файлы создаются в текущей директории неявно, в результате компиляции или каких-либо других системных операций. Например, если в текущей директории имеется файл исходного кода на языке Java – program.java, то в результате его компиляции: javac program.java Java-компилятор создает в текущей директории class-файл, содержащий двоичный байткод Java-программы – файл program.class. Многие программы создают в текущей директории временные файлы, подчас с весьма экзотическими именами, - например, Microsoft Word в результате открытия файла с документом. По окончании работы программы временные файлы удаляются. 227 Создание директории. В рабочей директории можно создать другую директорию. На командном языке это делается командой mkdir, например: mkdir tmp. Удаление файла из текущей директории выполняется специальной командой - del (в Windows) или rm (в UNIX). Удаление уничтожает только ссылку на файл из директории, но не сам файл. Если на него есть другие ссылки, он сохраняется. Типичной ошибкой пользователей является поспешное неверное удаление файла. Если оно выполнено в системе Windows, то, как правило, файл можно восстановить специальными утилитами (кроме его имени), так как, например, в системе FAT файл представляется как список смежных областей. Если же удаление файла выполнено в UNIX, то, к сожалению, файл восстановлению не подлежит, так как в UNIX используется представление в виде индексных блоков, содержащих ссылки на все блоки данных файла. Вывод содержимого директории. Команда dir (в Windows) и ls (в UNIX) выводит содержимое директории на консоль. С помощью перенаправления стандартного вывода содержимое директории можно сохранить в текстовом файле, например: ls doc > doc_list.txt Переименование файла. Имя файла в директории можно изменить, если новое имя уже не встречается в директории. В UNIX это делается командой mv, например: mv old_file.txt new_file.txt Создание символической ссылки. Из элемента директории можно создать символическую ссылку на другую директорию. Это может оказаться необходимым, если требуется смоделировать структуру директорий, созданную на другом компьютере, например, на компьютере заказчика, так как системные файлы в программном продукте, например, makeфайлы для его сборки, ссылаются на определенные пути доступа к директориям. В UNIX символическая ссылка создается командой ln, например: cd /my_dir ln –s /doc doc Создается символическая ссылка из директории my_dir на директорию /doc, под тем же именем doc. Таким образом, пути /doc и /my_dir/doc указывают на одну и ту же директорию. В UNIX такой прием используется очень часто. Обход файловой системы. Более сложная операция осуществляет обход дерева директорий, начиная с заданной корневой, например, с целью поиска заданного файла. Например, в системе UNIX команда: find . –name plan.txt –print выполняет поиск в текущей директории и всех ее поддиректориях файла plan.txt и выводит на консоль полный путь доступа к каждому найденному файлу с таким именем. В системе "Эльбрус", как уже было сказано в разделе Особенности системы файлов в "Эльбрусе", создание файла – отдельная операция, не связанная с директорией (справочником) вообще. Только если явно создан элемент справочника, и в него записана ссылка на созданный файл, то она сохраняется, пока сохраняется ссылка на сам справочник. Логическая организация директорий Структуру директорий рекомендуется организовывать логически, т. е. в соответствии с логикой программы, хранения и использования данных. У такой организации директорий – две основные цели: эффективность (обеспечить быстрый поиск файла) и именование (обеспечить удобство для пользователей, например, в случае, если несколько пользователей называют два разных файла в своих директориях одним и тем же именем, в соответствии с его назначением). Директории позволяют осуществить логическую группировку файлов по их назначению, свойствам и т.д. (например, почта, документа, Java-код, игры). В связи с этим, одноуровневая организация директорий для всех пользователей не рекомендуется, так как могут возникнуть проблемы с удобной группировкой файлов и с совпадением имен. Одноуровневая структура директорий изображена на рис. 19.4. 228 Рис. 19.4. Одноуровневая организация директорий. При двухуровневой организации директорий в многопользовательской системе появляется возможность иметь одинаковые имена файлов сходного назначения для различных пользователей. При такой организации создается главная директория, в которой хранятся персональные поддиректории пользователей. В каждой из них, в свою очередь, хранятся файлы конкретного пользователя. Двухуровневая схема изображена на рис. 19.5. Рис. 19.5. Двухуровневая организация директорий. Однако данная организация не поддерживает возможность дальнейшей группировки файлов. Наиболее общей и удобной, рекомендуемой читателям, является древовидная структура директорий (рис. 19.6). Рис. 19.6. Древовидная структура директорий. Именно древовидная структура директорий обеспечивает эффективный поиск, возможность группировки и поддержку уже рассмотренных понятий текущей (рабочей) директории и пути доступа к файлу. 229 Различаются абсолютный и относительный путь. Абсолютный путь указывает полный путь доступа к файлу, начиная от логического имени раздела, либо от корневой системной директории, например (в системе UNIX): /usr/bin/sh – путь доступа к файлу командного процессора Bourne Shell. Относительный путь указывает путь доступа к файлу относительно некоторой текущей директории. В том же примере, если считать, что текущая директория - /usr, то относительный путь к тому же файлу имеет вид: bin/sh. Недостаток абсолютных путей в том, что на разных компьютерах (например, заказчика и исполнителя) абсолютные пути к одному и тому же файлу или к одной и той же директории могут оказаться различными. В результате возникают ошибки при сборке проекта, его архивировании, разархивировании и др. Поэтому рекомендуется в системных файлах, например, в make-файлах для сборки проектов, указывать, по возможности, относительные пути, либо обозначать рабочую директорию один раз с помощью некоторого макроса и использовать это обозначение в путях, например: ${SYSDIR}/sh, где макрос SYSDIR задает конкретный путь к системной директории на данном компьютере. Пример древовидной структуры директорий приведен на рис. 19.6. Примеры операций над директориями (в обозначениях рис. 19.6): cd /spell/mail/prog – установка текущей директории. type list – вывод на консоль содержимое одного из ее файлов. Если текущая директория /mail, то поддиректория count создается командой: mkdir count Структура директорий в виде ациклического графа (рис. 19.7) возникает вследствие использования различными пользователями одних и тех же файлов и директорий. Рис. 19.7. Структура директорий в виде ациклического графа. При этом может возникнуть ситуация, когда у одного и того же файла (директории) два различных имени (aliasing). В рис. 19.7, если в директории dict удалить ссылку list, то образуется повисшая ссылка (dangling pointer). Возможные решения данной проблемы: хранение обратных ссылок из файла на директорию (с целью своевременного удаления всех ссылок); хранение счетчиков ссылок на файл; при обнулении счетчика ссылок на файл последний считается не используемым, и его память перераспределяется. 230 Структура директорий в виде произвольного графа создает еще более серьезные проблемы, например, как гарантировать отсутствие циклов в графе директорий. Пример структуры директорий в виде произвольного графа приведен на рис. 19.8. Рис. 19.8. Структура директорий в виде произвольного графа. Циклические ссылки на файлы могут возникнуть из-за ошибок в программе, связанной с обработкой файлов. Если при этом она тестируется и многократно запускается, то это может привести к переполнению внешней памяти на диске (или в разделе диска), что и произошло у автора при отладке компилятора с языка CLU на МВК "Эльбрус" в 1980-х гг. Возможные решения проблемы циклических ссылок: Допускать только ссылки на файлы, а не на поддиректории; данное решение слишком ограничительно. Выполнять сборку мусора во внешней памяти; однако традиционные алгоритмы сборки мусора не делают проверок на наличие циклов, поэтому в цепочке циклически ссылающихся друг на друга файлов все они будут считаться используемыми. Каждый раз при создании новой ссылки запускать алгоритм проверки отсутствия циклов – по-видимому, слишком "дорогое" решение. Монтирование файловых систем Файловая система – поддерево директорий на некоторой машине, расположенных в одном разделе. Каждая файловая система должна быть смонтирована, прежде чем к ней будет обеспечен доступ. Файловая система монтируется в некоторую точку монтирования (mount point). Монтирование (с абстрактной точки зрения) – это подсоединение отдельного дерева (еще не смонтированной файловой системы) к какой-либо вершине (точке монтирования) общего дерева смонтированных и доступных файловых систем. В системе UNIX имеются команды mount; automount и autodirect, управляющие монтированием. Команда mount позволяет явно задать точку монтирования и файловую систему, монтируемую в эту точку. Список всех смонтированных файловых систем хранится в системном текстовом файле /etc/mnttab (в разных диалектах пути к этому файлу и даже его имя могут различаться). Команда automount запускается при загрузке операционной системы и создает системный процесс-демон automountd, который по содержимому указанного системного файла автоматически монтирует указанные в нем файловые системы при загрузке ОС и следит за их постоянной смонтированностью. Команда autodirect позволяет смоделировать пути к "виртуальным" директориям, которых физически на данной машине не существует, и указать в системном файле /etc/vfstab их "заменители" (в виде путей к реальным директориям, размещенным на локальной машине), что весьма полезно в случае получения большого проекта от заказчика с абсолютными путями, не существующими на Вашей машине. На рис. 19.9 изображены дерево смонтированных систем с директориями пользователей (a) и еще не смонтированная файловая система (b) с директориями новых пользователей. 231 Рис. 19.9. Дерево смонтированных систем и еще не смонтированная файловая система. Если по команде mount или automount в качестве точки монтирования файловой системы (b) указывается поддиректория users, то возникает картина, изображенная на рис. 19.10. Рис. 19.10. Точка монтирования файловой системы. Общий доступ к файлам В многопользовательских системах общий доступ к файлам (sharing) необходим. Общий доступ может быть обеспечен через некоторую систему защиты (protection). В распределенных системах файлы могут использоваться совместно через сеть. Управление общим доступом к файлам в разных ОС различно: например, в Windows утилита Explorer обеспечивает возможность установки общего доступа к заданному файлу или папке с помощью GUI, сделав отметку в соответствующем checkbox, указать сетевое имя данного общего ресурса и указать, возможен ли доступ по чтению и по записи, или только по чтению. В системе UNIX передача файла из заданной файловой системы в общий доступ выполняется командой share. Network File System (NFS) – распространенная система общего доступа к файлам через локальную сеть, которая подробно рассмотрена в лекции 20. Интересная возможность общего доступа к файлам имеется в системе Solaris: файловая система, отданная в общий доступ командой share, может адресоваться с помощью пути вида /net/hostname/filesystem, где hostname – имя машины; filesystem – имя файловой системы на ней. Это очень удобно, но может создать проблемы при переносе проекта в дру- 232 гую локальную сеть (как любой абсолютный путь – в данном случае путь содержит имя машины). Защита файлов Создатель файла должен иметь возможность управлять списком допустимых операций над файлом и списком пользователей, которым они разрешены. Это и обеспечивают механизмы защиты файлов. Различаются следующие основные типы доступа к файлу: Read (для чтения) Write (для записи) Execute (для исполнения) Append (для записи в конец файла, или присоединения) Delete (для удаления) List (для вывода списка файлов в директории). Для управления защитой файлов в UNIX введены удобные и наглядные обозначения, которые мы и рассмотрим. Различаются следующие режимы доступа: read, write, execute (RWX). Различаются также три класса пользователей: владелец файла (owner), группа, к которой он принадлежит (group) и весь остальной "мир" пользователей (public). Группы пользователей создаются системным администратором. Для каждого класса пользователей признаки защиты RWX кодируются тремя битами (или одним восьмеричным числом). Таким образом, набор полномочий для работы с файлом для всех трех категорий пользователей кодируется 9 битами, или тремя восьмеричными цифрами. Например, команда: chmod 740 my_file задает для файла my_file следующие полномочия: для владельца – 7 (111): чтение, запись и выполнение; для группы – 4 (100): только чтение; для остальных пользователей – 0 (000): никаких действий над файлом не разрешено. Для директории полномочия "X" (execute) означает возможность входа в нее командой cd. Реализация файловых систем В данном разделе начнем рассматривать принципы и методы реализации файловых систем, изложение которых продолжено в "Виртуальные файловые системы (VFS). Реализации файловых систем. Сетевая файловая система NFS". В данной и следующей лекциях будут рассмотрены следующие вопросы: Структура файловых систем Реализация файловых систем Реализация директорий Методы размещения файлов Управление свободной памятью Эффективность и производительность Восстановление Файловые системы на основе журналов транзакций (Log-Structured) сетевая файловая система NFS. Структура файловой системы Файл - логическая единица распределения памяти. Он является также совокупностью логически взаимосвязанной информации. Файловая система располагается во внешней памяти (на дисках) и организована по уровням. Структура многоуровневой файловой системы изображена на рис. 19.11. 233 Рис. 19.11. Многоуровневая файловая система. На верхнем уровне абстракции работают пользовательские программы, использующие высокоуровневые примитивы вида WriteLine(F, X). Уровнем ниже располагаются модули интерфейса логических файлов – логических записей, блоков и операций обмена. Еще ниже следуют модули организации файлов, затем – операции базовой системы файлов. Ни нижних уровнях располагаются драйверы устройств (управление вводом-выводом) и аппаратура (устройства ввода-вывода и их контроллеры). Блок управления файлом (File control block - FCB) – структура в памяти, содержащая информацию о файле. Типовая структура блока управления файлом представлена в таблице 3. Таблица 3. Типовая структура блока управления файлом полномочия для работы с файлом даты создания, доступа и модификации файла владелец файла, группа, список управления доступом размер файла блоки данных файла Системные структуры в памяти для управления файловой системой При открытии файла и при дальнейшем выполнении операций над ним ОС хранит в памяти целый ряд системных структур, изображенных на рис. 19.12. При открытии файла, при исполнении операции, где указывается путь доступа к файлу в структуре директорий, система находит ссылку на блок управления файлом. При выполнении операций обмена ОС считывает в память блоки данных файла, над которыми выполняются операции. Кроме того, ОС хранит общесистемную таблицу открытых файлов. Для каждого процесса также хранится таблица файлов, открытых только этим процессом. Ключевые термины Network File System (NFS) – широко распространенная система общего доступа к файлам через локальную сеть. Абсолютный путь - полный путь доступа к файлу, начиная от логического имени раздела, либо от корневой системной директории. 234 Рис. 19.12. Структуры ОС в памяти для управления файловой системой. Атрибуты файла – общие свойства, описывающие содержимое файла. Блок – логическая единица информации (часть) файла, как правило, объединяющая несколько записей, с целью оптимизации операций ввода-вывода. Блок управления файлом (File control block - FCB) – структура в памяти, содержащая информацию о файле и используемая операционной системой. Директория (справочник, папка) - directory, folder – структура во внешней памяти, содержащая символьные имена файлов и других директорий и ссылки на них. Дополнение к файлу объектного кода (ДФОК): в системе "Эльбрус" - файл, содержащий в унифицированном виде таблицы именованных сущностей, определенных в программе и ее процедурах (метаданные). Заголовок файла – головная запись файла, в которой содержатся его атрибуты. Запись (record) – элементарная единица, часть файла, в терминах которых выполняются операции обмена с файлом. Защита (Protection) – управляющая информация, задающая полномочия чтения, изменения и исполнения файла. Контейнер (в системе "Эльбрус") – хранилище файлов на одном или нескольких дисках. Монтирование – подсоединение отдельного поддерева еще не смонтированной файловой систем к какой-либо вершине (точке монтирования) общего дерева доступных файловых систем. Набор данных (data set) - термин фирмы IBM для обозначения файла. Общий доступ (sharing) – возможность доступа к файлам и директориям различным пользователям, в том числе – по локальной сети. Относительный путь - путь доступа к файлу относительно некоторой текущей директории. Память файла - его записи, содержащие собственно хранимую в нем информацию. Путь (path) – многослоговое имя файла или директории, состоящее из имени корневой директории (или логического диска) и последовательности имен директорий последующих уровней. 235 Раздел (partition) – смежная область дисковой памяти, имеющая свое логическое имя (обычно одна из первых букв латинского алфавита). Резервное копирование (back-up) – копирование файлов и директорий на внешние носители – ленту (стример), flash-память, внешний переносной жесткий диск, компакт-диск (CD, DVD), с целью их сохранности. Символическая ссылка – ссылка из элемента одной директории на другую директорию или файл, уже имеющий другой путь доступа. Cправочник внешних ссылок (СВС) – в системе "Эльбрус": справочник, имеющийся у каждого файла и используемый для хранения его внешних ссылок на другие файлы; элементы СВС адресуются по номерам, а не по именам. Точка монтирования (mount point) – узел в дереве файловых систем, к которому подсоединяется новая файловая система при монтировании. Файл (file) – смежная область логического адресного пространства, как правило, хранящаяся во внешней памяти. Файл объектного кода (ФОК) – в системе "Эльбрус": файл, в котором хранится двоичный код исполняемой программы. Файловая система – поддерево директорий на некоторой машине, расположенных в одном разделе. Краткие итоги Файл – смежная область логического адресного пространства, хранящаяся, как правило, во внешней памяти. В файле могут храниться данные или программа. Файл делится на записи постоянной или переменной длины. Возможны файлы сложной структуры, интерпретируемые программами, их создавшими (например, документ в Microsoft Word). Файлы интерпретируют ОС и обрабатывающие их программы. Основные атрибуты файла: имя, тип, ссылка на размещение на устройстве, размер, признаки защиты, время создания, чтения и модификации. Информация о файлах хранится в структуре директорий. Основные операции над файлом: создание, запись, чтение, позиционирование, удаление, сокращение, открытие и закрытие. Тип файла в большинстве ОС указывается с помощью расширения его имени. Различаются прямой (по номеру блока) и последовательный (с помощью сдвига текущей позиции) доступ к файлам. Последовательный доступ может быть смоделирован операциями прямого доступа. Индексные файлы используются для ускорения поиска в больших основных файлах. Директория – системная структура во внешней памяти, содержащая ссылки на файлы или другие директории. Файловая система в "Эльбрусе" отличается тем, что файл может быть создан без явной ссылки на него из справочника (директории). Файлы и справочники хранятся в контейнерах – хранилищах из одного или нескольких дисков. Файлы могут ссылаться друг на друга через справочники внешних ссылок, имеющихся у каждого файла. Недостатки файловой системы "Эльбруса" – сложность структуры файлов, большое число атрибутов, зависимость операций над файлами от ти па внешнего устройства. Файлы и директории в файловой системе хранятся в разделах – смежных областях дисковой памяти, имеющих свои логические имена. Основные операции над директорией: поиск файла, создание файла, удаление файла, создание поддиректории, вывод содержимого директории, переименование файла, создание символической ссылки, обход файловой системы. Различные способы логической организации директорий: одноуровневая, двухуровневая, древовидная, в виде ациклического графа, в виде произвольного графа. Рекомендуется древовидная структура директорий, так как она позволяет организовать поддиректории для каждого пользователя, использовать файлы с одинаковыми именами в директориях различ- 236 ных пользователей и организовывать директории тематически. Структура директорий в виде ациклического графа возникает вследствие совместного использования узлов несколькими поддиректориями. Структура директорий в виде произвольного графа может привести к наличию циклов, обнаружение которых – очень неэффективная и нежелательная операция. Монтирование файловой системы – это ее подсоединение к узлу уже существующих, активных и используемых файловых систем (точке монтирования). Общий доступ к файлам и директориям необходим в многопользовательских системах, в том числе – в локальных сетях. Общий доступ контролируется некоторой системой защиты. Система NFS наиболее распространена как система общего доступа к файлам в локальной сети. Система защиты управляет полномочиями пользователей по выполнению различных действий над файлами. В ОС UNIX задаются полномочия чтения, записи и исполнения для трех групп пользователей - владельца, его группы и всех остальных. Для реализации файловой системы ОС организует блок управления файлом, содержащий основные атрибуты файла. Реализация системы файлов имеет иерархическую структуру, на верхнем уровне которой – пользовательские программы, на нижнем – драйверы и устройства ввода-вывода. Для управления открытием, закрытием файлов и операциями обмена ОС хранит в памяти общую таблицу открытых файлов и таблицы открытых файлов для каждого процесса. Набор для практики Вопросы 1. Что такое файл? 2. Какого типа информация может храниться в файле? 3. Какую структуру может иметь файл? 4. Какие программы интерпретируют содержимое файла? 5. Каковы основные атрибуты файла? 6. Каковы основные операции над файлом? 7. Каким образом система определяет тип файла? 8. Какие расширения имен используются в операционных системах? 9. Какие методы доступа к файлам Вам известны? 10. Какие операции определены над файлами прямого доступа? 11. Какие операции определены над файлами последовательного доступа? 12. Что такое индексный файл и для чего он используется? 13. Что такое директория? 14. Каковы особенности, достоинства и недостатки файловой системы "Эльбруса"? 15. Что такое раздел? 16. Каковы основные операции над директорией? 17. Каковы цели логической организации директорий? 18. Какая организация директорий является наиболее предпочтительной и почему? 19. Какие проблемы возникают при организации директорий в виде произвольного графа? 20. Что такое монтирование файловых систем? 21. Что такое точка монтирования? 22. Что такое общий доступ к файлам и почему он необходим? 23. Что такое NFS? 24. Что такое защита файлов? 25. Какие полномочия защиты и для каких пользователей рассматриваются в UNIX? 26. Что такое блок управления файлом? 27. Какие уровни абстракции можно выделить в реализации файловых систем? 28. Какие структуры в памяти создает ОС при открытии файла и для управления операциями обмена? Упражнения 1. Реализуйте набор основных операций над файлами, используя низкоуровневые примитивы ввода-вывода. 237 2. Реализуйте операции последовательного доступа к файлам, используя операции прямого доступа. 3. Реализуйте индексные файлы и операции ускоренного поиска информации по основным файлам с использованием индексных файлов. 4. Реализуйте структуру директорий и основные операции над ней, используя операции над файлами. Храните все ссылки в символической форме. 5. Разработайте и реализуйте алгоритм поиска циклических ссылок в структуре директорий. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. Обзор концепции файла и типов файлов в файловых системах (реферат). Обзор расширений имен файлов (реферат). Обзор методов доступа к файлам (реферат). Обзор операций над директориями и методов реализации директорий в файловых системах (реферат). 5. Обзор концепции монтирования и методов монтирования файловых систем в операционных системах (реферат). 6. Обзор методов защиты файлов в операционных системах (реферат). 7. Реализация набора основных операций над файлами, используя низкоуровневые примитивы ввода-вывода (курсовая работа). 8. Реализация операций последовательного доступа к файлам, используя операции прямого доступа (курсовая работа). 9. Реализация индексных файлов и операций ускоренного поиска информации по основным файлам с использованием индексных файлов (курсовая работа). 10. Реализация структуры директорий и основных операций над ней, используя операции над файлами. Храните все ссылки в символической форме (курсовая работа). 11. Разработка и реализация алгоритма поиска циклических ссылок в структуре директорий (курсовая работа). 238 20. Лекция: Виртуальные файловые системы (VFS). Реализации файловых систем. Сетевая файловая система NFS В лекции рассмотрены следующие вопросы: виртуальные файловые системы (VFS); реализация файлов с помощью FAT (Windows) и индексных блоков (UNIX); управление внешней памятью; кэширование; файловые системы на основе журнала транзакций; сетевая файловая система NFS. Содержание Введение Виртуальные файловые системы Реализация директорий Методы размещения файлов Файловые системы, основанные на расширениях Ссылочное размещение файла Индексируемое размещение Управление свободной внешней памятью Эффективность и производительность дисковой памяти Кэширование диска Проблемы восстановления файлов Сетевая файловая система NFS Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Значительную роль для пользователей в современных условиях играют виртуальные и сетевые файловые системы, которые позволяют осуществлять операции над файлами в удобных терминах на должном уровне абстракции. Весьма важны также эффективные и надежные методы реализации файлов и операций над ними в файловых системах. Все эти вопросы рассмотрены в данной лекции. Виртуальные файловые системы Виртуальные файловые системы (VFS) обеспечивают объектно-ориентированный способ реализации файловых систем. VFS обеспечивает единый интерфейс системных вызовов (API) для различных типов файловых систем, которые могут быть очень разными по своей реализации, включая сетевые файловые системы. Данный API является набором операций над самой VFS, а не над каким-либо специфическим типом файловых систем. Схема организации виртуальной файловой системы изображена на рис. 20.1. Реализация директорий Директория – центральная системная структура в файловой системе, на которой основан поиск файлов. Поэтому эффективная реализация директорий особенно важна. Наиболее простой метод реализации директорий - линейный список имен с указателями на блоки данных. Такая реализация просто программируется, однако требует большого времени выполнения. Более эффективный метод реализации - хэш-таблица – линейный список с хэшоглавлением и подразделением на (небольшие) списки элементов с одним и тем же значением хеш-функции. Такой метод уменьшает время поиска в директории. При использовании хеш-таблицы возможны коллизии – ситуации, когда два имени хэшируются в один и тот же адрес. Данная проблема решается использованием метода цепо- 239 чек – представления хеш-таблицы, при котором для каждого значения хеш-функции хранится список элементов, имеющих данное значение хеш-функции. Рис. 20.1. Схема организации виртуальной файловой системы. Методы размещения файлов Смежное размещение. Термин метод размещения означает метод, с помощью которого размещаются блоки файла во внешней памяти. Различаются следующие основные методы размещения файлов: Смежное размещение Ссылочное размещение Индексированное размещение. При смежном размещении каждый файл занимает набор смежных блоков на диске. Преимущество данного метода - простота: требуется хранить только одну ссылку (номер блока) и длину (число блоков). Другим преимуществом является возможность произвольного доступа. Недостатки данного метода следующие: возможны потери дисковой памяти из-за фрагментации (метод аналогичен общей задаче динамического распределения памяти, рассмотренной ранее); невозможность увеличения размера файла. Смежное размещение файлов иллюстрируется на рис. 20.2. Файловые системы, основанные на расширениях Многие современные файловые системы, - например, Veritas File System, или Vx-FS – основная файловая система в ОС HP-UX фирмы Hewlett-Packard, - используют модифицированное смежное размещение файлов. Дисковые блоки в такой системе размещаются в расширениях (extents). Расширение – это смежный блок на диске. Файл состоит из одного или нескольких расширений. Таким образом, если длина файла не увеличивается, он хра- 240 нится в виде одной смежной области внешней памяти, что обеспечивает максимальную эффективность доступа. В случае увеличения длины файл представляется списком из основной части и расширений. Рис. 20.2. Смежное размещение файлов. Ссылочное размещение файла При ссылочном размещении каждый файл представляется в виде связанного списка дисковых блоков, которые могут быть разбросаны по диску. Преимущества данного метода: Простота – необходимо хранить только начальный адрес; Отсутствие потерь дискового пространства; система хранит списки свободной памяти. Недостаток - отсутствие произвольного доступа: для доступа к данным файла в общем случае необходимо выполнить просмотр части списка блоков файла. При ссылочном размещении адрес по файлу представляется в виде (Q, R), где Q – номер блока, к которому выполняется доступ, в связанном списке блоков, представляющем файл; R - смещение в блоке. Ссылочное размещение файлов изображено на рис. 20.3. К файловым системам, использующим ссылочное размещение, относится файловая система File-allocation table (FAT), используемая в MS-DOS и OS/2 и до сих пор используемая в Windows (рис. 20.4). В системе FAT элемент директории содержит имя файла и адрес его начального блока (кластера) на диске. Каждый блок ссылается на следующий, кроме последнего. Система FAT разработана создателем корпорации Microsoft Биллом Гейтсом в 1976 г. Теперь читателю должно быть понятно, почему операция удаления файла в Windows не "фатальна": она означает лишь удаление элемента директории со ссылкой на начальный кластер файла. Несмотря на это, список кластеров, представляющий файл, можно обнаружить и восстановить ссылку из директории на его начало, хотя и под другим именем. В MS DOS данную функцию выполняла системная утилита unerase (отменить удаление). Индексируемое размещение При индексируемом размещении, в отличие от предыдущих, все указатели на блоки файла собраны вместе в индексный блок (i-node, superblock). Используется индексная таблица, ссылающаяся на блоки данных файла. Подобная система используется в системах UNIX, Linux, Solaris. 241 Рис. 20.3. Ссылочное размещение файлов. Рис. 20.4. Файловая система File Allocation Table (FAT). Пример индексируемого размещения приведен на рис. 20.5. Как видно из схемы, при индексируемом размещении блоки файла могут быть расположены как угодно разрозненно, но индексный блок содержит все ссылки на них. Ссылка на блок данных может быть выбрана непосредственно из индексного блока, без какого-либо поиска. Определенная опасность такого размещения в том, что на индексный блок ложится критическая нагрузка: если его целостность будет нарушена, файл восстановлению не подлежит. Именно поэтому в UNIX команда rm, удаляющая файл, "фатальна" для него. Таким образом, при индексируемом размещении файлов необходима индексная таблица. Преимущество такого метода размещения - возможность произвольного доступа; отсутствие внешней фрагментации. Накладными расходами является индексный блок. 242 Рис. 20.5. Индексируемое размещение файлов. При отображении логического адреса в физический, если ограничить максимальный размер файла 256 K словами, а размер блока - 512 слов, то для индексной таблицы требуется только один блок. Логический адрес будет иметь вид (Q, R), где Q - смещение в индексной таблице, R - смещение в блоке. При отображении логического адреса в физический для файла неограниченной длины (при размере блока – 512 слов) может использоваться ссылочная схема – в список связываются блоки индексной таблицы. В данном случае логический адрес будет иметь вид (Q1, R1), где Q1 = номер блока индексной таблицы; R1 = (Q2, R2), где Q2 - смещение в блоке индексной таблицы, R2 смещение в блоке файла. В системе UNIX используется комбинированная схема индексного размещения файлов: возможна одноуровневая адресация данных через индексные блоки, двухуровневая (индексные блоки адресуют другие индексные блоки, а те, в свою очередь, - блоки данных), трехуровневая и т.д. Данная схема иллюстрируется на рис. 20.6. Управление свободной внешней памятью Для управления свободной памятью на диске система использует битовый вектор длины n, где n – общее число блоков на диске, каждый бит которого описывает состояние соответствующего блока: bit[i] = 0, если block[i] свободен, 1 – если блок занят. При таком представлении информации о свободных и занятых блоках, номер первого занятого блока вычисляется по простой формуле: номер первого занятого блока = число битов в слове * число нулевых слов + номер первой 1 . Битовые шкалы, используемые для управления блоками, требуют дополнительной памяти. Например, при размере блока в 212 байтов и размере диска в 230 байтов (1 GB) длина битового вектора будет равна n = 230/212 = 218 битов (или 32 KB). При использовании битовых векторов легко получать информацию о смежно расположенных файлах. Для сравнения, при использовании связанного списка свободной дисковой памяти (метод, обычно применяемый в ОС для оперативной памяти), невозможно легко получить информацию о смежных областях памяти, но зато нет лишнего расходования памяти. 243 Рис. 20.6. Комбинированная индексная схема размещения файлов в UNIX. Для предотвращения ситуаций рассогласованности информации о свободной дисковой памяти, операционной системе необходимо защищать указатель на список свободной памяти, либо битовую шкалу (в зависимости от способа представления информации о свободной памяти). Битовый вектор должен храниться на диске. Однако его копии в памяти и на диске могут различаться. Нельзя допустить, чтобы block[i] имел такую ситуацию, когда bit[i] = 1 в памяти и bit[i] = 0 на диске. Решение этой проблемы в том, чтоты согласовывать значения битов на диске и в памяти по следующему алгоритму: Установить bit[i] = 1 на диске; Разместить block[i]; Установить bit[i] = 1 в памяти. Представление информации о свободной дисковой памяти в виде списка блоков иллюстрируется на рис. 20.7. Эффективность и производительность дисковой памяти Эффективность использования дисковой памяти зависит от: Алгоритмов распределения дисковой памяти и управления директориями; Типов данных, хранимых в элементе директории для файла. Для повышения производительности работы с диском используются следующие методы: Кэширование диска – использование специальной области основной памяти для часто используемых блоков диска; Освобождение прочитанного (free-behind) и опережающее считывание (readahead) – методы оптимизации последовательного доступа к диску, которые заключаются в том, что основная память, в которой хранились копии прочитанных блоков, освобождается, а вместе с очередным блоком файла считываются в основную память и несколько следующих блоков; 244 Организация виртуальных дисков - улучшение производительности ПК путем выделения области памяти под виртуальный диск (RAM-диск). Рис. 20.7. Список свободной дисковой памяти. Кэширование диска Буферная кэш-память. В операционных системах используются различные методы кэширования диска (рис. 20.8). Рис. 20.8. Различные методы размещения кэша для диска. В основной памяти хранятся: виртуальные диски, буфера блоков обрабатываемых файлов, таблицы открытых файлов. В буферной памяти контроллера диска хранятся копии обрабатываемых блоков файла. Проблема в том, что различные модули кэш-памяти используются не всегда достаточно эффективно и не всегда достаточно согласованы друг с другом. Например, система поддерживает кэш страниц, который кэширует страницы, а не блоки файла, используя методы ор- 245 ганизации виртуальной памяти. Ввод-вывод файлов, отображаемых в память, использует кэш страниц. С другой стороны, обычный ввод-вывод через файловую систему использует кэш буфера (диска). Понятно, что эти различные кэш-модули решают сходные задачи. Не хватает универсализации кэш-памяти. В результате получается усложненная схема, приведенная на рис. 20.9. Рис. 20.9. Ввод-вывод без унифицированной буферной кэш-памяти. Решение данной проблемы – использование унифицированной буферной кэшпамяти. Унифицированная буферная кэш-память использует один и тот же кэш страниц для кэширования и файлов, отображаемых в память, и обычных операций ввода-вывода через файловую систему. Схема ввода-вывода с использованием унифицированной буферной кэшпамяти изображена на рис. 20.10. Проблемы восстановления файлов Файловые системы с журналом транзакций. При работе с файловыми системами и с дисками возможны различные экстремальные ситуации – от сбоя диска до выключения питания. Подобные ситуации могут привести к порче информации в файле или к несогласованности информации в файле и в его буферах в основной памяти. Для обнаружения и диагностики таких проблем в операционных системах имеются утилиты проверки согласованности, которые сравнивают данные в структуре директорий с блоками данных на диске и пытаются исправить несогласованности. Еще раз повторим, что наилучший способ сохранить свои файлы – это регулярно использовать системные программы для резервного копирования (back up) данных с диска на другое устройство памяти (стример, флэшку, внешний жесткий диск, и т.д.). Восстановить испорченный файл на диске можно с помощью его резервной копии. Автор сам на себе недавно испытал ситуацию, когда по непонятной причине (видимо, из-за сбоя диска, которые случаются крайне редко) оказался испорченным файл с главой книги "Trustworthy Compilers", подготовленной для издательства John Wiley & Sons, причем копия файла на флэшке также оказалась испорченной. Проблему решила заранее предусмотрительно сделанная копия файла на вторую флэшку. 246 Рис. 20.10. Ввод-вывод с использованием унифицированной буферной кэш-памяти. Более систематический подход к поддержанию целостности и отслеживанию состояний файлов предпринят в файловых системах с журналом транзакций (log structured filesystems). Файловые системы с журналом фиксируют любое изменение в файловой системе как транзакцию (по аналогии с системами управления базами данных и современными web-сервисами). Все транзакции записываются в журнал. Транзакция считается одобренной (committed), если она записана в журнал. Однако файловая система может быть в этот момент еще не обновлена. Транзакции из журнала асинхронно выполняются над файловой системой. Когда файловая система модифицируется, транзакция удаляется из журнала. Если имеет место сбой файловой системы, то все оставшиеся транзакции из журнала, тем не менее, должны быть выполнены. Сетевая файловая система NFS Система NFS (Network File System) -одна из наиболее распространенных сетевых файловых систем, разработанная фирмой Sun Microsystems и используемая в системе Solaris. NFS – это спецификация и реализация программной системы для доступа к удаленным файлам через локальную (или глобальную) сеть. Данная реализация является частью операционных систем Solaris и SunOS, использующих быстрый, но менее надежный асинхронный сетевой протокол, основанный на датаграммах (UDP/IP), и сеть Ethernet (сетевые протоколы подробно рассматриваются далее в соответствующих лекциях курса). В реализации NFS используются процессы-демоны nfsd (обработка NFS-запросов клиентов) и mountd (обработка запросов монтирования), а также biod (асинхронный ввод-вывод блоков удаленных файлов на клиенте). Взаимодействующие рабочие станции рассматриваются в NFS как набор независимых машин с независимыми файловыми системами, что позволяет совместно использовать файловые системы прозрачным образом. Удаленная директория монтируется на локальную директорию. Смонтированная директория трактуется как полное поддерево локальной файловой системы, заменяя поддерево локальной файловой системы. 247 Спецификация удаленной директории для операции монтирования не является прозрачной; необходимо указать имя машины с удаленной директорией. После этого файлы в удаленной директории могут быть доступны прозрачным образом, т.е. операции над локальными и удаленными файлами программируются одинаково. При этом выполняется доступ только к тем блокам файла, к которым реально происходит обращение, а не ко всему файлу. С учетом назначения полномочий доступа, потенциально любая файловая система (или директория внутри файловой системы), может быть смонтирована удаленно поверх локальной директории. NFS спроектирована для работы в неоднородном окружении различных машин, ОС и сетевых архитектур; спецификация NFS от них не зависит. Эта независимость достигнута благодаря использованию примитивов RPC (Remote Procedure Call – удаленный вызов процедуры), реализованных поверх External Data Representation (XDR) – протокола – машинно-независимого представления данных для их передачи через сеть. Спецификация NFS различает сервисы, обеспечиваемые механизмом монтирования, и фактические удаленные файловые системы. Протокол монтирования в NFS устанавливает первоначальную логическую связь между сервером и клиентом. Операция монтирования включает имя удаленной директории, подлежащей монтированию, и имя машины-сервера, на которой она хранится. Запрос на монтирование отображается на соответствующий RPC и передается на mountсервер, исполняемый на серверной машине. Список экспорта (export list) указывает список файловых систем, которые сервер экспортирует для монтирования, а также имена машин, на которых разрешено их монтировать. Исполняя запрос на монтирование, соответствующий этому списку, сервер возвращает обработчик файла (file handle)—ключ к дальнейшему доступу. File handle содержит идентификатор файловой системы и номер inode (индексного узла), идентифицирующий монтируемую директорию внутри экспортируемой файловой системы. Операция монтирования изменяет только точку зрения клиента и не влияет на серверную часть. Монтирование в NFS иллюстрируется рис. 20.11 и рис. 20.12: на рис. 20.11 изображены три независимых файловых системы, а на рис. 20.12 – результат монтирования в NFS одной из них (директория dir1 смонтировалась как поддиректория удаленной файловой системы /usr/local. Рис. 20.11. Три независимых файловых системы. Протокол NFS предоставляет набор RPC для удаленных операций над файлами. Процедуры поддерживают следующие операции: Поиск файла в директории Чтение набора элементов директории 248 Управление ссылками и директориями Доступ к атрибутам файлов Чтение и запись файлов Рис. 20.12. Монтирование в NFS. NFS – серверы не имеют состояния (stateless); каждый запрос должен иметь полный набор аргументов. Модифицированные данные должны быть направлены на диск сервера до того, как результаты вернутся к клиенту (теряется возможность кэширования). NFS – протокол не поддерживает механизмы управления параллельным доступом. Система NFS имеет три основных уровня архитектуры: UNIX – интерфейс файловой системы (основан на вызовах open, read, write и close calls и на дескрипторах файлов). Уровень Virtual File System (VFS) – различает локальные и удаленные файлы, и в дальнейшем локальные файлы обрабатываются в соответствии с типами их файловых систем. VFS активизирует операции, специфичные для конкретной файловой системы, для обработки локальных запросов в соответствии с типами файловых систем. Уровень VFS вызывает процедуры NFS – протокола для удаленных запросов. NFS – сервисный уровень – нижний уровень архитектуры; реализует NFS – протокол. Схема архитектуры NFS приведена на рис. 20.13. Трансляция имен путей в NFS выполняется путем разбивки имени пути на последовательность имен компонент и выполнения отдельного NFS - поиска для каждой пары (компонента, vnode директории). Для ускорения поиска на клиентской машине организуется кэш имен удаленных директорий. Удаленные операции NFS обеспечивают почти взаимно-однозначное соответствие между обычными системными вызовами UNIX и удаленными вызовами процедур протокола NFS (за исключением открытия и закрытия файлов). NFS основана на парадигме удаленных сервисов, но поддерживает буферизацию и кэширование для повышения эффективности. NFS организует кэш блоков файлов: когда файл открывается, ядро проверяет у удаленного сервера, необходимо ли обновить кэшируемые атрибуты. Кэшируемые блоки используются, только если соответствующие кэшированные атрибуты самые свежие. Кэш атрибутов файлов обновляется по мере передачи обновленных атрибутов с сервера. 249 Клиенты не освобождают задерживаемые блоки до тех пор, пока сервер не подтвердит, что они записаны на диск. Рис. 20.13. Схема архитектуры NFS. Выражаясь менее формально, впечатления от многолетней работы автора в локальной сети с использованием NFS достаточно благоприятные. Система обеспечивает монтирование удаленных файловых систем и работу с ними, как если бы они были расположены на локальной машине (только, разумеется, с некоторым замедлением). Она достаточно удобна и надежна. При каких-либо сбоях характерной чертой NFS является то, что она оставляет в локальных директориях временные файлы – копии удаленных файлов – с именами вида .N0035 и т.д. В таком случае рекомендуется удалить эти файлы обычным образом и продолжить работу. Ключевые термины File-allocation table (FAT) – файловая система со ссылочным размещением файлов, используемая в MS DOS и в Windows. NFS (Network File System) - распространенная сетевая файловая система, используемая в системе Solaris. Veritas File System (Vx-FS) – основная файловая система в ОС HP-UX (HewlettPackard). Виртуальная файловая система (VFS) – файловая система, обеспечивающая объектно-ориентированный способ реализации файловых систем, единый интерфейс системных вызовов для различных типов файловых систем, включая сетевые файловые системы. Виртуальный диск – диск для временного хранения файлов, организованный в основной памяти, с целью улучшения производительности персонального компьютера. Индексируемое размещение файлов - метод размещения, при котором все указатели на блоки файла собраны вместе в индексный блок; используется индексная таблица, ссылающаяся на блоки данных файла. Индексный блок (i-node, superblock) – специальный блок при индексируемом размещении файлов, в котором хранятся указатели на блоки данных файла. Кэширование диска – использование специальной области основной памяти для копирования часто используемых блоков диска. 250 Опережающее считывание (read-ahead) - метод оптимизации последовательного доступа к диску, при котором вместе с очередным блоком файла считываются в основную память и несколько следующих блоков. Освобождение прочитанного (free-behind) - метод оптимизации последовательного доступа к диску, при котором основная память, где хранились копии прочитанных блоков, автоматически освобождается при считывании следующих блоков. Расширение (extent) - смежный блок на диске для хранения части файла; файл состоит из одного или нескольких расширений. Cмежное размещение файлов – метод размещения, при котором каждый файл занимает набор смежных блоков на диске. Ссылочное размещение файлов – метод размещения, при котором каждый файл представляется в виде связанного списка дисковых блоков. Унифицированная буферная кэш-память - кэш-память, использующая один и тот же кэш страниц для кэширования и файлов, отображаемых в память, и обычных операций ввода-вывода через файловую систему. Файловая система с журналом транзакций (log structured filesystem) - файловая система, фиксирующая любое изменение как транзакцию; все транзакции записываются в журнал. Краткие итоги Виртуальные файловые системы – системы, абстрагирующие пользователя от различий между файловыми системами и обеспечивающие единый интерфейс системных вызовов для различных файловых систем, включая сетевые. Способы реализации директорий в файловых системах – линейный список либо хештаблица. Последний обеспечивает более высокую эффективность. Основные методы размещения файлов в файловых системах – смежное, ссылочное и индексируемое размещение. При смежном размещении файл занимает смежную область памяти на диске. При этом обеспечивается простой и эффективный доступ, но невозможно увеличение файла; возможны потери дисковой памяти. В файловых системах, основанных на расширениях (extents), файл представляется как смежная область памяти и список расширений – смежных областей памяти. При ссылочном размещении файл представляется в виде списка дисковых блоков. Например, такой метод применен в системе FAT (File Allocation Table), используемой в MS DOS и в Windows. При таком методе отсутствуют потери дискового пространства, но нет возможности произвольного доступа к файлу. При индексируемом размещении все указатели на блоки данных файла собраны в специальный индексный блок (индексную таблицу). При этом возможен произвольный доступ, но требуется хранение индексных блоков. Кроме того, в случае порчи индексного блока данные файла становится недоступными. Для управления свободной дисковой памятью используются битовый вектор, каждый элемент которого указывает, свободен ли i-й блок или занят. Другой метод – использование списков свободной дисковой памяти. Использование битового вектора позволяет легко получить информацию о смежных областях дисковой памяти. При использовании списка свободной памяти это сделать невозможно, но отсутствуют дополнительное расходование дисковой памяти. Производительность управления дисковой памятью и вводом-выводом зависит от кэширования диска, оптимизаций опережающего считывания и освобождения прочитанного, организации виртуальных дисков в основной памяти. Для оптимизации кэширования используется унифицированная буферная кэш-память, которая используется как при вводе-выводе в обычные файлы, так и при работе с файлами, отображаемыми в память. 251 Для сохранения и восстановления файлов рекомендуется использовать резервное копирование. Файловые системы с журналом транзакций обеспечивают повышенную надежность обработки файлов. Сетевая файловая система NFS реализована на основе механизмов и протоколов RPC (удаленный вызов процедуры) и XDR (внешнее представление данных для передачи через сеть). Система обеспечивает работу пользователя с удаленными файловыми системами с помощью тех же операций, которые используются и для локальных файловых систем. Удаленные файловые системы монтируются на локальные. При этом указывается имя машины с удаленной директорией. В реализации NFS используются процессы-демоны. NFS-сервисы не имеют состояния (stateless). Архитектура NFS трехуровневая – интерфейс системных вызовов для UNIX; уровень виртуальной файловой системы; нижний уровень реализации NFSсервисов. Набор для практики Вопросы 1. 2. 3. 4. 5. 6. 7. 8. 9. Что такое виртуальная файловая система? Какими способами реализуются директории в файловых системах? Какие основные методы используются для размещения файлов? Каковы особенности, достоинства и недостатки смежного размещения файлов? Каковы особенности, достоинства и недостатки ссылочного размещения файлов? Каковы особенности, достоинства и недостатки индексируемого размещения файлов? Что такое расширения (extents) и как они используются для размещения файлов? Как организованы файловые системы по методу File Allocation Table (FAT)? Какие методы используются для представления информации о свободной дисковой памяти, в чем их сравнительные достоинства и недостатки? 10. Что такое кэширование диска? 11. Что такое унифицированная буферная кэш-память и для чего она используется? 12. Что такое опережающее считывание? 13. Что такое освобождение прочитанного? 14. Какие методы используются для восстановления файлов? 15. Что такое файловая система с журналом транзакций? 16. Что такое NFS? 17. На каких сетевых протоколах и механизмах основана реализация NFS? 18. Каковы возможности системы NFS для пользователя? 19. Каковы особенности монтирования удаленных файловых систем в NFS? 20. Каковы уровни архитектуры NFS? Упражнения 1. Реализуйте директорию и операции над ней с использованием хеш-функции. 2. Реализуйте смежное размещение файлов и основные операции над файлами при данном размещении. 3. Реализуйте ссылочное размещение файлов и основные операции над файлами при данном размещении. 4. Реализуйте индексируемое размещение файлов и основные операции над файлами при данном размещении. 5. Реализуйте размещение файлов на основе расширений (extents) и основные операции над файлами при данном размещении. 6. Реализуйте представление информации о свободной дисковой памяти в виде битового вектора и основные операции над ним. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. Обзор виртуальных файловых систем (реферат). Файловая система FAT (реферат). Файловые системы с индексируемым размещением файлов (реферат). Обзор системы NFS (реферат). Реализация директории и операций над ней с использованием хеш-функции (курсовая работа). 252 6. Реализация смежного размещения файлов и основных операций над файлами при данном размещении (курсовая работа). 7. Реализация ссылочного размещения файлов и основных операций над файлами при данном размещении (курсовая работа). 8. Реализация индексируемого размещения файлов и основных операций над файлами при данном размещении (курсовая работа). 9. Реализация размещения файлов на основе расширений (extents) и основных операций над файлами при данном размещении (курсовая работа). 10. Реализация представления информации о свободной дисковой памяти в виде битового вектора и основных операций над ним (курсовая работа). 253 254 21. Лекция: Системы ввода-вывода В лекции рассмотрены следующие вопросы: организация ввода-вывода в компьютерной системе и ее поддержка в ОС; контроллеры; драйверы; контроллеры с прямым доступом к памяти (Direct Memory Access – DMA); цикл выполнения задания в ОС, чередование вычислений и ввода вывода, прерывания. Содержание Введение Аппаратура ввода-вывода Основные концепции Опрос устройств Прерывания Ввод-вывод с прямым доступом к памяти (DMA) Программный интерфейс ввода-вывода Блочные и символьные устройства Сетевые устройства существенно отличаются от блочных и символьных; имеют свой собственный интерфейс и систему команд Часы и таймеры Блокируемый (синхронный) и не блокируемый (асинхронный) ввод-вывод Подсистема ввода-вывода в ядре ОС Структуры данных для ввода-вывода в ядре ОС Жизненный цикл запроса на ввод-вывод Производительность ввода-вывода Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Устройства и системы ввода-вывода в современных компьютерных и операционных системах весьма разнообразны. В лекции рассмотрены следующие вопросы: Аппаратура ввода-вывода Интерфейс приложений для ввода-вывода Подсистема ввода-вывода в ядре ОС Преобразование запросов на ввод-вывод в аппаратные операции Производительность систем ввода-вывода. Аппаратура ввода-вывода В настоящее время наблюдается все более и более активное развитие устройств вводавывода в компьютерных системах. В значительной степени это объясняется, во-первых, необходимостью ввода, обработки и вывода мультимедийной информации (аудио, видео, цифровых фотографий, отсканированных образов и других изображений), во-вторых, постоянной потребностью в увеличении скорости и емкости устройств вследствие гигантского роста размеров обрабатываемой информации. Еще в 1980-х гг., например, нормой считалось использование гибких дискет (FDD) емкостью 1.44 мегабайта для резервного копирования. Сейчас устройствами FDD настольные и портативные компьютеры вообще не комплектуются, а, что касается резервного копирования, то и устройств емкостью 128 гигабайт может оказаться недостаточно для этой цели. Обзор аппаратуры ввода-вывода дан в "Особенности ОС для различных классов компьютерных систем. ОС реального времени. ОС для облачных вычислений ". Набор устройств включает, в частности: клавиатуру и мышь; жесткие диски (HDD), включая внутренние и внешние (ZIV drives); flash-память; ленточные стримеры; компакт-диски BluRay, DVD, CD; 255 твердотельные накопители на магнитных дисках (solid state disks – SSD); ZIP drives, JAZ drives – уже устаревающие, но еще используемые устройства для резервного копирования со съемными носителями (их постепенно вытесняет флэшпамять, физические размеры модулей которой гораздо меньше, а емкость – больше); магнито-оптические диски – ныне уже устаревшие устройства для резервного копирования, но долгое время использовавшиеся; устройства для мультимедийного ввода-вывода: порты и адаптеры IEEE 1394 (FireWire) для подключения цифровых видеоустройств; порты и адаптеры High Definition Multimedia Interface (HDMI) для подключения видеоаппаратуры стандарта High Definition (HD); кард-ридеры для нескольких форматов (SmartMedia и др.) носителей, используемых в цифровых фотоаппаратах; мониторы, видеокарты (видеоадаптеры) и графические процессоры, в том числе – многоядерные; принтеры, сканеры. Основные концепции Рассмотрим общие концепции аппаратуры и ОС, связанные с устройствами вводавывода. Каждое устройство подключается к компьютерной системе через порт – контроллер и разъем (либо беспроводное устройство) для передачи данных между устройством вводавывода и компьютером. Каждый порт имеет свое традиционное обозначение и свой номер в системе. Порт может существовать физически, как разъем для проводного соединения и связанный с ним контроллер порта (например, USB – универсальный порт для подключения широкого спектра устройств; LPT – порт для подключения принтеров и сканеров), либо может быть организован операционной системой как виртуальный порт для унификации обработки внешних устройств. Виртуальные порты, обычно – коммуникационные порты (COM) с большими номерами – например, COM10, COM15, - организуются для обмена с устройствами беспроводной связи – например, мобильными телефонами и органайзерами. Беспроводная связь чаще всего организуется через Bluetooth – радиосвязь на расстоянии до 20 м, в новых стандартах – до 1 км. Шина (bus) - это цепочка устройств прямого доступа в компьютерной системе, через которую передается информация от одних устройств к другим. Обычно в настольных и портативных компьютерах используется шина PCI (Personal Computer Interface), тактовая частота которой в современных компьютерах 1 – 1.5 GHz. Она фактически и определяет суммарную производительность компьютерной системы. К шине PCI подключены контроллеры внешних устройств и портов. Контроллер (host adapter) – специализированный микропроцессор для управления внешним устройством и портом. Контроллер внешнего устройства – это устройство управления командами ввода-вывода с данным внешним устройством. Устройства имеют адреса, используемые командами непосредственного ввода-вывода и командами ввода-вывода, отображаемого в память. Каждый контроллер устройства использует свой буфер памяти для хранения одного или нескольких блоков информации, расположенный либо в специализированной памяти устройства (контроллера), либо являющийся частью оперативной памяти компьютерной системы. Типовая структура общей шины персонального компьютера изображена на рис. 21.1. Некоторые пояснения к схеме. IDE – типовой интерфейс для подключения внутри корпуса компьютера через шлейфы внутренних жестких дисков, устройств CD – и DVD-ROM. Шлейф имеет характерную плоскую форму, шириной 2 -3 см, очень малой толщины, с широким разъемом. В современных компьютерах для внутренних дисков вместо IDE используется более высокоскоростной интерфейс SATA. Контроллер и шина SCSI – возможность подключения к одному SCSI-порту цепочки (гирлянды) SCSI-устройств (дисков, сканеров, устройств CD-ROM и DVD-ROM и др.), каждое из которых имеет свой, уникальный в данной цепочке, номер – SCSI ID от 0 до 9. Удобство интерфейса SCSI в том, что цепочка организуется из внешних устройств, каждое из которых соединяется SCSI-кабелем со следующим, а последнее устройство в цепочке содержит включенный терминатор, обозначающий конец цепочки. Это удобно при наращивании объ- 256 ема внешней памяти компьютера. SCSI-устройства использовались автором на рабочих станциях SPARC фирмы Sun, которая являлась одним из активных сторонников интерфейса SCSI (Small Computer System Interface). Рис. 21.1. Типовая структура общей шины персонального компьютера. В таблица 1 приведен пример адресов внешних устройств персонального компьютера. Таблица 1. Пример таблицы адресов внешних устройств ПК (частично) диапазон адресов устройств ввода-вывода (шестнадцатиричных устройство 000-00F DMA-контроллер 020-021 контроллер прерываний 040-043 таймер 200-20F игровой контроллер 2F8-2FF последовательный порт (вторичный) 320-32F контроллер жесткого диска 378-37F параллельный порт 3D0-3DF графический контроллер 3F0-3F7 контроллер гибких дисков (дискет) 3F8-3FF последовательный порт (первичный) Опрос устройств Операционная система с помощью прерываний по таймеру организует опрос устройств – периодический анализ состояния каждого внешнего устройства. В процессе работы в состоянии устройств могли произойти изменения, например, пользователь установил флэшку в USB-порт, включил или выключил принтер и т.д. При опросе устройств ОС определяет состояние каждого устройства, которое может быть следующим: 257 command-ready – готово к выполнению команд; busy – занато; error – ошибка. При выполнении ввода-вывода аппаратура организует цикл busy-wait ожидания вводавывода с устройством: если устройство занято, процесс ждет его освобождения. Прерывания Линия запросов на прерывания (interrupt request – IRQ) переключается устройством ввода-вывода, которое сигнализирует с помощью запроса на прерывание о начале или окончании ввода-вывода. Обработчик прерываний получает сигнал о прерывании. Сигнал может быть замаскирован (maskable), чтобы игнорировать или задержать прерывание – например, если прерывание произошло в обработчике другого прерывания. Вектор прерываний – резидентный массив, содержащий адреса обработчиков прерываний в операционной системе, - используется с целью переадресовки прерывания для обработки соответствующим обработчиком (handler). Работа с вектором прерываний основана на приоритетах внешних устройств, инициировавших прерывания. На рис. 21.2 приведена схема ввода-вывода, управляемого прерываниями. Рис. 21.2. Ввод-вывод, управляемый прерываниями. В таблица 2 приведены номера прерываний в процессоре Intel Pentium. 258 Таблица 2. Tаблица номеров прерываний в процессоре Intel Pentium Номер прерывания Описание 0 ошибка при делении 1 исключение при отладке 2 прерывание по null 3 точка остановки 4 прерывание, обнаруженное INTO 5 исключение по выходу за границы 6 неверный код операции 7 устройство недоступно 8 двойное прерывание 9 переполнение сегмента сопроцессора 10 неверный сегмент состояния задачи 11 сегмент отсутствует 12 ошибка стека 13 общее прерывание по защите 14 отказ страницы 15 (зарезервировано Intel, не использовать) 16 ошибка в операции с плавающей точкой 17 контроль выравнивания 18 контроль аппаратуры 19-31 зарезервировано Intel, не использовать 32-255 маскируемые прерывания Ввод-вывод с прямым доступом к памяти (DMA) Как уже отмечалось ранее, при традиционной организации ввода-вывода контроллер устройства использует собственную буферную память, что приводит к необходимости двойной пересылки данных – сначала процессор пересылает данные в буфер, созданный ОС, затем ОС пересылает данные в буфер устройства. Ввод-вывод с прямым доступом к памяти (Direct Memory Access – DMA) - более эффективная схема организации ввода-вывода, основанная на использовании фрагмента основной памяти в качестве буфера устройства для выполнения ввода-вывода. Схема .используется с целью избежать программируемого вводавывода для больших пересылок данных. Схема требует специальной аппаратуры – DMAконтроллера – в настоящее время такие контроллеры приобретают все более широкое распространение. DMA позволяет избежать участия процессора в пересылках больших объемов данных непосредственно между устройством ввода-вывода и памятью. На рис. 21.3 приведена схема организации DMA. Программный интерфейс ввода-вывода При проектировании и реализации программного интерфейса (API) ввода-вывода используются принципы уровней абстракции. Модули операционной системы, реализующие системные вызовы для ввода-вывода, инкапсулируют поведение конкретных устройств ввода-вывода и обеспечивают более абстрактный интерфейс. Более низкий уровень, уровень драйверов устройств, скрывает различия между контроллерами ввода-вывода конкретных устройств от ядра ОС. Устройства ввода-вывода различаются по многим параметрам в силу их специфики, например: Устройство для работы с потоками символов или с блоками; Устройство последовательного или прямого доступа; Разделяемое или специализированное (монополизируемое) устройство; 259 Различия по скорости выполнения операций устройствами; Устройство для чтения/записи, или только для чтении, или только для записи. Рис. 21.3. Процесс выполнения ввода-вывода по схеме DMA. Структура модулей ввода-вывода в ядре, разработанная и реализованная по этим принципам, изображена на рис. 21.4. Классификация устройств ввода-вывода по различным характеристикам и их примеры приведены в таблица 3. Таблица 3. Характеристики устройств ввода-вывода классификация варианты примеры режим передачи данных символьный блочный терминал диск метод доступа последовательный произвольный модем CD-ROM метод передачи данных синхронный асинхронный лента клавиатура возможность совместного доступа монопольный общий лента клавиатура скорость устройства латентность время поиска скорость передачи задержка между операциями направленнность вводавывода только чтение только запись чтение-запись CD-ROM графический контроллер диск 260 Рис. 21.4. Структура модулей ввода-вывода в ядре ОС. Блочные и символьные устройства Типичный пример блочного устройства – устройство управления дисками. Оно выполняет команды вида: read, write, seek (считать, записать или найти блок с заданным номером). Устройство может выполнять чистый ввод-вывод или доступ к файловой системе. Имеется возможность доступа к файлу, отображаемому в память. Типичные примеры символьных устройств – клавиатура, мышь, последовательные порты. Такие устройства выполняют команды вида: get, put (считать или записать символ). Библиотеки верхнего уровня в операционной системе для символьных устройств допускают построчное редактирование посимвольно введенной информации. Сетевые устройства существенно отличаются от блочных и символьных; имеют свой собственный интерфейс и систему команд Сетевые устройства и их драйверы в ОС поддерживают традиционные или специфические сетевые протоколы и способы передачи информации через сеть. Например, ОС UNIX и Windows NT / 9x / 2000 поддерживают сокетный интерфейс. Сетевое устройство отделяет сетевой протокол от сетевой операции. Команды сетевых устройств включают функцию select – выбор сетевого пакета. Сетевые устройства различны по подходам к реализации (конвейеры, pipes, FIFO, потоки, очереди, почтовые ящики). В типичной конфигурации настольного или портативного компьютера присутствуют следующие сетевые устройства: сетевой адаптер локальной сети (Ethernet), имеющий разъем типа RJ45 для подключения сетевого кабеля twisted pair (витая пара) или BNC (коаксиального); устройство для подключения к беспроводной сети типа IEEE.802.11x (Wi-Fi); устройство для подключения к локальной сети IEEE 1394 (FireWire) для передачи цифрового видео; 261 уже несколько устаревший, но до сих пор используемый в компьютерах способ подсоединения к сети Интернет - встроенный модем для передачи информации по телефонной линии (dial-up) со скоростью максимум порядка 5-6 килобайт в секунду. Устройства FireWire, по-видимому, из-за особой важности передачи мультимедийной информации, в современных компьютерах располагаются на материнской плате. В спецификации компьютера это обычно указывается аббревиатурой типа FireWire on board (на борту). Операционные системы поддерживают для пользователей более высокоуровневую концепцию сетевого соединения (network connection), включающую информацию о сетевом устройстве, с помощью которого данное соединение осуществляется. Сетевые протоколы подробно рассмотрены далее в специальных разделах курса. Часы и таймеры Данные хронометрические устройства в компьютерной системе хранят информацию о текущем времени, прошедшем отрезке времени, установках таймера. Как правило, операционная система использует программируемые интервалы времени для работы с таймером. Таким образом, в системе организуются периодические прерывания с целью опроса устройств и диспетчеризации процессов. В системе UNIX работу с часами и таймером поддерживает системный вызов и команда ioctl. Кроме того, в системе имеется процесс-демон cron, с помощью которого в системе организуются события, происходящие в назначенное время, - например, автоматическое резервное копирование всех наиболее важных файловых систем на ленту. Блокируемый (синхронный) и не блокируемый (асинхронный) ввод-вывод Для оптимизации ввода-вывода в системе поддерживается, помимо традиционного синхронного (блокируемого), также асинхронный ввод-вывод. Блокируемый ввод-вывод основан на простой, интуитивно понятной парадигме: процесс задерживается, пока ввод-вывод не закончится. Он более прост для использования и понимания, но, в силу своей недостаточной эффективности, недостаточен для некоторых применений. Для оптимизации ввода-вывода возврат из системного вызова для ввода-вывода может происходит по мере доступности информации. Применяется пользовательский интерфейс для копирования данных (буферизация). Ввод-вывод также часть реализуется с помощью многопоточности (multi-threading): ввод-вывод выделяется в отдельный поток. Из системных вызовов для ввода-вывода предусмотрен быстрый возврат с выдачей в качестве результата числа байтов, фактически прочитанного или записанного. Асинхронный ввод-вывод основан на иной парадигме: процесс исполняется одновременно с выполнением ввода-вывода. Вследствие этого, он более сложен в использовании, так как большинство программистов до сих пор привыкли мыслить и реализовывать программы в последовательном стиле. После завершения асинхронного ввода-вывода подсистема ввода-вывода генерирует сигнал (исключение) в процессе, его использующем. Программирование асинхронного ввода-вывода основано на использовании пары операций типа начать асинхронный ввод-вывод и закончить асинхронный ввод-вывод (подождать его результатов). Такая схема чревата ошибками, так как программистам свойственно забывать завершающие действия, парные инициализирующим, если среда разработки им об этом не напоминает. Однако именно асинхронный ввод-вывод обеспечивает наибольшую эффективность. Подсистема ввода-вывода в ядре ОС Операционная система управляет устройствами ввода-вывода. ОС осуществляет планирование, включая упорядочение запросов на ввод-вывод в очередях к каждому устройству. ОС обеспечивает буферизацию – запись данных в память в процессе передачи между устройствами. Цели буферизации: балансировка устройств с разными скоростями; 262 сглаживание несоответствия размера данных для работы с устройством; поддержка "семантики копирования". Как неоднократно отмечалось, для оптимизации работы с внешними устройствами организуется кэширование – использование быстрой память, в которой хранится копия данных (фактически в ней сохраняются наиболее часто используемые блоки). Следует, однако, иметь в виду, что содержимое кэш-памяти - всегда только копия реальных данных, поэтому в некоторых случаях приходится синхронизировать содержимое кэша с содержимым диска, чтобы не допустить рассогласованности информации. Кэширование - ключ к повышению производительности дисковых устройств. Весьма важна также такая функция ОС, как буферизация вывода (spooling) – задержка вывода на устройство, с целью поддержания целостности информации, выводимой одним и тем же процессом. Типичный пример – печать на принтер. ОС выполняет также резервирование устройства – обеспечение монопольного доступа к нему. Имеются системные вызовы для занятия и освобождения устройства монопольного доступа. ОС контролирует отсутствие тупиков (deadlocks), которые возможны при монопольном использовании устройств. ОС выполняет обработку ошибок ввода-вывода. Система поддерживает восстановление информации после чтения с диска, недоступности устройства, временных сбоев при записи. В большинстве случаев возвращается номер (код) ошибки, в случае, если запрос на ввод-вывод завершается неудачно. В системные журналы записывается информация об обнаруженных проблемах. Структуры данных для ввода-вывода в ядре ОС В ядре ОС хранится информация о состоянии для компонент ввода-вывода, включая таблицы открытых файлов, сетевых соединений, состояние символьных устройств. Она представляет собой большое число сложных структур данных (очередей ввода-вывода и таблиц устройств) для контроля буферов, распределения памяти и др. Реализация многих из этих системных структур использует объектно-ориентированные методы и передачу сообщений. Структура модулей ввода-вывода в системе UNIX изображена на рис. 21.5. Рис. 21.5. Структура модулей ввода-вывода в ядре UNIX. 263 Жизненный цикл запроса на ввод-вывод Рассмотрим более подробно процесс чтения из дискового файла. Он состоит из следующих этапов: Определяется устройство, на котором хранится файл; Выполняется трансляция имени в представление устройства; Физически считанные данные с диска размещаются в буфере; Данные становятся доступными для запросившего их процесса; Управление возвращается процессу. Жизненный цикл запроса на ввод-вывод изображен на рис. 21.6. Рис. 21.6. Жизненный цикл запроса на ввод-вывод. Производительность ввода-вывода Ввод-вывод – важный фактор в производительности системы. Имеются несколько факторов, определяющих, насколько ввод-вывод критичен по эффективности в системе: Ввод-вывод требует от процессора исполнения драйвера устройства - кода уровня ядра ОС; Необходимо выполнять контекстные переключения, связанные с прерываниями; Необходимо выполнять копирование данных. 264 Особенно напряженным в любой компьютерной системе является сетевой трафик, так как его скорость фактически определяет скорость и производительность работы всей распределенной системы (например, работы с удаленными файловыми системами), а также скорость получения информации из Интернета или корпоративной сети. На рис. 21.7 изображена детальная схема взаимодействия компьютеров при наборе символьной информации и передачи ее через сеть. Схема дает представление о сложности взаимодействия, действиях аппаратуры и программного обеспечения, выполняемых для каждого набранного и передаваемого символа, количестве прерываний, их обработок и соответствующих контекстных переключений. Рис. 21.7. Схема взаимодействия компьютеров при наборе символьной информации и передачи ее через сеть. Выводы. Для повышения производительности ввода-вывода и сетевого взаимодействия в системе необходимо: Сократить число контекстных переключений; Сократить объем копирования данных; Сократить число прерываний, используя большие переходы, интеллектуальные контроллеры и опрос устройств; Использовать DMA (Direct Memory Access); 265 Сбалансировать нагрузку на процессор, память и шину и производительность вводавывода с целью повышения суммарной производительности. Ключевые термины PCI (Personal Computer Interface) – системная шина, используемая в персональных компьютерах, к которой подключены процессор, память и внешние устройства. SCSI ID – номер SCSI-устройства в цепочке SCSI-устройств (от 0 до 9), устанавливаемый непосредственно на корпусе устройства специальным переключателем. Буферизация – запись данных в память в процессе передачи между устройствами. Буферизация вывода (spooling) – задержка вывода на устройство, с целью поддержания целостности информации, выводимой одним и тем же процессом. Ввод-вывод с прямым доступом к памяти (Direct Memory Access – DMA) - эффективная схема организации ввода-вывода, основанная на использовании фрагмента основной памяти в качестве буфера устройства для выполнения ввода-вывода. Вектор прерываний – резидентный массив, содержащий адреса обработчиков прерываний в операционной системе. Виртуальный порт – реально в физическом воплощении не существующий порт, организуемый и инсталлируемый операционной системой для унификации обработки внешних устройств; как правило – коммуникационный порт с большим номером (COM10, COM15), используемый для обмена с устройствами беспроводной связи – например, мобильными телефонами и органайзерами. Контроллер (host adapter) – специализированный микропроцессор для управления внешним устройством и портом. Маскируемый (maskable) сигнал о прерывании – сигнал о прерывании, заблокированный с целью игнорирования или задержки прерывания. Обработчик прерывания – модуль ядра ОС, осуществляющий обработку прерывания с заданным номером. Опрос устройств – периодический анализ состояния каждого внешнего устройства, выполняемый операционной системой при обработке прерывания по таймеру. Порт – контроллер и разъем (либо беспроводное устройство) для передачи данных между устройством ввода-вывода и компьютером. Резервирование устройства – обеспечение операционной системой монопольного доступа пользовательских процессов к устройству ввода-вывода. Сетевое соединение (network connection) – высокоуровневая концепция, абстракция сетевого устройства, поддерживаемая операционной системой для пользователя. Цепочка (гирлянда) SCSI-устройств – физически соединенные друг с другом SCSIустройства, подключенные к одному SCSI-порту и имеющие разные номера SCSI ID. Цикл busy-wait – взаимодействие процессора с внешним устройством, при котором, если устройство занято, процесс ждет его освобождения. Шина (bus) - цепочка устройств прямого доступа в компьютерной системе, через которую передается информация от одних устройств к другим. Шлейф – широкий плоский кабель, используемый внутри корпуса компьютера для подсоединения дисков и оптических дисков к системной шине. Краткие итоги Набор устройств ввода-вывода весьма широк, он постоянно развивается и совершенствуется, значительно увеличивается быстродействие и емкость устройств. В компьютерной системе каждое устройство ввода-вывода подключено к соответствующему порту. Устройство и порт имеют свои контроллеры – специализированные процессоры для управления ими. Процессор, память и внешние устройства в системе соединены общей системной шиной (наиболее распространена шина PCI). Каждое устройство имеет адрес, ис- 266 пользуемый командами непосредственного ввода-вывода и ввода-вывода, отображаемого в память. ОС периодически, с помощью прерываний по таймеру, выполняет опрос всех внешних устройств – проверку их состояния. Возможные состояния: готово к выполнению команд, занято, ошибка. Контроллер устройства по окончании ввода-вывода генерирует сигнал о прерывании, в результате управление получает обработчик прерывания – модуль ядра ОС. Указатели обработчиков всех видов прерываний собраны в резидентный массив – вектор прерываний. Для оптимизации ввода-вывода используется прямой доступ к памяти (DMA) – метод организации ввода-вывода, при котором в качестве буфера устройства используется фрагмент основной памяти. Данный метод основан на использовании специальных DMA-контроллеров. DMA позволяет разгрузить процессор, освободив его от работы по пересылки данных для ввода-вывода. В операционной системе API для ввода-вывода имеет иерархическую структуру. Системные вызовы – верхний уровень – инкапсулируют поведение устройств ввода-вывода. Более низкий уровень – драйверы устройств – скрывают различия между контроллерами устройств от ядра ОС. Устройства ввода-вывода подразделяются на блочные и символьные, последовательного и произвольного доступа, резервируемое или разделяемое, только для чтения, для записи или для чтения-записи, и различаются по скоростям работы. Блочные устройства выполняют команды вида: прочитать, записать или найти блок с заданным номером. Символьные устройства выполняют команды вида: ввести символ, вывести символ, с программируемой возможностью построчного редактирования. Сетевые устройства отличаются от блочных и символьных, имеют свой собственный интерфейс, поддерживают распространенные сетевые протоколы, реализуют функцию выбора сетевого пакета. Часы и таймеры обеспечивают хранение информации о текущем времени, прошедшем интервале времени, периодические прерывания по таймеру. Ввод-вывод подразделяется на синхронный и асинхронный. Первый проще для понимания, но менее эффективен. Второй более эффективен, но требует глубокого понимания и осторожности, чтобы избежать ошибок. Основные действия ОС по управлению вводом-выводом: планирование работы устройств ввода-вывода; буферизация устройств; кэширование устройств; буферизация вывода (spooling); резервирование устройств и контроль отсутствия тупиков. ОС обрабатывает ошибки ввода-вывода, поддерживает восстановление информации после чтения с диска, недоступности устройства, временных сбоев. Процессу возвращается код ошибки. В системных журналах фиксируется информация обо всех обнаруженных проблемах. В ядре ОС хранится большое число сложных системных структур (очередей, таблиц, заголовков открытых файлов и др.) для управления вводом-выводом. Производительность ввода-вывода улучшается при сокращении числа контекстных переключений, сокращении копирования данных, сокращении числа прерываний, использовании DMA, балансировке нагрузки на компоненты системы. Набор для практики Вопросы 1. 2. 3. 4. 5. 6. 7. 8. Какие виды устройств ввода-вывода используются в компьютерных системах? Что такое порт? Что такое виртуальный порт? Что такое системная шина? Что такое контроллер? Что такое опрос устройств? Каковы возможные состояния устройства? Каким образом генерируется прерывание об окончании ввода-вывода? 267 9. Что такое маскируемый сигнал о прерывании и какова цель маскирования? 10. Что такое DMA и какова его цель? 11. На какие виды делятся устройства по специфике обрабатываемой информации? 12. На какие виды делятся устройства с точки зрения организации методов доступа? 13. Приведите примеры блочных устройств. 14. Приведите примеры символьных устройств. 15. Каковы особенности сетевых устройств? 16. Для чего используются часы и таймеры? 17. Какие два метода организации ввода-вывода используются в системах, с точки зрения синхронизации процесса и инициируемого им ввода-вывода? 18. Какие основные функции выполняет ОС для организации ввода-вывода? 19. Что такое буферизация устройств? 20. Что такое кэширование устройств? 21. Что такое планирование устройств? 22. Что такое резервирование устройств? 23. Что такое spooling? 24. Как обрабатывается запрос процесса на ввод-вывод? 25. Какие факторы влияют на производительность ввода-вывода? Упражнения 1. Реализуйте модель взаимодействия процессора, драйвера устройства, контроллера устройства при обработке запроса на ввод-вывод. 2. Изучите и опишите в виде таблицы типы и номера прерываний в используемом Вами компьютере. 3. Реализуйте модель части операционной системы и аппаратуры, выполняющей обработку ввода-вывода на одном внешнем устройстве (системные вызовы, драйвер устройства, контроллер устройства). 4. Реализуйте синхронным и асинхронным методом копирование содержимого одного файла в другой, проанализируйте результаты и сравните время выполнения в обоих случаях. Темы для курсовых работ, рефератов, эссе 1. Обзор видов внешних устройств в современных компьютерах (реферат). 2. Обзор видов прерываний и методов их обработки в современных компьютерах (реферат). 3. Метод DMA и DMA-контроллеры (реферат). 4. Обзор архитектур реализаций ввода-вывода в операционных системах (реферат), 5. Обзор сетевых устройств в компьютерных системах (реферат). 6. Реализация модели взаимодействия процессора, драйвера устройства, контроллера устройства при обработке запроса на ввод-вывод (курсовая работа). 7. Реализация модели части операционной системы и аппаратуры, выполняющей обработку ввода-вывода на одном внешнем устройстве (системные вызовы, драйвер устройства, контроллер устройства) (курсовая работа).. 8. Реализация синхронным и асинхронным методом копирования содержимого одного файла в другой и сравнительный анализ производительности (курсовая работа). 268 22. Лекция: Сети и сетевые структуры В лекции рассмотрены: сети и сетевые структуры; распределенные и сетевые системы; топологии и типы сетей; коммуникации по сети; маршрутизация; именование и разрешение имен. Содержание Введение Распределенные системы Сетевые и распределенные операционные системы Сетевые топологии Типы сетей Глобальные и региональные сети Проблема организации коммуникаций по сети. Стратегии маршрутизации Стратегии соединения и разрешение коллизий Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Данная и следующая лекция посвящены сетям и сетевым структурам. Поддержка сетевых технологий и работы в сетях – неотъемлемая часть современных операционных систем. В лекции рассмотрены следующие вопросы: Мотивация использования сетей Топологии сетей Типы организации сетей Коммуникация в сетях. Распределенные системы Мотивация сетей. Использование компьютеров в современных условиях осуществляется не изолированно, а в распределенных системах и сетях – домашней или офисной локальной сети, сети Интернет, корпоративных сетей и др. На рис. 22.1 показана структура типичной распределенной системы. Пользователь с сетевого сайта B работает с сервером, расположенным на сетевом сайте B. На сетевом сайте C пользователям предоставлены полезные ресурсы. Таким образом, использование сетей и сетевых структур имеет следующую мотивацию: Совместное использование ресурсов. Ресурсы, предоставляемые различными узлами (сайтами) сети, могут совместно использоваться всеми ее сайтами. Совместное использование и публикация файлов на удаленных сайтах. Сети позволяют пользователям публиковать информацию на удаленных сайтах для ее использования другими пользователями сети. Обработка информации в распределенной базе данных. С помощью сетей пользователям предоставляются удаленные и распределенные базы данных с разнообразной информацией из области бизнеса, экономики, образования, туризма и др. Использование удаленных специализированных устройств. Через сеть пользователи могут обращаться к специализированным устройствам, отсутствующим на их локальных компьютерах – например, принтерам. Ускорение вычислений – распределение загрузки. С использованием сети могут быть организованы распределенные вычисления, в которых каждый узел сети решает свою часть задачи, благодаря чему вычисления могут быть значительно ускорены. Надежность – обнаружение отказа машины, реинтеграция отказавшей машины. Сетевые архитектуры позволяют в случае сбоев или отказов одного из узлов сети (например, сервера) перераспределить его рабочую нагрузку на другой аналогичный узел сети и вывести дефектный узел из конфигурации сети, с целью его последующего ремонта или замены. 269 Коммуникация – с помощью передачи сообщений. Сеть – удобный способ коммуникации, делового и личного общения. Рис. 22.1. Распределенная система. Сетевые и распределенные операционные системы По отношению к сетям, операционные системы можно разделить на сетевые ОС и распределенные ОС. В сетевых ОС пользователи осведомлены относительно множественности машин. Доступ к ресурсам на различных машинах выполняется явно с помощью: Удаленного входа на соответствующую машину. Передачи данных с удаленной машины на локальную машину с помощью механизма FTP (File Transfer Protocol). В распределенных ОС пользователи не осведомлены относительно множественности машин. Доступ к удаленным ресурсам осуществляется аналогично доступу к локальным ресурсам (пример – уже рассмотренная сетевая файловая система NFS). Методы использования распределенной ОС следующие: Миграция данных – передача данных по сети путем передачи целого файла, или передачи только тех частей данного файла, которые необходимы для выполнения непосредственно наиболее срочной задачи. Миграция вычислений – передача по сети вычислений, а не данных, всей остальной системе. Миграция процессов – исполнение процесса или его частей на удаленных машинах. Преимущества миграции процессов: Балансировка загрузки – распределенное выполнение процессов в сети. Ускорение вычислений – процессы могут исполняться параллельно на разных машинах. Потребность в оборудовании – для исполнения процесса может потребоваться какой-либо конкретный процессор. Потребность в программном обеспечении – требуемое программное обеспечение может быть доступно только на какой-либо конкретной машине. Доступ к данным – процесс исполняется удаленно, вместо того, чтобы пересылать все данные на локальную машину. 270 Сетевые топологии Машины в системе могут быть физически соединены разнообразными способами – например, проводной связью (кабелями "витая пара" или коаксиальными, волоконнооптическими кабелями, телефонными кабелями), беспроводной связью – Wi-Fi / Wi-MAX, Bluetooth, инфракрасной связью и др. Способы объединения машин в сеть могут анализироваться и сравниваться с учетом следующих критериев: Базовая стоимость. Насколько дорогостоящим может быть соединение всех машин в системе? Стоимость коммуникации. Сколько времени требуется для посылки сообщения от машины A машине B? Надежность. Если соединение или машина отказывают, то могут ли, тем не менее, остальные машины нормально осуществлять коммуникацию? Различные топологии представляются в виде графов, вершины которых соответствуют машинам. Дуга из вершины A в вершину B соответствует непосредственному соединению двух машин. Схемы на рис. 22.2 поясняют основные сетевые топологии. Рис. 22.2. Сетевые топологии. Основные топологии сетей, изображенные на схемах, - полностью соединенная сеть (любая машина соединена с любой другой), частично соединенная сеть, сеть древовидной структуры, сеть типа звезда, сеть типа кольцо. На практике, практически любая проводная локальная сеть организована логически по принципу полностью соединенной сети, но физически сеть реализована следующим образом: каждая машина подсоединена к концентратору (hub) – устройству для установки коммуникаций между машинами в сети, а непосредственные соединения каждой машины с любой другой отсутствуют. В беспроводных сетях, аналогично, используются особые сетевые концентраторы для коммуникации машин друг с другом, так что можно также считать, что беспроводная локальная сеть – это полностью соединенная сеть. В клиент-серверных региональных и глобальных сетях, разумеется, схема иная – компьютеры-клиенты соединяются только со своим сервером. 271 Более старый способ непосредственного соединения в сеть двух компьютеров – это их соединение по нуль-модемному кабелю. Также для непосредственного беспроводного соединения двух портативных компьютеров можно использовать инфракрасные порты, если они есть, или Bluetooth. Типы сетей Локальные сети. По числу машин, размеру и протяженности сети подразделяются на локальные и глобальные. Локальная сеть - Local-Area Network (LAN) – это сеть, расположенная на небольшой площади, например, в пределах здания или нескольких соседних зданий – офисов, либо даже в одной комнате (например, домашняя локальная сеть). Пример относительно большой локальной сети (из нескольких тысяч машин) – локальная сеть Петродворцового учебнонаучного комплекса СПбГУ, включающего четыре факультета, несколько НИИ и студенческие общежития. Локальная сеть организуется на основе многопользовательской шины, топологии кольца или звезды. Скорость работы в локальной сети – порядка 10 мегабит в секунду при использовании кабеля типа витая пара (twisted pair) и сетевых концентраторов (hubs). Эта скорость невелика, особенно если машины расположены на расстоянии несколько сот метров друг от друга; при работе чувствуется замедление. Если используются волоконно-оптические кабели (fiber optic cables) и оптические переключатели (optical switches), то скорость работы сети возрастает до 100 мегабит в секунду, но такое способ соединения в сеть гораздо более дорогой. Современные сетевые адаптеры персональных компьютеров позволяют осуществлять соединение в сеть на скорости до 1 гигабита в секунду. Узлами локальной сети являются, как правило, рабочие станции и (или) персональные компьютеры. В локальной сети могут быть также несколько (обычно одна или две) mainframe-машин или даже суперкомпьютеров или компьютерных кластеров (последнее характерно для университетов и крупных исследовательских центров) В локальной сети доступны такие разделяемые сетевые ресурсы, как сетевые принтеры и другие устройства (например, сетевые диски – mass storage devices). Такие устройства имеют сетевые карты (адаптеры), свои сетевые адреса и свои имена в сети, так что они являются полноправными элементами сети, наряду с компьютерами. Если у принтера нет сетевой карты (в стандартных конфигурациях), то для его использования его необходимо подключить к какому-либо компьютеру сети, внести его в список разделяемых сетевых ресурсов и для его использования постоянно держать этот компьютер включенным (что не всегда удобно). Подобные нюансы необходимо иметь в виду тем, кто только приступает к организации домашней или офисной локальной сети. Таким образом, тот минимум, который необходимо иметь для организации локальной сети, – это два или более компьютеров, сетевой концентратор (hub) и сетевые кабели типа витая пара с разъемами типа RJ45 для подсоединения к концентратору каждого компьютера локальной сети. В стандартной TCP/IP – сети каждый компьютер должен иметь свой IP-адрес и свое сетевое имя. Кроме того, необходимо не забыть выделить на каждом компьютере сети хотя бы один разделяемый сетевой ресурс (например, диск или принтер), который "видят" на этом компьютере другие компьютеры сети, иначе (по личному опыту автора) могут быть проблемы с распознаванием этого компьютера как элемента сети. На рис. 22.3 изображена схема типичной организации локальной сети. В схеме, кроме компьютеров и сетевых ресурсов, присутствует шлюз (gateway) – вход в локальную сеть: обычно это одна выделенная машина, которая играет роль входной в данной локальной сети. Она занимается фильтрацией сетевых пакетов, их передачей другим компьютерам, защитой от внешних сетевых атак. Глобальные и региональные сети Глобальные сети - Wide-Area Network (WAN) – связывают географически удаленные машины. Используются соединения типа "точка-точка" (point-to-point) по линиям большой протяженности (часто арендуемым у телефонных компаний) – выделенным линиям (dedicated lines). Более современные способы организации глобальных сетей – волоконнооптические кабели и беспроводная связь типа Wi-FI. 272 Рис. 22.3. Взаимодействие в глобальной сети обычно требует нескольких сообщений. Узлами глобальной сети могут быть как персональные компьютеры, так и mainframeкомпьютеры, суперкомпьютеры, кластеры компьютеров. Одним из современных видов глобальных и региональных сетей является WWAN (Wireless Wide Area Network) – беспроводная региональная сеть. Подобные сети реализуются фирмой Cingular (США). Распространены в США и Канаде. Основаны на протоколах мобильной связи GSM и CDMA. Скорость такой сети - порядка 100 МБит / с. Современные лэптопы (например, Sony VAIO) оборудуются WWAN – адаптерами и антеннами. В России аналогом являются беспроводные сети Wi-MAX, которые в настоящее время находят все более широкое распространение. Как показано на рис. 22.4, в глобальных сетях для коммуникации используются специальные коммуникационные процессоры. Проблема организации коммуникаций по сети. При проектировании коммуникационной сети должны быть решены следующие основные проблемы: Именование и разрешение имен. Как два процесса найдут друг друга для коммуникации? Стратегии маршрутизации (routing). Каким образом сообщения посылаются по сети? Стратегии соединения (connection). Каким образом два процесса обмениваются сообщениями? Разрешение конфликтов. Сеть – разделяемый ресурс; каким образом разрешаются конфликтующие запросы на ее использование? Именование и разрешение имен в сети. Системы (машины) в сети имеют имена. Сообщения идентифицируются номерами процессов (process ids). Процесс на удаленной системе идентифицируется парой <host-name, process-identifier>. Для глобального разрешения сетевых имен используется Domain Name Service (DNS), обеспечивающий структуру именования машин, а также преобразование имени в IP-адрес (в сети Интернет). Пример доменного имени (domain name) машины в сети Интернет: spbu.ru – доменное имя Санкт-Петербургского университета. С помощью протокола и сервисов DNS доменные имена преобразуются в числовые IP-адреса конкретных машин в сети, например, 100.200.150.2. 273 Рис. 22.4. Коммуникационные процессоры в глобальной сети Стратегии маршрутизации Маршрутизация (routing) – поиск маршрута для каждого сетевого пакета и направление его по найденному маршруту. Для маршрутизации в сетях используется специальное сетевое оборудование – маршрутизаторы (routers), которые обязательно должны использоваться в больших локальных сетях. Наиболее известные компании, выпускающие маршрутизаторы, - Cisco и 3COM. Рассмотрим возможные стратегии маршрутизации. Фиксированная маршрутизация. Путь от A к B задан заранее; он изменяется, только если им невозможно воспользоваться из-за отказов аппаратуры. При этом: Поскольку выбирается кратчайший путь, затраты на коммуникацию минимизированы. Фиксированная маршрутизация не может быть адаптирована к изменению загрузки. Обеспечивается получение сообщений в том же порядке, в каком они были посланы. Виртуальная цепочка. Путь от A к B фиксируется на время одного сеанса. Различные сеансы, включающие сообщения от A в B, могут иметь различную маршрутизацию. Особенности данного способа маршрутизации: Это частичное средство адаптации к изменениям загрузки. Обеспечивается получение сообщений в том же порядке, в каком они были посланы. Динамическая маршрутизация. Путь для отправки сообщения от A к B определяется только в момент отправки данного сообщения. Обычно система посылает сообщение другой системе через соединение, наименее используемое в данный момент времени. Метод адаптирован к изменениям загрузки, так как избегает отправки сообщений через интенсивно используемые соединения. Сообщения при данном методе могут приходить в другом порядке. Эта проблема может быть решена путем присваивания номера последовательности каждому сообщению (что и реализовано в сетях TCP/IP). 274 Стратегии соединения и разрешение коллизий Сети с кольцевой топологией. Для осуществления сетевой коммуникации необходимо установить сетевое соединение (connection). Различаются следующие виды сетевых соединений. Переключение схем. Устанавливается постоянное физическое соединение на все время коммуникации (например, по телефонной линии или по кабелю "витая пара"). Переключение сообщений. Устанавливается временное соединение на период передачи сообщения (например, пересылка электронной почты). Переключение пакетов. Сообщения переменной длины делятся на пакеты фиксированной длины, которые и посылаются адресату. Пакеты могут передаваться по сети различными путями. Пакеты должны быть вновь собраны в сообщения по их прибытии. Пример – основной протокол Интернета TCP/IP. Переключение схем требует времени для установки, но меньших накладных расходов на посылку каждого сообщения; при этом могут иметь место потери пропускной способности сети. Переключение сообщений и пакетов требует меньшего времени на установку, но накладные расходы на передачу сообщений больше, чем в первых двух методах. Коллизии в сети возникают, если несколько систем одновременно обращаются к одному и тому же участку сети для передачи информации. Для разрешения коллизий в сетях используется метод CSMA/CD (Carrier sense with multiple access; collision detection: носитель, чувствительный к одновременному доступу; обнаружение коллизий). Суть метода в следующем. Система определяет, не передается ли одновременно по данному участку сети сообщение другой системой. Если две или более систем начинают передачу сообщений в точности в одно и то же время, то фиксируется коллизия, и передача прекращается. Недостаток метода: если система сильно загружена, то может возникнуть множество коллизий, что приведет к падению производительности. Метод CSMA/CD успешно используется в сетях типа Ethernet – наиболее распространенном типе сетей. Методы сетевого соединения в сетях с кольцевой топологией. В России пока не столь популярны сети с кольцевой топологией, однако их изучение и освоение представляет несомненный интерес. Известны следующие методы организации сетевого соединения и коммуникации в сетях с кольцевыми топологиями. Передача маркера (token). Специальные сообщения, называемые маркерами, постоянно циркулируют в системе (обычно – при кольцевой топологии сети). Машина, которой требуется передать информацию, должна дождаться получения сообщениямаркера. Когда машина завершает свой раунд передачи сообщения, она передает по сети маркерное сообщение. Схема передачи маркерных сообщений используется в системах IBM и Apollo. Такая архитектура сети называется маркерным кольцом (token ring). Слоты для сообщений. Несколько слотов для сообщений фиксированного размера постоянно циркулируют в системе (обычно – кольцевой структуры). Поскольку слот может вмещать только сообщения фиксированного размера, единое с логической точки зрения сообщение может быть разбито на несколько пакетов меньшей длины, каждый из которых пересылается в отдельном слоте. Такая схема была опробована в экспериментальной архитектуре сети Cambridge Digital Communication Ring (Кембриджское кольцо). Ключевые термины Cambridge Digital Communication Ring (Кембриджское кольцо) – разновидность исследовательской сетевой системы с кольцевой топологией. CSMA/CD (Carrier sense with multiple access; collision detection: носитель, чувствительный к одновременному доступу; обнаружение коллизий) – распространенный метод разрешения коллизий в сетях. Domain Name Service (DNS) – сервис в сети Интернет, обеспечивающий структуру именования машин, а также преобразование доменного имени в IP-адрес. 275 Виртуальная цепочка – метод маршрутизации, при котором путь сетевых пакетов между двумя заданными сетевыми узлами фиксируется на время одного сеанса связи. Витая пара (twisted pair) - распространенный тип сетевого кабеля, используемый в сетях Ethernet, с разъемами типа RJ45. Волоконно-оптический кабель (fiber optic cable) – быстродействующий сетевой кабель со скоростью передачи данных до 100 МБит / с, принцип действия, которого основан на волоконной оптике. Выделенная линия (dedicated line) – телефонная линия связи, используемая только для сетевого взаимодействия двух узлов (компьютеров) локальной или глобальной сети. Глобальная сеть - Wide-Area Network (WAN) – сеть, связывающая географически удаленные машины. Динамическая маршрутизация - метод маршрутизации, при котором путь для отправки сообщения между двумя заданными сетевыми узлами определяется только в момент отправки данного сообщения. Доменное имя (domain name) – составное символьное имя компьютера в сети Интернет (например, spbu.ru). Коллизия в сети – ситуация, когда несколько систем одновременно обращаются к одному и тому же участку сети для передачи информации. Коммуникационный процессор – специализированный процессор, используемый в глобальных сетях для сетевой коммуникации. Концентратор (hub) – устройство для установки коммуникаций между машинами в локальной сети, к которому подключены все сетевые компьютеры. Локальная сеть - Local-Area Network (LAN) – сеть, расположенная на небольшой площади, например, одной комнате, в пределах здания или нескольких соседних зданий. Маршрутизатор (router) – сетевое устройство для маршрутизации. Маршрутизация (routing) – поиск маршрута для каждого сетевого пакета и направление его по найденному маршруту. Оптический переключатель (optical switch) – быстродействующее сетевое устройство, аналогичное концентратору, используемое в сетях с волоконнооптическими кабелями. Передача маркера (token), или маркерное кольцо (token ring) – метод коммуникации в сети с кольцевой топологией, при котором специальные сообщения, называемые маркерами, постоянно циркулируют в системе. Переключение пакетов - метод сетевого соединения, при котором сообщения переменной длины делятся на пакеты фиксированной длины, которые и посылаются адресату. Переключение схем – метод сетевого соединения, при котором устанавливается постоянное физическое соединение на все время коммуникации. Переключение сообщений - метод сетевого соединения, при котором устанавливается временное соединение на период передачи сообщения. Полностью соединенная сеть – сеть, в которой любая машина соединена с любой другой. Распределенная операционная система – ОС, в которой пользователи не осведомлены относительно множественности машин; доступ к удаленным ресурсам осуществляется аналогично доступу к локальным ресурсам. Сетевая карта (сетевой адаптер) – специализированный сетевой процессор, встроенный в компьютер и обеспечивающий доступ компьютера к локальной сети при подключении к нему сетевого кабеля. Сетевая операционная система – ОС, в которой пользователи осведомлены относительно множественности машин и осуществляют доступ к ресурсам на удаленных машинах явно с помощью удаленного входа или передачи данных с удаленной машины по протоколу FTP. Сетевое соединение (connection) – способ соединения компьютеров в сети, обеспечивающий их сетевую коммуникацию. Сетевой диск – жесткий диск, являющийся частью сетевого компьютера или отдельным элементом сети (со своей сетевой картой), к которому разрешен общий доступ компьютеров локальной сети. Сетевой принтер – принтер, подключенный к сетевому компьютеру или являющийся отдельным элементом сети (со своей сетевой картой), к которому разрешен общий доступ компьютеров локальной сети. 276 Слоты для сообщений - метод коммуникации в сети с кольцевой топологией, при котором несколько слотов для сообщений фиксированного размера постоянно циркулируют в системе. Фиксированная маршрутизация – метод маршрутизации, при котором путь сетевого пакета между двумя сетевыми узлами известен заранее и изменяется только при неисправности сетевых устройств. Шлюз (gateway) – выделенный компьютер локальной сети, играющая роль входного компьютера в данную локальную сеть. Краткие итоги В настоящее время практически все компьютеры используются в рамках распределенных систем, в локальных и глобальных сетях. Мотивация использования сетей: совместное использование ресурсов, ускорение вычислений, надежность, коммуникация. С точки зрения использования сетей, ОС подразделяются на сетевые – ОС, в которых пользователи осведомлены о множественности машин и выполняют явно удаленный вход на другие машины и пересылку файлов с удаленных машин, - и распределенные ОС, в которых пользователи не осведомлены о множественности машин и обращаются к удаленным ресурсам теми же способами, как к локальным. Машины могут быть соединены в сеть различными способами (проводные сети и беспроводные сети различных стандартов) и с использованием различных топологий: полностью соединенная сеть, частично соединенная сеть, сеть древовидной структуры, сеть с топологией "звезда", сеть с топологией "кольцо". С точки зрения размещения, сети подразделяются на локальные – сети, размещаемые в одной или нескольких комнатах или зданиях – и глобальные – сети, объединяющие географически удаленные друг от друга машины. В локальной сети объединяются рабочие станции, персональные компьотеры и, возможно, mainframe- или суперкомпьютеры, а также сетевые принтеры и диски как полноправные элементы сети со своими сетевыми именами и картами. В глобальной сети узлы являются mainframe- или суперкомпьютерами и соединяются выделенными линиями связи или беспроводной связью (типа Wi-MAX и WWAN). В глобальных сетях для коммуникации используются специализированные коммуникационные процессоры. При коммуникации по сети решаются следующие основные проблемы: именование и разрешение имен, маршрутизация, способ соединения, разрешение конфликтов. Для разрешения имен в сети Интернет используется Domain Name Service (DNS), преобразующий символьное сложное доменное имя компьютера в его IP-адрес. Сообщения идентифицируются номерами процессов, сами процессы – парой (имя хоста, идентификатор процесса). Маршрутизация – поиск маршрута для сетевого пакета и отправка его по найденному маршруту. Используются следующие стратегии маршрутизации: фиксированная (по определенному пути), виртуальная цепочка (связь устанавливается на время одного сеанса) и динамическая (связь устанавливается отдельно для отправки каждого сообщения). Стратегии сетевых соединений: переключение схем (постоянное физическое соединение), переключение сообщений (временное соединение на период передачи сообщения) и переключение пакетов (деление сообщения на пакеты фиксированной длины. Для разрешения коллизий в сетях применяется метод CSMA/CD - Carrier sense with multiple access (CSMA); collision detection (CD) – носитель, чувствительный к одновременному доступу; обнаружение коллизий. В сетях с кольцевой топологией для сетевых соединений применяются методы маркерного кольца и слотов для сообщений. Набор для практики Вопросы 1. Что такое распределенная система? 277 2. В чем состоит мотивация использования сетей? 3. Что такое сетевая операционная система? 4. Что такое распределенная ОС и в чем ее отличие от сетевой? 5. Что такое топология сети? 6. Какие основные виды сетевых топологий используются при организации сетей? 7. На какие типы подразделяются сети, с точки зрения расположения их узлов? 8. Что такое локальная сеть? 9. Что такое глобальная сеть? 10. Какие узлы являются элементами локальной сети? 11. Какие узлы являются элементами глобальной сети? 12. Какие виды беспроводных сетей используются сейчас и каковы их параметры? 13. Какие основные проблемы решаются при коммуникации по сети? 14. Что такое DNS? 15. Как идентифицируется процесс в сети? 16. Как идентифицируется сообщение в сети? 17. Что такое маршрутизация и маршрутизатор? 18. Какие стратегии маршрутизации используются в сетях? 19. В чем заключается метод фиксированной маршрутизации? 20. В чем заключается метод маршрутизации виртуальная цепочка? 21. В чем заключается динамический метод маршрутизации? 22. Какие стратегии сетевого соединения используются в сетях? 23. В чем заключается стратегия переключения схем? 24. В чем заключается стратегия переключения сообщений? 25. В чем заключается стратегия переключения пакетов? 26. Какой метод используется для разрешения коллизий в сетях? 27. Что такое маркерное кольцо и Кембриджское кольцо? 28. В чем заключается метод слотов для сообщений в сетях с кольцевой топологией? Упражнения 1. Изучите и опишите способы обращения к удаленным машинам и сетевым ресурсам в используемой Вами операционной системе. 2. Изобразите топологию сети Вашей фирмы (Вашего университета) и классифицируйте ее по принятой классификации сетевых топологий. 3. Изучите и опишите способы сетевых соединений и их параметры в локальной сети Вашей фирмы (Вашего университета). 4. Организуйте домашнюю локальную сеть из всех компьютеров, которые имеются у Вас дома. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. 6. 7. 8. 9. Обзор архитектур распределенных систем и локальных сетей (реферат). Обзор сетевых топологий (реферат). Архитектура и организация локальных сетей (реферат). Архитектура и организация глобальных сетей (реферат). Архитектура, параметры и организация беспроводных сетей (реферат). Обзор стратегий маршрутизации и маршрутизаторов (реферат). Архитектура и функционирование DNS (реферат). Методы сетевых соединений (реферат). Методы разрешения коллизий в сетях (реферат). 278 23. Лекция: Классические и современные сетевые коммуникационные протоколы В лекции рассмотрены: коммуникационные протоколы; уровни организации сетей согласно модели ISO; протокол TCP/IP; протокол GPRS; беспроводные сети, протоколы IEEE 802.11x (Wi-Fi); мгновенные сообщения (Instant Messaging and Presence); обнаружение ошибок в сетях и реконфигурация сетей; задачи проектирования сетей. Содержание Введение Протоколы коммуникации Сети Ethernet Протокол TCP/IP Устойчивость сетей к ошибкам – обнаружение ошибок и реконфигурация сетей Проектирование сетей Функционирование Ethernet-сетей Некоторые современные сетевые протоколы Семейство протоколов Wi-Fi (IEEE 802.11x) Обмен мгновенными сообщениями (Instant Messaging and Presence) Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Самое основное в использовании сетей и сетевых технологий – сетевые протоколы, которым и посвящена данная лекция. В ней рассмотрены следующие вопросы: Протоколы коммуникации Устойчивость сетей Стратегии проектирования сетей. Протоколы коммуникации Модель ISO. Сетевой протокол – это набор команд (операций) для взаимодействия узлов в сети. Ввиду сложности организации сетей, используемая модель сетевых протоколов содержит большое число уровней абстракции. Согласно стандарту коммуникационной модели ISO, коммуникационная сеть подразделяется на следующие основные уровни (layers): Физический уровень (physical layer) – механические и электрические устройства для передачи сигналов. Самый нижний уровень сетевой коммуникации. Включает сетевое оборудование - сетевые кабели, разъемы, концентраторы и т.д. Уровень (связывания) данных (Data link layer) – обрабатывает фреймы (frames), или части пакетов фиксированной длины, включая обнаружение ошибок и восстановление после ошибок на физическом уровне. Сетевой уровень (network layer) – обеспечивает соединение и маршрутизацию пакетов в коммуникационной сети, включая обработку адресов исходящих пакетов, декодирование адресов входящих пакетов и поддержку информации для маршрутизации для соответствующего ответа для изменения уровней загрузки. Транспортный уровень (transport layer) – отвечает за сетевой доступ нижнего уровня и за передачу сообщений между клиентами, включая разделение сообщений на пакеты, сопровождение порядка пакетов, поток управления и генерацию физических адресов. Уровень сеанса (session layer) – реализует сеансы (sessions), или протоколы коммуникации между процессами. 279 Уровень презентаций (presentation layer) – инкапсулирует различие в форматах между различными системами в сети, включая преобразования символов и полудуплексную (дуплексную) связь (эхо-вывод). Уровень приложений (application layer) – самый высокий уровень модели сетевых протоколов. Взаимодействует непосредственно с запросами на передачу файлов пользовательского уровня, протоколами удаленных входов и передачи электронной почты, а также со схемами распределенных баз данных. Схема уровней сетевой коммуникации представлена на рис. 23.1. Рис. 23.1. Многоуровневая модель коммуникации ISO. На рис. 23.2 представлено содержание уровней сетевой коммуникации. На рис. 23.3 изображена структура сетевого сообщения, согласно модели ISO. Сообщение имеет заголовки каждого уровня, начиная от уровня связывания данных, затем следует тело сообщения и признак конца сообщения (уровня связывания данных, отвечающего за целостность передачи сообщения). Таким образом, реализация каждого уровня абстракции обрабатывает сообщение, используя заголовок сообщения соответствующего уровня. Сети Ethernet Ethernet (стандарт IEEE 802.3) – наиболее распространенный метод организации сетей. Относится к физическому (physical Ethernet) уровню и уровню связывания данных, согласно 8-уровневой модели ISO (п. 23.2). Слово ether по-английски означает эфир. Основоположник сетей Ethernet – Роберт Меткалф (R. Metcalfe 1973). Он же впоследствии основал фирму 3COM, одну из наиболее известных компаний в области сетевых технологий. Основные идеи Ethernet - использование коаксиального кабеля (BNC) и 48-битового адреса (MAC-адреса), который присваивается каждому сетевому компьютеру и используется для идентификации источников и получателей пакетов в сетях Первоначально скорость сетей Ethernet составляла до 3 МБит/с. В настоящее время она увеличилась до 1 Гбит/с (Gigabit Ethernet). 280 Рис. 23.2. Уровни сетевых протоколов (ISO). В большинстве локальных сетей в качестве кабеля используется витая пара (twisted pair) с разъемами типа RJ 45. Для соединений используются концентраторы (hubs) с быстродействием 10 МБит/с (10BASE-T) или переключатели (switches) с быстродействием 100 МБит/с (100BASE-T). Ethernet-адрес каждого компьютера фиксирован, выдается при загрузке операционной системы и может быть также выведен на консоль специальными командами ОС; например, в ОС Solaris – командой banner, которая выводит на экран стартовую информацию ОС, в том числе MAC-адрес компьютера. 281 Рис. 23.3. Структура сетевого сообщения, согласно модели ISO. Протокол TCP/IP IP-адреса. TCP/IP (Transmission Control Protocol / Internet Protocol) – наиболее распространенное семейство протоколов сетевого и транспортного уровня, используемых в Интернете. Основоположники TCP/IP – Роберт Кан (Robert Kahn) и Винтон Серф (Vinton Cerf) -1972 – 1974. Протокол TCP/IP основан на использовании IP-адресов каждого хоста (компьютера), имеющих вид: a.b.c.d (все четыре числа – в диапазоне от 0 до 255) и обеспечивает пересылку по сети пакетов (packets) фиксированного размера, содержащих адрес получателя и номер пакета в сообщении. TCP/IP -протокол обеспечивает транспорт сетевых пакетов, деление сообщения на пакеты отправителем и сборку сообщения из пакетов получателем. IPадрес может быть закреплен за компьютером постоянно Интернет-провайдером пользователя компьютера, либо присваивается компьютеру динамически (каждый раз – разный) при выходе в Интернет. Более общее современное название TCP/IP - Internet Protocol Suite. Различаются более новая версия – IPv6 и более старая – IPv4. В версии IPv6 используется IP-адрес не из четырех, а из 6 чисел. Протокол TCP/IP – синхронный, т.е. получатель ожидает получения каждого пакета и посылает отправителю подтверждение об этом. Другой вариант Интернет-протокола - UDP/IP (Universal Datagram Protocol / Internet Protocol) – асинхронный транспортный протокол, обеспечивающий обмен датаграммами – байтовыми массивами переменной длины; он считается менее надежным, чем TCP/IP, но работает быстрее, поэтому часто для быстрого обмена сообщениями в сетях предпочитают именно его. Скорость TCP/IP не всегда удовлетворительна, ввиду огромного числа IP-узлов в Интернете. Для оптимизации связи между узлами сети применяются Distributed Hash Tables (DHT) – распределенные хеш-таблицы. В них собственная система имен узлов сети и 282 более быстрого их поиска, чем с использованием TCP/IP протоколов, работающая "поверх" TCP/IP. На рис. 23.4 изображены уровни протокола TCP/IP и перечислены основные протоколы прикладного уровня, работающие поверх TCP/IP и UDP/IP, - протокол передачи гипертекста (основа функционирования World Wide Web), протоколы передачи файлов, передачи электронной почты, взаимодействия с удаленным терминалом, управления сетью. Рис. 23.4. Уровни протокола TCP/IP. Устойчивость сетей к ошибкам – обнаружение ошибок и реконфигурация сетей Обнаружение ошибок сетевой аппаратуры достаточно сложно. Для обнаружение ошибки связи может быть использован протокол "рукопожатия" (handshake) – обмена сообщениями о каждом выполненном действии (посланном и принятом сообщении). Предположим, что система A и система B установили связь. Через фиксированные интервалы времени системы должны обмениваться сообщениями типа "я в порядке" (I-am-up), указывающими, что они нормально функционируют. Если система A не получает сообщения через фиксированный интервал, то, повидимому, либо другая система не работает, либо данное сообщение потеряно. Система A теперь посылает сообщение вида: "Вы в порядке?" (are-you-up?) системе B. Если система A не получает ответа, она может повторить сообщение или попробовать альтернативный маршрут к системе B На практике используется следующий метод обнаружения, работает ли хост с именем hostname, - команда ping: ping hostname (или: ping A.B.C.D с указанием IP-адреса хоста) При выполнении этой команды происходит пробный обмен сообщениями фиксированной длины с заданным хостом, трассировка отправки и получения которых выдается на консоль, после чего выдается стандартное сообщение "Host hostname alive" (хост hostname жив). 283 Если этих сообщений нет, видимо, связь с хостом по каким-то причинам потеряна (он перезагружается, либо нарушена связь на физическом уровне, либо произошло отключение электропитания и т.д.). Если система A не получает обязательного ответа от системы B, она заключает, что имеет место какая-либо ошибка. Типы ошибок: Система B не работает Непосредственная связь между A и B не работает Альтернативная связь между A и B не работает Сообщение потеряно. Однако система A не может точно определить, почему произошла ошибка. Реконфигурация сети. Когда система A определяет, что произошла ошибка, она должна реконфигурировать систему: 1. Если связь между A и B отказала, эта информация должна быть доведена до любой машины в сети. 2. Если имеет место отказ машины, то любая другая машина должна быть также нотифицирована о том, что сервисы, обеспечиваемые отказавшей машиной, более не доступны. Когда связь или машина становятся доступны снова, данная информация должна также быть сообщена всем машинам в сети. На практике при перезапуске какого-либо сервера в локальной сети имеется возможность послать всем пользователям сети предупреждение о том, что через минуту произойдет перезагрузка сервера, и они должны срочно сохранить свои данные. Проектирование сетей При проектировании сетей должен быть учтен целый ряд требований: Прозрачность (transparency) – распределенная система должна быть представлена пользователю как обычная централизованная система. Устойчивость к ошибкам (fault tolerance) – распределенная система должна продолжать функционировать в случае ошибок. Масштабируемость (scalability) – по мере увеличения числа запросов, система должна легко воспринимать добавление новых ресурсов с целью удовлетворения новых запросов. Для предоставления сетевых вычислительных услуг используются кластеры – совокупности полуавтономных машин, с точки зрения пользователя функционирующих как одна система. Функционирование Ethernet-сетей Передача сетевых пакетов между машинами в сетях Ethernet, наиболее распространенных с 1970-х гг. по настоящее время, происходит следующим образом. Каждая машина имеет уникальный IP-адрес и соответствующий Ethernet- (MAC-) адрес. Для коммуникации требуются оба адреса. Для поиска IP-адресов используется Domain Name Service (DNS). Протокол Address Resolution Protocol (ARP) используется для отображения MAC-адресов в IPадреса. Если машины находятся в одной и той же локальной сети, то может использоваться ARP. Если машины в разных локальных сетях, то машина-отправитель посылает пакет маршрутизатору (router), который маршрутизирует данный пакет до принимающей сети. Структура сетевого пакета в Ethernet-сети изображена на рис. 23.5. Как видно из схемы, пакет начинается со стандартной последовательности байтов. Он содержит Ethernet-адреса получателя и источника, длину сообщения, само сообщение (пересылаемые данные) и контрольную сумму. Структура пакета достаточно проста и особых комментариев не требует. 284 Рис. 23.5. Структура сетевого пакета в сетях Ethernet. Некоторые современные сетевые протоколы Протокол GPRS. Изложение классических основ сетевых протоколов и их стандартов завершим рассмотрением некоторых современных сетевых протоколов различных уровней, имеющих особенно важное практическое значение. В данном разделе рассмотрим протокол GPRS. GPRS (General Packet Radio Service) - протокол беспроводной радиосвязи уровня связывания данных (уровня 2) по модели ISO, широко используемый в мобильной связи (GSM). Данный протокол "понимает" структуру IP-пакетов. Обеспечивается реальная скорость связи до 60 КБит / с, сравнимая со скоростью обычного модема и обмена через телефонную линию (dial-up). Используется для реализации SMS (текстовых сообщений), MMS (мультимедийных сообщений), Instant messaging and presence (отправки и получения мгновенных сообщений), WAP (упрощенного доступа к Web для мобильных телефонов), мобильного Интернета В некоторых местностях и странах GPRS является фактически единственным способом организации связи для передачи данных и выхода в Интернет. Настоятельно рекомендуется при выборе мобильного телефона обращать внимание на поддержку протокола GPRS. При использовании TCP/IP GPRS-протокол присваивает каждому мобильному телефону один или несколько IP-адресов и обеспечивает надежную пересылку IP-пакетов. IP-адреса, как правило, присваиваются динамически. Для маршрутизации пакетов используются точки доступа (access points) со своими именами Access Point Names (APNs). При настройке GPRS в мобильном телефоне необходимо указать APN, предоставляемое Вашим провайдером (например, МТС) При использовании телефона как GPRS-модема (для выхода в Интернет, приема электронной почты и т.д.) связь с компьютером осуществляется через Bluetooth или через инфракрасный порт (IrDA). Не следует путать GPRS с GPS (глобальной системой спутниковой навигации), как иногда делают, в чем неоднократно убеждался автор. 285 Схема функционирования протокола GPS изображена на рис. 23.6. Рис. 23.6. Протокол GPRS: Схема работы. Семейство протоколов Wi-Fi (IEEE 802.11x) Wi-Fi (IEEE 802.11x) – это семейство протоколов уровня связывания данных (уровня 2 по модели ISO) для беспроводной радиосвязи в локальных сетях (WLAN). Другое неофициальное (более старое) название того же семейства протоколов – RadioEthernet. Используется для выхода в Интернет, передачи голосовых сообщений через TCP/IP (VoIP), связи с мультимедийными устройствами (цифровыми камерами, проекторами и т.п.) Скорость передачи данных – от 11 МБит / с (по стандарту 802.11b) до 54 МБит/с (по стандартам 802.11a и 802.11c). Wi-Fi - связь доступна в радиусе действия точки доступа (access point) ~ 200-250 метров. Зона доступа Wi-Fi носит название hotspot. Типичная зона доступа – гостиница, аэропорт, вокзал, Интернет-кафе. Wi-Fi – адаптеры встраиваются в портативные компьютеры, органайзеры (PDA), коммуникаторы. Преимущества Wi-Fi: при наличии точки доступа в соответствующей окрестности, доступ в Интернет возможен везде. Недостатки Wi-Fi: локальный характер связи; различие числа Wi-Fi каналов в Европе, Америке и Азии; недостаточная безопасность; на практике, недостаточная надежность при числе пользователей 1000 – 10000 и более; связь Wi-Fi не безвредна для здоровья (поэтому ограничена для использования в странах Евросоюза). Wi-MAX – более высокоскоростной вариант Wi-Fi (со скоростью передачи данных до 1 Гбит / с) с большим радиусом действия. В настоящее время отечeственные коммуникационные фирмы активно ведут работу по покрытию территории РФ сетями Wi-MAX. Обмен мгновенными сообщениями (Instant Messaging and Presence) Instant Messaging and Presence (IMP) - семейство протоколов и технологий верхнего уровня (application layer) для обмена сообщениями между клиентами, использующими мобильные телефоны, коммуникаторы, лаптопы и перемещающимися из одной точки в другую. IMP использует адреса, сходные с email-адресами, например: node@domain/work – XMPP-адрес. Посылаемые сообщения – как правило, текстовые, но также возможно посылать и графические образы. 286 Основные понятия IMP: IMP client – пользователь сети; presence – информация о присутствии клиента на связи; presentity (presence server) – сервер сети, обеспечивающий регистрацию клиентов и выдачу информации о присутствии на связи. Основные протоколы IMP: SIMPLE / SIP; XMPP (Jabber); Wireless Village. Лаборатория Java-технологии СПбГУ под научным руководством автора в 2003 – 2006 гг. выполнила работы для лаборатории Panasonic Research по реализации Java-библиотек для мгновенных сообщений (JSR 164 / 165 / 186 / 187) и разработке комплексов тестов для их тестирования (TCKs). Ключевые термины Address Resolution Protocol (ARP) – протокол нижнего уровня в Ethernet-сетях, используемый для отображения MAC-адресов в IP-адреса. Ethernet (стандарт IEEE 802.3) – наиболее распространенный метод организации сетей, основанный на 48-битовых MAC-адресах сетевых компьютеров. GPRS (General Packet Radio Service) - протокол беспроводной связи уровня связывания данных, широко используемый в мобильной связи (GSM) и "понимающий" структуру IPпакетов. Instant Messaging and Presence (IMP) - cемейство протоколов и технологий верхнего уровня для обмена сообщениями между клиентами, использующими мобильные телефоны, коммуникаторы и портативные компьютеры и перемещающимися из одной точки в другую. IP-адрес – адрес компьютера в сети TCP/IP, имеющий вид: a.b.c.d (все четыре числа – в диапазоне от 0 до 255). TCP/IP (Transmission Control Protocol / Internet Protocol) – наиболее распространенное семейство протоколов сетевого и транспортного уровня, используемых в Интернете, основанное на IP-адресах компьютеров. UDP/IP (Universal Datagram Protocol / Internet Protocol) – асинхронный транспортный протокол для IP-сети, обеспечивающий обмен датаграммами переменной длины. Wi-Fi (IEEE 802.11x) – семейство протоколов уровня связывания данных для беспроводной радиосвязи в локальных сетях. Датаграмма – байтовый массив, посылаемый по IP-сети с помощью протокола UDP/IP . Масштабируемость (scalability) – требование к организации сети, согласно которому, распределенная система должна легко адаптироваться к любому увеличению числа запросов. Пакет (packet) – часть сообщения в сети TCP/IP, имеющая фиксированный размер, содержащая адрес получателя и номер пакета в сообщении. Прозрачность (transparency) – требование к организации сети, согласно которому распределенная система должна быть представлена пользователю как обычная централизованная система. Распределенная хеш-таблица (Distributed Hash Table - DHT) – метод ускоренного взаимодействия между подмножеством узлов IP – сети, основанный на использовании хешфункций. "Рукопожатие" (handshake) – обмен взаимодействующих узлов сети сообщениями о каждом выполненном действии (посланном и принятом сообщении). Сетевой протокол –набор команд (операций) для взаимодействия узлов в сети. Сетевой уровень (network layer) – уровень сетевых протоколов стандарта ISO, обеспечивающий соединение и маршрутизацию пакетов в коммуникационной сети, включая обработку адресов исходящих пакетов, декодирование адресов входящих пакетов и поддержку информации для маршрутизации для соответствующего ответа для изменения уровней загрузки. Транспортный уровень (transport layer) – уровень сетевых протоколов стандарта ISO, отвечающий за сетевой доступ нижнего уровня и за передачу сообщений между клиен- 287 тами, включая разделение сообщений на пакеты, сопровождение порядка пакетов, поток управления и генерацию физических адресов. Точка доступа (access point) – предоставляемый провайдером мобильной связи шлюз, используемый для маршрутизации GPRS-пакетов. Уровень (связывания) данных (Data link layer) – уровень сетевых протоколов стандарта ISO, на котором обрабатываются фреймы сообщений (части пакетов фиксированной длины), включая обнаружение ошибок и восстановление после ошибок на физическом уровне. Уровень презентаций (presentation layer) – уровень сетевых протоколов стандарта ISO, инкапсулирующий различие в форматах между различными системами в сети, включая преобразования символов и полудуплексную (дуплексную) связь (эхо-вывод). Уровень приложений (application layer) – самый высокий уровень модели сетевых протоколов стандарта ISO,. взаимодействующий с запросами на передачу файлов пользовательского уровня, протоколами удаленных входов и передачи электронной почты, а также со схемами распределенных баз данных. Уровень сеансов (session layer) – уровень сетевых протоколов стандарта ISO, реализующий сеансы (sessions), или протоколы коммуникации между процессами. Устойчивость к ошибкам (fault tolerance) – требование к организации сети, согласно которому распределенная система должна продолжать функционировать в случае ошибок. Физический уровень (physical layer) – уровень сетевых протоколов стандарта ISO, соответствующий механическим и электрическим сетевым устройствам для передачи сигналов. Краткие итоги Согласно стандартной модели ISO, коммуникационные протоколы в сетях подразделяются на следующие уровни (снизу вверх): физический уровень, уровень связывания данных, сетевой уровень, транспортный уровень, уровень сеансов, уровень презентаций, уровень приложений. Стандартное сетевое сообщение имеет заголовки всех уровней, тело (данные) и признак конца сообщения уровня связывания данных. Ethernet – это наиболее распространенный метод организации сетей на физическом уровне и уровне связывания данных, основанный на использовании 48-битовых MACадресов компьютеров и коаксиальных кабелей BNC. Скорость связи в настоящее время – до 1 гигабита. Используются кабели типа витая пара с разъемами RJ45, сетевые концентраторы и переключатели. TCP/IP – это семейство Интернет-протоколов, основанное на IP-адресах компьютеров (вида a.b.c.d, где каждое из чисел от 0 до 255) и делении сообщений на пакеты фиксированной длины, содержащие номер пакета и адрес получателя. TCP/IP – синхронный обмен. Асинхронный вариант обмена в IP-сетях – UDP/IP, основанный на пересылке датаграмм в виде байтовых массивов переменной длины. Для ускорения доступа к подмножествам TCP/IP – сетей используются распределенные хеш-таблицы. В семействе протоколов TCP/IP сетевой уровень обеспечивает IP-протокол, транспортный – UPD или TCP, верхний уровень – протоколы HTTP, FTP, TELNET, SMTP, DNS, SNMP. Для обнаружения ошибок в сетях используется метод рукопожатия – обмена сообщениями о каждом выполненном действии. Узел, обнаруживший ошибку в сети в виде отказа другого узла, должен оповестить об этом другие узлы сети. Требования к проектированию сетей – прозрачность для пользователей, устойчивость к ошибкам и масштабируемость. Для предоставления сетевых услуг используются кластеры компьютеров, функционирующие с точки зрения сетевого клиента как одна машина. При функционировании Ethernet-сети в рамках одной локальной сети используется протокол ARP для отображения MAC-адресов компьютеров в их адреса, для связи между разными локальными сетями используются маршрутизаторы. Сетевой пакет в Ethernet-сети содер- 288 жит стандартное начало в виде последовательности определенных байтов, адрес получателя, адрес источника, длину сообщения, данные сообщения и контрольную сумму. Протокол GPRS используется для беспроводной связи в IP-сети и обеспечивает быструю обработку IP-пакетов. Использует протоколы и серверы мобильной связи GSM и точки доступа, предоставляемые провайдерами мобильной связи. Скорость доступа сравнима со скоростью обычного модема. Wi-Fi – семейство протоколов беспроводной радиосвязи в локальных сетях со скоростью 10-50 мегабит в секунду в пределах точки доступа (200-250 м). Wi-MAX – развитие Wi-Fi путем покрытия высокоскоростными сетями Wi-Fi территории города, региона или государства. Скорость связи – до 100 МБит / с. Instant Messaging and Presence – семейство высокоуровневых протоколов для обмена мгновенными сообщениями в сетях мобильных устройств и портативных компьютеров. Набор для практики Вопросы 1. На какие уровни подразделяются сетевые протоколы, согласно модели ISO? 2. Что такое физический уровень? 3. Что такое уровень связывания данных? 4. Что такое сетевой уровень? 5. Что такое транспортный уровень? 6. Что такое уровень сеансов? 7. Что такое уровень презентаций? 8. Что такое уровень приложений? 9. Какова стандартная структура сетевого сообщения? 10. Что такое Ethernet и Ethernet-сети? 11. Что такое MAC-адрес? 12. Что такое TCP/IP? 13. В чем отличие UDP/IP от TCP/IP? 14. Что такое распределенная хеш-таблица и какова цель ее использования? 15. Какой метод используется для обнаружения ошибок в сетях? 16. Каковы требования к проектированию сетей? 17. Что такое прозрачность сети? 18. Что такое масштабируемость сети? 19. Что такое устойчивость сети к ошибкам? 20. С помощью, каких протоколов функционирует Ethernet-сеть? 21. Какова структура пакета в Ethernet-сети? 22. Что такое GPRS? 23. Что такое Wi-Fi и Wi-MAX? 24. Что такое instant messaging and presence? Упражнения 1. Назовите все известные Вам сетевые протоколы и определите, к какому уровню модели ISO они относятся. 2. Реализуйте на языке Java с помощью пакета java.net взаимодействие между двумя узлами сети (клиентом и сервером) по протоколам TCP/IP и UDP/IP и проанализируйте результаты. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. 6. 7. 8. Обзор стандартной модели сетевых протоколов ISO (реферат). Обзор архитектуры и организации Ethernet-сетей (реферат). Обзор сетей и сетевых протоколов TCP/IP (реферат). Методы обнаружения ошибок в сетях и реконфигурации сетей (реферат). Обзор возможностей и реализации протокола GPRS (реферат). Обзор возможностей и реализаций семейства протоколов Wi-Fi и Wi-MAX (реферат). Обзор протоколов обмена мгновенными сообщениями (реферат). Реализация на языке Java с помощью пакета java.net взаимодействие между двумя узлами сети (клиентом и сервером) по протоколам TCP/IP и UDP/IP. 289 290 24. Лекция: Безопасность операционных систем и сетей. Trustworthy Computing В лекции рассмотрены следующие вопросы: концепция безопасности; сетевые и системные угрозы (атаки); борьба с атаками; аудит сетевых систем; брандмауэры; обнаружение попыток взлома; криптография; SSL; уровни безопасности компьютеров; решение проблем безопасности в Windows NT и в Microsoft.NET; политики безопасности; инициатива Microsoft Trustworthy Computing Initiative. Содержание Введение Проблема безопасности Аутентификация Программные угрозы (атаки) Системные угрозы (атаки) Типы сетевых атак Trustworthy Computing (TWC) Initiative Принципы разработки безопасных программных продуктов Классификация угроз и атак (STRIDE) Оценка атак на программное обеспечение Борьба с атаками Брандмауэр Обнаружение попыток взлома Криптография Уровни безопасности компьютеров Безопасность в Windows NT Безопасность в .NET Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Безопасность – одна из наиболее актуальных проблем в области ИТ в настоящее время, ввиду сильной зависимости повседневной деятельности и бизнеса от компьютерных технологий и ввиду резко возрастающего числа сетевых атак (киберпреступности). Особенно важна безопасность для операционных систем и сетей как основных объектов атак. В лекции рассмотрены следующие вопросы: Проблема безопасности Аутентификация Программные угрозы (атаки) Системные угрозы (атаки) Защита систем Обнаружение взлома Криптография Безопасность в Windows NT / 2000 / XP / 2003 / Vista, в.NET Инициатива Trustworthy Computing Initiative корпорации Microsoft. Проблема безопасности Безопасность (security) – это защита от внешних атак. В настоящее время наблюдается значительный рост числа самых разнообразных атак хакеров, угрожающих целостности информации, работоспособности компьютерных систем и зависящих от них компаний, благосостоянию и личной безопасности людей. Для защиты от атак необходимы специальные меры безопасности, компьютерные технологии и инструменты. В любой компьютерной системе должна быть реализована подсистема безопасности, которая должна проверять внешнее окружение системы и защищать ее от: Несанкционированного доступа 291 Злонамеренной модификации или разрушения Случайного ввода неверной информации. Практика показывает, что легче защитить от случайной, чем от злонамеренной порчи информации. Аутентификация Одной из наиболее широко используемых мер безопасности является аутентификация (authentication) – идентификация пользователей при входе в систему. Такая идентификация пользователей наиболее часто реализуется через логины – зарегистрированные имена пользователей для входа в систему – и пароли – секретные кодовые слова, ассоциируемые с каждым логином. Основной принцип использования паролей в том, что они должны сохраняться в секрете. Поэтому одна из традиционных целей атакующих хакеров состоит в том, чтобы любыми способами выведать у пользователя его логин и пароль. Для сохранения секретности паролей предпринимаются следующие меры. Частая смена паролей. Аналогичные меры применялись в армии во время войны. Большинство сайтов и других систем (например, сайт партнеров фирмы Microsoft) требуют от пользователей регулярной (например, не реже. чем раз в три месяца) смены паролей, иначе сайт блокируется для доступа. Подобные меры вполне оправданы. Использование "не угадываемых" паролей. Практически все системы требуют от пользователя при регистрации устанавливать пароли, не являющиеся легко угадываемыми: например, как правило, пароль должен содержать большие и маленькие буквы и цифры, специальные символы и иметь длину не менее 7-8 символов. Используются также автоматические генераторы не угадываемых паролей. Поэтому использование в качестве паролей легко угадываемых слов – например, имени любимой собаки или общеупотребительного понятия – не рекомендуется. Сохранение всех неверных попыток доступа. Во многих системах реализован системный журнал, в котором фиксируются все неверные попытки ввода логинов и паролей. Обычно дается фиксированное число таких попыток (например, три). Пароли также могут быть закриптованы или разрешены для доступа лишь один раз, после чего от пользователя требуется смена пароля. Программные угрозы (атаки) Рассмотрим некоторые типичные виды угроз и атак, используемые хакерами. Троянская программа (Trojan Horse) – атакующая программа, которая "подделывается" под некоторую полезную программу, но при своем запуске не по назначению (злонамеренно) использует свое окружение, например, получает и использует конфиденциальную информацию. Троянские программы используют системные механизмы для того, чтобы программы, написанные одними пользователями, могли исполняться другими пользователями. Вход в ловушку (Trap Door) - использование логина или пароля, который позволяет избежать проверок, связанных с безопасностью. Переполнение стека и буфера (Stack and Buffer Overflow) - использование ошибки в программе (переполнение стека или буферов в памяти) для обращения к памяти другого пользователя или процесса с целью нарушения ее целостности. Системные угрозы (атаки) Рассмотрим также некоторые типичные атаки, использующие уязвимости (vulnerabilities) в системных программах – ошибки и недочеты, дающие возможность организации атак. Черви (Worms) – злонамеренные программы, использующие механизмы самовоспроизведения (размножения). Например, один из Интернет-червей использует сетевые возможности UNIX (удаленный доступ) и ошибки в программах finger и sendmail. Принцип его действия следующий: некоторая постоянно используемая в сети системная программа распространяет главную программу червя. 292 На рис. 24.1 изображен принцип действия Интернет-червя Morris, использующего уязвимости в системных программах UNIX. Рис. 24.1. Интернет-червь Morris. Вирусы – фрагменты кода, встраивающиеся в обычные программы с целью нарушения работоспособности этих программ и всей компьютерной системы. В основном вирусы действуют на микрокомпьютерные системы. Вирусы скачиваются с публично доступных сайтов или с дисков, содержащих "инфекцию". Для предотвращения заражения компьютерными вирусами необходимо соблюдать принципы безопасности при использовании компьютеров (safe computing) – использовать антивирусы, guards – программы, постоянно находящиеся в памяти и проверяющие на вирусы каждый открываемый файл - .exe, doc, и т.д. Отказ в обслуживании (Denial of Service – DoS) – одна из распространенных разновидностей атак на сервер, заключающаяся в создании искусственной перегрузки сервера с целью препятствовать его нормальной работе. Например, для Web-сервера такая атака может заключаться в том, чтобы искусственно сгенерировать миллион запросов "GET". Если сервер реализован не вполне надежно, подобная атака чаще всего приводит к переполнению памяти на сервере и необходимости его перезапуска. Типы сетевых атак Рассмотрим некоторые типы современных сетевых атак, которых необходимо постоянно остерегаться пользователям. Phishing – попытка украсть конфиденциальную информацию пользователя путем ее обманного получения от самого пользователя. Даже само слово phishing – искаженное слово fishing (рыбная ловля), т.е. хакер с помощью этого приема как бы пытается поймать чересчур наивного пользователя "на удочку". Например, напугав в своем сообщении пользователя, что его логин и пароль, кредитная карта или банковский счет под угрозой, хакер пытается добиться от пользователя в ответ ввода и отправки некоторой конфиденциальной информации. Обычно phishing-сообщение по электронной почте приходит как бы от имени банка и подделывается под цвета, логотипы и т.д., используемые на сайте банка. Однако для его разоблачения обычно достаточно подвести курсор мыши (не кликая ее) к приведенной webссылке или email-адресу (при этом она высвечивается) и убедиться в том, что адрес указывает отнюдь не на банк, а на совершенно посторонний сайт или email. Поэтому пользователям не следует быть слишком наивными. Другая действенная мера, если phishing происходит регулярно с одних и тех же email-адресов, - включить эти адреса в черный список на emailсервере. Тогда подобные сообщения вообще не будут доходить до входного почтового ящика пользователя. Pharming – перенаправление пользователя на злонамеренный Web-сайт (обычно с целью phishing). Меры предотвращения со стороны пользователя мы уже рассмотрели. В со- 293 временные web-браузеры встроены программы антифишингового контроля, которые запускаются автоматически при обращении к сайту. Хотя это отнимает у пользователя некоторое время, подобные меры помогают предотвратить многие атаки. Tampering with data – злонамеренное искажение или порча данных. Действенной мерой по борьбе с подобными атаками является криптование информации. Spoofing – "подделка" под определенного пользователя (злонамеренное применение его логина, пароля и полномочий). Логин и пароль при этом либо получены от пользователя обманным путем (например, в результате phishing), либо извлечены из "взломанного" хакерской программой системного файла. Elevation of privilege – попытка расширить полномочия (например, до полномочий системного администратора) с целью злонамеренных действий. Поэтому наиболее секретная информация в любой компьютерной системе – пароль системного администратора, который необходимо защищать особенно тщательно. Trustworthy Computing (TWC) Initiative Инициатива под таким названием (инициатива надежных и безопасных вычислений) объявлена в 2002 г. в историческом электронном письме основоположника корпорации Microsoft Билла Гейтса всем сотрудникам компании. Основная суть инициативы TWC заключается в том, что безопасности необходимо уделять особое внимание при разработке программной системы, начиная с самых ранних этапов. Однако этим инициатива TWC не исчерпывается – смысл и цели ее гораздо шире и охватывают также экономические, юридические аспекты и "человеческий фактор". Основные принципы инициативы TWC: Безопасность (Security) – реализация и использование в любой программной системе действенных мер защиты от внешних атак; использование специальных методов разработки программ, направленных на достижение этой цели. Сохранение конфиденциальности информации (Privacy) – использование программным обеспечением частной и корпоративной информации только с явного согласия пользователя и только для понятных ему законных целей; защита конфиденциальной информации от взлома в результате атаки. Надежность (Reliability) – предсказуемость поведения программных систем, которые должны обеспечивать в заданном окружении ожидаемое правильное поведение программы. Оперативность, законность и корректность бизнеса (Business Integrity) – оперативность работы группы сопровождения программного продукта и своевременные консультации пользователей по вопросам безопасности; корректность бизнеса компании – разработчика программного обеспечения. Сама корпорация Microsoft с 2002 г. полностью реорганизовала бизнес-процессы разработки программного обеспечения, используя новую схему жизненного цикла для разработки безопасных программ – SDLC (Security Development Life Cycle). Принципы TWC воплощены во всех новых версиях продуктов Microsoft: Internet Explorer 7 и 8, Windows Vista и др. Microsoft своей инициативой TWC призвала все остальные компании и индивидуальных разработчиков следовать предложенным ею принципам, хотя изначально отношение к инициативе TWC в мире было достаточно осторожным и даже скептическим. Microsoft финансировала работы по обеспечению TWC и обучение TWC в университетах. Следует отметить, что обучение TWC в университетах в мире только начато. Наибольшее внимание этим вопросам в первую очередь уделяют университеты военного подчинения и назначения. Одним из первых университетов, обучающих студентов ИТ-специальностей принципам TWC, является математико-механический факультет СПбГУ – более подробное изучение TWC в курсе проф. В.О. Сафонова "Архитектуры и модели программ и знаний" (4 курс) и изложение элементов TWC во всех других курсах проф. В.О. Сафонова: "Операционные системы и сети", "Java-технология", "Компиляторы". 294 Принципы разработки безопасных программных продуктов Новая схема жизненного цикла для разработки безопасных программ, разработанная и применяемая компанией Microsoft, носит название Security Development Life Cycle (SDLC). Основная идея SDLC – учитывать требования безопасности в течение всего жизненного цикла разработки программ, начиная с самых ранних этапов. Схема SDLC приведена на рис. 24.2. Рис. 24.2. Схема Security Development Life Cycle (SDLC). На схеме приведены традиционные этапы жизненного цикла и стрелками показаны дополнения к ней, которые вносятся SDLC. В течение всего цикла разработки ПО, начиная с самых ранних этапов (требования, спецификации, проектирование), необходимо постоянно предусматривать меры надежности и безопасности ПО, чтобы впоследствии не пришлось их встраивать в систему в "авральном порядке", что значительно увеличит затраты. Необходимо заранее анализировать и моделировать возможные угрозы и атаки на ПО и разрабатывать меры их отражения. Необходимы инструменты количественной оценки рисков, с точки зрения надежности и безопасности. Необходимы специальные виды тестирования ПО – security testing, fuzzy testing (fuzzing) – тестирование подсистемы безопасности и тестирование на граничные или близкие к граничным значения параметров, имитирующее действия хакеров по подбору и взлому IP-адресов и других компонент компьютерной системы. Необходимы эксперты по безопасности ПО (security buddies), участвующие в разработке в течение всего цикла. Компания Microsoft предложила ряд простых схем для оценки и разработки безопасного программного обеспечения , для оценки угроз и атак и оценки последствий атаки, которые мы и рассмотрим. Схема (формула) SD3C определяет основные принципы разработки безопасного программного обеспечения: Secure in Design – применение принципов безопасного проектирования; учет возможных атак; реализация способов их отражения; Secure by Default – включение установок безопасности по умолчанию; Secure in Deployment – безопасное развертывание и инсталляция программного обеспечения; Communication – постоянное взаимодействие группы сопровождения продукта с пользователями, быстрый выпуск новых версий продукта с исправленными ошибками безопасности; рекомендации по настройке безопасности. Классификация угроз и атак (STRIDE) По формуле STRIDE Microsoft предлагает классифицировать угрозы и атаки: 295 Spoofing – букв.: пародирование, розыгрыш – "подделка" под определенного пользователя; например, воспроизведение транзакции, выполняющей аутентификацию пользователя. Tampering – Несанкционированное изменение данных с целью атаки; например, модификация аутентификационных файлов с целью добавления нового пользователя. Repudiation – буквально означает категорическое несогласие, отрицание, отказ – отсутствие фиксации в системных журналах действий, которые могут привести к нарушению безопасности. В операционной системе драйвер может быть подвержен repudiation-угрозе, если он не выполняет журналирование (logging) действий, которые могут привести к нарушению безопасности. Например, драйвер видеоустройства, который не фиксирует запросы на изменение фокуса и уменьшение размеров изображения (что может привести к его искажению). Information disclosure – несанкционированный доступ к конфиденциальной информации; например: Получение списка номеров кредитных карт клиентов банка. Denial of service – Отказ в обслуживании; например: сознательное достижение эффекта излишней загрузки процессора, используя недостатки хеш-алгоритма. Elevation of privilege – Увеличение привилегий (несанкционированное присваивание прав системного администратора). Пример: запуск привилегированной программы для выполнения Ваших команд. Оценка атак на программное обеспечение Еще одна формула – DREAD – рекомендуется для оценки внешних атак: Damage – Ущерб, нанесенный атакой. Reproducibility – Воспроизводимость атаки: как часто она происходит и может ли быть воспроизведена (смоделирована). Exploitability – здесь: квалификация (уровень); опыт и квалификация (хакера), необходимые для атаки. Affected users – Против каких пользователей направлена атака. Discoverability – Может ли атака быть обнаружена. Борьба с атаками Для борьбы с атаками могут быть предусмотрены следующие меры. Проверка на подозрительные примеры активности – например, несколько подряд попыток ввести неверный пароль могут означать попытку его угадать. Ведение журнала аудита (audit log) – в него записывается время, пользователь и тип каждой попытки доступа к объекту. Журнал используется для восстановления при нарушении защиты и для выработки более действенных мер безопасности. Периодическое сканирование системы на предмет "дыр" в системе безопасности. Выполняется в моменты, когда компьютер практически не используется (пример - сканирование на вирусы). Проверки на: Короткие или простые для угадывания пароли Несанкционированные программы, устанавливающие другие имена пользователей Несанкционированные программы в системных директориях Неожиданно долгие по времени процессы Неверную защиту директорий Неверную защиту системных файлов данных Опасные элементы в путях для поиска программ (ведущие к троянским программам) Изменения в системных программах: проверки контрольных сумм. 296 Брандмауэр Брандмауэр (firewall) – системное программное обеспечение для защиты локальной сети от внешних атак. Брандмауэр помещается между "доверенными" и "не доверенными" компьютерами – например, компьютерами данной локальной сети и всеми остальными. Брандмауэр ограничивает сетевой доступ между двумя различными доменами безопасности. Встроенный брандмауэр имеется во всех современных операционных системах и по умолчанию включен. Настоятельно рекомендуется не отключать его, что особенно существенно при выходе в Интернет. Схема использования брандмауэра изображена на рис. 24.3. Рис. 24.3. Схема использования брандмауэра для обеспечения сетевой безопасности. Уверен, что все пользователи Windows среди читателей неоднократно обращали внимание на сообщение ОС о том, что попытка взлома Вашего компьютера была пресечена. Это – заслуга встроенного брандмауэра Windows. Реализация брандмауэров, как правило, основана на фильтрации сетевых пакетов, пересылаемых с "надежных" и потенциально ненадежных IP-адресов. Обнаружение попыток взлома Действенной мерой безопасности является обнаружение попыток входа в компьютерные системы. Методы обнаружения: Аудит и ведение журнала (см. раздел Борьба с атаками); Использование tripwire - программ для UNIX, которые проверяют, не изменялись ли некоторые файлы и директории, например, файлы, содержащие пароли; Слежение за системными вызовами. В таблица 1 приведен пример таблицы, используемой для слежения за системными вызовами UNIX. 297 Таблица 1. Таблица слежения за последовательностью системных вызовов системный вызов open расстояние = 1 read getrlimit расстояние = 2 mmap расстояние = 3 mmap close read mmap mmap open mmap mmap open close open getrlimit getrlimit mmap getrlimit mmap close close Криптография Криптография – это преобразование понятного текста в зашифрованный текст. Методы криптографии широко используются для защиты конфиденциальной информации. Свойства хороших методов криптования: Относительно простой для авторизованных пользователей способ криптования и декриптования данных. Схема криптования должна зависеть не от секретного алгоритма, а от секретного параметра алгоритма, называемого ключом криптования (encryption key). Для несанкционированного пользователя должно быть крайне сложно определить ключ. Технология Data Encryption Standard (DES) основана на подстановке символов и изменении их порядка на основе ключа, предоставляемого авторизованным пользователям через защищенный механизм. Такая схема лишь настолько безопасна, насколько безопасен сам механизм получения ключа. Криптование на основе открытого ключа – другой широко распространенный метод криптографии - основано на принципе, при котором пользователю известны два ключа: public key – открытый ключ для криптования данных. private key – закрытый ключ, известный только пользователю и применяемый им для декриптования данных. Метод открытого ключа воплощает еще одно важное требование к методам криптографии: метод должен быть основан на схеме криптования, которая публично доступна, но это не будет облегчать разгадывание схемы декриптования. Примером криптования, используемым в Web-технологиях, является SSL (Secure Socket Layer) - семейство криптографических протоколов, предназначенное для обмена криптованными сообщениями через сокет. SSL используется для защищенного взаимодействия между Web-серверами и браузерами (например, ввода номеров кредитных карт). При обращении клиента к серверу последний проверяется с помощью сертификата. Взаимодействие между компьютерами использует криптографию на основе симметричного ключа. Уровни безопасности компьютеров Министерство обороны США классифицирует безопасность компьютеров по уровням: A, B, C, D. Уровень безопасности D соответствует минимальному уровню безопасности. На уровене безопасности C обеспечиваются периодические проверки компьютера с помощью аудита. Уровень С подразделяется на уровни C1 и C2. Уровень C1 обозначает взаимодействие пользователей с одинаковым уровнем безопасности. Уровень C2 допускает управление доступом на уровне пользователей. Уровень безопасности B имеет все свойства уровня C, однако каждый объект может иметь уникальные метки чувствительности (sensitivity labels). Подразделяется на уровни B1, B2, B3. На уровне безопасности A используются формальные методы спецификации и проектирования для обеспечения безопасности. 298 Безопасность в Windows NT Конфигурируемое обеспечение безопасности допускает политики уровней от D до C2 (управление доступом на уровне пользователей). Безопасность основана на учетных записях пользователей, причем каждый пользователь имеет свой идентификатор безопасности (security ID). Используется субъектная модель для обеспечения безопасности доступа. Субъект отслеживает полномочия и управляет полномочиями для каждой программы, которую запускает пользователь. Каждый объект в Windows NT имеет свой атрибут безопасности, определяемый дескриптором безопасности (security descriptor). Например, файл имеет дескриптор безопасности, который задает полномочия доступа для всех пользователей. Безопасность в .NET Из всех систем и платформ для разработки программного обеспечения, в .NET механизмы безопасности наиболее развиты. .NET предоставляет гибкую, конфигурируемую систему безопасности. Имеется три основных вида организации и проверок безопасности. Code Access Security (безопасность доступа к коду) – конфигурирование и проверки безопасности для исполняемого кода (сборки). Проверки безопасности осуществляются при исполнении программы на стеке текущего потока. Полномочия безопасности (например, разрешение на открытие файла) проверяются не только для конкретного вызванного метода, но и для всех методов всех сборок, вызванных на стеке текущего потока. Если хотя бы для одного из них полномочия нарушены, программа прекращается генерацией исключения SecurityException. Такая схема позволяет исключить атаки типа elevation of privilege. Evidence-Based Security (безопасность, основанная на свидетельствах) – схема безопасности для проверки доверия к вызываемой двоичной сборке. Термин evidence (свидетельство) в данном случае означает информацию о сборке, которую анализирует система поддержки выполнения, - например, наличие цифровой подписи, компания-разработчик и др. На основе этого анализа определяется базовый набор полномочий сборки. Role-Based Security (безопасность, основанная на ролях) – схема для гибкого конфигурирования полномочий безопасности пользователей. Каждому пользователю может быть приписана роль (обозначаемая символьной строкой, например, "manager"), с которой может быть связан определенный набор полномочий безопасности. Атрибуты безопасности. В .NET широко используется понятие атрибута – произвольной информации, аннотирующей именованную сущность (например, класс, метод или поле). В частности, имеется встроенная система атрибутов безопасности. Атрибуты безопасности проверяются при загрузке сборки в виртуальную машину времени выполнения. Декларативное и императивное управление безопасностью. Атрибуты безопасности являются декларативным методом управления безопасностью. Другой метод, императивный, заключается в вызове системных методов (например, Demand), проверяющих полномочия безопасности во время выполнения. Более подробно вопросы безопасности и методы разработки безопасного кода описаны в современной, но ставшей уже классической книге [26 (не найдено)], авторы которой – признанные эксперты по безопасности фирмы Microsoft. Ключевые термины Data Encryption Standard (DES) – технология криптования, основанная на подстановке символов и изменении их порядка на основе ключа, предоставляемого авторизованным пользователям через защищенный механизм. DREAD (Damage, Reproducibility, Exploitability, Affected users, Discoverability) – формула корпорации Microsoft для определения последствий атак. Elevation of privilege – попытка расширить полномочия (например, до полномочий системного администратора) c целью злонамеренных действий. 299 Pharming – перенаправление пользователя на злонамеренный Web-сайт (обычно с целью phishing). Phishing – попытка украсть конфиденциальную информацию пользователя путем ее обманного получения от самого пользователя (например, с помощью тревожного электронного письма). SDLC (Security Development Life Cycle) – схема жизненного цикла разработки безопасных программ, предложенная и применяемая фирмой Microsoft. SD3C (Secure in Design, by Default, in Deployment, and Communication) – формула требований к безопасности программного продукта фирмы Microsoft. Spoofing – "подделка" под определенного пользователя, злонамеренное применение его логина, пароля и полномочий. SSL (Secure Socket Layer) - семейство криптографических протоколов, предназначенное для обмена криптованными сообщениями через сокет. STRIDE (Spoofing, Tampering with data, Repudiation, Denial of service, Elevation of privilege) – формула компании Microsoft для определения видов атак. Tampering with data – атака путем искажения или порчи данных. Tripwire - системные программы (для UNIX), проверяющие, не изменялись ли некоторые файлы и директории, например, файлы, содержащие пароли. Trustworthy Computing (TWC) Initiative – инициатива корпорации Microsorft (2002), направленная на улучшение безопасности разрабатываемого кода. Аутентификация (authentication) – идентификация пользователей при входе в систему. Безопасность (security) –защита от внешних атак. Брандмауэр (firewall) – системное программное обеспечение для защиты локальной сети от внешних атак, как бы образующее стену между "доверенными" и "не доверенными" компьютерами. Вирус – фрагмент кода, встраивающийся в обычные программы с целью нарушения работоспособности этих программ и всей компьютерной системы. Вход в ловушку (Trap Door) – атака путем использования логина или пароля, который позволяет избежать проверок, связанных с безопасностью. Журнал аудита (audit log) – системный журнал подсистемы безопасности, в который записывается время, пользователь и тип каждой попытки доступа к системным объектам и структурам. Закрытый ключ (private key) – ключ, известный только пользователю и применяемый им для декриптования данных. Ключ криптования (encryption key) – секретный параметр алгоритма криптования, от которого зависит результат его работы. Криптование на основе открытого ключа – метод криптографии, основанный на использовании пары ключей: на принципе, при котором пользователю известны два ключа: открытый ключ для декриптования данных и закрытый ключ для криптования данных. Криптография – преобразование понятного текста в зашифрованный текст с целью защиты информации. Логин (login, loginname) – зарегистрированное имя пользователя для входа в систему. Отказ в обслуживании (Denial of Service – DoS) – атака на сервер путем создания его искусственной перегрузки с целью препятствовать его нормальной работе. Открытый ключ (public key) – ключ, известный всем пользователям, и используемый для криптования данных. Пароль (password) – секретное кодовое слово, ассоциируемое и вводимое в секретном режиме вместе с логином. 300 Переполнение буфера (Buffer Overrun) – атака путем использования ошибки в программе (переполнения буфера в памяти) для обращения к памяти другого пользователя или процесса с целью нарушения ее целостности. Троянская программа (Trojan Horse) – атакующая программа, которая "подделывается" под некоторую полезную программу, но при своем запуске злонамеренно использует свое окружение, например, получает и использует конфиденциальную информацию. Червь (Worm) – злонамеренная программа, использующая механизмы самовоспроизведения (размножения) и распространяющаяся через сеть. Краткие итоги Безопасность – защита от внешних атак. В настоящее время она особенно важна в связи с ростом киберпреступности. Любая программная система должна иметь подсистему безопасности, защищающую от несанкционированного доступа, злонамеренной модификации, разрушения, случайного ввода неверной информации. Аутентификация (идентификация) пользователей чаще всего реализуется через логины и пароли. Пароли должны сохраняться в секрете, периодически меняться, не быть легко угадываемыми. Различаются следующие виды атак: троянские программы; входы в ловушку (обход подсистемы безопасности); использование переполнения стека или буфера; черви – самовоспроизводящиеся программы, распространяемые через сеть; вирусы – фрагменты кода, присоединяющиеся к обычным программам с вредоносными целями; отказ в обслуживании – создание искусственной перегрузки сервера с целью добиться его отказа. Современные типы атак: phishing – выуживание конфиденциальной информации у пользователя; pharming – перенаправление пользователя на враждебные web-сайты; tampering with data – искажение или порча данных; spoofing – подделка под определенного пользователя с целью злоупотребления его полномочиями; elevation of privilege – попытка расширить полномочия до полномочий администратора системы со злонамеренными целями. Инициатива Trustworthy Computing (TWC) фирмы Microsoft (2002) направлена на повышение безопасности кода и усиление внимания к вопросам безопасности. Основные принципы TWC: безопасность, надежность, сохранение конфиденциальности информации, корректность и оперативность бизнеса. Фирма Microsoft финансировала обучение основам TWC, разработана и внедрила новую схему SDLC жизненного цикла разработки безопасных программ. Суть SDLC заключается в том, что безопасности уделяется постоянное внимание на всех этапах жизненного цикла, выполняется анализ рисков, связанных с безопасностью, статические проверки и тестирование кода на безопасность, в разработке участвуют внешние эксперты по безопасности. Формулы безопасности, предложенные фирмой Microsoft: SD3C (secure in design, by default, in deployment + communication) – принципы разработки безопасного кода; STRIDE (spoofing, tampering, repudiation, information disclosure, denial of service, elevation of privilege) – классификация атак; DREAD (damage, reproducibility, exploitability, affected users, discoverability) – схема оценки ущерба от атак. Рекомендуемые меры борьбы с атаками: проверка на подозрительные примеры активности; использование журналов аудита; периодическое сканирование системы на предмет дыр в безопасности; проверки на короткие пароли, на изменение системных файлов и директорий и т.д. Брандмауэр – системное программное обеспечение, играющее роль стены между доверенными компьютерами локальной сети и всеми остальными. Методы обнаружения попыток взлома компьютерных систем: аудит и ведение журнала; tripwire (системных программ автоматической проверки состояния системных файлов и директорий); слежение за последовательностью системных вызовов. Криптография – преобразование понятного текста в зашифрованный с целью защиты информации. Схема криптования должна зависеть не от секретного алгоритма, а от его сек- 301 ретного параметра (ключа криптования). Наиболее часто используемые методы: асимметричное криптование на основе использования открытого и скрытого ключей; DES. Пример криптования – SSL, используемый в Web-технологиях для ввода конфиденциальной информации через Web-сайты. Различаются четыре уровня безопасности компьютеров в США – D, C, B, A, от минимальной безопасности до использования формальных методов для обеспечения безопасности. Безопасность в Windows NT основана на идентификаторах безопасности каждого пользователя и на дескрипторах безопасности обрабатываемых объектов. Безопасность в .NET наиболее развита. Она включает безопасность доступа к коду, безопасность на основе свидетельств о двоичной сборке, безопасность на основе ролей, управлении безопасностью на основе атрибутов и вызовов системных методов. Набор для практики Вопросы 1. Что такое безопасность? 2. От каких действий должна защищать подсистема безопасности? 3. Что такое аутентификация и каким методом она выполняется? 4. Что такое троянская программа? 5. Что такое вход в ловушку (trap door)? 6. Как организована атака типа переполнения буфера? 7. Что такое сетевой червь? 8. Что такое компьютерный вирус? 9. В чем суть атаки типа отказ в обслуживании? 10. Что такое phishing? 11. Что такое pharming? 12. Что такое tampering with data? 13. Что такое spoofing? 14. Что такое elevation of privilege? 15. В чем суть и каковы принципы Trustworthy Computing Initiative фирмы Microsoft? 16. Каковы особенности схемы жизненного цикла SDLC? 17. Что такое SD3C? 18. Что такое STRIDE? 19. Что такое DREAD? 20. Каковы рекомендуемые методы борьбы с атаками? 21. Что такое журнал аудита? 22. Что такое брандмауэр? 23. Каковы рекомендуемые методы обнаружения попыток взлома системы? 24. Что такое криптография? 25. В чем суть схемы криптования на основе открытого с скрытого ключей? 26. В чем суть метода криптования DES? 27. Что такое SSL и где используется эта технология криптования? 28. Каковы уровни безопасности компьютеров в США? 29. Как организована безопасность в Windows NT? 30. Как организована безопасность в .NET? Упражнения 1. 2. 3. 4. 5. 6. Реализуйте схему аутентификации пользователей с помощью логинов и паролей. Предложите метод защиты от атаки типа переполнение буфера. Реализуйте программу проверки неизменности системных файлов и директорий. Реализуйте программу проверки неизменности системных путей (path). Реализуйте метод криптования на основе открытого и скрытого ключей. Реализуйте алгоритм криптования DES. Темы для курсовых работ, рефератов, эссе 1. Методы организации безопасности в операционных системах (реферат). 2. Современные методы криптографии (реферат). 3. Trustworthy Computing Initiative (реферат). 302 4. Реализация схемы аутентификации пользователей с помощью логинов и паролей (курсовая работа). 5. Разработка и реализация метода защиты от атаки типа переполнение буфера (курсовая работа). 6. Реализация программы проверки неизменности системных файлов и директорий (курсовая работа). 7. Реализация программы проверки неизменности системных путей (path) (курсовая работа). 8. Реализация метода криптования на основе открытого и скрытого ключей (курсовая работа). 303 304 25. Лекция: Обзор архитектуры и возможностей системы Linux: архитектура, ядро, распространение и лицензирование, принципы проектирования, управление процессами В лекции рассмотрены следующие вопросы: история создания Linux; Linux и GNUпроекты; ядро Linux; развитие Linux; архитектура Linux; диалекты Linux; Linux как серверная ОС; принципы проектирования Linux; компоненты Linux; динамически подгружаемые модули ядра; управление процессами. Содержание Введение История Linux Ядро Linux Современное состояние Linux, дистрибутивы и лицензирование Принципы проектирования и компоненты системы Linux Загружаемые модули ядра Linux Управление процессами в Linux Планирование задач ядра и синхронизация в ядре Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Данная и следующая лекции посвящены обзору возможностей одного из самых популярных семейств операционных систем – Linux. В настоящей лекции и "Обзор архитектуры и возможностей системы Linux: управление памятью, ресурсами, файловые системы, драйверы устройств, сети, безопасность" рассмотрены следующие вопросы: История Linux Принципы проектирования Linux Модули ядра Linux Управление процессами в Linux Планирование в Linux Управление памятью в Linux Файловые системы в Linux Ввод и вывод в Linux Взаимодействие процессов в Linux Структура сети в Linux Безопасность в Linux. История Linux Linux – современная, свободно распространяемая ОС, основанная на стандартах и традициях UNIX. История Linux берет свое начало с 1983 г., когда Ричард Столмен (Richard Stallman) начал проект GNU, а в 1985 г. основал некоммерческую организацию Free Software Foundation. Основная цель – разработка UNIX-подобной системы, которая состояла бы только из свободно распространяемого программного обеспечения. Впервые Linux разработана как небольшое, но самодостаточное ядро ОС в 1991 Линусом Торвальдсом (Linus Torvalds), с основной целью добиться совместимости с UNIX. История Linux – это история многолетнего (удаленного) взаимодействия пользователей всего мира, которое осуществляется почти исключительно через Интернет. Система была спроектирована с целью эффективного и надежного использования на распространенных персональных компьютерах, но она также используется и на многих других аппаратных платформах. 305 Основная часть ОС Linux полностью оригинальна, но на ней может также исполняться значительная часть свободно распространяемого программного обеспечения для UNIX, и в результате в распоряжении пользователей имеется оригинальная, свободно распространяемая, совместимая с UNIX система, в которой нет корпоративного конфиденциального кода. Ядро Linux Версия 0.01 (май 1991) не содержала сетевых средств, выполнялась только на 80386совместимых Intel – процессорах, имела очень ограниченный набор драйверов устройств и поддерживала только файловую систему MINIX (MINIX – операционная система типа UNIX, разработанная Andrew Tannenbaum). Версия Linux 1.0 (март 1994) включала следующие новые возможности: Поддержку стандартных для UNIX сетевых протоколов TCP/IP BSD-совместимый интерфейс сокетов для сетевого программирования Поддержку драйверов устройств для использования IP в сетях типа Ethernet Расширенную файловую систему Поддержку большого диапазона SCSI – контроллеров для высокопроизводительного доступа к дискам. Версия Linux 1.2 (март 1995) была последней версией ядра Linux только для персональных компьютеров. Версия Linux 2.0 выпущена в июне 1996, со следующими новыми возможностями: Поддержкой нескольких аппаратных архитектур, включая полный 64-разрядный перенос на рабочие станции Digital Alpha (первые 64-разрядные рабочие станции в мире) Поддержкой многопроцессорной архитектуры Улучшенным кодом для управления памятью Улучшенной производительностью TCP/IP Поддержкой внутренних потоков (threads) ядра ОС, используемых для обработки зависимостей между загрузочными модулями и для автоматической загрузки модулей по требованию. Стандартизованным конфигурационным интерфейсом. Версия Linux 2.0 была доступна на процессорах Motorola 68000, Sun SPARC, PC (x86) и PowerMac. Современное состояние Linux, дистрибутивы и лицензирование ОС Linux использует многие инструменты, разработанные как части Berkeley BSD UNIX, системы X Window разработки MIT, а также проекта GNU некоммерческой ассоциации Free Software Foundation (FSF). Минимальный набор системных библиотек был разработан как часть проекта GNU, с улучшениями, разработанными сообществом Linux. Средства сетевого администрирования Linux были разработаны на основе версии 4.3 Berkeley Software Distribution (BSD) UNIX. Недавние производные от BSD (например, UNIX FreeBSD), в свою очередь, заимствовали код из Linux. Система Linux поддерживается слабо связанной сетью разработчиков, взаимодействующих через Internet. Небольшое число публично доступных ftp-серверов используется как хранилища информации о де-факто стандартах. Стандартный предварительно откомпилированный набор пакетов, или дистрибутивов, включает базовую систему Linux, утилиты для инсталляции системы и управления системой, а также готовые к инсталляции пакеты инструментов для UNIX. Ранние дистрибутивы включали диалекты SLS и Slackware. Red Hat и Debian – популярные дистрибутивы, соответственно, основанные на коммерческих и некоммерческих исходных кодах. Единый формат файла пакета - RPM обеспечивает совместимость между различными дистрибутивами Linux. 306 Что касается инсталляции Linux, то, по личному опыту автора, при частичных инсталляциях Linux в различных конфигурациях (например, workstation) и последующих "доинсталляциях" до полной версии возможны проблемы: инсталлятор "путает" фактический состав инсталлируемых пакетов (Linux Red Hat, 2003), по крайней мере, дополнить Linux до полной версии путем итеративных инсталляций не удается, и рекомендуется сразу же инсталлировать полную версию, т.е. явным образом изменить умолчания инсталлятора. Ядро Linux распространяется на условиях GNU General Public License (GPL), которые установлены организацией Free Software Foundation. Программист, использующий Linux, либо создающий свои собственные системы на базе Linux, не имеет права превращать свой продукт в коммерческий (ведомственный); программное обеспечение, распространяемое на основе GPL, не может распространяться только в виде двоичного кода (т.е. в поставку Linux должен быть включен исходный код). Это было одной из принципиальных целей проекта. Linux в основном используется как серверная операционная система, ввиду ее высокой надежности. Что касается использования Linux как клиентской ОС, то доля ее использования очень мала, как показывает приведенная на рис. 25.1 диаграмма использования различных ОС как Web-клиентов. Рис. 25.1. Использование различных операционных систем как Web-клиентов, март 2010. Принципы проектирования и компоненты системы Linux Linux – многопользовательская совместимых инструментов. и многозадачная ОС с полным набором UNIX- Ее файловая система соответствует традиционной семантике UNIX. Она полностью реализует стандартную сетевую модель UNIX. Основные цели проектирования Linux – скорость, эффективность и стандартизация. ОС Linux разработана как система, совместимая со стандартами POSIX по крайней мере два дистрибутива Linux были официально сертифицированы как совместимые с POSIX. Программный интерфейс Linux соответствует семантике диалекта SVR4 UNIX (разработанного фирмой AT&T), но не диалекта BSD UNIX (разработанного университетом Беркли). 307 Компоненты системы Linux изображены на рис. 25.2. Рис. 25.2. Компоненты системы Linux. Как большинство реализаций UNIX, Linux состоит из трех основных групп кода – ядро, системные библиотеки и системные утилиты; наиболее важно различие между ядром и всеми остальными компонентами. Ядро отвечает за поддержку основных концепций (абстракций) ОС. Код ядра исполняется в привилегированном режиме, и ему полностью доступны все аппаратные ресурсы компьютера. Весь код и структуры даны ядра хранятся и исполняются в едином адресном пространстве. Системные библиотеки определяют стандартный набор функций, с помощью которого приложения взаимодействуют с ядром, и которые реализуют основную часть функциональности ОС, не требующую исполнения в привилегированном режиме. Системные утилиты выполняют индивидуальные специфические задачи. Загружаемые модули ядра Linux Одним из важнейших новшеств в ядре Linux являются загружаемые модули ядра (loadable kernel modules, LKM), появившиеся в версии 1.2. Они обеспечивают ядру гибкость и функциональность. Части (секции) кода ядра могут компилироваться, загружаться и выгружаться, независимо от остальной части ядра. Модуль ядра может реализовывать драйвер устройства, файловую систему или сетевой протокол. Модульный интерфейс позволяет сторонним разработчикам реализовывать и распространять на своих собственных условиях драйверы или файловые системы, которые не могут распространяться на основе GPL. Модули ядра позволяют инсталлировать Linux в виде стандартного, минимального ядра, без использования каких-либо встроенных устройств. Три компоненты модуля Linux поддерживают: Управление модулем Регистрацию драйвера Разрешение конфликтов. Компонента управление модулем управляет загрузкой модуля в память и его взаимодействием с остальной частью ядра. Управление модулем разбито на две части: Управление частями кода модуля в памяти ядра Управление символами, на которые модуль разрешает ссылаться. 308 Компонента module requestor управляет загрузкой запрошенных, но еще не загруженных модулей. Она также регулярно опрашивает ядро, чтобы убедиться, что модуль до сих пор используется, и выгружает модуль, если он долгое время активно не использовался. Схема исходного кода загружаемого модуля ядра Linux изображена на рис. 25.3. Рис. 25.3. Схема исходного кода загружаемого модуля ядра Linux. Компонента регистрация драйверов предоставляет модулю возможность сообщить ядру, что новый драйвер доступен. Ядро поддерживает динамическую таблицу всех известных драйверов и обеспечивает набор подпрограмм для добавления драйверов в эти таблицы или удаления из них в любое время. Таблицы регистрации включают следующие элементы: Драйверы устройств Файловые системы Сетевые протоколы Двоичные форматы. Модуль разрешения конфликтов предоставляет механизм, который позволяет различным драйверам устройств резервировать аппаратные ресурсы и защищать эти ресурсы от случайного использования другими драйверами. Цели модуля разрешения конфликтов: Предотвратить конфликты, связанные с использованием аппаратуры Предотвратить автопроверки (autoprobes) от пересечения с уже существующими драйверами устройств Разрешить конфликты различных драйверов, пытающихся иметь доступ к одной и той же аппаратуре. Управление процессами в Linux В классической системе UNIX средства управления процессами разделяют создание процесса и запуск новой программы на две различные операции: Системный вызов fork создает новый процесс Новая программа запускается с помощью системного вызова exec. 309 В UNIX процесс содержит всю информацию, которую ОС должна поддерживать для реализации концепции отдельного исполнения отдельной программы. В системе Linux свойства процесса делятся на три группы: идентификация процесса, его окружение и контекст. Идентификатор процесса (PID) - уникальный идентификатор процесса (число); используется для указания процессов в операционной системе, когда приложение выполняет системный вызов signal, modify или wait для другого процесса. Полномочия (Credentials). Каждый процесс должен иметь связанный с ним идентификатор пользователя и один или более идентификаторов групп, определяющих права процесса для доступа к системным ресурсам и файлам. Идентификация личности (Personality). Хотя это и нетрадиционно для систем типа UNIX, в Linux каждый процесс имеет уникальный идентификатор личности, с помощью которого возможна некоторая модификация семантики ряда системных вызовов. Он используется главным образом в библиотеках эмуляции, для запроса о совместимости системных вызовов с тем или иным специфическим диалектом UNIX. Окружение процесса наследуется от процесса-родителя. Состоит из двух векторов, завершающихся нулями: Вектор аргументов содержит список аргументов командной строки, использованный при вызове исполняемой программы; традиционно начинается с имени самой программы Вектор окружения – список пар "NAME=VALUE", которые связывают переменные окружения с заданными именами и их произвольные текстовые значения. Передача переменных окружения между процессами и наследование этих переменных дочерними процессами – гибкие средства передачи информации компонентам системного программного обеспечения, работающим в непривилегированном режиме. Механизм переменных окружения обеспечивает средства настройки ОС, которые могут устанавливаться для каждого процесса отдельно, а не путем конфигурирования системы в целом. Контекст процесса – это постоянно изменяющееся состояние исполняемой программы в любой момент времени. Контекст планирования – наиболее важная часть контекста процесса; это информация, которую использует планировщик для приостановки и запуска процесса. Ядро поддерживает хранение статистической информации о ресурсах, потребляемых в каждый момент каждым процессом и общем объеме ресурсов, использованным каждым процессом с момента его создания по настоящий момент. Таблица файлов – это вектор указателей на системные файловые структуры. При выполнении системных вызовов для ввода-вывода процессы ссылаются на эти структуры с помощью индексов в таблице файлов. В то время как таблица файлов содержит список открытых файлов, контекст файловой системы применяется для запросов об открытии новых файлов. Здесь хранятся ссылки на текущую корневую (root) директорию и рабочую (default) директорию для поиска файлов. Таблица обработчиков сигналов определяет подпрограммы в адресном пространстве процесса, которые должны быть вызваны при возникновении соответствующих сигналов. Контекст виртуальной памяти процесса определяет все содержимое его персонального адресного пространства. Процессы и потоки. Linux использует одно и то же внутреннее представление для процессов и потоков. Поток в Linux – это новый процесс, который использует общее адресное пространство с процессом-родителем. Различие проявляется только в случае, когда новый поток создается системным вызовом clone: классический системный вызов fork создает новый процесс со своим полностью новым контекстом; 310 системный вызов clone создает новый процесс со своим новым идентификатором личности, но такой, которому разрешено совместно использовать структуры данных со своим родителем. Использование системного вызова clone дает процессам возможность явного контроля над тем, какие ресурсы совместно используются потоками. Планирование задач ядра и синхронизация в ядре Напомним, счто планирование – это распределение операционной системой процессорного времени между различными задачами. В то время как в большинстве ОС под планированием понимается запуск и приостановка процессов, в Linux планирование также включает выполнение различных задач ядра. Выполнение задач ядра включает как задания, запрошенные данным процессом, так и задания, исполняемые в процессе работы драйверов. Запрос на исполнение в режиме ядра может возникнуть в двух случаях: Исполняемая программа может запросить сервис ОС, как явно с помощью системного вызова, так и неявно, например, при отказе страницы Драйвер устройства может сгенерировать аппаратное прерывание, в результате которого процессор начнет исполнять в режиме ядра обработчик данного прерывания. Синхронизация в ядре требует, чтобы критические секции ядра исполнялись без их прерывания другими критическими секциями. Linux использует два метода для защиты критических секций: Обычный код ядра - не прерываемый. Если получено прерывание по времени, в момент, когда процесс исполняет подпрограмму системного сервиса ядра, флаг need_resched служит для указания того, чтобы запустился планировщик, когда завершится системный вызов и управление должно быть передано непривилегированному коду. Второй метод применяется к критическим секциям ядра, которые исполняются в сервисах обработки прерываний. Используя аппаратуру процессора, управляющую прерываниями, для отключения прерываний во время исполнения критической секции, ядро гарантирует, что оно может исполняться без риска одновременного обращения к общим структурам данных. Во избежание потери производительности, ядро Linux использует архитектуру синхронизации, которая позволяет большим критическим секциям исполняться без необходимости отключения прерываний на все время исполнения критической секции. Службы обработки прерываний делятся на верхнюю половину (top half) и нижнюю половину (bottom half): Верхняя половина – это обычная процедура обработки прерываний, исполняемая с отключением рекурсивных прерываний Нижняя половина исполняется при включенном режиме прерываний, с использованием мини-планировщика, который обеспечивает, чтобы нижние половины не прерывали друг друга. Эта архитектура дополняется механизмом для выбора нижних половин при исполнении обычного кода ядра. На рис. 25.4 изображены уровни защиты прерываний. Код каждого уровня может быть прерван кодом более высокого уровня, но никогда не будет прерван кодом того же или более низкого уровня. Пользовательский процесс может быть всегда прерван другим процессом, если происходит прерывание для планирования в режиме разделения времени. Linux использует два алгоритма планирования процессов: Алгоритм разделения времени для равноправного планирования с прерываниями между различными процессами Алгоритм реального времени для случая, когда абсолютные приоритеты более важны, чем равноправность. 311 Рис. 25.4. Уровни защиты прерываний. Класс планирования процесса определяет, какой именно алгоритм применить. Для процессов с разделением времени Linux использует алгоритм на основе доверия (credits) с приоритетами (priority). Правило credits := credits / 2 + priority учитывает как историю процесса, так и его приоритет. По такой системе автоматически определяются приоритеты интерактивных процессов или исполняющих ввод-вывод. Linux реализует классы планирования: FIFO и round-robin; в обоих случаях каждый процесс имеет приоритет, а не только определенный класс планирования. Планировщик запускает процесс с наивысшим приоритетом; для процессов с одним и тем же приоритетом, он исполняет процесс, который дольше всего ждал. FIFO – процессы исполняются до их завершения или блокировки. round-robin – процесс будет прерван через некоторое время и помещен в конец очереди планирования, так что RR-процессы одинакового приоритета автоматически разделяют время между собой. Версия Linux 2.0 была первым ядром Linux, поддерживающим SMP-оборудование; различные процессы или потоки могут исполняться параллельно на нескольких процессорах. Для соблюдения требований ядра об исполнении без прерываний, SMP накладывает следующее ограничение: не более чем один процесс в каждый момент может исполнять код в режиме ядра. Ключевые термины GNU General Public License (GPL) – лицензия, согласно которой используется и распространяется Linux: программист, использующий Linux, либо создающий свои собственные системы на базе Linux, не имеет права превращать свой продукт в коммерческий; программное обеспечение, распространяемое на основе GPL, не может распространяться только в виде двоичного кода (т.е. в поставку Linux должен быть включен исходный код). Загружаемый модуль ядра (loadable kernel module, LKM) – механизм Linux, обеспечивающий возможность компиляции, загрузки и выгрузки отдельных модулей кода ядра, независимо от остальной части ядра. Идентификатор процесса (PID) - уникальный идентификатор процесса (число), используемое для указания процессов в операционной системе. Контекст процесса – состояние исполняемой программы в любой момент времени; состоит из контекста планирования, контекста системы файлов, таблицы обработчиков сигналов и контекста виртуальной памяти. Окружение процесса – системная структура, состоящая из двух векторов, завершающихся нулями: вектор аргументов командной строки процесса и вектор (переменных) окружения процесса. 312 Краткие итоги Система Linux – популярная ОС, созданная в начале 1990-х гг. с целью разработки UNIXсовместимой ОС с открытым исходным кодом. Создатель Linux – Линус Торвальдс. Основная часть Linux полностью оригинальна и не содержит ведомственного конфиденциального кода. Linux использует разработки BSD UNIX, AT&T UNIX, библиотеку X Windows. Разработка Linux поддерживается сетью разработчиков, связанных через Интернет. Дистрибутивы Linux имеют стандартный формат (RPM), что обеспечивает совместимость между многочисленными диалектами Linux. Ядро Linux распространяется на условиях GNU General Public License, суть которых в том, что разработки на основе кода Linux нельзя использовать для коммерческих целей, и распространение ПО, разработанного на основе Linux, должно включать исходные коды. Linux в основном используется как серверная ОС. Доля ее использования как клиентской ОС очень мала. Linux – свободно распространяемая полнофункциональная ОС с полным набором UNIXсовместимых инструментов. Обеспечивается совместимость с POSIX. Linux API соответствует UNIX SVR4, но не UNIX BSD. Linux состоит из ядра, системных библиотек и системных утилит. Код ядра исполняется в привилегированном режиме. Системные библиотеки и утилиты исполняются в пользовательском режиме. Важное новшество в Linux – механизм динамически загружаемых модулей ядра, который дает возможность отдельно компилировать, загружать, запускать и выгружать модули ядра. Компоненты модуля ядра – управление загрузкой модуля, регистрация драйверов и разрешение конфликтов. Для управления процессами в Linux для каждого процесса создаются и используются его идентификация, окружение и контекст. Для поддержки многопоточности в Linux используется системный вызов clone, который создает новый процесс в адресном пространстве процесса-родителя. В отличие от многих ОС, планирование в Linux включает также и планирование задач ядра. Синхронизация в ядре требует, чтобы критическая секция одной части ядра не прерывалась другими критическими секциями. При обработке прерываний все прерывания разделены на верхнюю половину (обычная обработка прерываний, с отключением рекурсивных прерываний) и нижнюю половину, исполняемую при включенном режиме прерываний с использованием мини-планировщика. При планировании процессов в Linux учитываются кредиты и приоритеты. Используются классы планирования FIFO и round-robin. Linux поддерживает симметричное мультипроцессирование (SMP). Набор для практики Вопросы 1. 2. 3. 4. 5. 6. 7. 8. 9. Что такое Linux? Каковы основные цели и принципы разработки Linux? Что такое дистрибутивы Linux и в каком формате они распространяются? По какой лицензии распространяется Linux и в чем суть этой лицензии? Для каких применений используется Linux – как клиентская или серверная ОС? С каким стандартом API для UNIX-подобных систем совместима Linux? Какому диалекту UNIX соответствуют системные библиотеки Linux? Из каких основных групп кода состоит реализация Linux? В чем принципиальная новизна в управлении модулями ядра Linux, по сравнению с большинством остальных ОС? 10. Каково назначение компоненты управление модулем? 11. Каково назначение компоненты регистрация драйверов? 12. Какие системные структуры создаются для процесса в Linux? 13. Что такое идентификатор процесса? 313 14. Что такое окружение процесса? 15. Что такое контекст процесса? 16. Каким системным вызовом создается поток в Linux? 17. Какова принципиальная особенность планирования процессов в Linux, с точки зрения обработки модулей ядра? 18. Каковы требования к исполнению критических секций при синхронизации в ядре? 19. Каковы особенности верхней и нижней половине прерываний при обработке прерываний в Linux? 20. Какие принципы используются при планировании процессов в Linux? 21. Какие стратегии планирования процессов используются в Linux? 22. Какой распространенный тип многопроцессорных архитектур поддерживает Linux? Упражнения 1. Инсталлируйте на своем домашнем компьютере систему Linux. Для инсталляции создайте на диске отдельный раздел (partition) утилитой Partition Magic. Инсталлируйте систему в полном объеме. 2. Перечислите и проанализируйте состав пакетов (RPM) дистрибутива Linux. 3. Широко известно, что Google Android – операционная система для мобильных устройств, разработанная на основе ядра Linux. Насколько, по-Вашему, соответствуют действия разработчиков Google Android лицензии GPL, на основе которой распространяется Linux? 4. Разработайте простой динамически загружаемый модуль ядра Linux (выдающий на консоль сообщение о своем запуске), в соответствии с принципами, описанными в лекции, и поэкспериментируйте с добавлением нового модуля в систему. 5. Проанализируйте и изучите исходные коды Linux и на их основе напишите обзор используемых методов управления процессами, планирования и диспетчеризации в Linux. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. Исторический обзор системы Linux (реферат). Архитектура и принципы проектирования Linux (реферат). Методы управления процессами в Linux (реферат). Методы планирования и диспетчеризации в Linux (реферат). Разработка простого динамически загружаемого модуля ядра Linux (выдающего на консоль сообщение о своем запуске), в соответствии с принципами, описанными в лекции, и эксперименты с добавлением нового модуля в систему (курсовая работа). 314 26. Лекция: Обзор архитектуры и возможностей системы Linux: управление памятью, ресурсами, файловые системы, драйверы устройств, сети, безопасность В лекции рассмотрены: управление памятью и ресурсами в Linux; файловые системы Linux; драйверы устройств Linux, поддержка сетей в Linux, безопасность в Linux. Содержание Введение Управление физической памятью в Linux Виртуальная память в Linux Исполнение и загрузка пользовательских программ в Linux Системы файлов Linux Ввод и вывод в Linux Взаимодействие процессов в Linux Структура сети в Linux Безопасность в Linux Развитие и использование Linux Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение В данной лекции, как и в "Обзор архитектуры и возможностей системы Linux: архитектура, ядро, распространение и лицензирование, принципы проектирования, управление процессами" рассматриваются архитектура и возможности системы Linux. В лекции описаны управление памятью, файловые системы, драйверы устройств, поддержка сетей, безопасность в Linux, перспективы Linux и разработки на основе Linux. Управление физической памятью в Linux Система распределения физической памяти в Linux занимается размещением и освобождением страниц, групп страниц и небольших блоков памяти. Она имеет дополнительные механизмы для виртуальной памяти, отображаемой в адресное пространство исполняемых процессов. Распределитель страниц размещает и освобождает физические страницы; он может также по запросу размещать группы смежных страниц. Распределитель страниц Linux использует алгоритм buddy-heap (партнерской кучи) для слежения за доступными физическими страницами, принципы которого в следующем: Каждая область памяти, подлежащая распределению, образует пару с ее смежным "партнером". Когда обе области-партнера освобождаются, они сливаются и образуют смежную область вдвое большего размера [15]. Если не существует малой области памяти, чтобы удовлетворить небольшой запрос на память, то область памяти большего размера расщепляется на две области-партнера для удовлетворения данного запроса. Распределение памяти для ядра Linux возможно как статическое (драйвер резервирует статическую область памяти во время загрузки системы) или динамическое (с помощью распределителя страниц). Расщепление памяти в куче изображено на рис. 26.1. 315 Рис. 26.1. Расщепление памяти в куче в системе Linux. Виртуальная память в Linux Система виртуальной памяти в Linux поддерживает адресное пространство, видимое каждому процессу: она создает страницы виртуальной памяти по требованию и управляет загрузкой этих страниц с диска или откачкой их обратно на диск, если требуется. Менеджер виртуальной памяти поддерживает две точки зрения на адресное пространство каждого процесса: Логическую – поддержка команд управления адресным пространством. Адресное пространство рассматривается как совокупность непересекающихся смежных областей. Физическую – с помощью таблицы страниц для каждого процесса. Для управления виртуальной памятью используются: Файл откачки (backing store), описывающий, откуда берутся страницы для заданного региона; регионы обычно поддерживаются либо файлом, либо не поддерживаются вообще (память, обнуляемая по требованию) Реакция региона на запись (совместное использование страниц или копирование при записи - COW). Ядро создает новое виртуальное адресное пространство: Когда процесс запускает новую программу системным вызовом exec; При создании нового процесса системным вызовом fork. При исполнении новой программы процессу предоставляется новое, пустое адресное пространство; процедуры загрузки программ наполняют это адресное пространство регионами виртуальной памяти. Создание нового процесса с помощью fork включает создание полной копии адресного пространства существующего процесса. Ядро копирует дескрипторы доступа к виртуальной памяти родительского процесса, затем создает новый набор таблиц страниц для дочернего процесса. Таблицы страниц процесса-родителя копируются непосредственно в таблицы страниц дочернего, причем счетчик ссылок на каждую страницу увеличивается. После исполнения fork родительский и дочерний процесс используют одни и те же физические страницы в своих виртуальных адресных пространствах. Система управления страницами откачивает страницы физической памяти на диск, если они требуются для какой-либо другой цели. Система управления страницами делится на две части: Алгоритм откачки, который определяет, какие страницы и когда откачать на диск; Механизм подкачки фактически выполняет передачу и подкачивает данные обратно в физическую память, если требуется. Ядро Linux резервирует постоянный, зависящий от архитектуры регион виртуального адресного пространства каждого процесса для его собственного внутреннего использования. 316 Эта область виртуальной памяти ядра содержит два региона: Статическую область, содержащую ссылки из таблицы страниц на каждую доступную физическую страницу памяти в системе, так что используется простая трансляция физического адреса в виртуальный при исполнении кода ядра. Остаток зарезервированной части не используется ни для какой другой цели; его элементы таблицы страниц могут быть модифицированы и указывать на любые страницы в памяти. Исполнение и загрузка пользовательских программ в Linux Linux поддерживает таблицу функций для загрузки программ. Каждой функции предоставляется возможность попытаться загрузить заданный файл, когда выполняется системный вызов exec. Регистрация многократно загружаемых программ позволяет Linux поддерживать как ELF, так и a.out – форматы кода. Первоначально страницы двоичного файла загружаются в виртуальную память; только если программа пытается обратиться к данной странице и возникает отказ страницы, в результате данная страница загружается в физическую память. Двоичный файл формата ELF (Executable and Linkage Format) состоит из заголовка, за которым следуют несколько выравненных до страницы секций; ELF-загрузчик читает заголовок и отображает секции файла в отдельные регионы виртуальной памяти. Структура секций файла ELF для модуля ядра Linux показана в таблица 1. Таблица 1. Структура секций файла ELF для модуля ядра Linux .text инструкции .fixup изменения времени исполнения .init.text инструкции инициализации модуля exit.text выходные инструкции модуля .rodata.etrl.l строки только для чтения .modinfо текст макросов модуля _versions данные о версии модуля .data инициализированные данные .bss неинициализированные данные other Распределение памяти для ELF-программ в Linux изображено на рис. 26.2. Статическая и динамическая линковка. Программа, библиотечные функции которой встроены непосредственно в двоичный исполняемый код, статически линкуется со своими библиотеками. Основной недостаток статической линковки в том, что любая генерируемая программа должна хранить копии одних и тех же общесистемных библиотечных функций. Динамическая линковка более эффективна в терминах как использования физической, так и дисковой памяти, так как она загружает системные библиотеки в память только один раз. Системы файлов Linux С точки зрения пользователя файловая система Linux представляет собой иерархическое дерево директорий, подчиняющееся семантике UNIX. С внутренней точки зрения, ядро скрывает детали реализации и управляет многими различными файловыми системами через общий уровень абстракции, то есть виртуальную файловую систему (VFS). Linux VFS спроектирована по объектно-ориентированным принципам и использует набор определений, задающий структуру файлов. Системные структуры inode-object и file-object 317 представляют отдельные файлы. Объект file system object представляет файловую систему в целом. Существует уровень абстракции для манипулирования этими объектами. Рис. 26.2. Распределение памяти для ELF-программ. Файловая система Ext2fs – основная файловая системы Linux. Она использует механизм, сходный с UNIX BSD Fast File System (ffs) для поиска блоков данных, принадлежащих некоторому файлу. Основные различия между ext2fs и ffs касаются их политик распределения дисковой памяти. В системе ffs диск делится на файлы, состоящие из блоков по 8Kb, а блоки разбиваются на фрагменты по 1Kb для хранения мал*еньких файлов или частично заполненных блоков в конце файла. Система Ext2fs не использует фрагменты; она распределяет память более мелкими единицами. Размер блока по умолчанию в ext2fs -1Kb, хотя блоки в 2Kb и 4Kb также поддерживаются. Система Ext2fs использует политики распределения, спроектированные с целью размещения логически смежных блоков файла в физически смежных блоках на диске, так чтобы можно было использовать одну операцию ввода-вывода для нескольких смежных блоков. Структурная схема системы файлов Ext2fs показана в таблица 2. Таблица 2. Структурная схема системы файлов Ext2fs в Linux Суперблок (Superblock) Описани группы блоков (Group Descriptors) Битовая карта блоков (Block Bitmap) Битовая карта индексных дескрипторов (Inode Bitmap) Таблица индексных дескрипторов (Inode Table) Данные (Data) 318 Группы блоков в Ext2fs. Все блоки ext2 разделяются на группы блоков. Для каждой группы блоков создается отдельная запись в глобальной дескрипторной таблице, в этой записи хранятся основные параметры: номер блока битовый карты блоков номер блока битовой карты inode номер блока таблицы inode число свободных блоков в группе число inode, содержащих каталоги. Битовая карта блоков — это структура, каждый бит которой показывает, отведён ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Аналогичную функцию выполняет битовая карта индексных дескрипторов, показывая какие именно индексные дескрипторы заняты, а какие нет. Ядро Linux, используя число inode, содержащих каталоги, пытается равномерно распределить inode каталогов по группам, а inode файлов помещает, если это возможно, в группу с родительским каталогом. Все оставшееся место, обозначенное в таблице как данные, отводится для хранения файлов. Адресация файлов в Ext2fs. Система адресации данных — одна из самых существенных составных частей файловой системы. Именно система адресации позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске. Файловая система ext2 использует следующую схему адресации блоков файла. Для хранения адреса файла выделено 15 полей, каждое из которых состоит из 4 байтов. Если размер файла меньше или равен 12 блокам, то номера этих кластеров непосредственно перечисляются в первых двенадцати полях адреса. Если размер файла превышает 12 блоков, то следующее 13-е поле содержит адрес кластера, в котором могут быть расположены номера следующих блоков файла. Таким образом, 13-й элемент адреса используется для косвенной адресации. При максимальном размере блока, равном 4096 байтов, 13-й элемент может содержать до 1024 номеров следующих кластеров данных файла. Если размер файла превышает 12+1024 блоков, то используется 14-е поле, в котором находится номер блока, содержащего 1024 номеров блоков, каждый из которых хранят 1024 номеров блоков данных файла. Здесь применяется уже двойная косвенная адресация. И, наконец, если файл включает более 12+1024+1048576 = 1049612 блоков, то используется последнее 15-е поле для тройной косвенной адресации. Таким образом, описанная выше система адресации, позволяет при максимальном размере блока 4 Кб иметь файлы размера до 2 терабайт или больше. Схема адресации файлов в системе Ext2fs изображена на рис. 26.3. Принципы размещения блоков в системе Ext2fs иллюстрируются на рис. 26.4. Файловая система Linux Proc. Файловая система proc не хранит данные; вместо этого, их содержимое вычисляется по требованию, в соответствии с пользовательскими запросами на ввод-вывод. Система proc реализует структуру директорий и файлы, находящиеся внутри них; затем она определяет уникальный и сохраняемый номер inode для каждой директории и файлов, которые в ней содержатся. Она использует этот номер inode для идентификации, какая операция требуется, когда пользователь пытается обратиться к конкретному inode файла или выполнить поиск в конкретном inode директории. Когда данные читаются из одного из этих файлов, система proc собирает соответствующую информацию, преобразует ее в текстовую форму и помещает в буфер чтения соответствующего процесса. Ввод и вывод в Linux Система файлов Linux, ориентированная на устройства, осуществляет доступ к дисковой памяти с помошью двух кэшей: Данные хранятся в кэше страниц, который объединен с системой виртуальной памяти; Метаданные хранятся в буферном кэше, причем каждый кэш индексируется блоком диска. 319 Рис. 26.3. Адресация файлов в системе Ext2fs. Рис. 26.4. Принципы размещения блоков в системе Ext2fs. Linux разбивает устройства на три класса: Блочные устройства допускают произвольный доступ к полностью независимым блокам данных фиксированного размера. 320 Символьные устройства включают большую часть всех других устройств; они не нуждаются в поддержке функциональности обычных файлов. Сетевые устройства взаимодействуют с сетевой системой ядра. Модульная структура драйверов устройств в Linux изображена на рис. 26.5. Рис. 26.5. Модульная структура драйверов устройств. Блочные устройства обеспечивают основной интерфейс ко всем дисковым устройствам в системе. Блочный буферный кэш служит для двух основных целей: Как буферный пул для активного ввода-вывода Как кэш для завершенного ввода-вывода. Менеджер запросов управляет чтением и записью содержимого буферов с помощью драйвера блочного устройства. Символьные устройства. Драйвер символьного устройства не поддерживает произвольный доступ к фиксированным блокам данных. Драйвер символьного устройства регистрирует набор функций, реализующих разнообразные требуемые операции ввода-вывода. Ядро не выполняет почти никакой предварительной обработки запроса на чтение или запись в файл символьного устройства, но просто передает данный запрос драйверу устройства. Основное исключение из этого правила – это особый набор драйверов символьных устройств, которые реализуют доступ к терминальным устройствам (TTY); для них ядро поддерживает стандартный интерфейс. Взаимодействие процессов в Linux Как и UNIX, Linux информирует процессы о наступлении событий с помощью сигналов. Существует ограниченный набор сигналов, и они не могут нести какую-либо информацию: только факт, что сигнал имеет место, доступен процессу. Ядро Linux не использует сигналы для коммуникации процессов, исполняемых в режиме ядра. Коммуникация внутри ядра осуществляется с помощью структур планировщика – states (состояния) и wait.queue (очередь ожидания). Механизм конвейера (pipe) позволяет дочернему процессу наследовать коммуникационный канал от процесса-родителя. Данные, записываемые с одного конца конвейера, могут быть прочитаны на другом конце. 321 Общая память обеспечивает очень быстрый способ коммуникации; любые данные, записанные одним процессом в регион общей памяти, могут быть немедленно прочитаны любым другим процессом, который отобразил этот регион в свое адресное пространство. Однако с целью синхронизации общая память должна использоваться в сочетании с каким-либо другим коммуникационным механизмом. Объект в общей памяти используется как файл откачки для регионов общей памяти, так же как файл может быть использован для откачки информации из региона, отображаемого в память. Отображения в общую память перенаправляют отказы страниц в регион памяти, занятый разделяемым объектом. Разделяемые объекты помнят свое содержимое, даже если в данный момент никакие процессы не отображают их в свои виртуальные пространства памяти. Структура сети в Linux Работа в сети – ключевая область функциональности в Linux. Сетевая система Linux поддерживает основные Интернет-протоколы для коммуникаций UNIX - UNIX. Она также реализует протоколы, характерные для ОС, отличных от UNIX, в частности, протоколы, используемые в сетях PC, таких как Appletalk и IPX. Сетевая система Linux реализована в виде трех уровней абстракции: Сокетный интерфейс Драйверы протоколов Драйверы сетевых устройств. Наиболее важный набор сетевых протоколов в Linux – это набор протоколов Интернета. Сетевая система Linux обеспечивает маршрутизацию между различными машинами на любом участке сети. На верхнем уровне протокола маршрутизации поддерживаются UDP-, TCP- и ICMP-протоколы. Безопасность в Linux В системе Linux реализованы подключаемые аутентификационные модули (pluggable authentication modules – PAM). PAM основаны на общей библиотеке, которая может быть использована любыми компонентами, где требуется аутентифицировать пользователя. Управление доступом в системах типа UNIX, включая и Linux, осуществляется с помощью уникальных числовых идентификаторов пользователя и группы (uid и gid). Управление доступом выполняется путем присваивания объектам маски защиты, которая указывает, какие операции (чтение, запись, исполнение) доступны для владельца, группы и всех остальных пользователей. Linux дополняет стандартный механизм UNIX (setuid) двумя способами: Реализует этот механизм по спецификации POSIX, что позволяет каждому процессу многократно освобождать и вновь получать свой действующий uid. Добавлена характеристика процесса, которая предоставляет лишь подмножество полномочий, согласно действующему uid. Linux обеспечивает механизм, который позволяет клиенту выборочно передавать доступ к отдельному файлу некоторому серверному процессу, без предоставления ему каких-либо других привилегий. Развитие и использование Linux Система Linux, как активно используемая и изучаемая, используется также для известных разработок. Например, все большую популярность приобретает ОС Google Android – ОС для мобильных устройств на основе ядра Linux (разработка фирмы Google). Кроме того, в России на основе Linux разработана отечественная ОС для школьников Альт- Линукс. 322 В целом, перспективы Linux мы считаем весьма многообещающими. Ключевые термины ELF (Executable and Linkage Format) – популярный формат файла исполняемого кода в UNIX и в Linux, основанный на представлении файла в виде совокупности секций. Ext2FS – файловая система в Linux, основанная на использовании блоков небольшого размера и многоуровневой косвенной адресации. Linux proc – файловая системы в Linux, основанная на отсутствии явного хранения данных и вычислении данных при выполнении запросов на ввод-вывод. TTY – традиционное обозначение терминальных устройств в UNIX и Linux. Конвейер (pipe) - механизм взаимодействия процессов в UNIX и Linux, позволяющий дочернему процессу наследовать коммуникационный канал от процесса-родителя. Партнерская куча (buddy-heap) - метод распределения физической памяти в Linux, основанный на расщеплении блоков памяти и объединении соседних свободных блоков. Подключаемые аутентификационные модули (pluggable authentication modules - PAM) – динамически подключаемые модули аутентификации пользователей, используемые в Linux. Краткие итоги Система распределения физической памяти в Linux использует механизм партнерской кучи, основанный на расщеплении свободных блоков и на объединении соседних свободных блоков памяти. Виртуальная память в Linux основана на таблице страниц каждого процесса и логической точке зрения на память как совокупность непересекающихся смежных областей. При создании нового процесса его адресное пространство пусто и наполняется регионами виртуальной памяти по мере загрузки программ. Системный вызов fork полностью копирует в дочерний процесс адресное пространство процесса-родителя. Для управления страницами используется механизм откачки и подкачки. Ядро Linux резервирует один регион виртуальной памяти каждого процесса для его собственных нужд, в частности, для размещения статической памяти. Linux поддерживает как a.out- , так и ELF-форматы файлов исполняемого кода; статическую и динамическую линковку. В Linux реализована виртуальная файловая система (VFS), скрывающая различие между разными системами файлов. Основная файловая система Linux – Ext2fs, основанная на использовании блоков небольшого размера, битовой карты блоков и многоуровневой косвенной адресации. Другая файловая система – Linux proc – не хранит данные явно, а генерирует их при выполнении запросов на ввод-вывод. Система ввода-вывода Linux использует кэш страниц и буферный кэш. Устройства разбиты на три класса – блочные, символьные и сетевые. Для блочных устройств используется блочный буферный кэш. Для символьных устройств поддерживаются специфические операции ввода-вывода и не поддерживается произвольный доступ к блокам данных. Особым образом организованы драйверы терминальных устройств (TTY), для которых ядро поддерживает стандартный интерфейс. Как и в UNIX, в Linux сигнализация о событиях для пользовательских процессов реализуется с помощью сигналов. Процессы ядра не используют сигналы и взаимодействуют с помощью системных структур планировщика. Для взаимодействия процессов используются конвейер (pipe) и разделяемые объекты в общей памяти. Сетевая система Linux поддерживает как сетевые протоколы связи UNIX – UNIX, так и протоколы ОС, отличных от UNIX. Реализация сетевой системы Linux имеет три уровня абстракции: сокетный интерфейс, драйверы протоколов и драйверы сетевых устройств. Поддерживается набор протоколов Интернета. Обеспечивается маршрутизация пакетов на лю- 323 бом участке сети. На верхнем уровне протокола маршрутизации поддерживаются протоколы UDP, TCP, ICMP. Безопасность в Linux реализована на основе динамически подключаемых аутентификационных модулей. Управление доступом, как и в UNIX, осуществляется с помощью уникальных идентификаторов пользователя и группы и масок защиты. Реализована совместимость с POSIX – возможность многократно освобождать и получать uid процесса. Кроме того, реализована возможность выборочно передавать доступ к файлу любому серверному процессу. Направления развития и использования Linux: новые ОС на основе ядра Linux (например, ОС для мобильных устройств Google Android) и обучение на основе Linux (российская ОС для школьников Альт Линукс). Набор для практики Вопросы 1. 2. 3. 4. 5. 6. 7. На каких принципах основана система распределения физической памяти в Linux? Что такое партнерская куча? Как организована виртуальная память в Linux? Что такое регион виртуальной памяти? Какие форматы файлов исполняемого кода поддерживает Linux? Каковы основные особенности формата ELF? Что такое статическая и динамическая линковка и в чем их сравнительные достоинства и недостатки? 8. Что такое Linux VFS? 9. По каким принципам организована файловая система Ext2FS? 10. В чем особенность файловой системы Linux proc? 11. На какие три класса подразделяются устройства ввода-вывода в Linux? 12. Каковы особенности блочных устройств? 13. Каковы особенности символьных устройств? 14. Каковы особенности сетевых устройств? 15. Какими способами взаимодействуют в Linux пользовательские процессы и процессы ядра? 16. Что такое конвейер (pipe)? 17. Какие три уровня абстракции реализованы в сетевой системе Linux? 18. Что такое подключаемый аутентификационный модуль? 19. Какая информация используется в Linux для защиты файлов? 20. Какая ОС для мобильных устройств разработана на основе ядра Linux? 21. Какая ОС для школьников разработана в России на основе Linux? Упражнения 1. Сравните и сформулируйте, в чем особенности системы управления физической памяти в Linux, по сравнению с методами управления памятью, рассмотренными в курсе. 2. Сравните и сформулируйте, в чем особенности системы управления виртуальной памяти в Linux, по сравнению с методами управления памятью, рассмотренными в курсе. 3. Сравните и сформулируйте, в чем особенности системы управления процессами в Linux, по сравнению с методами, рассмотренными в курсе. 4. Смоделируйте файловую систему Ext2fs, ее основные структуры данных и операции. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. Обзор методов управления памятью в Linux (реферат). Обзор методов управления процессами в Linux (реферат). Обзор методов управления файлами и файловых систем в Linux (реферат). Операционная система для мобильных устройств Google Android на базе ядра Linux (реферат). 5. Моделирование файловой системы Ext2fs, ее основных структур данных и операций (курсовая работа). 324 27. Лекция: Обзор архитектуры и возможностей систем Windows 2000/XP/2003/Vista/2008/7 В лекции рассмотрены следующие вопросы: история Windows; роль Windows NT; архитектура Windows; ядро; исполнительная подсистема; подсистемы окружения. Содержание Введение Система Windows 2000 История Windows Принципы проектирования Windows 2000 – расширяемость, переносимость, надежность, безопасность, совместимость, производительность, поддержка интернационализации и локализации. Архитектура Windows 2000 Ядро Windows 2000 Обработка прерываний в ядре Исполнительная подсистема (executive) ОС Windows 2000 Подсистемы окружения в Windows 2000 Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Windows – наиболее распространённое семейство операционных систем для настольных и портативных компьютеров. Имеются также версии Windows для мобильных устройств (Windows Mobile) и для компьютерных кластеров. Можно без преувеличения сказать, что Windows – это тот мир, в котором живут и работают миллионы программистов. Windows в своем развитии бурно прогрессирует. Значительно повысилась надежность системы, значительно возросли ее возможности. В данной и следующей лекциях рассмотрены история, архитектура и возможности Windows. В "Обзор архитектуры и возможностей систем Windows 2000/XP/2003/Vista/2008/7 " и "Системные механизмы Windows " рассмотрены следующие вопросы: История Принципы проектирования Компоненты системы Подсистемы окружения Файловая система Работа в сети Программный интерфейс. Система Windows 2000 Windows 2000 – это 32-битовая многозадачная операционная система для микропроцессоров типа Intel. Windows 2000 продолжает линию развития, начатую в середине 1990-х гг. системой Windows NT. Основные цели разработки Windows 2000 и последующих новых версий Windows (2003/2008/7): переносимость безопасность соответствие POSIX поддержка многопроцессорности расширяемость поддержка интернационализации совместимость приложений с MS-DOS и ранними версиями Microsoft Windows. Новые версии Windows используют архитектуру микроядра. Windows 2000 доступна в нескольких версиях - Professional, Server, Advanced Server, National Server. 325 История Windows Для большинства отечественных пользователей, включая автора, Windows стала доступной впервые в конце 1980-х гг. как графическая оболочка, запускаемая в среде операционной системы MS DOS командой win. Уже тогда были ощутимы основные характерные черты Windows, хотя она еще не была операционной системой, - удобный многооконный (как тогда называли) графический пользовательский интерфейс. Затем появились наиболее известные в те годы версии - Windows 3.0, Windows 3.11, Windows for Workgroups (Windows для рабочих групп). Все они поддерживали исполнение приложений под управлением графической многооконной оболочки. В 1988 Microsoft приняла решение о разработке переносимой ОС "new technology" (NT), которая поддерживала бы и OS/2, и POSIX API. Первоначально Windows NT должна была использовать OS/2 API как свое естественное окружение, однако в процессе разработки NT была изменена и стала использовать Win32 API, что отражает популярность Windows 3.0. Именно, Windows NT, появившаяся к середине 1990-х гг., сыграла решающую роль в изменении отношения пользователей к Windows. До ее появления на рынке существовала точка зрения о недостаточной надежности Windows и невозможности ее использования как серверной ОС, вследствие чего в качестве серверных ОС многие предпочитали использовать Solaris или другие версии UNIX. Однако Windows NT Server, с ее передовой надежной архитектурой, расширенной поддержкой сети, поддержкой совместимости снизу вверх для приложений, разработанных для предшествующих ОС, изменила ситуацию на рынке до такой степени, что к середине 1990-х гг. лицензий на Windows NT было продано больше, чем на UNIX. Весьма важной линией развития Windows стало семейство клиентских ОС - Windows 9x – Windows 95 и Windows 98, затем – Windows Millennium. В этих операционных системах были реализованы расширенные мультимедийные возможности, поддержка драйверов самых разнообразных устройств (в том числе – механизм Plug-and-Play автоматического распознавания новых устройств и установки их драйверов), а также кодеки для обработки мультимедийной информации. Пользовательский интерфейс Windows 95 (с его "летающими листками" и характерным дизайном окон) стал эталоном для разработчиков GUI. Не случайно Microsoft значительно продлила срок поддержки Windows 98 для пользователей. Автору, так же как и миллионам других разработчиков, не хотелось "расставаться" с комфортным интерфейсом Windows 95 / 98. Значительным рубежом в развитии ОС стал выпуск в 2001 г. ОС Windows XP, которая и в настоящее время, почти через 10 лет (дополненная Service Packs 1, 2 и 3), является одной из наиболее широко используемых ОС в мире. Кодовое название Windows XP – whistler (свистулька), по-видимому, из-за характерной мелодии, сопровождающей вход в системы и выход их системы. Windows XP популярна среди пользователей, благодаря удобному инсталлятору, повышенной надежности, удобному и эстетичному пользовательскому интерфейсу, расширенной поддержке драйверов устройств (начиная с Windows XP, практически никаких проблем с драйверами при установке новых устройств пользователи Windows не испытывают). ОС Windows 2003 Server характерна прежде всего своей повышенной безопасностью – например, браузер в этой системе явным образом запрашивает у пользователя подтверждение надежности каждого конкретного нового сайта. ОС Windows 2008 – серверная ОС с удобными средствами конфигурирования, удобной поддержкой сети, поддержкой параллельного программирования. Выпущена также ее специальная версия Windows 2008 HPC – High Performance Computing, с расширенной поддержкой параллелизма. Недавно на рынке ОС появилась Windows 7 – клиентская ОС, по отзывам пользователей, весьма надежная и удобная. Таков лишь очень краткий перечень уникальных результатов фирмы Microsoft в области операционных систем – за небольшой отрезок времени разработано более десятка клиентских и серверных ОС семейства Windows, значительно повышена их надежность и безопасность, расширены пользовательские возможности. 326 Наиболее значительной представляется линия развития ОС Windows NT – Windows 2000 – Windows XP – Windows 2003 – Windows Vista - Windows 2008 – Windows 7. Это семейство ОС использует общие принципы архитектуры и общую кодовую базу (код ядра). Поэтому в дальнейшем в данной и следующей лекциях, рассматривая принципы организации Windows 2000, мы фактически рассматриваем архитектуру всех новых ОС семейства Windows. Принципы проектирования Windows 2000 – расширяемость, переносимость, надежность, безопасность, совместимость, производительность, поддержка интернационализации и локализации. Расширяемость. Windows 2000 имеет многоуровневую архитектуру. Ядро и его исполнительная подсистема (executive), исполняемое в защищенном режиме, обеспечивает базовые системные сервисы. Поверх ядра реализованы несколько серверных подсистем, работающих в пользовательском режиме. Модульная структура позволяет добавлять новые подсистемы окружения без модификации ядра. Переносимость. Благодаря своим принципам проектирования и архитектуры, Windows 2000 может быть перенесена с одной аппаратной платформы на другую со сравнительно небольшими изменениями. Система написана на языках высокого уровня - C и C++. Код, зависящий от процессора, изолирован в динамически линкуемую библиотеку (DLL), называемую уровень абстрагирования от аппаратуры - hardware abstraction layer (HAL). Идея HAL была реализована фирмой Microsoft, по признанию ее менеджеров, гораздо раньше – при разработке в 1980-х гг. пакета Microsoft Office для различных аппаратных платформ, включая Macintosh / MacOS (ОС Windows тогда еще не было). Эта же идея была использована и в Windows 2000, и еще позднее – при реализации академической версии .NET – SSCLI (Rotor), работающей на трех различных платформах. Надежность. Windows 2000 использует аппаратную защиту для виртуальной памяти и программные защитные механизмы для ресурсов ОС. Безопасность. Как уже было сказано в предыдущих лекциях, именно с улучшения безопасности Windows 2000 была начата инициатива trustworthy computing, и с тех пор в каждой новой ОС Microsoft уделяет особое внимание безопасности. Совместимость. Приложения, которые разработаны с учетом требований стандарта IEEE 1003.1 (POSIX), могут компилироваться для Windows 2000 без изменений в исходном коде и исполняться в среде Windows 2000. Производительность. Подсистемы Windows 2000 могут взаимодействовать друг с другом с помощью высокопроизводительной передачи сообщений. Прерывание низкоприоритетных потоков позволяет системе быстро реагировать на внешние события. Windows 2000 спроектирована для поддержки симметричного мультипроцессирования. Поддержка интернационализации (i18n) и локализации (l10n). Windows 2000 поддерживает различные языки и культурные среды (locales) с помощью специализированных библиотек - NLS API. Архитектура Windows 2000 ОС Windows 2000 с точки зрения архитектуры организована как многоуровневая система модулей. Система поддерживает защищенный (системный) режим, в котором выполняются HAL, ядро и исполнительная подсистема (executive). В пользовательском режиме исполняется набор подсистем, среди которых - подсистемы окружения, эмулирующие различные ОС, с целью совместимости приложений. Подсистемы защиты реализуют различные функции безопасности. Схема архитектуры Windows 2000 приведена на рис. 27.1. В последующей части лекции рассмотрим подробнее основные компоненты архитектуры Windows 2000. 327 Рис. 27.1. Архитектура Windows 2000. Ядро Windows 2000 Ядро в системе является основой функционирования исполнительной подсистемы (executive) и подсистем, выполняемых в пользовательском режиме. Отказы страниц в ядре исключены. Его исполнение никогда не прерывается. Ядро выполняет следующие основные функции: Планирование потоков Обработка прерываний и исключений Низкоуровневую синхронизацию процессов Восстановление после отказов электропитания. Особенно важной и принципиально новой в операционных системах особенностью является то, что ядро системы Windows - объектно-ориентированное. Ядро использует два набора объектов: Объекты-диспетчеры - - объекты, управляющие диспетчеризацией и синхронизацией (события, мьютексы, семафоры, потоки, таймеры). Управляющие объекты - асинхронные вызовы процедур, обработчики прерываний, объекты нотификации об электропитании, объекты состояния электропитания, объекты профилирования. Поддержка потоков и процессов в ядре. Процесс имеет адресное пространство в виртуальной памяти, информацию (например, базовый приоритет) и тесную связь с одним или несколькими процессами. Потоки – единицы исполнения, планируемые диспетчером ядра. Каждый поток имеет свое собственное состояние, включая приоритет, связь с процессором и статистическую информацию. Поток может быть в следующих состояниях: ready, standby, running, waiting, transition и terminated. Планирование в ядре. Диспетчер использует 32-уровневую схему приоритетов для определения порядка выполнения потоков. Приоритеты разбиты на два класса: 328 Класс real-time содержит потоки с приоритетами от 16 до 31. Класс variable содержит потоки с приоритетами от 0 до 15. Характерными чертами стратегии приоритетов Windows 2000 являются следующие: Хорошее время ответа для потоков, использующих мышь и окна. Предоставление возможности потокам, связанным с вводом-выводом, обеспечивать занятость устройств ввода-вывода. Планирование выполняется, когда поток переходит в состояние ready или wait, когда поток завершается, либо когда приложение изменяет приоритет потока или связь с процессором. Потокам реального отдается предпочтение при выделении процессора; но ОС не гарантирует, что поток начнет выполняться в течение какого-либо определенного интервала времени (такой подход известен как soft real-time). Обработка прерываний в ядре Ядро обеспечивает обработку прерываний, если исключения и прерывания генерируются аппаратурой и программным обеспечением. Таким образом, в Windows 2000 введены средства обработки исключений (exceptions) – более высокоуровневый механизм обработки ошибок, чем сигналы в UNIX. Исключения, которые не могут быть обработаны программно, обрабатываются диспетчером исключений ядра ОС. Диспетчер прерываний в ядре обрабатывает прерывание либо путем вызова подпрограммы, обслуживающей прерывание (например, драйвера устройства), либо путем вызова внутренней подпрограммы ядра. Уровни запросов на прерывания в Windows 2000 приведены в таблица 1. Таблица 1. Уровни запросов на прерывания в Windows 2000 уровни прерываний типы прерываний 31 аппаратный контроль или ошибка шины 30 отказ электропитания 29 межпроцессорная нотификация (запрос к активности другого процессора, например, для диспетчеризации или обновления TLB - кэша страниц 28 часы (используется для отслеживания времени 27 профиль 3-26 традиционные IRQ-прерывания 2 диспетчеризация или отложенный вызов процедуры (DPC) - ядро 1 асинхронный вызов процедуры (АРС) 0 пассивно Ядро использует блокировщики (spin locks, буквально – вертящиеся замки), находящиеся в основной памяти, для взаимного исключения процессов. Для иллюстрации приведем код на ассемблере x86 реализации spin lock: mov eax, spinlock_address mov ebx, SPINLOCK_BUSY wait_cycle: lock xchg [eax], ebx cmp ebx, SPINLOCK_FREE jnz wait_cycle ; <работа с разделяемым ресурсом – критическая секция> mov eax, spinlock_address mov ebx, SPINLOCK_FREE lock xchg [eax], ebx Исполнительная подсистема (executive) ОС Windows 2000 Рассмотрим более подробно исполнительную подсистему (executive) Windows 2000. 329 Менеджер объектов. Как уже было сказано, Windows 2000 использует объекты для управления всеми своими службами и для представления сущностей. Менеджер объектов исполнительной подсистемы управляет использованием всех объектов. Основные функции менеджера объектов: Генерирация object handle - ссылки на объект ядра Windows 2000; Выполнение проверок безопасности при работе с объектом; Слежение за использованием каждого объекта процессами. Объекты управляются стандартным набором методов: create, open, close, delete, query name, parse, security. Модуль executive поддерживает именование объектов. Имя может быть постоянным или временным. Имена объектов структурируются как имена путей доступа к файлам в MS-DOS или UNIX. Реализованы объекты-символические ссылки, которые подобны символическим ссылкам в UNIX и дают возможность иметь несколько синонимов для одного файла. Процесс получает ссылку на объект при его создании, при открытии уже существующего объекта, при получении скопированной ссылки от другого процесса, либо путем наследования ссылки от процесса-родителя. Каждый объект защищен списком управления доступом. Менеджер виртуальной памяти в executive. При проектировании менеджера виртуальной памяти предполагалось, что процессор поддерживает для отображения виртуальных адресов в физические механизм страничной организации, прозрачный кэш для многопроцессорных систем, а также алиасы для виртуальных адресов. Менеджер виртуальной памяти в Windows 2000 использует страничную организацию с размером страницы 4 килобайта. Используется двухуровневая схема выделения памяти: 1. На первом шаге резервируется часть адресного пространства процесса. 2. На втором шаге данное выделение поддерживается выделением пространства в файле откачки (paging file). Схема распределения виртуальной памяти в Windows 2000 приведена на рис. 27.2. Рис. 27.2. Схема распределения виртуальной памяти в Windows 2000. 330 Как видно из схемы, используются иерархитеские двухуровневые таблицы страниц. Трансляция виртуальных адресов в Windows 2000 использует несколько структур данных. Каждый процесс имеет справочник страниц (page directory), содержащий 1024 элемента справочника страниц размером по 4 байта. Каждый элемент справочника страниц ссылается на таблицу страниц, которая содержит 1024 элемента таблицы страниц (page table entries - PTEs) размером по 4 байта. Каждый PTE ссылается на фрейм страницы (4 KB) в физической памяти. Ссылка на элемент всегда занимает 10 битов (0..1023). Это свойство используется при трансляции виртуальных адресов в физические. Страница может находиться в следующих состояниях: valid (корректна), zeroed (обнулена), free standby (свободна), modified (модифицирована), bad (некорректна). На рис. 27.3 изображена структура виртуального адреса в Windows 2000. Рис. 27.3. Структура виртуального адреса в Windows 2000. В виртуальном адресе 10 битов для page directory entry, 10 битов для page table entry, 12 битов для смещения в байтах на странице. На рис. 27.4 изображена структура элемента таблицы страниц. Рис. 27.4. Структура элемента таблицы страниц в Windows 2000. В элементе 5 битов отведено для защиты страницы, 20 битов - для адреса фрейма страницы, 4 бита - для выбора файла откачки, 3 бита для описания состояния страницы. Бит V равен 0. Менеджер процессов executive. Обеспечивает сервисы для создания, удаления и использования потоков и процессов. Связи родительских процессов с дочерними и иерархии процессов обрабатываются конкретной подсистемой окружения, которая владеет данным процессом. Важный элемент менеджера процессов – механизм локального вызова процедуры (LPC). LPC передает запросы и результаты между клиентским и серверным процессами на локальной машине. В частности, он используется для запросов к сервисам различных подсистем ОС. При создании канала для LPC должно быть указано сообщение одного из трех типов. 331 Первый тип – маленькие сообщения, до 256 байтов; в качестве промежуточной памяти используется очередь сообщений порта, и сообщения копируются от ного процесса к другому. Второй тип – во избежание копирования больших сообщений, передаются ссылки на разделяемые объекты, содержащие сообщения. Третий тип - быстрый LPC – используется графическими подсистемами Win32. Рассмотрим структуру сообщения LPC, описанную на языке Си: typedef struct _LPC_MESSAGE_HEADER { // длина тела сообщения USHORT DataLength; // длина сообщения с заголовком USHORT TotalLength; / / тип сообщения USHORT MessageType; USHORT DataInfoOffset; // уникальный идентификатор процесса, пославшего сообщение ULONG ProcessId; уникальный идентификатор потока, пославшего сообщение ULONG ThreadId; // идентификатор сообщения ULONG MessageId; ULONG CallbackId; } LPC_MESSAGE_HEADER, *PLPC_MESSAGE_HEADER; Менеджер ввода-вывода в executive. Менеджер ввода-вывода отвечает за следующие компоненты и действия ОС: Файловые системы Управление кэш-памятью Драйверы устройств Сетевые драйверы. Менеджер ввода-вывода следит за тем, какие файловые системы загружены, и управляет буферами для запросов на ввод-вывод. Он также взаимодействует с менеджером виртуальной памяти для обеспечения вводавывода в файлы, отображаемые в память. Менеджер ввода-вывода управляет кэш-менеджером, который обеспечивает кэширование для всей системы ввода-вывода. Менеджер ввода-вывода поддерживает как синхронные, так и асинхронные операции, обеспечивает тайм-ауты для драйверов, поддерживает механизмы для вызова одного драйвера другим. Схема файлового ввода-вывода в Windows 2000 изображена на рис. 27.5. Монитор безопасности в executive. Объектно-ориентированная архитектура Windows 2000 обеспечивает использование единого механизма для контроля доступа во время выполнения и аудита всех объектов системы. Каждый раз, когда процесс получает ссылку на объект, монитор безопасности проверяет маркер безопасности процесса и список управления доступом к объекту для проверки, имеет ли процесс необходимые права. Менеджер Plug-and-Play. Менеджер Plug-and-Play (PnP) используется для распознавания изменений в конфигурации оборудования и адаптации к ним (установки соответствующих драйверов). Когда добавляются новые устройства (например, PCI или USB), менеджер PnP загружает соответствующий драйвер. Менеджер PnP также следит за ресурсами, используемыми каждым устройством. 332 Рис. 27.5. Файловый ввод-вывод в Windows 2000. Подсистемы окружения в Windows 2000 Над executive надстраиваются процессы пользовательского режима, обеспечивающие исполнение программ, разработанных для других ОС. Windows 2000 использует подсистему Win32 как основное операционное окружение. Подсистема Win32 используется для запуска всех процессов. Она же обеспечивает средства работы с мышью, клавиатурой и средства графики. Окружение MS-DOS обеспечивается приложением Win32, называемым Virtual Dos machine (VDM), процессом пользовательского уровня, для которого поддерживается страничная организация и диспетчеризация, как и для всех других потоков. Окружение для 16-битовых Windows обеспечивается VDM, которая содержит подсистему Windows on Windows. Последняя предоставляет процедуры ядра Windows 3.1 для менеджера окон и функций GDI. Подсистема POSIX спроектирована для исполнения POSIX-приложений, следующих POSIX.1 – стандарту, который базируется на модели UNIX. Подсистема OS/2 выполняет OS/2 - приложения. Подсистема входа и безопасности аутентифицирует пользователей, входящих в систему Windows 2000. Требуется, чтобы пользователи имели учетную запись с логином и пароль. Пакет аутентификации подсистемы безопасности аутентифицирует всех пользователей, которые пытаются осуществить доступ к какому-либо объекту системы. Windows 2000 использует Kerberos как пакет аутентификации по умолчанию. Ключевые термины Plug-and-Play (PnP) – механизм автоматического распознавания изменений в конфигурации оборудования и адаптации к ним (установки соответствующих драйверов). Virtual Dos Machine (VDM) - процесс пользовательского уровня, обеспечивающий совместимость с приложениями MS-DOS. Блокировщик (spin lock, буквально – вертящийся замок) – системный механизм синхронизации, используемый для взаимного исключения процессов ядра Windows. Исполнительная подсистема (executive) – основная часть ядра Windows, исполняемая в защищенном режиме, реализующая базовые системные сервисы. 333 Локальный вызов процедуры (LPC) – системный механизм вызова процедур Windows, передающий запросы и результаты между клиентским и серверным процессами на локальной машине; используется для запросов к сервисам различных подсистем ОС. Объект-диспетчер - системный объект в Windows, управляющий диспетчеризацией и синхронизацией. Объектная ссылка (object handle) - ссылка на системный объект ядра Windows. Управляющий объект - системный объект Windows, управляющий асинхронным вызовом процедуры, обработкой прерывания, нотификацией об электропитании или профилированием. Уровень абстрагирования от аппаратуры (hardware abstraction layer, HAL) – динамически линкуемая библиотека Windows, инкапсулирующая код, зависящий от конкретного процессора, - тем самым обеспечивающая независимость от аппаратуры всего остального кода Windows. Краткие итоги Windows 2000 / XP / 2003 / 2008 / 7 – новейшая линия в развитии ОС Windows, которой предшествовало более чем 20-летнее развитие Windows от графической оболочки в среде MS DOS до наиболее популярной в мире операционной системы. Windows 2000 – объектноориентированная ОС, основными целями разработки которой являются переносимость, безопасность, соответствие POSIX, поддержка многопроцессорности, расширяемость, поддержка интернационализации, совместимость приложений с MS DOS и первыми версиями Windows. Использует архитектуру микроядра. Первой ОС в новой линии развития Windows стала Windows NT, выпущенная в середине 1990-х гг. Windows NT, 2000 и более новые версии Windows имеют общую кодовую базу – ядро ОС. Windows 2000 написана на C и C++. Код, зависящий от процессора, выделен в специальный API – hardware abstraction layer (HAL). Архитектура Windows 2000 - многоуровневая. В защищенном режиме исполняется ядро, исполнительная подсистема ядра – executive, реализующая базовые системные сервисы, и HAL. Над этими компонентами надстраиваются подсистемы пользовательского режима, эмулирующие различные ОС и обеспечивающие реализацию безопасности. Ядро Windows разработано в объектно-ориентированном стиле и использует два набора системных объектов – объекты-диспетчеры и управляющие объекты. Ядро поддерживает процессы и потоки. Используется гибкая система приоритетов, включающая поддержку потоков реального времени и разделения времени. Процессы реального времени планируются как soft real-time (без обязательности выдерживания фиксированного интервала времени ответа). Ядро обеспечивает обработку прерываний и системный механизм исключений. Для синхронизации процессов ядра используются блокировщики типа spin locks. Менеджер системных объектов обеспечивает генерацию системных объектных ссылок (object handles) и выполнение базовых операций над объектами. Поддерживается именование объектов и объекты – символические ссылки. Каждый объект защищен списком управления доступом. Для реализации виртуальной памяти используется двухуровневая таблица страниц с размером страницы 4 килобайта. Используются файлы откачки. Для системных вызовов процедур используется механизм LPC (local procedure call), обеспечивающий передачу сообщений или ссылок на общим области памяти. Менеджер ввода-вывода поддерживает синхронные и асинхронные операции, тайм-ауты для драйверов, кэширование ввода-вывода, использование файлов, отображаемых в память. Монитор безопасности использует маркеры безопасности процессов и списки управления доступом к объектам для авторизации. Менеджер PnP отслеживает изменения в конфигурации и установку соответствующих драйверов новых устройств. 334 Подсистемы окружения Windows: подсистема Win32; DOS Virtual Machine; подсистема Windows on Windows (исполнение 16-битовых приложений Windows); подсистема POSIX, подсистема OS/2; подсистема входа и безопасности (управляет учетными записями пользователей, используя Kerberos-аутентификацию по умолчанию). Набор для практики Вопросы 1. В каком качестве была реализована первая версия Windows и в какой среде она работала? 2. В чем принципиальная новизна подхода к реализации Windows NT? 3. Назовите все операционные системы, являющиеся развитием Windows NT. 4. В чем новизна и каковы основные преимущества ОС Windows 95 / 98? 5. Каковы основные цели разработки Windows 2000? 6. На каких языках написана Windows 2000? 7. Как называется исполнительная подсистема ядра Windows 2000 и какие основные сервисы она реализует? 8. Каким образом достигнута минимальная зависимость кода Windows от аппаратуры? 9. С программами для каких ОС и стандартов обеспечивается совместимость в системе Windows 2000? 10. Какие компоненты Windows исполняются в защищенном, а какие – в пользовательском режиме? 11. Что такое подсистема в ОС Windows? Назовите все подсистемы ОС Windows. 12. Какие виды системных объектов использует ядро Windows? 13. В каких состояниях может находиться поток в Windows? 14. Какие классы процессов и потоков выделяются при планировании в Windows? 15. Какие механизмы используются для обработки ошибок в Windows? 16. Какие средства используются для синхронизации системных процессов ядра Windows? 17. Какие функции выполняет менеджер объектов исполнительной подсистемы ядра Windows? 18. Каким образом защищены системные объекты ядра Windows? 19. Как организована система виртуальной памяти и таблицы страниц в Windows? 20. Какой процедурный механизм коммуникации используется для системных процессов? 21. Какие функции выполняет менеджер ввода-вывода? 22. Какие системные структуры используются подсистемой безопасности для авторизации процессов? 23. Какие функции выполняет менеджер Plug-and-Play? 24. Какие подсистемы окружения для совместимости с другими ОС имеются в Windows? 25. Какой вид аутентификации используется в Windows? Упражнения 1. Инсталлируйте новую версию Windows, имеющуюся в Вашем распоряжении (Windows 7, Vista и др.) и проанализируйте ее основные возможности для пользователей. 2. Используйте открытое академическое ядро Windows (WRK) и изучите по исходным кодам и опишите основные компоненты ядра Windows (executive и др.). 3. Поэкспериментируйте с запуском в новой версии Windows приложений для других ОС – MS DOS, Windows 3.1 и др. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. История операционных систем семейства Windows (реферат). Архитектура и принципы проектирования Windows 2000 (реферат). Исполнительная подсистема (executive) ядра Windows 2000 (реферат). Подсистемы окружения Windows 2000 и совместимость с другими ОС (реферат). Использование открытого академического ядра Windows (WRK) для изучения по исходным кодам и описания основных компонент ядра Windows (executive и др.). (курсовая работа). 6. Эксперименты с запуском в новой версии Windows приложений для других ОС – MS DOS, Windows 3.1 и др. (курсовая работа). 335 336 28. Лекция: Системные механизмы Windows В лекции рассмотрены: система файлов Windows; сетевые средства Windows; программный интерфейс Windows; управление памятью, процессами, заданиями, многопоточность в Windows; поддержка параллельного программирования в Windows; управление физической памятью и рабочими наборами в Windows. Содержание Введение Система файлов Windows Сетевые средства Windows Программный интерфейс Windows Программный интерфейс Windows: Управление процессами Управление виртуальной и физической памятью и рабочими наборами в Windows Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Система Windows использует целый ряд оригинальных системных механизмов, которым и посвящена данная лекция. Данная лекция, как и предыдущая ("Обзор архитектуры и возможностей систем Windows 2000/XP/2003/Vista/2008/7 "), предназначена для детального изучения архитектуры, принципов организации, системных механизмов и возможностей Windows. Рассмотрены система файлов, сетевые средства, API, управление памятью, процессами, задачами, поддержка параллельного программирования в Windows. Система файлов Windows Базовая система файлов ОС Windows 2000, как и ОС Windows NT, - NTFS (NT File System). В данном разделе рассмотрим ее подробно. Фундаментальная структура системы файлов Windows 2000 (NTFS) – том (volume). Том создается утилитой администрирования диска. Структура тома основана на логическом диске (partition). Том может занимать часть диска, целый диск или распределяться по нескольким дискам (рис. 28.1). Все метаданные, такие как информация о томе, хранятся в обычном файле. NTFS использует кластеры как базовую единицу выделения дисковой памяти. Кластер – число секторов диска, размер которого – степень двойки. Поскольку размер кластера меньше, чем в FAT16, внутренняя фрагментация уменьшается. NTFS использует логические номера кластеров - logical cluster numbers (LCN) в качестве дисковых адресов. Файл в NTFS – не просто байтовый поток, как в MS-DOS или в UNIX, но структурированный объект, состоящий из атрибутов. Каждый файл в NTFS описывается одной или несколькими записями в массиве, хранящемся в специальном файле, называемом Master File Table (MFT). Каждый файл в томе NTFS имеет уникальный идентификатор (ID), называемый ссылкой на файл - file reference. Это 64-битовое число, состоящее из 48-битового номера файла и 16-битового номера последовательности. Ссылка на файл может использоваться для выполнения внутренних проверок целостности. Пространство имен NTFS организовано в иерархию директорий. Индексный корень (index root) содержит верхний уровень B+ - дерева. Все изменения структур данных в файловой системе NTFS выполняются как транзакции, для которых используется журнал. Перед тем, как структура данных изменяется, транзакция заносит в журнал специальную запись, которая содержит информацию для повторного выполнения (redo) и отмены (undo) данного изменения. После изменения структуры данных в журнал заносится информация об успешном выполнении операции. В случае порчи информации файловая система может быть восстановлена до целостного состояния с использованием журнальных записей. Эта схема не гарантирует, что все данные пользовательского файла могут быть восстановлены в случае порчи информации, а гарантирует лишь, что все 337 структуры данных о файлах в системе (метаданные) не повреждены и отражают какое-либо целостное состояние данных до порчи информации. Журнал хранится в третьем файле метаданных каждого тома. Безопасность тома NTFS реализована на основе объектной модели Windows 2000. Каждый файловый объект имеет дескриптор безопасности, хранящийся в записи MFT. Данный атрибут содержит маркер доступа владельца файла, а также список управления доступом, устанавливающий права каждого пользователя для доступа к данному файлу. FtDisk, дисковый драйвер Windows 2000, устойчивый к сбоям, обеспечивает несколько способов объединения нескольких SCSI-дисков в один логический том. Он логически конкатенирует диски, образуя один логический том (набор дисков тома – volume set). Драйвер выполняет обработку нескольких частей тома по принципу round-robin для формирования "полосатого множества" (stripe set), или disk striping) – рис. 28.2. Stripe set – набор от 2 до 32 дисков, логически объединенных в единый том. При записи данных в stripe set данные записываются порциями по 64 Кбайта (которые могут распределяться произвольным образом между дисками stripe set). Это позволяет сэкономить время в случае, если работа с дисками stripe set может выполняться параллельно. Такая схема не гарантирует сохранности данных. Как вариант используется схема stripe set with parity (рис. 28.3), которая позволяет восстановить данные в случае сбоя. Зеркальное отображение дисков (Disk mirroring) - это надежная схема, использующая множество "зеркал" (mirror set) — две секции одного размера на разных частях диска с идентичным содержимым (рис. 28.4). Для обработки запорченных дисковых секторов FtDisk использует аппаратный метод, называемый предохранением секторов (sector sparing), а NTFS использует программный метод, называемый повторным отображением кластеров (cluster remapping). На рис. 28.1 изображена структура тома NTFS, размещаемого на двух логических дисках. Рис. 28.1. Том NTFS, размещаемый на двух дисках. Stripe set, размещенное на двух дисках, изображено на рис. 28.2. Stripe set with parity на трех дисках изображено на рис. 28.3. Mirror set на двух дисках изображено на рис. 28.4. Сжатие в файловой системе NTFS. Для сжатия файла NTFS разделяет данный файл на модули сжатия (compression units) - блоки по 16 смежных кластеров. Для не смежно расположенных файлов NTFS использует другой метод экономии памяти. Кластеры, содержащие только нули, фактически не хранятся на диске. Вместо этого, в по- 338 следовательности виртуальных номеров кластеров оставлены пропуски, информация о которых хранится в элементе MFT для данного файла. При чтении из файла, если найден пропуск в нумерации виртуальных кластеров, NTFS просто заполняет нулями соответствующую часть буфера. Рис. 28.2. Stripe set на двух дисках. Рис. 28.3. Stripe set with parity на трех дисках. Точки повторного анализа (peparse points) в файловой системе NTFS при обращении вызывают генерацию кода ошибки. Они содержат информацию для менеджера вводавывода, какие действия выполнять дальше. Точки повторного анализа могут быть использованы для обеспечения функциональности монтирования, как в UNIX. Они могут быть также использованы для доступа к файлам, которые перенесены в отдельно размещаемую память. 339 Рис. 28.4. Mirror set на двух дисках. Сетевые средства Windows Windows 2000 поддерживает как одноранговую связь, так и клиент-серверную связь в сетях; она также содержит средства для управления сетями. При описании сетевых средств в Windows 2000 будем ссылаться на два внутренних интерфейса: NDIS (Network Device Interface Specification) — отделяет сетевые адаптеры от транспортных протоколов, так чтобы каждый из них можно было изменить, не оказывая влияния на другой. TDI (Transport Driver Interface) — обеспечивает, чтобы каждая из компонент уровня сеанса могла использовать любой транспортный механизм. Windows 2000 реализует транспортные протоколы как драйверы, которые могут быть динамически добавлены к системе или удалены из нее. Протокол server message block (SMB) используется для передачи через сеть запросов на ввод-вывод. Он имеет четыре типа сообщений: Session control (управление сеансом) File (файл) Printer (принтер) Message (сообщение). Система Network basic Input/Output system (NetBIOS) - сетевой интерфейс Windows с абстрагированием от аппаратуры. Она используется в Windows для: Установки логических имен в сети Установления логической последовательности сеансов между двумя логическими именами в сети Поддержки надежной передачи данных для сеанса с помощью запросов NetBIOS или SMB. NetBEUI (NetBIOS Extended User Interface) – сетевой протокол по умолчанию для одноранговых сетей Windows 95 и Windows for Workgroups. Используется для совместного использования ресурсов в подобных сетях. Windows 2000 использует протокол Интернета TCP/IP для соединения с различными ОС и аппаратными платформами. 340 Протокол PPTP (Point-to-Point Tunneling Protocol) используется для коммуникации между модулями Remote Access Server, работающими на машинах под Windows 2000, соединенных через Интернет. Протокол NWLink предназначен для объединения сетей NetBIOS и Novell NetWare. Протокол Data Link Control (DLC) используется для доступа к mainframe-компьютерам IBM и принтерам HP, непосредственно подсоединенным к сети. Системы на базе Windows 2000 могут взаимодействовать с компьютерами Macintosh с помощью протокола Apple Talk, если сервер в сети, работающий под Windows 2000, использует пакет Windows 2000 Services for Macintosh. Windows 2000 поддерживает распределенные приложения с помощью именованных систем типа NetBIOS, именованных конвейеров (pipes), mail-слотов, сокетов типа Windows Sockets, удаленных вызовов процедур - Remote Procedure Calls (RPC) и протоколов Network Dynamic Data Exchange (NetDDE). Системы типа NetBIOS могут взаимодействовать через сеть, используя протоколы NetBEUI, NWLink или TCP/IP. Именованные конвейеры – это механизм передачи сообщений через сетевую коннекцию. Они именуются с использованием uniform naming convention (UNC). Mail-слоты – это механизм передачи сообщений без непосредственного использования коннекции, основанный на приложениях типа поиска компонент в сети. Winsock, API для реализации сокетов под Windows, - это интерфейс уровня сеанса, обеспечивающий стандартизованный интерфейс для многих транспортных протоколов, которые могут иметь различные схемы адресации. Механизм RPC в Windows 2000 следует широко используемому стандарту Distributed Computing Environment для RPC - сообщений, так что программы, использующие RPC для Windows 2000, имеют высокую степень переносимости. RPC – сообщения посылаются с использованием NetBIOS, или Winsock в сетях TCP/IP, или именованных конвейеров в сетях LAN Manager. Windows 2000 предоставляет язык Microsoft Interface Definition Language (используемый в модели CORBA) для описания имен, аргументов и результатов удаленных процедур. В Windows 2000 приложение может использовать API для ввода-вывода Windows 2000 для доступа к файлам удаленного компьютера теми же средствами, как к локальным файлам, при условии, что на удаленном компьютере исполняется MS-NET server. Перенаправитель (redirector) - это объект клиентской стороны, который пересылает запросы на ввод-вывод удаленных файлов. Эти запросы затем удовлетворяются сервером. С целью повышения производительности и обеспечения безопасности, перенаправители и серверы выполняются в режиме ядра. Доступ к удаленному файлу выполняется по следующей схеме. Приложение вызывает менеджер ввода-вывода для запроса на открытие файла (предполагается, что имя файла – в стандартном формате UNC). Менеджер ввода-вывода конструирует пакет запроса на ввод-вывод. Менеджер ввода-вывода распознает, что это запрос к удаленному файлу, и вызывает специальный драйвер, называемый Multiple Universal Naming Convention Provider (MUP). MUP посылает пакет запроса на ввод-вывод асинхронно всем зарегистрированным перенаправителям. Перенаправитель, который может удовлетворить данный запрос, отвечает MUP. Для того, чтобы не задавать тот же вопрос перенаправителям в будущем, MUP использует кэш-память для запоминания того, какой перенаправитель может работать с этим файлом. Перенаправитель посылает сетевой запрос удаленной системе. Сетевые драйверы удаленной системы получают запрос и передают его драйверу сервера. Драйвер сервера перепоручает этот запрос драйверу соответствующей файловой системы. 341 Соответствующий драйвер вызывается для доступа к данным. Результаты возвращаются драйверу сервера, который пересылает данные перенаправителю, передавшему запрос. Сетевые домены. Windows типа NT использует концепцию домена для управления глобальными правами доступа между группами. Домен (domain) – это группа машин, использующих ОС типа Windows NT Server, которые используют одну и ту же политику безопасности и одну и ту же пользовательскую базу данных. Windows 2000 обеспечивает три модели установки доверительных связей. Однонаправленную: A доверяет B Двунаправленную, или транзитивную: A доверяет B, B доверяет C, следовательно, A, B, C доверяют друг другу Перекрестную (Crosslink) – допускается, чтобы аутентификация миновала иерархию, с целью сокращения аутентификационного трафика. Разрешение имен в сети. Традиционный механизм разрешения имен в сети IP – это процесс преобразования имени компьютера в IP-адрес. Например, www.bell-labs.com преобразуется в 135.104.1.14. Windows 2000 обеспечивает несколько методов разрешения имен: Windows Internet Name Service (WINS) broadcast name resolution domain name service (DNS) хост-файл LMHOSTS – файл. Реализация протокола WINS состоит из одного или более WINS – серверов, поддерживающих динамическую базу данных о связях между именами и IP-адресами, а также клиентского программного обеспечения для запросов к серверам. Реализация протокола WINS использует Dynamic Host Configuration Protocol (DHCP), который автоматически обновляет адресные конфигурации в базе данных WINS без вмешательства пользователя или системного администратора. Программный интерфейс Windows Доступ к объектам ядра. Процесс получает доступ к объекту ядра, называемому XXX, путем вызова функции CreateXXX для получения (открытия) ссылки (handle) на XXX. Ссылка уникальна для данного процесса. Ссылка может быть закрыта вызовом функции CloseHandle. Система может удалить данный объект, если счетчик ссылок на него стал равным нулю. Windows 2000 применяет три способа совместного использования объекта несколькими процессами: Дочерний процесс наследует ссылку на объект Один процесс дает объекту имя при его создании, а другой процесс открывает данное имя Функцию DuplicateHandle, которая обеспечивает, если известна ссылка на процесс и значение ссылки, получение для другого процесса ссылки на тот же объект. Программный интерфейс Windows: Управление процессами Процесс запускается функцией CreateProcess, которая загружает все динамически линкуемые библиотеки, используемые процессом, и создает первичный поток (primary thread). Дополнительные потоки могут создаваться функцией CreateThread. Каждая DLL или exe-файл, загружаемые в адресное пространство процесса, идентифицируются ссылкой на экземпляр (instance handle Планирование в Win32 использует четыре класса приоритетов: IDLE_PRIORITY_CLASS (уровень приоритетов 4) NORMAL_PRIORITY_CLASS (уровень 8 — типичный для большинства процессов) HIGH_PRIORITY_CLASS (уровень 13) REALTIME_PRIORITY_CLASS (уровень 24). 342 Для обеспечения уровней производительности, необходимых для интерактивных программ, Windows 2000 использует специальное правило планирования для процессов класса NORMAL_PRIORITY_CLASS. Windows 2000 различает основной процесс (foreground process), который в данный момент выбран на экране, и фоновые процессы (background processes), которые не выбраны в данный момент. Когда процесс становится основным, Windows 2000 увеличивает его квант планирования, как правило, в три раза. Ядро динамически изменяет приоритет потока, в зависимости от того, связан ли он с вводом-выводом или с процессором. Для синхронизации доступа к общим объектам несколькими потоками ядро предоставляет синхронизирующие объекты, такие как семафоры и мьютексы (mutexes). Кроме того, потоки могут синхронизироваться с использованием функций WaitForSingleObject или WaitForMultipleObjects. Другой метод синхронизации в Win32 API – критическая секция. Волокна (fibers) – еще одна разновидность параллельных процессов. Волокно (fiber) – это код пользовательского режима, исполнение которого планируется по алгоритму, определенному пользователем. Волокно отличается от потока тем, что разработчик приложения сам явным образом планирует переключение процессора между волокнами. Волокна исполняются совместно. В каждый момент времени разрешено исполняться только одному волокну, даже на многопроцессорной аппаратуре. Windows 2000 поддерживает концепцию волокон с целью переноса унаследованных UNIX-приложений, написанных на основе модели исполнения волокон. Имеется механизм преобразования потока в волокно – ConvertThreadToFiber. Взаимодействие процессов. Win32 – приложения могут выполнять взаимодействие между процессами путем совместного использования разделяемых объектов ядра. Альтернативный способ взаимодействия процессов – передача сообщений; он наиболее популярен для Windows GUI - приложений. При этом один поток посылает сообщение другому потоку или окну. Вместе с сообщением поток может также посылать данные. Каждый поток Win32 имеет свою входную очередь, из которой данный поток получает сообщения. Это более надежно, чем общая входная очередь, применяемая в 16-битовой версии Windows, так как при использовании отдельных очередей одно подвисшее приложение не может блокировать другие. Управление виртуальной и физической памятью и рабочими наборами в Windows Для организации виртуальной памяти используются следующие функции Win32: VirtualAlloc резервирует или согласует для резервирования виртуальную память. VirtualFree освобождает виртуальную память. Эти функции дают возможность приложению запомнить виртуальный адрес, по которому была выделена виртуальная память. Приложение может использовать память, отобразив файл в свое адресное пространство. Два процесса могут совместно использовать память, отображая один и тот же файл в свою виртуальную память. Куча (heap) в окружении Win32 – это область (region) зарезервированного адресного пространства. Для процесса Win32 создается куча, размер которой по умолчанию равен 1 MB. Доступ к куче синхронизирован, с целью защиты структур данных, связанных с распределением памяти в куче, от разрушения при совместном доступе из нескольких потоков. Поскольку функции, которые основаны на глобальных или статических данных, неправильно работают в многопоточном окружении, предоставлен механизм выделения глобальной, но связанной с конкретным потоком памяти (thread-local storage - TLS). Данный механизм предоставляет как статические, так и динамические методы выделения памяти, связанной с потоком. Для управления физической памятью поддерживается традиционная концепция рабочего набора (множества) – working set. Рабочий набор — все физические страницы, которыми "владеет" процесс. По существу, это все страницы, к которым процесс может обратиться, не вызвав сбоя страницы. Предел рабочего набора — максимальное число страниц, 343 которыми процесс может владеть. При достижении предела добавление каждой новой страницы должно сопровождаться исключением одной страницы из набора (замена в рабочем наборе). Верхний предел размера набора для каждого процесса по умолчанию - максимальное значение для всей системы - вычисляется и сохраняется в MmMaximumWorkingSetSize. Это примерно объем основной памяти минус 512 страниц (2 мегабайта в архитектуре x86) и минус минимальный размер системного рабочего набора (1.5 мегабайта в x86). Это интересные данные, поскольку они дают представление, сколько памяти реально теряется на нужды ОС. Реальный верхний предел составляет 2 гигабайта минус 64 мегабайта для 32-битовой ОС Windows. Процесс всегда запускается с пустым рабочим набором. Затем он вызывает отказы страниц при обращении к странице, не входящей в его рабочий набор. Многие отказы страниц могут быть разрешены с использованием памяти. Когда размер рабочего набора достигает максимума (либо выполняется подстройка рабочего набора), выполняется выброс страниц, чтобы высвободить место для новых. В Windows используется политика локальной замены страниц (для сравнения, в большинстве систем типа UNIX реализована глобальная замена). Это означает, что один процесс не может занять всю физическую память, кроме случая, когда другие процессы не используют ее. Алгоритм замены замещает наиболее давние по использованию страницы (ведется учет возраста страниц). В Windows 2000 подобная схема реализована только для однопроцессорных систем, в Windows XP и Windows Server 2003 — для любых, в том числе – для многопроцессорных систем. В системах Windows XP и Windows Server 2003 для управления памятью реализован новый флаг VirtualAlloc — MEM_WRITE_WATCH. В Windows различаются следующие типы отказов страниц основной памяти: Страницы могут быть возвращены путем механизма отказа в процесс из списков резервных и измененных страниц; Общая страница, допустимая для одного процесса, может оказаться сбойной в других. Некоторые отказы страниц диска неизбежны, например, при запуске нового процесса (и соответствующей загрузке EXE- или DLL-файлов). Кроме того, нормальная файловая операция ввода-вывода выполняется посредством подкачки. При этом кэшированные файлы добавляются сбоем в системный рабочий набор. Системный рабочий набор. Подобно тому, как все процессы имеют рабочие наборы, подкачиваемые код и данные системного пространства Windows размещаются в системном рабочем наборе. Он состоит из 4 компонентов: подкачиваемый пул; поддерживающие подкачку код и данные в исполнительном сегменте ядра; поддерживающие подкачку код и данные в драйверах режима ядра, Win32K.Sys, графических драйверах и т. д.; глобальный кэш данных файловой системы. Чтобы подсчитать физический (резидентный) размер этих компонентов с помощью системной утилиты PerfMon, следует выяснить значения следующих показателей: Память Память Память Память | | | | число число число число подкачанных в пул резидентных байтов резидентных байтов системного кода резидентных байтов системных драйверов резидентных байтов системного кэша. Показатель счетчика байтов в памяти | кэше представляет собой сумму показателей этих четырех "резидентных" (физических) счетчиков. Управление физической памятью. Система хранит не назначенные физические страницы в одном из нескольких списков: Список Список Список Список Список свободных страниц измененных страниц резервных страниц нулевых страниц плохих страниц — страницы, не прошедшие тест памяти при загрузке системы. 344 Списки реализованы как записи в базе данных PFN. Они обслуживаются как списки FIFO, или очереди. Динамика подкачки. Новые страницы распределяются по рабочим наборам из начала списка свободных или нулевых страниц. Страницы, исключенные из рабочего набора в ходе операции замены, помещаются в конец одного из следующих списков: Список измененных страниц (если они были изменены в рабочем наборе) Список резервных страниц (если изменения не вносились). Решение принимается на основе значении бита D (dirty = изменена) в записи таблицы страницы. Пока физическая страница находится в одном из этих списков, между ней и процессом по-прежнему поддерживается связь. По мере того как процессы вызывают отказы страниц, страницы изымаются из списка свободных или резервных страниц и включаются в состав рабочего набора процесса. Общая страница может быть одновременно резидентной в рабочих наборах нескольких процессов. Ключевые термины NTFS (NT File System) – основная файловая система Windows NT и Windows 2000, основанная на концепциях тома и логического номера кластера. Master File Table (MFT) – системный файл в файловой системе NTFS, содержащий записи с информацией о каждом файле. Mirror set – в файловой системе NTFS две секции одного размера на разных частях диска с идентичным содержимым, используемые для большей надежности хранения данных. NetBEUI (NetBIOS Extended User Interface) – сетевой протокол по умолчанию для одноранговых сетей Windows 95 и Windows for Workgroups. Stripe set – набор от двух до 32 дисков в файловой системе NТFS, логически объединенных в единый том, при записи данных в который данные записываются по очереди на каждый диск порциями по 64 Кб. Windows Internet Name Service (WINS) – собственный механизм разрешения имен (преобразования доменных имен компьютеров в IP-адреса), используемый в системе Windows. Winsock - API для реализации сокетов для Windows; интерфейс уровня сеанса, обеспечивающий стандартизованный интерфейс сокетов. Волокно (fiber) – параллельно выполняемый код пользовательского режима, исполнение которого и переключение с одного волокна на другое планируется по алгоритму, определенному пользователем. Домен (domain) – группа компьютеров, работающих под управлением ОС типа Windows NT Server, которые используют одну и ту же политику безопасности и одну и ту же пользовательскую базу данных. Кластер – единица выделения дисковой памяти в системе NTFS. Рабочий набор (working set) – множество всех физических страниц, которыми владеет процесс. Том (volume) – хранилище файлов в NTFS; может занимать часть логического диска, целый диск или распределяться по нескольким дискам. Краткие итоги Основной системой файлов в Windows NT и Windows 2000 является система NTFS. Она основана на следующих концепциях: том – хранилище файлов, которое может занимать часть логического диска, один или несколько логических дисков; stripe set – множество порций информации по 64 KB из одного файла, хранящихся на разных дисках для оптимизации параллельного доступа; Master File Table – таблицы с информацией о каждом файле в томе. Единицей выделения памяти в файле в NTFS является кластер. Каждый файл адресуется по 64-битовой ссылке (file reference). NTFS организована как транзакционная файловая система, с возможностью отмены и повторного выполнения транзакций. Безопасность в NTFS реализована на основе дескрипторов безопасности, которые имеет каждый файл. Утилита FtDisk 345 обеспечивает логическое объединение нескольких SCSI-дисков в один логический том. NTFS использует сжатие с целью экономии памяти. Сетевые средства Windows обеспечивают поддержку большого числа протоколов – Server Message Block, NetBIOS, NetBEUI, PPTP, NWLink (для взаимодействия с сетями Novell), DLC (для доступа к оборудованию IBM и HP), AppleTalk (для взаимодействия с компьютерами Macontosh). Для передачи сообщений через сеть используются mail-слоты и именованные конвейеры. WinSock API обеспечивает стандартизированный сокетный интерфейс для Windows. Поддерживается механизм удаленного вызова процедуры (RPC). Доступ к удаленным файлам осуществляется с помощью драйвера MUP. Используется концепция сетевого домена. Для разрешения сетевых имен и их преобразования в IP-адреса используется DNS, а также собственный сервис WINS. Программный интерфейс Windows (API) обеспечивает обработку системных объектов с помощью объектных ссылок. Процессы запускаются функцией CreateProcess, потоки – функцией CreateThread. Механизм планирования в Windows различает процессы реального времени (soft real-time) и интерактивные. Когда диаголовый процесс становится активным (его элемент GUI выбран на экране), его квант времени увеличивается в три раза. Для синхронизации в ядре используются мьютексы или критические секции. В Windows поддержан новый вид параллельного выполнения – волокна (fibers), аналогичный потокам, но, в отличие от потоков, явно управляемый пользователем. Для взаимодействия потоков используется передача сообщений, причем куаждый поток имеет собственную входную очередь, что более надежно. Поддерживается механизм виртуальной памяти. Процессы совместно используют область виртуальной памяти, отображая один и тот же файл в свои адресные пространства. Для каждого процесса (потока) создается куча и выделяется локальная память потока (thread-local storage). При управлении физической памятью используется концепция рабочего набора – множества всех физических страниц, которыми владеет процесс. Рабочей набор каждого процесса имеет свой верхний предел. При его достижении ОС, при добавлении каждой новой страницы, исключает одну страницу из рабочего набора (замена в рабочем наборе). Используется политика локальной замены страниц. Вычисляется и контролируется максимальное суммарное значение размера рабочего набора для всей системы. Обрабатываются отказы страниц, например, при загрузке новых DLL. Windows поддерживает системный рабочий набор, используемый для нужд системных процессов ОС. Для обработки страниц используются списки свободных, измененных, резервных, нулевых и плохих (не прошедших тест памяти) страниц. Страницы, исключенные из рабочего набора, помещаются в список резервных или список измененных страниц. По мере обработки отказов страниц, страницы изымаются из списка резервных или свободных страниц и включаются в рабочий набор процесса. Набор для практики Вопросы 1. Что такое NTFS? 2. Что такое том и как он может размещаться на логических дисках? 3. Что такое кластер и каков его размер? 4. Что такое logical cluster numbers и как они используются в системе? 5. Что такое Master File Table? 6. Какие возможности обеспечивает транзакционный механизм NTFS? 7. Какие объекты используются для управления безопасностью файлов? 8. Какие возможности обеспечивает утилита FtDisk? 9. Что такое stripe set? 10. Что такое stripe set with parity? 11. Что такое mirror set? 12. Какие протоколы поддерживает сетевой механизм Windows? 13. Как организовано разрешение сетевых имен в Windows? 14. Что такое WinSock? 15. Что такое RPC? 16. Что такое именованный конвейер? 346 17. Что такое mail-слот? 18. Что такое сетевой домен? 19. Что такое redirector? 20. Каким образом и с помощью какого драйвера выполняется доступ к удаленному файлу? 21. Какие системные функции используются для управления системными объектами? 22. Какие функции используются для создания процесса и потока? 23. Что такое волокно и каким образом организуется параллельное выполнение с использованием волокон? 24. Какие классы процессов выделяются системой планирования Windows? 25. Каким образом изменяется квант времени диалогового процесса, если его элемент GUI выбран на экране? 26. Какие методы синхронизации используются для объектов ядра? 27. Какие функции используются для управления виртуальной памятью? 28. Каким образом два процесса могут использовать общую область виртуальной памяти? 29. Какие области физической памяти выделяются системой для каждого потока? 30. Что такое рабочий набор процесса? 31. Что такое системный рабочий набор? 32. Каким образом изменяется рабочий набор при достижении верхнего предела его размера? 33. Какие списки страниц используются системой? Упражнения 1. Разработайте программу визуализации системных структур, используемых для представления файлов в системе NTFS. 2. Используя утилиту PerfMon, изучите и опишите механизм управления рабочими наборами страниц в Windows. 3. Организуйте сетевой домен для своей домашней или офисной локальной сети под управлением Windows. Темы для курсовых работ, рефератов, эссе 1. Обзор архитектуры файловой системы NTFS и ее сравнение с другими системами (реферат). 2. Обзор сетевой подсистемы Windows и поддерживаемых ею сетевых протоколов (реферат). 3. Обзор программного интерфейса Windows для управления объектамси, процессами, памятью (реферат). 4. Обзор механизмов управления рабочими наборами страниц в Windows (реферат). 5. Разработка программы визуализации системных структур, используемых для представления файлов в системе NTFS (курсовая работа). 6. Изучение с помощью утилиты PerfMon и разработка подробного описания механизма управления рабочими наборами страниц в Windows (курсовая работа). 347 348 29. Лекция: Академическая программа Microsoft Shared Source Initiative. Открытое ядро Windows для изучения и исследований (Windows Research Kernel) В лекции рассмотрены следующие вопросы: академическая программа Windows (WAP); исследовательское ядро Windows с открытыми исходными кодами (WRK); комплект учебных материалов по Windows фирмы Microsoft (CRK); проект Oz по созданию исследовательских ОС на базе WRK. Содержание Введение Академическая программа Microsoft Shared Source Initiative Портал Codeplex Академическая программа Microsoft Windows Academic Program Компоненты академической программы Windows Пакет учебных ресурсов CRK Исследовательское ядро Windows Research Kernel Проект ProjectOZ Контактная информация и ссылки Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение При подготовке данной и предыдущей лекций были использованы презентации докладов коллег из Microsoft Redmond Дейва Проберта и Аркадия Ретика на семинаре по операционным системам в Политехническом университете, Санкт-Петербург, октябрь 2007 г. Автор благодарен коллегам за любезно предоставленные материалы. Содержание данной лекции – академические программы Microsoft по операционным системам, открытым исходным кодам и их использование в преподавании и обучении. Академическая программа Microsoft Shared Source Initiative Программа Shared Source Initiative (SSI) — это организационная структура, целью которой является предоставление доступа к исходным кодам продуктов Microsoft для преподавания и исследований. Программа SSI включает в себя технологии и лицензии для частных лиц и организаций. Программа Microsoft Shared Source Initiative решает несколько важных задач: Поддержка заказчиков путем предоставления им возможности упростить разработку собственных приложений, повысить самостоятельность в решении задач и усовершенствовать тестирование систем безопасности; Создание новых возможностей для партнеров Майкрософт по разработке привлекательных решений и услуг, при одновременном уменьшении затрат и обеспечении ускоренного выхода на рынок; Стимулирование новых разработок и разработчиков предоставлением инструментов, сервисных программ и базовых технологий, что позволит изучать и реализовывать новаторские идеи на базе технологий Майкрософт. Содействие обучению и исследованиям благодаря предоставлению учащимся, преподавателям и исследователям передовых технологий для использования на занятиях и в академических публикациях. Отметим принципиальное отличие подхода Shared Source от Open Source: открытый исходный код в статусе Shared Source (в отличие от open source - продуктов, для которых подчас никто не отвечает ни за качество кода, ни за его развитие и изучение) имеет кураторов со стороны фирмы, которая предоставила открытый исходный код (в данном случае – Microsoft). Они отвечают на вопросы и дают консультации и рекомендации, что просто бесценно для академических разработчиков и преподавателей. По личному опыту автора, обра- 349 зец такой поддержки для программы SSCLI (Rotor) фирма Microsoft продемонстрировала с 2002 г., когда на сотни писем с вопросами в почтовой рассылке Rotor следовал незамедлительный, четкий и понятный ответ специалистов Microsoft. За пять лет с момента запуска программы SSI Майкрософт перешла от преимущественного предоставления исходного кода на выборочной основе к публичному предоставлению. Были выпущены три проекта Майкрософт на условиях лицензирования ПО с открытым исходным кодом. Теперь корпорация приступила к совместному использованию кода, о чем свидетельствует создание портала CodePlex (http://www.codeplex.com) и многочисленные проекты Майкрософт на условиях лицензий Microsoft Shared Source. Основные вехи истории программы Shared Source Initiative: Май 2001 г. Запуск SSI. Выпущены в статусе Shared Source продукты: Enterprise SLP (для Windows); Shared Source4 Common Language Infractructure, или Rotor (академическая версия .NET); первые версии Windows CE Shared Source Starter Kit и ASP.NET Starter Kit. Автор курса участвует в академической программе SSCLI / Rotor с 2002 г. Апрель 2004 г. Выпущен набор открытых инсталляторов Windows Installer XML (WiX), первый из трех проектов в рамках программы, ставших доступными на веб-узле SourceForge на условиях обычной публичной лицензии. Октябрь 2005 г. Опубликованы образцы лицензий SSI (Microsoft Reference License, Microsoft Community License, Microsoft Permissive License). Текст лицензий ясен, изложен легким для понимания языком и невелик по объему (каждая лицензия - не более страницы), что облегчает понимание условий лицензирования. Июнь 2006 г. Открыт сайт CodePlex — портал Майкрософт для формирования интерактивного сообщества и выполнения совместных проектов по разработке программного обеспечения. В портале размещены проекты Майкрософт и сообщества. Автор курса со своей командой участвует в проектах, опубликованных на сайте CodePlex: в 2009 г. на нем опубликованы результаты нашего совместного проекта с Microsoft – Parallel Dwarfs (http://paralleldwarfs.codeplex.com) по реализации параллельных алгоритмов решения классических задач прикладной математики на основе новейших технологий параллельного программирования Microsoft. Дополнительные сведения www.microsoft.com/sharedsource. о SSI можно найти на веб-узле Портал Codeplex Сайт CodePlex является одним из расширений программы Microsoft Shared Source Initiative и предоставляет разработчикам портал сетевого сообщества для инновационной деятельности и активного участия в совместных проектах по разработке программного обеспечения. Портал CodePlex создан на базе Visual Studio Team Foundation Server. Каких-либо лицензионных ограничений не существует; разработчики в полной мере вольны выбирать тип лицензии, наилучшим образом отвечающий их потребностям. Более 1000 проектов; приблизительно 10% являются проектами Майкрософт, остальные были предложены сообществом. Дополнительные сведения о CodePlex доступны на веб-узле www.codeplex.com. Приведем цитату по поводу CodePlex из википедии - свободной Web-энциклопедии: "CodePlex — это веб-узел корпорации Майкрософт, размещающий проект открытого исходного кода. Он предназначен для совместной разработки программных проектов с открытым исходным кодом. Его функциональные возможности включают вики-страницы, управление источниками на базе Team Foundation Server, дискуссионные форумы, отслеживание проблем, разметку проектов, поддержку RSS, статистику и релизы". Академическая программа Microsoft Windows Academic Program Академическая программа Windows (WAP) – это уникальная программа, организованная фирмой Microsoft для изучения на основе открытых исходных кодов операционных 350 систем семейства Windows, включая как новейшие ОС типа Windows NT / 2000 / 2003 / 2008 / Vista / 7, так и версии Windows для встроенных систем (Windows Embedded). Еще 10 лет назад трудно было даже представить, что Microsoft предпримет столь беспрецедентный шаг – откроет "святую святых" – исходный код ядра Windows. Ныне, в течение нескольких лет, это оказалось возможным. Поэтому у студентов, аспирантов, преподавателей и исследователей есть, без преувеличения, уникальный шанс изучить Windows "изнутри" и тем самым получить полное практическое представление об организации современной ОС. Целm программы WAP, сформулированная фирмой Microsoft, - способствовать повышению интереса к исследованиям и преподаванию базовой операционной системы. Как отмечает Дейв Проберт, менеджер по разработке Windows, ныне Microsoft необходимы новые свежие идеи по разработке ОС. Очень важен также интерес к ОС студентов, так как именно в предмете операционных систем воплотилось сочетание изучения математических методов, методов информатики и практической программной инженерии – архитектуры и механизмов сложнейшего программного продукта – современной операционной системы. В результате программы WAP корпорация Майкрософт получит лучше подготовленных пользователей, партнеров, а некоторые из них, возможно, станут сотрудниками Microsoft. Очень важны для Microsoft фундаментальные новаторские разработки ОС, а также возможность расширить использование Windows в образовании. Мотивация студентов, аспирантов и преподавателей, особенно молодежи, для участия в программе WAP вполне понятна. Обсудим лишь некоторые ее аспекты: Научная любознательность – приведены примеры типичных высказываний: o "Хотелось бы понять, почему Windows пользуется таким успехом... o "Отличается ли коммерческое ПО от ПО с открытым исходным кодом?" o "Было бы интересно сравнить Windows с другими ОС" Карьерные устремления: o "Хочу получить хорошую работу по завершении учебы". o "Я хочу работать на корпорацию Майкрософт". Хобби: o "Хочу разработать более совершенную игру..." o "Хотелось бы узнать побольше..." Компоненты академической программы Windows Программа WAP предлагает академическим участникам следующие компоненты: Пакет Windows Operating Systems Internals Curriculum Resource Kit (CRK) — презентации, эксперименты, лабораторные работы, тесты и задания для включения учебных примеров по ядру Windows в учебные курсы по операционным системам. Доступен на академическом сайте Microsoft. Windows Research Kernel — основные исходные коды ядра, аннотированные подробными комментариями, и двоичные файлы, интегрированные со средой для создания и тестирования экспериментальных версий ядра Windows в целях обучения и исследования. Книга об архитектуре Windows типа NT, являющаяся частью WRK, содержит более 40 спецификаций. WRK доступен на академическом сайте Microsoft. ProjectOZ — проект создания среды операционных систем с использованием встроенных интерфейсов ядра Windows для выполнения в пользовательском режиме простых и ясных абстракций процессора, диспетчера памяти, механизма ловушек и физической памяти, которые могли бы применяться в экспериментах, связанных с исследованием принципов работы операционных систем. Все указанные компоненты www.microsoft.com/WindowsAcademic. программы WAP доступны Ресурсы для преподавателей выпущены также на компакт-диске. Пакет учебных ресурсов CRK Цели проекта CRK: 351 на сайте Объединение ресурсов по предмету основной ОС: презентационных материалов, лабораторных работ, заданий, тестов, сервисных программ Sysinternals и средств отладки; Предоставление справочных материалов и примеров внедрения: материалы для углубленных занятий по ОС, образцы исходного кода WRK; Предоставление кратких сведений о лицензировании: условия некоммерческого академического использования; обсуждение возможности изменения и создания проектов на основе CRK. Пакет CRK основан на материалах 4-го издания книги Windows Internals ("Внутренняя структура ОС Windows"). Авторы книги — М.Руссинович (M. Russinovich) и Д.Соломон (D. Solomon) при участии профессора Андреаса Польце (Andreas Polze), Институт ХассоПлаттнера, Германия. Книга охватывает все разделы ACM/IEEE-CS OS BOK и другие темы. Материал для изучения "масштабируется" на несколько уровней, имеет модульную структуру (может использоваться целиком или по частям). Приведено большое число учебных примеров. Каждый раздел включает базовые и расширенные модули. Базовые модули содержат материалы, предназначенные для включения в полный учебный курс по ОС базового уровня продолжительностью в один семестр. Расширенные модули содержат материалы, предназначенные для включения в курс углубленного изучения ОС продолжительностью в один семестр. Во всех разделах приводятся образцы исходного кода. Всего CRK включает около 100 часов инструктивных и учебных материалов: Полная версия CRK стала доступной в феврале 2006 года. Содержимое первого этапа обновлено. Теперь все разделы содержат ссылки на исходный код, который находится на компакт-диске и на академическом сайте. Использование CRK. Пакет CRK - самый популярный на настоящее время компонент учебного процесса MSDN Academic Alliance (MSDNAA). Используется преимущественно в лекциях во многих университетах - включается в уже имеющиеся презентации (для студентов старших курсов). На основе CRK может быть также разработан факультативный курс по ОС на базе Windows для аспирантов. CRK полезен для самообразования. Он содержит список дипломных проектов для выпускного курса, а также список тем для исследований, - возможных тем для кандидатских диссертаций. CRK предоставляет богатый набор лабораторных ресурсов (руководства, служебные программы и инструменты). Исследовательское ядро Windows Research Kernel Цели уникального проекта по предоставлению академическому сообществу исходных кодов ядра Windows состоят в следующем: Облегчить преподавателям и учащимся сравнение и нахождение различий в отношении Windows и других операционных систем; Предоставить учащимся возможность изучать исходный код, вносить изменения и создавать проекты; Обеспечить действенную поддержку исследованиям и публикациям по ОС; Способствовать изданию большего числа учебников по ОС и предназначенных для университетов книг по внутренней организации ядра Windows; Упростить лицензирование, чтобы разрешить использование исходных кодов Windows на классных занятиях и в лабораторных работах. Исследовательское ядро WRK основано на исходных кодах ОС NT Windows Server 2003 SP1 и Windows x64. Объем - более 800 тысяч строк исходного кода ядра Windows. Код несколько упрощен, добавлены и упорядочены комментарии, исправлены опечатки. Еще раз отметим, что код WRK представляет собой подлинные спецификации и проектную документацию по Windows типа NT. Использование WRK. Комплекс WRK может быть использован прежде всего для лабораторных работ по программированию – например, для внесения изменений или создание проектов в целях преподавания и проведения экспериментов. Пример возможного проекта: планирование в ОС на основе round-robin (справедливого раздела). WRK может быть использован также для детального изучения исходного кода, что особенно удобно, если для обучения используется пакет CRK. 352 WRK может быть использован для студенческих проектов для выпускного курса (дипломов, магистерских диссертаций). WRK также является хорошей основой для перспективных исследований в рамках кандидатских диссертаций. Проект ProjectOZ Цель ProjectOZ — создание экспериментальной среды для проектов по операционным системам. Студентам и преподавателям предоставляется среда для проектов ОС с использованием API-интерфейса NT. Обеспечиваются в пользовательском режиме простые абстракции. Применяются реальные функциональные возможности ОС, а не "игрушечное" моделирование. В целях преподавания и проведения экспериментов понижен уровень сложности. В простой среде разработки применяются стандартные средства для сборки, отладки и создания инструментария. Поддерживаются эксперименты, связанные с исследованием принципов работы ОС. Поощряется образ мыслей учащихся, направленный на создание готовых к использованию программных продуктов. Архитектура ProjectOZ: Нагрузки, тесты, инструментарий Проекты и эксперименты учащихся Первоначальная реализация ОС (небольшой объем кода, побуждает учащихся добиваться более высокого результата); Продвинутый уровень - обеспечиваемые SPACE* абстракции ЦП, диспетчера памяти, ловушек. Разработан на основе проекта SPACE Калифорнийского университета (Санта-Барбара, США). В области лабораторных работ по программированию ОС UNIX на сегодняшний день представлена лишь в виде "игрушечной" ОС (Minix) или симуляторов Nachos и XINU. Для сравнения, ProjectOZ – часть программы WAP - предоставляет среду для разработки учебных и исследовательских проектов по операционным системам с использованием ядра Windows - API-интерфейсов NT. ProjectOZ достаточно прост, но, тем не менее, обеспечивает реальные функциональные возможности ОС и простую среду разработки с инструментами для сборки, отладки и разработки инструментария. ProjectOZ выполняется в пользовательском режиме в стандартной системе Windows, благодаря использованию возможностей архитектуры подсистем Windows. Уровень SPACE проекта ProjectOZ поддерживает более сложные абстракции оборудования. Базовый уровень проекта, BasicOZ, предоставляет основные примитивы функций операционной системы. Поэтому времени на обучение требуется совсем немного, и учащиеся смогут очень быстро перейти к созданию собственных проектов, расширяя BasicOZ. Контактная информация и ссылки В заключение лекции, в данном разделе приведем контактные ссылки, любезно предоставленные специалистами Microsoft. Пакет CRK доступен для бесплатной загрузки из репозитория Academic Alliance Curriculum Repository на веб-узле MSDN: www.msdnaacr.net/curriculum/pfv.aspx?ID=6191 ProjectOZ доступен для бесплатной загрузки из репозитория Academic Alliance Repository на веб-узле MSDN www.msdnaacr.net/curriculum/pfv.aspx?ID=6547 WRK предназначен исключительно для преподавательского состава, доступ защищен паролем. Доступен также для загрузки коллективным подписчикам MSDNAA кафедрам и факультетам учебных заведений. http://msdn.microsoft.com/subscriptions/. Индивидуальный доступ преподавателей к WRK возможен через портал FacultyConnection www.microsoft.com/education/facultyconnection/. Обратная связь со специалистами Microsoft во всем описанным вопросам: [email protected] Дополнительные сведения о WAP и по смежным темам содержатся на сайте: www.microsoft.com/WindowsAcademic 353 Форумы для обсуждений и общения с группой ядра и архитектуры Windows поддерживается на портале http://forums.microsoft.com/WindowsAcademic . Ключевые термины CodePlex (http://www.codeplex.com) – портал, открытый фирмой Microsoft для использования сообществом разработчиков при разработках с открытым исходным кодом. Parallel Dwarfs (http://paralleldwarfs.codeplex.com) – совместный проект СПбГУ (под руководством проф. В.О. Сафонова) и Microsoft по реализации параллельных алгоритмов решения классических задач прикладной математики ("dwarfs") на основе новейших технологий параллельного программирования Microsoft. Shared Source – вид условий распространения программного продукта с открытым кодом, при которых, в отличие от Open Source, открытый исходный код имеет кураторов со стороны фирмы, предоставившей его в открытый доступ; кураторы отвечают на вопросы пользователей и исследователей и дают рекомендации по развитию и сопровождению кода. Shared Source Common Language Infrastructure (SSCLI, Rotor) - академическая версия .NET, распространяемая с открытыми исходными кодами для использования в преподавании и в исследованиях. Академическая программа Windows (WAP) – программа, организованная фирмой Microsoft для изучения на основе открытых исходных кодов операционных систем семейства Windows, включая как новейшие ОС типа Windows NT / 2000 / 2003 / 2008 / Vista / 7, так и версии Windows для встроенных систем. Исследовательское ядро Windows (Windows Research Kernel) — исходные коды ядра Windows типа NT, аннотированные подробными комментариями, и двоичные файлы, интегрированные со средой для создания и тестирования экспериментальных версий ядра Windows в целях обучения и исследования; часть программы WAP. Пакет Windows Operating Systems Internals Curriculum Resource Kit (CRK) — пакет презентаций, экспериментов, лабораторных работ, тестов и заданий для включения учебных примеров по ядру Windows в учебные курсы по операционным системам; часть программы WAP. Проект ProjectOZ — проект создания среды операционных систем с использованием встроенных интерфейсов ядра Windows для выполнения в пользовательском режиме простых и ясных абстракций процессора, диспетчера памяти, механизма ловушек и физической памяти, которые могли бы применяться в экспериментах, связанных с исследованием принципов работы операционных систем; часть программы WAP. Программа Shared Source Initiative (SSI) —организационная структура, целью которой является предоставление доступа к исходным кодам продуктов Microsoft для преподавания и исследований. Краткие итоги Для использования при обучении и в исследованиях открырых исходных кодов продуктов фирмы Microsoft, фирма Microsoft организовала академическую программу Shared Source Initiative (SSI). Она включает более 150 проектов, в ней участвуют более 2 млн. академических разработчиков. Для развития программы SSI открыт портал CodePlex, поддерживающий проекты с открытым исходным кодом. Для изучения и развития системы Windows на основе ее открытых исходных кодов фирма Microsoft организовала программу Windows Academic Program (WAP). Целью Microsoft в этой программе является не только более широкая популяризация и более глубокое изучение Windows пользователями, но и привлечение свежих оригинальных идей и молодых талантливых академических разработчиков к тематике операционных систем и системы Windows. Основные компоненты Windows Academic Program: исследовательское ядро Windows (Windows Research Kernel – WRK) – аннотированные и документированные исходные коды ядра Windows типа NT; 354 пакет Windows Internals Curriculum Resource Kit (CRK) – пакет учебных материалов по внутренней архитектуре Windows; проект ProjectOZ – проект создания среды операционных систем типа Windows для экспериментов и исследований в области ОС. Эти компоненты свободно доступны на академическом портале Windows. Для преподавателей выпущен также компакт-диск с этими учебными ресурсами. Пакет учебных ресурсов CRK основан на материале уникальной книги Д. Соломона и М. Руссиновича по внутренней архитектуре ОС Windows. Исследовательское ядро Windows содержит более 800 тыс. строк исходного кода, основанного на коде ядра ОС Windows Server 2003 SP1 и Windows x64. К исходным кодам прилагаются подлинные спецификации и проектная документация по ядру Windows. Цель проекта ProjectOZ – создание экспериментальной среды для исследовательских проектов в области операционных систем. Он составлен на основе проекта SPACE Калифорнийского университета в Санта-Барбаре. В заключение лекции приведены ссылки на описанные академические ресурсы. Набор для практики Вопросы 1. Что такое программа Microsoft Shared Source Initiative (SSI) и каковы ее цели? 2. Какие программные продукты в статусе shared source выпущены в рамках программы SSI? 3. Что такое SSCLI / Rotor? 4. Какой портал открыт фирмой Microsoft для поддержки разработки исследовательских проектов с открытым исходным кодом? 5. Какая академическая программа открыта фирмой Microsoft для изучения и развития Windows и каковы ее цели? 6. Из каких компонент состоит программа WAP? 7. Что такое WRK? 8. Что такое CRK? 9. Что такое ProjectOZ? Упражнения 1. Создайте собственный проект с открытым исходным кодом на портале CodePlex, опубликуйте на нем краткое описание проекта, открытый исходный код, поддерживайте форум с обсуждением вашего проекта. 2. Скачайте и изучите проект ParallelDwarfs () . 3. Изучите Windows Research Kernel и подготовьте краткий обзор исходных кодов WRK. 4. Создайте собственный исследовательский проект на основе ProjectOZ по разработке части операционной системы (например, диспетчера процессов). Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. 6. Обзор программы Microsoft Shared Source Initiative (SSI) (реферат). Обзор программы Windows Academic Program (реферат). Обзор WRK (реферат).http://paralleldwarfs.codeplex.com Обзор CRK (реферат). Обзор ProjectOZ (реферат). Создание собственного проекта с открытым исходным кодом на портале CodePlex (курсовая работа). 7. Изучение проекта ParallelDwarfs (http://paralleldwarfs.codeplex.com) и подготовка его обзора (курсовая работа). 8. Изучение Windows Research Kernel и подготовка его обзора (курсовая работа). 9. Создание собственного исследовательского проекта на основе ProjectOZ по разработке части операционной системы, по выбору студента (например, диспетчера процессов) (курсовая работа). 355 356 30. Лекция: ОС для мобильных устройств. Windows Mobile В лекции рассмотрены следующие вопросы: особенности мобильных устройств и операционных систем для мобильных устройств; обзор рынка ОС для мобильных устройств: Windows Mobile, Symbian OS, Google Android, Blackberry OS и др. Содержание Введение Особенности ОС для мобильных устройств Рынок ОС для мобильных устройств Windows Mobile Symbian OS Google Android BlackBerry OS Перспективы ОС для мобильных устройств Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Мобильные устройства стали неотъемлемой частью повседневной жизни и деятельности большинства людей во всем мире. Поэтому операционные системы для мобильных устройств в настоящее время бурно развиваются. Данная лекция является кратким обзором ОС для мобильных устройств. Особенности ОС для мобильных устройств К мобильным устройствам принято относить мобильные телефоны, смартфоны и коммуникаторы. Разработчики ОС для мобильных устройств работают над тем, чтобы приблизить возможности этих ОС к возможностям ОС для настольных и портативных компьютеров. Однако в ОС для мобильных устройств есть своя специфика. Их основные особенности следующие. Учет более жестких ограничений по памяти мобильных устройств. Хотя мобильные устройства активно развиваются, по своим параметрам (объему памяти, быстродействию процессора) они все же пока уступают настольным компьютерам. Поэтому приложения для мобильных устройств, требующие большого объема памяти, воспроизводятся на мобильных устройствах с неполными возможностями. Ряд инструментов, например, Java, также доступны для мобильных устройств в специальных версиях, разработанных с целью экономии памяти, с ограничениями, не свойственными классическим версиям: на мобильных устройствах работает Java Micro Edition (JME), а не полная версия – Java Standard Edition (JSE) для настольных компьютеров. В ней, например, отсутствует вещественная арифметика в Java и ряд других важных возможностей. Учет более низкой скорости процессора. По сравнению с настольными компьютерами, аналоги настольных приложений на мобильных устройствах работают заметно медленнее: например, медленно открывается изображение на экране мобильного телефона, текстовый файл для просмотра и т.д. Это неудобно для пользователей и, по-видимому, будет преодолено в последующих версиях самих мобильных устройств и их ОС. Учет особенностей экранов и экранных навигаторов конкретных моделей мобильных устройств. Многие типы мобильных устройств различных фирм имеют существенно разные экраны и различные виды экранных навигаторов (трэкбол и др.). При разработке ОС и сервисных программ для мобильных устройств эти различия приходится учитывать, что осложняет разработку программного обеспечения. Совместимость с основными форматами файлов: .doc/docx, .ppt/.pptx, .pdf, .jpg и др. При работе на мобильном устройстве необходимо иметь возможность визуализировать, редактировать и создавать файлы тех же привычных форматов, что и на настольных компьютерах. Обеспечение такой совместимости – одна из важных задач ОС и сервисных программ для мобильных устройств. 357 Мультимедийные возможности: рисунки, видео, аудио, обмен мультимедийными сообщениями. Обработка мультимедийной информации для мобильных устройств особенно важна: пользователи должны иметь возможность сделать фотографии, снять видео, просмотреть их на мобильном устройстве, опубликовать в Интернете, послать на настольный компьютер или в виде сообщения своим корреспондентам. Поддержка коммуникационных и сетевых технологий: Wi-Fi / WiMAX, Bluetooth, GPRS, EVDO, GSM, CDMA. Мобильное устройство и его ОС должны обеспечивать для пользователей возможность современных видов коммуникации в беспроводных сетях. Рынок ОС для мобильных устройств В настоящее время на рынке мобильных устройств используется несколько десятков наиболее распространенных ОС. Некоторые из них разработаны на основе свободно распространяемого ядра Linux. Ведущие фирмы-производители мобильных устройств поддерживают собственные ОС либо ОС, приобретенные вместе с их фирмами-разработчиками. Наиболее распространенные ОС для мобильных устройств следующие: Nokia Symbian OS Google Android Windows Mobile Blackberry OS. Apple iPhone OS Samsung Bada PalmOS. В данной лекции мы рассмотрим первые четыре семейства ОС для мобильных устройств как наиболее популярные. Windows Mobile Windows Mobile – семейство ОС для мобильных устройств фирмы Microsoft. Оно относится к семейству Windows CE (Consumer and Embedded) – Windows для встроенных систем. Ядро ОС Windows Mobile основано на ОС Windows CE. Текущая версия Windows Mobile (2010) – Windows Phone Classic 6.5. В США Windows Mobile - третья по популярности ОС для мобильных устройств (после Blackberry OS и iPhone OS). Windows Mobile поддерживает следующие виды мобильных устройств: PocketPC, смартфоны, коммуникаторы (например, Qtek). Первая версия Windows Mobile была выпущена в 1996 г. Windows Mobile: возможности и ПО. ОС Windows Mobile предоставляет разнообразный набор возможностей и программного обеспечения: Office Mobile – аналог Microsoft Office для мобильных устройств; полная совместимость по форматам; Windows Media Player – мультимедийный проигрыватель, аналог проигрывателя для настольной версии Windows; Internet Explorer Mobile – Web-браузер, аналог Internet Explorer для настольной версии Windows; Программное обеспечение для поддержки Bluetooth и Wi-Fi – современных видов коммуникации; Программное обеспечение Microsoft ActiveSync для синхронизации данных с настольными компьютерами. Windows Mobile поддерживает пользовательский интерфейс с мобильным устройством с помощью касания экрана стайлусом и пальцами, в том числе (в современных версиях) – multi-touch. Новые версии Windows Mobile поддерживают также .NET Compact Framework, что дает возможность выполнения приложений для платформы .NET на мобильных устройствах. Версии Windows Mobile 6. Начиная с версии 6, Windows Mobile выпускается в трех основных версиях: Windows Mobile 6 Classic — для КПК Windows Mobile 6 Professional — для коммуникаторов Windows Mobile 6 Standard — для смартфонов. 358 Пользовательский интерфейс Windows Mobile 6.5 представлен на рис. 30.1. Рис. 30.1. Пользовательский интерфейс Windows Mobile 6.5 Как видно из рисунка, он очень похож на пользовательский интерфейс настольных версий Windows, что существенно облегчает работу пользователей. Перспективы Windows Mobile. На наш взгляд, ОС Windows Mobile имеет большие перспективы, хотя все сложнее и сложнее становится конкуренция с другими популярными ОС, прежде всего, с ОС фирм Apple (iPhone OS) и Google (Android). В целях конкуренции фирма Microsoft развивает новый проект – Microsoft KIN, новый смартфон, конкурирующий с Apple iPhone. Symbian OS Symbian OS – наиболее распространенная в настоящее время ОС для мобильных устройств, разработанная консорциумом Symbian (Nokia, Ericsson, Psion, Motorola), основанным в 1998 г. Фирма Nokia финансирует объединение Symbian Foundation, целью которого является разработка и поддержка единой (для мобильных устроцств различных компаний) мобильной платформы на основе Symbian OS. Symbian OS hазработана на основе ОС Psion EPOC32 (фирмы Psion). Язык реализации системы – C++; имеется также поддержка Java. Наиболее распространенные версии – Symbian OS Series 60 2nd edition; 3rd edition. По данным на конец 2009 г., 47% смартфонов в мире используют Symbian OS. Для сравнения, показатели использования других ОС: Blackberry OS – 20%, Windows Mobile – около 9%, Google Android – около 5%. Возможности Symbian OS. Symbian OS поддерживает удобный пользовательский интерфейс и имеет значительное число сервисных программ, в том числе – разработанных фирмой-производителем Nokia. Основные возможности для пользователя следующие: Меню с иконками приложений; Список контактов; Поддержка встроенной фото- и видеокамеры, галереи изображений и видеоклипов; Обработка файлов, управление памятью (SmartMedia); Web-браузер; Электронная почта; Обмен сообщениями SMS и MMS; Поддержка GPS-навигации; Редакторы фото и видео; Поддержка Java Micro Edition - загрузки и исполнения мидлетов; Библиотека приложений фирмы Nokia. 359 Google Android Google Android – стек приложений для мобильных устройств, включающий операционную систему (на базе ядра Linux), промежуточное программное обеспечение (middleware) и сервисные программы. Система Android разработана фирмой Android, Inc., приобретенной компанией Google (2005). В настоящее время (2010 г.) это четвертая по популярности ОС для смартфонов в США. Важной особенностью Google Android является то, что сервисные программы и библиотеки этой системы написаны на Java. Возможности Google Android. Прежде всего, Google Android привлекает пользователей своим удобным и эстетичным пользовательским интерфейсом, который разработан с использованием двумерной и трехмерной графики (библиотеки OpenGL). Основные возможности системы следующие: СУБД SQLite для хранения данных; Поддерживаемые сетевые технологии: GSM/EDGE, Bluetooth, Wi-Fi, WiMAX, Bluetooth 2.0; Обмен сообщениями SMS и MMS; Web-браузер на базе WebKit Application Framework. IDEN, CDMA, EV-DO, UMTS, Поддержка Java. Фирма Google по принципиальным соображениям использует в системе Android собственную реализацию Java – Dalvik Virtual Machine, разработанную специально для мобильных устройств. По мнению специалистов Google, cтандарт Java Micro Edition (JME) устарел, так как рассчитан на устаревшие типы мобильных устройств и их технические возможности. Поэтому в Google Android стандарт JME не поддерживается. Поддержка мультимедиа. В системе Google Android имеются кодеки для всех распространенных мультимедийных стандартов, программное обеспечение для обработки мультимедийных файлов и взаимодействия с видео- и аудиоустройствами. Поддержка разработки приложений. Система Google Android имеет свою собственную интегрированную среду для разработки приложений - Android SDK, включающий эмулятор мобильных устройств, средства отладки, профилирования, а также plug-in к популярной среде Eclipse для разработки Java-приложений. Пользовательский интерфейс Google Android представлен на рис. 30.2. Рис. 30.2. Пользовательский интерфейс Google Android 360 BlackBerry OS Blackberry OS - ОС для мобильных устройств с базовым набором приложений, работающая на смартфонах и коммуникаторах фирмы Research and Motion (RIM) – например, BlackBerry Torch 9800. Современная версия системы (2010) – BlackBerry OS 6.0. Возможности BlackBerry OS. BlackBerry OS поддерживает широкий набор возможностей для пользователей, в том числе: Пометка сообщений и установка времени напоминаний на смартфоне BlackBerry; Просмотр вложенных папок персональных контактов и редактирование контактов. BES (BlackBerry Enterprise Server) вставляет все пользовательские контакты в приложение Contacts, даже если они находятся в различных папках; Просмотр и использование контактов, расположенных в общих папках, и копирование их в локальный список контактов пользователя, при наличии разрешения; Программа просмотра файлов для доступа в общие сетевые ресурсы с возможностью открывать, добавлять и сохранять документы. Возможность просмотра информации о документе, в том числе типа файла, размера и даты; Отправка приглашения на встречи и записи календаря со смартфона BlackBerry; Возможность добавлять, удалять, перемещать и переименовывать персональные папки; Возможность просматривать личный список рассылки в контактах Outlook и отправлять письма по нему; Фирма RIM также работает над решением, которое позволит письмам, пришедшим со смартфона, выглядеть так же, как если бы они были отправлены из Microsoft Outlook. Новые возможности BlackBerry OS 6.0 (август 2010): Новый пользовательский интерфейс предназначенный для широкого использования Multitouch-жестов, но при этом сохраняющий возможности управления с помощью трэкбола; Структура рабочего стола, аналогичная операционным системам Apple iOS и Android; Улучшенные мультимедийные возможности ОС; Улучшенные возможности для веб-серфинга: в новой версии ОС используется мобильный браузер на основе инструмента WebKit, что позволяет запускать вебприложения, написанные на языке HTML 5; Упрощенный доступ к мобильным сообщениям, электронной почте и социальным сетям. Перспективы ОС для мобильных устройств В связи с активным развитием мобильных устройств, операционные системы для них имеют большие перспективы развития. На наш взгляд, основными направлениями дальнейшего развития ОС для мобильных устройств являются: Улучшение и упрощение пользовательского интерфейса; Улучшенная графика; Более широкие мультимедийные возможности; Развитие набора сервисных и игровых программ; Обеспечение полной совместимости с настольными компьютерами и с используемыми на них форматами файлов; Продолжение и развитие использования платформы Java для мобильных устройств; все ведущие производители мобильных устройств поддерживают платформу Java, что является гарантией развития самой Java-технологии; Развитие самих мобильных устройств: улучшение разрешения экранов, ускорение процессоров, увеличение объема памяти, реализация новых быстрых коммуникационных технологий, и поддержка этих новых возможностей в ОС для мобильных устройств. Ключевые термины Blackberry OS - ОС для мобильных устройств с базовым набором приложений, работающая на смартфонах и коммуникаторах фирмы Research and Motion (RIM). 361 Google Android – стек приложений для мобильных устройств, включающий операционную систему (на базе ядра Linux), промежуточное программное обеспечение (middleware) и сервисные программы. Symbian OS – наиболее распространенная в настоящее время ОС для мобильных устройств, разработанная консорциумом Symbian (Nokia, Ericsson, Psion, Motorola) Windows CE (Consumer and Embedded) – версия Windows для встроенных систем. Windows Mobile – семейство ОС для мобильных устройств фирмы Microsoft. Краткие итоги В настоящее время ОС для мобильных устройств бурно развиваются, как и сами эти устройства – мобильные телефоны, смартфоны, коммуникаторы. Особенности ОС для мобильных устройств: учет ограничений по памяти и невысокой скорости процессора, учет особенностей и различий экранов и экранных навигаторов различных моделей мобильных устройств, совместимость со всеми основными форматами файлов, инструменты для обработки мультимедийной информации, поддержка современных коммуникационных и сетевых технологий. Наиболее распространенные ОС на рынке ОС для мобильных устройств: Nokia Symbian OS, Google Android, Windows Mobile, Blackberry OS, Apple iOS, Samsung Bada, PalmOS. Windows Mobile – ОС для мобильных устройств фирмы Microsoft, поддерживающая на мобильных устройствах пользовательский интерфейс и возможности, аналогичные Windows для настольных компьютеров. Это третья по популярности ОС для смартфонов. Windows Mobile предлагает широкий набор программных средств, аналогичных популярным программам для настольных Windows-машин: Office Mobile, Windows Media Player, Internet Explorer Mobile и др. Начиная с версии 6, Windows Mobile выпускается в трех вариантах: Windows Mobile 6 Classic — для КПК, Windows Mobile 6 Professional — для коммуникаторов, Windows Mobile 6 Standard — для смартфонов. В новой версии Windows Mobile улучшена поддержка Wi-Fi и Bluetooth и реализован ряд других возможностей, подробно описанных в лекции. Несмотря на хорошие перспективы, Windows Mobile все труднее выдерживать конкуренцию с Apple iPhone OS и с Google Android. Развивается новый проект Microsoft – Microsoft KIN – проект нового смартфона, конкурирующего с Apple iPhone. Symbian OS – наиболее популярная ОС для мобильных устройств, разработанная консорциумом компаний Symbian и поддерживаемая фирмой Nokia, использующей Symbian OS для всех своих моделей мобильных телефонов. Разработана на основе ОС Psion EPOC32. Реализована на языке C++. На конец 2009 г. 47% пользователей смартфонов в США используют Symbian OS. Symbian OS поддерживает традиционный набор возможностей. Следует особо отметить библиотеки программ фирмы Nokia. Google Android – ОС для мобильных устройств фирмы Google, разработанная на основе ядра Linux. Это четвертая по распространенности ОС для мобильных устройств. Ее характерные черты – высококачественная двумерная и трехмерная графика, разработка и поддержка разработки приложений на Java. BlackBerry OS – ОС для мобильных устройств, работающая на популярных в США коммуникаторах BlackBerry фирмы RIM. Современная версия – BlackBerry OS 6.0. Структура рабочего стола в BlackBerry OS аналогична конкурентам. Характерные особенности BkackBerry OS: удобный интерфейс для контактов, для мобильных сообщений, электронной почты, облегченный доступ к социальным сетям. Перспективы ОС для мобильных устройств весьма многообещающие: улучшение и упрощение пользовательского интерфейса; улучшенная графика; более широкие мультимедийные возможности; развитие набора сервисных и игровых программ; совместимость с ПК и с форматами файлов; продолжение и развитие использования платформы Java для мобильных устройств; развитие самих мобильных устройств: улучшение разрешения экранов, ускорение процессоров, увеличение объема памяти, реализация новых быстрых коммуникационных технологий. 362 Набор для практики Вопросы 1. Каковы основные разновидности мобильных устройств? 2. Каковы основные особенности ОС для мобильных устройств? 3. С какими основными форматами файлов необходимо обеспечить совместимость в ОС для мобильных устройств? 4. Какие коммуникационные технологии поддержаны в ОС для мобильных устройств? 5. Назовите наиболее широко используемые ОС для мобильных устройств. 6. Что такое Windows Mobile? 7. Ядро какой ОС использует Windows Mobile? 8. Какие основные офисные и сервисные приложения предоставляет Windows Mobile? 9. Какие современные версии (виды) Windows Mobile используются в настоящее время? 10. Каковы новые возможности Windows Mobile 6.1? 11. Что такое Symbian OS? 12. Какой компанией и на каком языке разработана Symbian OS? 13. Каковы основные возможности Symbian OS? 14. Какая ОС для мобильных устройств наиболее распространена в настоящее время? 15. Что такое Google Android? 16. Ядро какой ОС использует Google Android? 17. Каковы основные возможности Google Android? 18. Какую реализацию Java использует Google Android? 19. Каковы инструменты разработки приложений для Google Android? 20. Что такое BlackBerry OS? 21. Каковы основные возможности BlackBerry OS? 22. Каковы перспективы и направления дальнейшего развития ОС для мобильных устройств? Упражнения 1. Проанализируйте возможности Windows Mobile, Google Android, Symbian OS, BlackBerry OS и сформулируйте, в чем преимущества и недостатки каждой из них, по сравнению со своими конкурентами. 2. Разработайте Java-приложение (мидлет), реализующее игру в крестики-нолики (ticktack-toe) на доске 3x3 для Google Android, используя плагин для Eclipse и эмулятор мобильных устройств Google Android. Темы для курсовых работ, рефератов, эссе 1. Аналитический обзор и сравнение возможностей ОС для мобильных устройств (реферат). 2. Обзор ОС Windows Mobile (реферат). 3. Обзор Symbian OS (реферат). 4. Обзор Google Android (реферат). 5. Обзор BlackBerry OS (реферат). 6. Разработка Java-приложения (мидлета), реализующего игру в крестики-нолики (ticktack-toe) на доске 3x3 для Google Android, используя плагин для Eclipse и эмулятор мобильных устройств Google Android (курсовая работа). 363 364 31. Лекция: ОС для облачных computing). Windows Azure вычислений (cloud В лекции рассмотрены следующие вопросы: понятие облачных вычислений (cloud computing) и особенности их организации; сервисы; центры обработки данных; обзор ОС и инструментов для облачных вычислений; Microsoft Windows Azure, ее особенности, преимущества и лидирующая роль в развитии облачных вычислений; платформа Microsoft.NET как базис для архитектуры Windows Azure; перспективы ОС для облачных вычислений. Содержание Введение Элементы концепции и архитектуры облачных вычислений Windows Azure Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе Введение Понятие облака (cloud) уже давно ассоциируется с метафорическим изображением Интернета, с помощью которого доступны некоторые сервисы. Облачные вычисления (сloud computing) – это практическая реализация данной идеи. Облачные вычисления основаны на масштабированных и виртуализованных ресурсах (данных и программах), которые доступны пользователям через Интернет и реализуются на базе мощных центров обработки данных (data centers). С пользовательской точки зрения, имеются доступные "облака", предоставляемые различными компаниями, которые можно использовать для доступа к мощным вычислительным ресурсам, отсутствующим у пользователя (который может работать, например, на нетбуке). Пользователь платит абонентскую плату за использование облачных сервисов какой-либо фирмы. Недостатком данного подхода является полная зависимость пользователя от используемого им облака, так как через облако доступны не только программы, но и данные самого пользователя. Возникает много вопросов относительно безопасности данных пользователя, хранимых в облаке. Из облачных платформ наиболее популярной является Microsoft Windows Azure - операционная система с поддержкой облачных вычислений - и Microsoft Azure Services Platform - платформа для разработки и использования облачных сервисов на базе Microsoft.NET. В настоящее время многие крупные компании – Microsoft, Google. IBM, Oracle/Sun, Amazon и многие более мелкие фирмы, конкурируя друг с другом, заняты разработкой своих облачных сервисов и инструментов для их создания. Имеется тенденция к интеграции "корпоративных облаков" в единое доступное пользователю облако. Элементы концепции и архитектуры облачных вычислений Элементами концепции облачных вычислений являются: инфраструктура как сервис, платформа как сервис, программное обеспечение как сервис, а также бизнесприложения доступные через Интернет. Иными словами, организация облачных вычислений коренным образом меняет архитектуру системы: в ней необходимо представить все возможности обработки данных, использования программ настройки и т.д. как облачные сервисы. Различаются следующие уровни архитектуры облачных вычислений. Уровень клиента – это клиентское ПО, используемое для доступа к облачным сервисам, например, web- браузер. Уровень сервисов – это сами сервисы, используемые через облачную модель. 365 Уровень приложений – это программы, доступные через облако и не требующие инсталляции на компьютере пользователя (в последнем – одно из главных преимуществ облачной модели). Уровень платформы – это программная платформа, объединяющая полный набор инструментов для развертывания и использования облачных вычислений на пользовательском компьютере (без дополнительных инсталляций, покупки оборудования и др.). Пример такой платформы: Microsoft.NET Azure Services Platform. Уровень памяти – поддержка хранения данных пользователя и доступа к ним через облако. Уровень инфраструктуры – предоставление полной виртуализованной платформы через облако, например, Amazon EC2. Рассмотрим схему архитектуры облачных вычислений: Сервисы, доступные через облако Инфраструктура для их развертывания и использования Платформа – набор инструментов для использования облака Память – поддержка хранения пользовательских данных в ЦОД, реализующем облако Архитектор облака – это главный разработчик его архитектуры. Интегратор облака – это его системный администратор, отвечающий за добавление компонент в облако и их изменение. Компоненты облака – как правило, являются Web-сервисами. Облако может быть общедоступным или частным (корпоративным). При использовании облачных вычислений несколько изменяются и роли участвующих в них специалистов. Поставщиком облака является центр обработки данных. Пользователями облака могут быть любые пользователи Интернета. Производитель оборудования или ПО – это компания, обеспечивающая разработку аппаратуры и программного обеспечения для центра обработки данных. Модель облачных вычислений основана на соблюдении целого ряда стандартов. Для взаимодействия приложений используются стандарты HTTP (основной Webпротокол), XMPP (Jabber) – стандарт для отправки и получения мгновенных сообщений, SSL (Secure Socket Layer)– уровень безопасных сокетных сетевых соединений. Для работы клиентов в облаке используются Web-браузеры (с активным использованием технологии AJAX, позволяющей уменьшить число перенаправлений с одной веб-страницы на другую и, тем самым, время доступа пользователя к необходимой ему информации) и offlineклиенты, работа которых основана на HTML 5 (специальной версии HTML для облачных вычислений). Для реализации облака используются принципы виртуализации программ и данных и стандарт OMF. Для взаимодействия с сервисами данные передаются в формате XML. Windows Azure Windows Azure – облачная платформа, разработанная фирмой Microsoft (по существу, операционная система и набор инструментов "в облаке"). На рис. 31.1 иллюстрируется роль Windows Azure в организации использования облачных сервисов, предоставляемых центром обработки данных Microsoft, фирмами и индивидуальными заказчиками. Важно подчеркнуть, что Windows Azure обеспечивает хранение, использование и модификацию данных и запуск программ только на компьютерах центров обработки данных Microsoft. Никакого программного обеспечения, кроме веб-браузера, на пользовательских компьютерах не требуется. На рис. 31.2 изображена схема организации работы пользователя в Windows Azure. 366 Рис. 31.1. Windows Azure, пользователи и центры обработки данных Рис. 31.2. Организация работы пользователя в Windows Azure С точки зрения пользователя, существуют две категории приложений – внутренние (on-premises applications), исполняемые на компьютере пользователя, и облачные (cloud applications), фактически исполняемые в среде Windows Azure на компьютерах центра обработки данных. На пользовательском компьютере могут быть установлены ОС Windows и, возможно, другие ОС. Независимо от этого, через Web-браузер пользователь получает доступ к "Windows в облаке" – Windows Azure. Функционирование Windows Azure основано на Web-сервисах .NET. Windows Azure для хранения данных обеспечивает доступ к аналогу СУБД Microsoft SQL Server "в облаке" – SQL Azure. На рис. 31.3 изображены основные компоненты Windows Azure. Основные компоненты Windows Azure – внешний облик, интерфейс (fabric, дословно – одежда), вычисления (Compute), память (Storage) и конфигурация (config). Все компоненты – вычисления, память и интерфейс – являются web-сервисами .NET. Сервис вычисления выполняет пользовательские облачные приложения, сервис память хранит пользовательские данные, сервис интерфейс обеспечивает общие средства управления приложениями, использующими облачную платформу. Основная проблема, решаемая сервисом вычисления, - исполнение огромного числа (возможно, миллионов) пользовательских приложений самого разного вида и назначения в едином облаке. Иначе говоря, основная проблема сервиса вычисления и облачных вычислений в целом – масштабирование. Данная проблема решается путем выполнения каждого экземпляра пользовательского облачного приложения в своей отдельной виртуальной машине. Данные виртуальные машины исполняются в среде 64-битовой ОС Windows 2008 Server - наиболее мощной серверной ОС фирмы Microsoft. 367 Рис. 31.3. Компоненты Windows Azure Сервис память предоставляет пользователю средства работы с данными различной структуры – большими бинарными объектами (blobs), размером до 50 Гб, хранящимися в контейнерах, таблицами (tables) и очередями (queues). Работа со структурами данных реализована на основе ADO.NET – библиотеками поддержки обработки структурированных данных в .NET. Сервис интерфейс реализован как большая группа машин, на каждой из которых работает приложение – агент интерфейса (fabric agent). Сервис интерфейс в целом управляется программным обеспечением. называемым контроллер интерфейса (fabric controller). Контроллер интерфейса взаимодействует с агентами интерфейса, а также с сервисом память как с обычными приложениями (поэтому детали представления данных от контроллера интерфейса скрыты). Контроллер интерфейса управляет каждым облачным приложением с помощью конфигурационного файла в формате XML. На рис. 31.4 изображена структура сервисов .NET как основы для реализации Windows Azure. Как уже говорилось, вся реализация Windows Azure основана на надежной и безопасной платформе .NET, исполнение программ в которой обеспечивается в особом безопасном режиме (managed execution – управляемое выполнение). Часть .NET, называемая Windows Comminucation Foundation (WCF) и предоставляемый ею механизм сервисов и является основой реализации платформы Windows Azure. Облачными сервисами управляют две компоненты – управление доступом (access control) и сервисная шина (service bus), детальное рассмотрение которых выходит за рамки данного курса. Рис. 31.4. Перспективы облачных вычислений, несмотря на их критику и пока осторожное отношение к ним, очень велики, так как облачные вычисления позволяют получить доступ к мощным вычислительным возможностям и данным большого объема практически с любых поль- 368 зовательских компьютеров (в том числе – карманных, мобильных устройств и т.д.), имеющих веб-браузер. Ключевые термины Microsoft Azure Services Platform - платформа фирмы Microsoft для разработки и использования облачных сервисов на базе Microsoft.NET. Microsoft Windows Azure - операционная система и набор инструментов фирмы Microsoft, обеспечивающий поддержку облачных вычислений ("ОC в облаке"). SQL Azure – версия СУБД Microsoft SQL Server для использования "в облаке". Агент интерфейса (fabric agent) – агентское приложение, исполняемое на каждом из компьютеров сервиса Интерфейс (Fabric) платформы Windows Azure. Архитектор облака – главный разработчик его архитектуры. Внутренние приложения (on-premises applications) – приложения, исполняемые на локальном компьютере пользователя. Вычисления (Compute) – облачный сервис платформы Microsoft Windows Azure, исполняющий пользовательские приложения в едином облаке. Интегратор облака – его системный администратор, отвечающий за добавление компонент в облако и их изменение. Интерфейс (внешний облик, Fabric) - облачный сервис платформы Microsoft Windows Azure, обеспечивающий интерфейс между различными облачными приложениями и между приложениями и памятью; реализован в виде группы компьютеров. Контроллер интерфейса (fabric controller) – программное обеспечение, управляющее работой облачного сервиса Интерфейс (Fabric) платформы Windows Azure. Облачные вычисления (сloud computing) –. вычисления, основанные на масштабированных и виртуализованных ресурсах (данных и программах), которые доступны пользователям через Интернет и реализуются на базе мощных центров обработки данных (data centers). Облачные приложения (cloud applications) – приложения, фактически исполняемые в среде облачных вычислений (например, Windows Azure) на компьютерах центра обработки данных. Память (Storage) - облачный сервис платформы Microsoft Windows Azure, предоставляющий пользователю средства работы с данными различной структуры – большими бинарными объектами, таблицами и очередями. Платформа – набор инструментов для использования облака. Поставщик облака - центр обработки данных, поддерживающий облачные вычисления. Сервисная шина (service bus) – компонента платформы Microsoft Azure Services Platform. Управление доступом (access control) – компонента платформы Microsoft Azure Services Platform. Уровень инфраструктуры – предоставление полной виртуализованной платформы через облако, например, Amazon EC2. Уровень клиента – клиентское ПО, используемое для доступа к облачным сервисам, например, web- браузер. Уровень памяти – поддержка хранения данных пользователя и доступа к ним через облако. Уровень платформы –программная платформа, объединяющая полный набор инструментов для развертывания и использования облачных вычислений на пользовательском компьютере (без дополнительных инсталляций, покупки оборудования и др.); пример: Microsoft.NET Azure Services Platform. 369 Уровень приложений – программы, доступные через облако и не требующие инсталляции на компьютере пользователя (в последнем – одно из главных преимуществ облачной модели). Уровень сервисов – облачные сервисы, используемые через облачную модель. Центр обработки данных (ЦОД, data center) – мощный вычислительный центр, состоящий из компьютеров, объединенных в локальную сеть, обслуживающих сервисы облачных вычислений некоторой компании. Краткие итоги Облачные вычисления – популярная современная модель вычислений, основанная на динамически масштабируемых и виртуализованных ресурсах (данных и приложениях), которые доступны и используются как сервисы, исполняемые на компьютерах мощного центра обработки данных. Преимущество облачных вычислений: все вычисления выполняются удаленно, от компьютера пользователя требуется только наличие веб-браузера и доступа в Интернет. Недостаток облачных вычислений – полная зависимость пользователя от облака (в котором хранятся не только программы, но и его данные). Современная тенденция – разработка корпоративных облаков всех ведущих фирм, их объединение в единое облако и все более широкое использование облачных вычислений пользователями. Элементы концепции облачных вычислений: инфраструктура как сервис, платформа как сервис, программное обеспечение как сервис. Уровни компонент облачных вычислений: уровень клиента, уровень приложений, уровень сервисов, уровень платформы, уровень памяти (данных), уровень инфраструктуры. Архитектура облачных вычислений: сервисы, инфраструктура, платформа, память. Роли в разработчиков и клиентов в облачных вычислениях: архитектор облака, интегратор облака, поставщик облака, пользователи облака, производитель оборудования. Стандарты, используемые в облачных вычислениях, - коммуникация приложений на основе протоколов HTTP и XMPP (протокол обмена мгновенными сообщениями); HTML 5 – специальная версия HTML для облачных вычислений; AJAX – технология для оптимизации обращений к веб-страницам путем минимизации числа перенаправлений; OMF – стандарт виртуализации данных; передача данных в формате XML. Windows Azure – операционная система и платформа фирмы Microsoft для облачных вычислений, наиболее развитая и распространенная среди всех облачных платформ. Ее реализация основана на платформе .NET и Windows Communication Foundation (WCF) и предоставляемых ею сервисах. Компоненты (сервисы) Windows Azure – Интерфейс (Fabric), Вычисления (Compute) и Память (Storage). Обеспечивается доступ к SQL Azure – облачной версии Microsoft SQL Server. Облачные сервисы .NET функционируют на основе двух объединяющих компонент – управления доступом и облачной шины. Перспективы облачных вычислений очень велики, так как они предоставляют мощные масштабируемые вычислительные сервисы, не требуя дополнительных ресурсов от компьютеров пользователей. Набор для практики Вопросы 1. 2. 3. 4. 5. 6. 7. 8. 9. Что такое облачные вычисления? Что понимается в облачных вычислений под "облаком"? Что такое центр обработки данных? Каковы элементы концепции облачных вычислений? Какие уровни выделяются при организации облачных вычислений? Что такое уровень клиента? Что такое уровень сервисов? Что такое уровень приложений? Что такое уровень платформы? 370 10. Что такое уровень памяти? 11. Что такое уровень инфраструктуры? 12. Каковы роли клиентов и реализаторов в облачных вычислениях? 13. Какие стандарты используются в облачных вычислениях? 14. Что такое Microsoft Windows Azure? 15. Из каких основных компонент состоит Microsoft Windows Azure? 16. На какой платформе основана реализация Microsoft Windows Azure? Упражнения 1. Сформулируйте, в чем, по-Вашему, преимущества и недостатки облачных вычислений. 2. Поэкспериментируйте с какой-либо общедоступной системой облачных вычислений, например, Amazon EC2 3. Какие из современных платформ разработки программ, по-Вашему, наиболее подходят для реализации облачных вычислений? Темы для курсовых работ, рефератов, эссе 1. Обзор концепции и реализаций облачных вычислений (реферат). 2. Облачная платформа Microsoft Windows Azure (реферат). 3. Эксперименты с какой-либо общедоступной системой облачных вычислений, например, Amazon EC2 или Microsoft Windows Azure (курсовая работа – требуется академический доступ к Microsoft Windows Azure) 371 372 32. Лекция: Перспективы операционных систем и сетей В данной заключительной лекции курса рассмотрены следующие вопросы: обзор других современных ОС, не рассмотренных подробно в курсе (фирм IBM, HP, Oracle/Sun и др.); современные тенденции в развитии ОС; графические оболочки ОС; поддержка распределенных, параллельных, облачных вычислений в ОС; развитие сетей: 3G, 4G, WiMAX; перспективы ОС и сетей. Содержание Введение Операционные системы других крупных фирм Solaris – операционная система разработки фирмы Oracle / Sun MacOS HP-UX Современные тенденции в развитии ОС Новые ОС семейства Windows Новые тенденции в развитии ОС Графические оболочки ОС Поддержка параллельных вычислений Развитие беспроводных сетей Перспективы развития ОС Ключевые термины Краткие итоги Набор для практики o Вопросы o Упражнения o Темы для курсовых работ, рефератов, эссе o Заключение Введение Данная лекция завершает курс по современным ОС. В ней суммируются тенденции развития современных ОС, дается обзор ОС, не рассмотренных в курсе, намечаются перспективы развития ОС и сетей. Операционные системы других крупных фирм В данном курсе рассмотрены как теоретические основы современных ОС, так и наиболее распространенные семейства ОС – Windows и Linux, а также дан обзор ОС для мобильных устройств и ОС для облачных вычислений. Имеется целый ряд весьма интересных и распространенных линий развития ОС, не нашедших подробного отражения в курсе. Это прежде всего операционные системы крупных фирм: IBM – в 1960-х – 1970-х гг. гг. разработала OS IBM 360 / 370; затем – ОС для персональных компьютеров OS/2; в настоящее время наиболее современными ОС этой фирмы являются z/OS и z/VM; Apple – с начала 1980-х гг. развивает семейство ОС MacOS, характеризующееся улучшенным графическим пользовательским интерфейсом (см. раздел MacOS); Oracle / Sun – c начала 1980-х гг. фирма Sun развивает ОС Solaris, развитие UNIX (см. раздел Solaris); Hewlett-Packard – развивает собственный диалект UNIX – систему HP/UX (см. раздел HP-UX); Novell – одна из ведущих фирм в области сетевых технологий; развивает семейство сетевых операционных систем: NetWare; в настоящее время - Open Enterprise Server (сетевая ОС, включающая все сетевые возможности NetWare и возможности распространенного диалекта Linux - openSUSE). Это далеко не полный перечень коммерческих и исследовательских ОС, включающий сотни наименований. 373 Solaris – операционная система разработки фирмы Oracle / Sun Она является развитием UNIX (линия Solaris 1.x – развитием диалекта UNIX BSD, линия Solaris 2.x – развитием диалекта UNIX AT&T SVR4). Автор имеет 10-летний опыт работы в системе Solaris, которая, по нашему личному опыту, весьма удобна и надежна и имеет удобные инструменты разработки программ. В различных разделах курса мы уже касались многих особенностей Solaris, таких, как поддержка многопоточности. Аппаратные платформы, поддерживаемые ОС Solaris, SPARC, x86, IA-32 и x64. В 1990-х гг. многие фирмы-пользователи предпочитали использовать именно Solaris как серверную ОС, а в качестве серверов – компьютеры SPARC фирмы Sun. Важным преимуществом Solaris является используемое в этой системе семейство оптимизирующих компиляторов Sun Studio (C, C++, Fortran), в разработке которых в 1990-х гг. автор принимал активное участие. В настоящее время компиляторы Sun Studio работают также на ОС Linux. Весьма интересным и мощным инструментом, доступным в системе Solaris, является jтладчик распределенных приложений DTrace. Новая файловая система ОС Solaris - ZFS (Zetabyte File System поддерживающая большие объемы файлов и возможность криптования информации в файлах с целью ее защиты. Система Solaris имеет мощную поддержку многопоточности и синхронизации потоков, а также удобную поддержка симметричного мультипроцессирования (SMP-архитектур). Используемые в системе Solaris графические оболочки - Common Desktop Environment (CDE), GNOME, Java Desktop; в 1990-х гг. использовалась также графическая оболочка OpenWindows. Для студентов, аспирантов и преподавателей поддерживается проект OpenSolaris – академический исследовательский проект по ОС на основе открытых исходных кодов Solaris. Его результаты дадут возможность улучшить новые версии коммерческой ОС Solaris. MacOS Разработчиком MacOS является фирма Apple - законодатель мод в области GUI, начиная с 1980-х гг. Ключевой идеей MacOS с самого начала является разработка и развитие ОС только на основе графического пользовательского интерфейса - "ОС без командной строки". Аппаратная платформа MacOS – всевозможные семейства компьютеров Macintosh фирмы Apple (наиболее популярные среди рабочих станций в США), а также PowerPC – рабочая станция RISC-архитектуры, совместно разработанная Apple, IBM и HP. Диалекты (версии) MacOS различаются по своему подходу к реализации, хотя для пользователя, благодаря, удобному графическому интерфейсу, эти различия могут быть незаметны. Класическая MacOS (classic MacOS) - оригинальная разработка фирмы Apple; новая линия MacOS X – развитие ОС MacOS Classic и ОС NeXTSTEP (UNIX-подобной ОС), т.е. она является UNIXсовместимой. HP-UX Разработчиком ОС HP-UX Hewlett-Packard. Это UNIX-подобная 64-битовая ОС (одна из первых 64-битовых ОС в истории). Ее аппаратная платформа - рабочие станции фирмы HP. В системе HP-UX используется оригинальная виртуальная файловая система: Veritas File System (Vx-Fs) использующая представление файлов на основе расширений (extents) - см. "Виртуальные файловые системы (VFS). Реализации файловых систем. Сетевая файловая система NFS". Современные тенденции в развитии ОС На основе опыта использования многих современных ОС, можно выделить следующие основные тенденции в их развитии. Графические оболочки. Любая современная ОС имеет графический пользовательский интерфейс, причем (по вполне понятным причинам острой конкуренции между фирмамиразработчиками) графические оболочки для всех ОС примерно одинаковы по возможностям. Подчас пользователю трудно сориентироваться, в какой именно ОС он работает, хотя для конечных пользователей (непрограммистов), по-видимому, такая унификация удобна. Поддержка новых сетевых технологий и Web-технологий. Сети и Интернет активно развиваются. Появляются новые стандарты и протоколы – IPv6, HTML 5 (для облачных вычислений) и т.д. Современные ОС развиваются в направлении поддержки всех новых сетевых технологий. 374 Усиленное внимание к механизмам безопасности и защиты. Во многом благодаря инициативе Trustworthy Computing, начатой фирмой Microsoft в 2002 г. (она подробно рассмотрена в предыдущих лекциях), а также ввиду все усиливающейся киберпреступности, все современные ОС уделяют повышенное внимание безопасности: при просмотре веб-страниц браузеры выполняют их проверку на отсутствие phishing; загрузки и инсталляции программ из сети выполняются только с явного согласия пользователя и т.д. Поддержка многопоточности и многоядерных процессоров. Ввиду широкого распространения многоядерных процессоров, все современные ОС имеют библиотеки программ, поддерживающие эту возможность аппаратуры. Именно благодаря многоядерной архитектуре, становится реально возможным параллельное выполнение потоков (threads). Поддержка распределенных и параллельных вычислений. Современные ОС имеют в своем составе высокоуровневые библиотеки, позволяющие разрабатывать параллельные алгоритмы решения задач – например, поддерживающие стандарты параллелизма OpenMP и MPI. Виртуализация ресурсов и аппаратуры. Современные ОС имеют в своем составе средства виртуализации, позволяющие выполнять приложения для других платформ в изолированных виртуальных машинах, в которые могут быть инсталлированы другие операционные системы. Развитие файловых систем с целью защиты информации и значительного увеличения размера файлов (для мультимедиа). Современные требования обработки мультимедийной информации приводят к тому, что старые файловые системы (например, FAT) оказываются недостаточными для хранения мультимедийных файлов. Например, максимальный размер файла в системе FAT – 4 гигабайта – легко может быть превышен при переписи на компьютер цифровой видеопленки длительностью 10-15 минут. Поэтому разрабатываются новые файловые системы, допускающие хранение очень больших файлов, например, система ZFS в ОС Solaris. Другим требованием является обеспечение конфиденциальности информации, которое приводит к необходимости реализации в файловых системах возможности криптования (которая реализована, например, в файловой системе ZFS). Поддержка облачных вычислений – совсем новая тенденция в развитии ОС, начало которой положила "облачная" ОС Windows Azure фирмы Microsoft (см. "ОС для облачных вычислений (cloud computing). Windows Azure"). Новые ОС семейства Windows Приведем краткий обзор возможностей новых ОС семейства Windows, не нашедших подробного отражения в курсе. Windows Vista имеет следующие новые возможности: новый стиль GUI (Windows Aero); встроенний инструментарий .NET Framework 3.0, обеспечивающий исполнение управляемого кода .NET; единую систему поиска информации WinFS; средства управления безопасностью приложений (в частности, запуск инсталляционных приложений только с явного согласия пользователя); подсистемы Windows Presentation Foundation (поддержка современного развитого GUI), Windows Communication Foundation (поддержка современных коммуникационных технологий с помощью сервисов); Windows Workflow Foundation (также называемая CardSpace) – поддержка аутентификации пользователей, планирования и организации работ. Windows Server 2008 – наиболее современная верверная ОС семейства Windows. Она предоставляет: поддержку новой версии Интернет-протокола IPv6; улучшенную поддержку сетей; поддержку параллельного программирования; новый мощный командный процессор Windows PowerShell; средства виртуализации и эмуляции приложений с помощью технологии Hyper-V. Windows 7 - наиболее новая на данный момент (2010 г.) ОС серии Windows. Она предоставляет поддержку нового вида пользовательского интерфейса - multi-touch; средства кэширования Интернет-трафика (Branch cache); уникальный набор фоновых рисунков рабочего стола для каждой страны; улучшенную поддержку драйверов устройств; более гибкие настройки безопасности и брандмауэра; развитие GUI-интерфейса Aero, впервые реализованного в Windows Vista. 375 Новые тенденции в развитии ОС Проект Midori. Midori - проект Microsoft Research, который начат в начале 2000-х гг. под названием Singularity. Midori – исследовательская ОС, реализованная на управляемом коде (managed codeявляющемся основой платформы .NET и обеспечивающем полный контроль типов, безопасности и др., что значительно повышает надежность и безопасность кода. Однако до Midori разработчики ОС предпочитали менее надежные, но более эффективные способы реализации ОС на языках C и C++, так что, на наш взгляд, Midori – весьма смелый эксперимент. На управляемом коде в ОС Midori реализованы, в том числе, и ядро ОС, и драйверы устройств. Midori предоставляет эффективная поддержка распалаллеливания, что особенно важно при современных тенденциях развития аппаратных платформ. Для повышения безопасности выполнения приложений Midori обеспечивает их защита на основе исполнения каждого приложения в своей отдельной "песочнице" (sandboxОдна из основных особенностей Midori – то, что она явл яется Интернет-ориентированной ОС. В будущем не исключен переход развития ОС фирмы Microsoft с платформы Windows на новую платформу Midori. Графические оболочки ОС Как уже отмечалось, графическая оболочка имеется у каждой современной ОС. Графические оболочки ОС предоставляют следующие основные возможности. Удобный графический пользовательский интерфейс. Возможность выполнить любые системные настройки с помощью GUI. Следует, по нашему личному опыту, особо отметить в этом отношении графические оболочки ОС Linux. Поддержка новых тенденций в развитии интерфейсов – multi-touch, Tablet PC и др. Унификация графических оболочек для различных ОС. В разных операционных системах используются графические оболочки CDE, KDE, GNOME. Возможно, в ближайшем будущем их список расширится. Отметим, что оболочки для разных ОС практически неотличимы (все они имеют, например, кнопку Start, папку My Documents и т.д.), что удобно для конечных пользователей, так как упрощает изучение рабочей среды. Однако, с нашей точки зрения, использование только графических оболочек (без изучения командных языков и конфигурационных файлов) снижает уровень подготовки системных программистов. При изучении ОС программистам, в особенности – системным, следует иметь это в виду. В этом отношении полезные навыки специалисту дает использование ОС типа UNIX – прежде всего, знание командных языков и конфигурационных файлов. Поддержка параллельных вычислений Все современные ОС предоставляют библиотеки для разработки параллельных алгоритмов с использованием возможностей аппаратуры. Они поддерживают следующие основные виды, стандарты и инструменты параллелизма: OpenMP - прагматы для распараллеливания программ для компиляторов с различных языков; MPI (Message Passing Interface) – параллельное выполнение программ, взаимодействующих с помощью передачи сообщений. ОС фирмы Microsoft поддерживают стандарт OpenMP. Имеются также библиотеки MPI.NET, поддерживающие стандарт MPI, а также библиотеки ParallelFx. Фирма Microsoft выпустила специальную версию операционной системы - Windows High Performance Computing (HPC) 2008, поддерживающую параллельное программирование. Развитие беспроводных сетей Важной современной тенденцией является развитие все более и более высокопроизводительных беспроводных сетей, которое находит свое отражение и в развитии операционных систем. Выделим следующие перспективные сетевые технологии. 376 WiMAX – региональные беспроводные сети на основе технологии Wi-Fi (беспроводной радиосвязи по стандартам IEEE.802.11) производительностью до 1 Гбит / с. 3G – мобильная связь третьего поколения на основе стандартов CDMA и UMTS (быстродействием до 14 МБит / с); в России "первопроходцем" 3G является компания СкайЛинк; в настоящее время все провайдеры мобильной связи переходят на стандарты 3G . 4G – новое поколение мобильных сетей связи со скоростью передачи до 1 ГБит / с, обеспечивающих также повышенное качество голосовой связи. Формально стандарт на сети 4G еще не принят, это – дело ближайшего будущего. Интересной тенденцией является также использование цифровых телевизионных каналов для выхода в Интернет с помощью специальных устройств set-top boxes. Перспективы развития ОС Как видно из содержания данной лекции и всего курса, операционные системы остаются активно развивающимся направлением, одним из наиболее интересных в области системного программирования. Перечислим некоторые характерные тенденции их развития. Тенденция к интеграции ОС (не только на уровне графических оболочек, но и на уровне общего ядра); развитие семейств ОС на основе модулей общего кода. Значительное повышение надежности, безопасности и отказоустойчивости ОС; разработка ОС на управляемом коде или его аналогах. Дальнейшая тенденция к проектам по ОС с открытым кодом; это вполне понятно, так как фирмам-разработчикам необходимы новые идеи, что является отличной возможностью проявить себя для молодых программистов. Развитие виртуализации: Необходимо обеспечить возможность выполнить или эмулировать любое приложение в среде любой современной ОС. Дальнейшее сближение по возможностям ОС для настольных компьютеров и ОС для мобильных устройств. Дальнейшая интеграция ОС и сетей. Перенос ОС и базовых инструментов в среды для облачных вычислений. Ключевые термины 3G – мобильная связь третьего поколения на основе стандартов CDMA и UMTS (быстродействием до 14 МБит / с). 4G – новое поколение мобильных сетей связи со скоростью передачи до 1 ГБит / с, обеспечивающих также повышенное качество голосовой связи. HP-UX – операционная UNIX-совместимая операционная система фирмы HewlettPackard. MacOS – операционная система фирмы Apple, обеспечивающая удобный графический пользовательский интерфейс. Midori – исследовательская ОС фирмы Microsoft Research, реализованная на управляемом коде. MPI (Message Passing Interface) – стандарт параллельного выполнения программ, взаимодействующих с помощью передачи сообщений. OpenMP - механизм и стандарт распараллеливания программ путем указания специальных прагматыов для компиляторов. Solaris – операционная система фирмы Oracle / Sun. Краткие итоги Операционные системы, кроме Windows и Linux, подробно рассмотренных в курсе, разрабатываются многими другими крупными фирмами: IBM (z/OS); Apple (MacOS); Oracle / Sun (Solaris); Hewlett-Packard (HP-UX); Novell (NetWare – сетевая ОС). 377 ОС Solaris – UNIX-подобная система, работающая на платформах SPARC и x86. Ее наиболее важные возможности – семейство оптимизирующих компиляторов Sun Studio; отладчик распределенных приложений DTrace; файловая система ZFS с поддержкой файлов очень большого объема и криптованием информации; развитая поддержка многопоточности и симметричного мультипроцессирования. Используемые графические оболочки: CDE, KDE, GNOME, Java Desktop. Академический проект OpenSolaris обеспечивает доступ к исходному коду Solaris с исследовательскими и учебными целями. MacOS – ОС фирмы Apple, работающая на компьютерах Macintosh. Она характеризуется развитым GUI (ОС без командной строки). Ее диалекты – Classic Mac OS (фирмы Apple) и MacOS X – гибрид классической MacOS и ОС типа UNIX. HP-UX – UNIX-подобная ОС фирмы Hewlett-Packard. Ее особенность – использование виртуальной файловой системы Vx-Fs (см. "Виртуальные файловые системы (VFS). Реализации файловых систем. Сетевая файловая система NFS"). Современные тенденции в развитии ОС: Графические оболочки (для всех ОС примерно одинаковы по возможностям); Поддержка новых сетевых технологий и Web-технологий; Усиленное внимание к механизмам безопасности и защиты; Поддержка многопоточности; Поддержка многоядерных процессоров; Поддержка распределенных и параллельных вычислений; Виртуализация ресурсов и аппаратуры; Развитие файловых систем с целью защиты информации и значительного увеличения размера файлов (для мультимедиа); Поддержка облачных вычислений. Новые ОС семейства Windows – Windows Vista, Windows Server 2008, Windows 7. В лекции приведено краткое описание их новых возможностей в части GUI, поддержки сетей, безопасности и др. Проект Midori – проект Microsoft Research по разработке исследовательской ОС на управляемом коде (с повышенной надежностью). На управляемом коде написаны даже ядро и драйверы. Midori – Интернет-ориентированная ОС, которая в будущем может стать основой для развития нового семейства ОС фирмы Microsoft. Каждая ОС имеет графическую оболочку, основные возможности которой следующие: Удобный графический пользовательский интерфейс; Возможность выполнить любые системные настройки с помощью GUI; Поддержка новых тенденций в развитии интерфейсов – multi-touch, Tablet PC и др. Имеется тенденция к унификации графических оболочек для различных ОС (CDE, KDE, GNOME). Однако, на наш взгляд. изучение и использование только графических оболочек ОС для системных программистов недостаточно. Необходимы хорошие знания командных языков и конфигурационных файлов. Современные ОС поддерживают параллельные вычисления. Например, новые версии Windows поддерживают стандарты параллельных вычислений OpenMP и MPI. Microsoft выпустила специальную ОС для поддержки параллельных вычислений – Windows 2008 HPC. Развиваются беспроводные сети: Wi-MAX, 3G, 4G. Также используются цифровые телевизионные каналы как способ подключения к Интернету. Это находит отражение и в ОС. Перспективы развития ОС: Тенденция к интеграции ОС (не только на уровне графических оболочек, но и на уровне общего ядра); развитие семейств ОС на основе модулей общего кода; Значительное повышение надежности, безопасности и отказоустойчивости ОС; разработка ОС на управляемом коде или его аналогах; Дальнейшая тенденция к проектам по ОС с открытым кодом (необходимы новые идеи – отличная возможность для молодых программистов); Развитие виртуализации: Необходимо обеспечить возможность выполнить или эмулировать любое приложение в среде любой современной ОС; Дальнейшее сближение по возможностям ОС для настольных компьютеров и ОС для мобильных устройств; Дальнейшая интеграция ОС и сетей; Перенос ОС и базовых инструментов в среды для облачных вычислений. ОС остаются активно развивающимся направлением, одним из наиболее интересных в области системного программирования. Набор для практики Вопросы 1. Что такое z/OS? 378 2. Что такое MacOS? 3. Что такое Solaris? 4. Что такое HP-UX? 5. Что такое NetWare? 6. Каковы основные возможности ОС Solaris? 7. Каковы основные особенности MacOS? 8. Каковы основные особенности HP-UX? 9. Каковы современные тенденции в развитии ОС? 10. Каковы новые ОС семейства Windows и их новые возможности? 11. Что такое Midori? 12. Каковы возможности графических оболочек ОС? 13. Какие стандарты параллельных вычислений поддерживают современные ОС? 14. Какие новые виды беспроводных сетей находят распространение в настоящее время? 15. Каковы перспективы развития ОС? Упражнения 1. Сравните возможности основных современных ОС (Windows, Linux, Solaris, MacOS и др.) и их графических оболочек. 2. Проанализируйте и опишите перспективы развития операционной системы, которую Вы используете. Темы для курсовых работ, рефератов, эссе 1. 2. 3. 4. 5. Обзор возможностей новых ОС семейства Windows (реферат). Обзор возможностей ОС Solaris (реферат). Обзор возможностей MacOS (реферат). Современные тенденции и перспективы развития ОС (реферат). Сравнение возможностей основных современных ОС (Windows, Linux, Solaris, MacOS и др.) и их графических оболочек (курсовая работа). 379 Заключение В данном курсе подробно рассмотрены как теоретические, так и практические основы современных операционных систем – от первых ОС до новейших ОС для облачных вычислений и мобильных устройств. Надеемся, что 32 лекции курса позволили Вам подробно изучить внутреннее устройство ОС, их архитектуру, основные алгоритмы, стратегии, принципы, используемые для их реализации. 8 лабораторных работ курса по ОС Windows XP, Windows Vista, Windows Server 2008, Windows 7, Windows Mobile, Windows Azure, Windows Research Kernel, Linux дали Вам основу для приобретения практических навыков и опыта использования этих систем. Для дальнейшего изучения рекомендуем публикации из списка литературы. Операционные системы – интереснейшая, активно развивающаяся область, в которой налицо, с одной стороны, эволюция и применение новейших информационных технологий, с другой - острая конкуренция фирм-разработчиков за увеличение числа пользователей, расширение круга проблемных областей, круга аппаратных архитектур и рынков сбыта операционных систем. Желаем Вам активного освоения и продуктивного использования современных операционных систем с помощью представленного курса. Надеемся, что некоторые из читателей заинтересуются операционными системами настолько, что примут участие в открытых проектах в области ОС, а возможно, и пополнят ряды разработчиков коммерческих операционных систем, став сотрудниками фирмы Microsoft или других компаний – ведущих разработчиков ОС. Поверьте, этим фирмам нужны Ваши знания, Ваши свежие идеи и результаты их реализации для улучшения и развития современных операционных систем. Желаем Вам больших профессиональных успехов! 380