Uploaded by Алексей Болдырев

Архитектура компьютеров и операционные системы.

advertisement
Архитектура компьютеров и
операционные системы.
1.История компьютера.
История компьютеров насчитывает уже более 200 лет. Первые механические
вычислительные машины были спроектированы и построены в 19 веке. Они
понадобились людям для решения все более сложных задач обработки чисел.
● 1940 - 1960
1940.
Калькулятор комплексных чисел
В 1939 году Bell Telephone Laboratories завершает создание калькулятора, разработку
которого начал Джордж Стибиц. Стибиц ошеломил группу, отправляя компьютеру
(расположенном в Нью-Йорке) команды с помощью терминала Teletype,
подключенного к Нью-Йорку по специальным телефонным линиям. Вероятно, это
первый пример вычислений с удаленным доступом.
1944
Harward Mark 1
Harvard Mark 1, разработанный профессором физики из Гарварда Говардом Эйкеном и
сконструированный и изготовленный IBM, представляет собой релейный калькулятор
размером с привычную нам комнату.
1946
ENIAC
Вычислительная система ENIAC, работа над которой началась в 1943 году, была
построена Джоном Мочли и Дж. Преспером Эккертом в Школе электротехники Мура в
Пенсильванском университете.
Благодаря электронной, а не электромеханической технологии, она была более чем в
1000 раз быстрее, чем любой предыдущий компьютер.
1948
Первая компьютерная программа
Исследователи из Манчестерского университета Фредерик Уильямс, Том Килберн и
Джефф Тутхилл разрабатывают маломасштабную экспериментальную машину
(SSEM), более известную как манчестерский «ребенок».
Это была первая программа в истории, запускавшаяся на цифровом электронном
компьютере с хранимой программой.
● 1950-е годы ХХ века.
1953
Электронная машина обработки данных IBM Model 701
За три года производства IBM продала 19 701 таких машин исследовательским
лабораториям, авиастроительным компаниям и федеральному правительству.
Введение IBM 701 также ознаменовало начало выхода IBM на рынок крупных
компаний.
1953
Первый компьютерный язык
Грейс Хоппер разрабатывает первый компьютерный язык, который в конечном итоге
стал известен как COBOL, что означает COMmon, Business-Oriented Language,
согласно Национальному музею американской истории.
1954
Магнитный барабанный калькулятор IBM 650.
IBM объявили 650 своим первым компьютером массового производства, а всего за
год компания продала 450 экземпляров.
Вращающийся со скоростью 12500 об/мин, магнитный барабан для хранения
данных 650 обеспечивает гораздо более быстрый доступ к хранимой информации,
чем другие барабанные машины.
Модель 650 также была очень популярна в университетах, где целое поколение
студентов впервые изучило программирование.
● 1960-е годы ХХ века.
1960
DEC PDP-1
Типичная компьютерная система PDP-1, которая продавалась примерно за 120 000
долларов, включала графический дисплей с электронно-лучевой трубкой, ввод/вывод
бумажной ленты, не требовала кондиционирования воздуха и нуждалась только в
одном операторе; все это стало тогда стандартом для мини-компьютеров.
1961
IBM 7030
В мэйнфреймах IBM серии 7000 впервые используются транзисторы.
1962
Компьютер Атлас.
Атлас, совместный проект Манчестерского университета, Ferranti Computers и Plessey,
стал доступен через девять лет после того, как компьютерная лаборатория
Манчестера начала изучать транзисторные технологии.
В то время Atlas был самым быстрым компьютером в мире и ввел понятие
«виртуальная память», то есть использование диска или барабана в качестве
расширения основной памяти. Управление системой обеспечивалось через Atlas
Supervisor, которую некоторые считают первой настоящей операционной системой.
1964
IBM/360
System/360 - важное событие в истории вычислительной техники.
В то время, когда IBM выпустила System/360, компания только что перешла от
дискретных транзисторов к интегральным схемам.
● 1970-е годы
1971
Первый микропроцессор Intel.
Первая реклама микропроцессора Intel 4004 появилась в журнале Electronic News.
1974
XEROX PARC Alto.
Alto - революционный компьютер, оказавший большое влияние на компьютерную
индустрию. Он был основан на графическом пользовательском интерфейсе с
использованием окон, значков и мыши и работал вместе с другими Alto по локальной
сети.
1976
Суперкомпьютер Cray-1.
Самая быстрая машина своего времени, Cray-1 отчасти зависит от ее формы, буквы
«С», которая уменьшает длину проводов и, следовательно, сигналы времени
должны проходить по ним.
Высокая плотность упаковки интегральных схем и новая фреоновая система
охлаждения также способствовали его быстродействию.
1976
Intel 8080.
Intel и Zilog представили новые микропроцессоры. В пять раз быстрее, чем его
предшественник 8008, Intel 8080 мог обрабатывать в четыре раза больше байтов,
что в сумме составляет 64 килобайта.
1976
Apple I.
Разработанный Стивом Возняком, уроженцем Калифорнии, и продаваемый его другом
Стивом Джобсом, Apple I представляет собой одноплатный компьютер для
любителей.
1977
Apple II.
Apple-II продавался в комплекте с основной логической платой, импульсным
источником питания, клавиатурой, корпусом, руководством, игровыми манипуляторами
и кассетной лентой с игрой Breakout.
В период с 1977 по 1993 год были проданы миллионы Apple II, что сделало его одной
из самых долгоживущих линеек персональных компьютеров.
1979
Микропроцессор Motorola 68000.
Этот высокопроизводительный процессор нашел свое место в мощных рабочих
станциях, предназначенных для ресурсоемких графических программ,
распространенных в инженерии.
1979
ATARI 400 и 800.
Вскоре после поставки игровой консоли Atari VCS, Atari разрабатывает два
микрокомпьютера с игровыми возможностями: Model 400 и Model 800.
Model400 служил в основном как игровая консоль, а 800 был скорее домашним
компьютером.
● 1980-е годы.
1981
Персональный компьютер IBM.
Узнаваемость бренда IBM, наряду с масштабной маркетинговой кампанией,
способствовала быстрому росту рынка персональных компьютеров с анонсом
собственного персонального компьютера (ПК).
Первый ПК IBM, формально известный как IBM Model 5150, был основан на
микропроцессоре Intel 8088 4,77 МГц и использовал операционную систему Microsoft
MS-DOS.
1982
Коммодор 64.
Коммодор 64 или C64, как он более известен, продается за 595 долларов, имеет 64 КБ
оперативной памяти и впечатляющую графику.
Тысячи наименований программного обеспечения были выпущены за время жизни
C64, и к тому времени, когда он был прекращен в 1993 году, было продано более 22
миллионов единиц.
Он признан Книгой рекордов Гиннеса 2006 года как самый продаваемый компьютер
всех времен.
1983
Compaq Portable.
Compaq Portable, рекламируемый как первый компьютер, на 100% совместимый с IBM
PC, может запускать то же программное обеспечение, что и IBM PC.
Успех Compaq положил начало рынку IBM-совместимых компьютеров, который к
1996 году занял 83% рынка персональных компьютеров.
1984
Apple Macintosh.
Macintosh был первым успешным компьютером с управляемым мышью и
графическим пользовательским интерфейсом, основанным на микропроцессоре
Motorola 68000. Его цена составляла 2500 долларов.
1987
IBM Personal System /2 (PS/2).
Это первая система IBM, включающая чип Intel 80386, к концу первого года компания
поставила более 1 миллиона единиц. В то же время IBM выпустила новую
операционную систему OS/2, впервые позволившую использовать мышь с
компьютерами IBM.
Многие считают, что PS/2 сделал 3,5-дюймовый дисковод для гибких дисков и
видеографический массив (VGA) стандартом для компьютеров IBM.
1989
Intel 80486.
Intel выпустила микропроцессор 80486 и чип RISC / сопроцессор i860, каждый из
которых содержит более 1 миллиона транзисторов. Микропроцессор RISC имел
32-битный целочисленный арифметико-логический блок (часть ЦП, которая выполняет
такие операции, как сложение и вычитание), 64-битный блок с плавающей запятой и
тактовую частоту 33 МГц.
Микросхемы 486 остались аналогичными по структуре своим предшественникам, 386
микросхемам. Что отличает 486 от других, так это его оптимизированный набор
инструкций с унифицированными инструкциями и кэшем данных на кристалле, а
также опциональным встроенным блоком вычислений с плавающей запятой.
В сочетании с усовершенствованным блоком интерфейса шины микропроцессор
удвоил производительность 386 без увеличения тактовой частоты.
● 21 век.
2005
Ардуино.
Возвращаясь к эре персональных компьютеров в 1970-х годах, Arduino начинается как
проект Interaction Design Institute, Ивреа, Италия.
Каждая плата Arduino размером с кредитную карту состояла из недорогого
микроконтроллера и сигнальных разъемов, что делало Arduino идеальным для
использования в любых приложениях, подключающихся к внешнему миру или
контролирующих его.
2007
Apple iPhone.
Apple запускает iPhone - комбинацию веб-браузера, музыкального плеера и
сотового телефона, который может загружать новые функции в виде приложений из
онлайн-магазина Apple.
2010
Apple iPad.
IPad сочетает в себе многие популярные возможности iPhone, такие как встроенная
камера высокого разрешения, доступ к iTunes Store и возможности аудио-видео, но с
девятидюймовым экраном и без телефона.
Приложения, игры и аксессуары помогли поднять популярность iPad и привели к
его внедрению в тысячи различных приложений, например, создания фильмов,
графики, музыки, управления запасами и систем кассовых терминалов, и это лишь
некоторые из них.
2012
Raspberry Pi.
Созданный в Великобритании фондом Raspberry Pi Foundation, этот компьютер
размером с кредитную карту отличается удобством использования и простотой
конструкции, что делает его очень популярным среди студентов и любителей.
2020
Чип Apple M1.
M1 был разработан Apple Inc. как центральный процессор (CPU) и графический
процессор (GPU) для компьютеров Macintosh и планшетов iPad Pro.
Он также знаменует собой первое серьезное изменение в наборе инструкций,
используемом компьютерами Macintosh с тех пор, как Apple в 2006 году
переключила компьютеры Mac с PowerPC на Intel.
2.Аппаратное обеспечение компьютеров.
Любой компьютер можно представить, как иерархическую систему,
представляющую собой совокупность взаимосвязанных подсистем, каждая из
которых, в свою очередь, иерархична по своей структуре, пока мы не достигнем
некоторого низшего уровня элементарной подсистемы.
На каждом уровне компьютер можно рассматривать как совокупность структуры и
выполняемых функций.
● Функция - работа каждого отдельного компонента как части конструкции.
● Структура - способ, которым компоненты взаимосвязаны.
Функции компьютера.
Компьютер может выполнять всего четыре основные функции:
1) Обработка данных.
Данные могут принимать самые разные формы, и диапазон требований к обработке
широк. Однако мы увидим, что существует только несколько основных методов или
типов обработки данных.
2) Хранение данных.
Даже если компьютер обрабатывает данные «на лету» (т. е. данные поступают и
обрабатываются, а результаты немедленно отправляются), компьютер должен
временно хранить по крайней мере те фрагменты данных, которые обрабатываются в
любой момент времени. Таким образом, есть хотя бы функция кратковременного
хранения данных. Не менее важно, что компьютер выполняет функцию
долговременного хранения данных. Файлы данных сохраняются на компьютере для
последующего поиска и обновления.
3) Перемещение данных.
Операционная среда компьютера состоит из устройств, которые служат источниками
или получателями данных. Когда данные принимаются или доставляются на
устройство, которое напрямую подключено к компьютеру, этот процесс называется
вводом-выводом (Input/Output, I/O), а устройство называется периферийным
устройством. Когда данные перемещаются на большие расстояния, на удаленное
устройство или с него, этот процесс называется передачей данных.
4) Управление.
Внутри компьютера блок управления отвечает за ресурсы компьютера и работу его
функциональных частей в соответствии с инструкциями.
Структура компьютера.
На Рисунке 2 представлена иерархия внутренней структуры
традиционного однопроцессорного компьютера.
Рис. 2
Структура однопроцессорного компьютера.
Она включает четыре основных структурных компонента:
● Центральный процессор(ЦП).
ЦП контролирует работу компьютера и выполняет его функции
обработки данных; часто называют процессором.
● Основная память(ОП).
ОП хранит данные.
● Ввод-вывод(ВВ, Input/Output, I/O).
ВВ перемещает данные между компьютером и его внешней средой.
● Системные соединения.
Это некоторый механизм, обеспечивающий связь между
процессором, основной памятью и вводом-выводом. Типичным
примером системного соединения является системная шина,
состоящая из ряда проводов, к которым присоединяются все
остальные компоненты.
В системе может быть один или более упомянутых компонентов.
Традиционно был только один процессор. В последние годы в одном
компьютере все чаще используется несколько процессоров.
В центральный процессор входят:
● Блок управления, который контролирует работу ЦП и,
следовательно, компьютера.
● Арифметико-логическое устройство (АЛУ), выполняющее
обработку данных.
● Регистры, которые обеспечивает внутреннюю память ЦП.
● Внутренние соединения ЦП. Это некоторый механизм, который
обеспечивает связь между блоком управления, АЛУ и регистрами.
Структура многоядерного компьютера.
Современные компьютеры обычно имеют несколько процессоров. Когда
все эти процессоры размещены на одном кристалле, используется
термин многоядерный компьютер, а каждый процессор (состоящий из
блока управления, АЛУ, регистров и, возможно, кэш-памяти) называется
ядром. Для пояснения терминологии будем использовать следующие
определения:
● Центральный процессор (ЦП).
Это та часть компьютера, которая извлекает и выполняет команды.
Он состоит из АЛУ, блока управления и регистров. В системе с
одним процессором его часто называют просто процессором.
● Ядро.
Это индивидуальный блок обработки на процессорной микросхеме.
Ядро может быть эквивалентно по функциональности ЦП в
однопроцессорной системе. Другие специализированные блоки
обработки, например, оптимизированные для векторных и
матричных операций, также называются ядрами.
● Процессор.
Это физический кусок кремния, содержащий одно или несколько
ядер. Процессор — это компонент компьютера, который
интерпретирует и выполняет команды. Если процессор содержит
несколько ядер, он называется многоядерным процессором.
Рисунок 3 - это упрощенный вид основных компонентов типичного
многоядерного компьютера. Большинство компьютеров, включая
встроенные в смартфоны и планшеты, а также персональные
компьютеры, ноутбуки и рабочие станции, содержат основные
компоненты на материнской плате.
Рис. 3
Печатная плата (Printed Circuit Board, PCB) является жесткой плоской
доской, которая удерживает межкомпонентные чипы и другие
электронные компоненты. Плата состоит из слоев, обычно от двух до
десяти, которые соединяют компоненты с помощью медных дорожек,
выгравированных на плате. Основная печатная плата в компьютере
называется системной платой или материнской платой, а более мелкие,
которые вставляются в слоты на основной плате, называются платами
расширения.
Самыми заметными элементами на материнской плате являются
микросхемы (чипы, от англ. chip - «тонкая пластинка» ).
Чип представляет собой один кусок полупроводникового
материала, обычно кремния, на котором изготавливаются
электронные схемы и логические элементы.
Материнская плата содержит слот или гнездо для чипа процессора,
который обычно содержит несколько отдельных ядер, в так называемом
многоядерном процессоре. Есть также слоты для микросхем памяти,
микросхем контроллеров ввода-вывода и других ключевых компонентов
компьютера. Для настольных компьютеров слоты расширения позволяют
устанавливать дополнительные компоненты на платах расширения.
Таким образом, современная материнская плата соединяет всего
несколько отдельных компонентов - микросхем, причем каждая
микросхема содержит от нескольких тысяч до сотен миллионов
транзисторов.
В общих чертах функциональными элементами ядра являются:
● Командная логика. Сюда входят задачи, связанные с выбором
команд и декодированием каждой команды для определения
операции и расположения в памяти любых операндов.
● Арифметико-логический блок (ALU). Выполняет операцию,
указанную в команде.
● Логика загрузки/сохранения. Управляет передачей данных в
основную память и из нее через кэш.
Кэш-память.
Отличительной особенностью компьютеров является использование
нескольких уровней памяти, называемых кэш-памятью, между
процессором и основной памятью.
Кэш-память меньше и быстрее основной памяти и
используется для ускорения доступа к памяти путем
помещения в кэш данных из основной памяти.
Наибольшее повышение производительности может быть достигнуто за
счет использования нескольких уровней кэш-памяти, при этом уровень 1
(L1) находится ближе всего к ядру, а дополнительные уровни (L2, L3 и т.
д.) постепенно удаляются от ядра.
Ядро содержит кэш L1, разделенный между кэшем команд (I-cache),
который используется для передачи команд в основную память и из нее,
и кэшем данных L1 для передачи операндов и результатов. Как правило,
современные процессорные микросхемы также включают в себя кэш L2
как часть ядра. Во многих случаях этот кэш также разделен между
кэшами команд и данных, хотя также используется комбинированный
одиночный кэш L2.
Рис. 4
Материнская плата.
Материнская или системная плата представляет собой большую
печатную плату, которая используется во всех программируемых
электронных устройствах. Компоненты, прикрепленные к плате, могут
отличаться от одной системы к другой. Настольный компьютер имеет
иные типы разъемов и оборудования, нежели смартфон.
Материнская плата содержит:
● разъемы питания,
● разъем ЦП для установки ЦП,
● слоты ОЗУ,
● разъемы ввода/вывода, такие как USB, DVI, HDMI, аудио,
● слоты расширения для дополнительных карт, таких как видеокарта
или RAID,
● микросхему северного моста (подключается непосредственно к ЦП,
отвечает за задачи, требующие максимальной
производительности),
● микросхему южного моста для логики ввода-вывода.
Пример материнской платы с разъемами для компонентов показан на
интерактивном Рисунке 5.
Рисунок 5. Пример материнской платы настольного персонального компьютера
Обзор ЦП.
Общая блок-схема типичного ЦП показана на Рисунке 6. Подсистемы
связаны между собой внутренними шинами. Реальные процессоры
намного сложнее, но общие концепции, обсуждаемые здесь, применимы
ко всем из них.
Рисунок 6. Блок-схема подсистем центрального процессора
Интерфейс шины. Это средство связи ЦП с остальной частью
компьютерной системы - памятью и устройствами ввода-вывода. Он
содержит схемы для размещения адресов на адресной шине, чтения и
записи данных на шину данных, а также чтения и записи сигналов на
шине управления. Интерфейс шины на многих ЦП взаимодействует с
внешними блоками управления шиной, которые, в свою очередь,
взаимодействуют с памятью и с различными типами шин ввода/вывода,
например, SATA, PCI-E и т. д. Внешние блоки управления прозрачны для
программиста.
Кэш-память L1. Хотя можно утверждать, что это не часть ЦП,
большинство современных ЦП включают в себя очень быструю
кэш-память на микросхеме ЦП. Каждую команду необходимо извлекать
из памяти. ЦП может выполнять команды намного быстрее, чем их можно
получить. Интерфейс с памятью позволяет более эффективно получать
несколько команд за один раз, сохраняя их в кэше L1, где ЦП имеет
очень быстрый доступ к ним. Многие современные процессоры
используют две кэш-памяти L1, организованные по Гарвардской
архитектуре - одна для команд, другая для данных. Его использование,
как правило, прозрачно для разработчика приложений.
Регистры. Регистр - это группа битов, которая предназначена для
использования в качестве переменной в программе. У компиляторов и
ассемблеров есть имена для каждого регистра. Почти все
арифметические и логические операции и операции перемещения
данных включают как минимум один регистр.
Указатель команды. Это 64-битный регистр, который всегда содержит
адрес следующей выполняемой команды.
Регистр команд. Этот регистр содержит команду, которая выполняется в
данный момент. Его битовая комбинация определяет, что блок
управления заставляет делать ЦП . Как только это действие будет
завершено, битовая комбинация в регистре команд может быть
изменена, и ЦП выполнит операцию, указанную следующей битовой
комбинацией.
Большинство современных процессоров используют очередь команд,
встроенную в чип. Несколько команд ждут в очереди, готовые к
выполнению. Отдельная электронная схема обеспечивает полную
очередь команд, пока обычный блок управления выполняет команды. Но
это просто деталь реализации, позволяющая блоку управления работать
быстрее. Суть того, как блок управления выполняет программу,
представлена моделью регистра с одной командой.
Блок управления. Биты в регистре команд декодируются в блоке
управления. Он генерирует сигналы, которые управляют другими
подсистемами ЦП для выполнения действий, указанных в команде.
Обычно он реализуется как конечный автомат и содержит декодеры,
мультиплексоры и другие логические компоненты.
Арифметико-логическое устройство (АЛУ). Устройство, которое
выполняет арифметические и логические операции над группами битов.
Регистр флагов. Каждая операция, выполняемая АЛУ, приводит к
различным условиям, которые необходимо записывать. Например,
сложение может привести к переносу. Один бит в регистре флагов будет
установлен либо в ноль (без переноса), либо на единицу (перенос) после
того, как АЛУ завершит любую операцию, которая может произвести
перенос.
Регистры ЦП.
Внутри процессора есть набор регистров, которые функционируют как
уровень памяти над основной памятью и кэшем в иерархии. Регистры в
процессоре выполняют две роли в зависимости от своей категории:
● Регистры, видимые пользователю позволяют программисту на
машинном языке или языке ассемблера минимизировать
обращения к основной памяти за счет оптимизации использования
регистров.
● Регистры управления и состояния используются блоком
управления для управления работой процессора и
привилегированными программами ОС для управления
выполнением программ.
Рисунок 7. Пример организации регистров для трех различных процессоров
Видимые пользователем категории регистров:
1. Программист может назначить регистрам общего назначения
множество функций. Любой регистр общего назначения может
содержать операнд для любого кода операции.
2. Регистры данных могут использоваться только для хранения
данных и не могут использоваться при вычислении адреса
операнда.
3. Регистры адресов сами по себе могут быть в некоторой степени
универсальными, или они могут быть предназначены для
определенного режима адресации.
римеры видимых пользователю регистров адресов:
● Указатели сегментов.
Эти регистры в машинах с сегментированной адресацией содержат
базовый адрес сегмента.
● Индексные регистры.
Эти регистры используются для индексированной адресации и
могут индексироваться автоматически.
● Указатель стека.
Если имеется видимая для пользователя адресация стека, то
обычно имеется специальный регистр, указывающий на вершину
стека.
4. Биты кода состояния собираются в один или несколько регистров,
их биты устанавливаются аппаратным обеспечением процессора в
результате операций. Обычно они составляют часть контрольного
реестра. Как правило, машинные команды позволяют считывать
эти биты по неявной ссылке, но программист не может их изменить.
Регистры управления и состояния необходимы для выполнения
команд. К таким регистрам относятся:
● Программный счетчик (Program counter, PC) содержит адрес
команды, которую нужно получить.
● Регистр команд (Instruction register, IR) содержит последнюю
полученную команду.
● Регистр адреса памяти (Memory address register, MAR) содержит
адрес места в памяти.
● Регистр буфера памяти (Memory buffer register, MBR) содержит
слово данных, которое должно быть записано в память, или слово,
прочитанное последним.
Взаимодействие процессора с памятью и
вводом.выводом.
Соединения между ЦП и памятью показаны на Рисунке 8. Этот рисунок
также включает подсистему ввода-вывода. Блок управления связан с
памятью тремя шинами:
● адресная шина,
● шина данных,
● шина управления.
Шина - это путь связи между двумя или более устройствами.
Рис. 8. Шины подключения ЦП
К одной шине можно подключить несколько устройств, но только два
устройства могут обмениваться данными по шине одновременно.
Выполнение программы в ЦП.
ЦП содержит специальный регистр - регистр команд, битовая
комбинация которого определяет, что будет делать ЦП. Как только это
действие будет завершено, битовый шаблон в регистре команд может
быть изменен, и ЦП выполнит операцию, указанную этим следующим
битовым шаблоном.
Поскольку команды представляют собой просто наборы битов, их можно
хранить в памяти. Регистр указателя команд всегда имеет адрес памяти
(указывает на) следующей команды, которая должна быть выполнена.
Для того чтобы блок управления выполнил эту команду, она копируется в
регистр команд.
Порядок выполнения программы таков:
1. Последовательность команд сохраняется в памяти.
2. Адрес памяти, где расположена первая команда , копируется в
указатель команд.
3. ЦП отправляет адрес из указателя команд в память на адресной
шине.
4. ЦП отправляет сигнал «чтение» по шине управления.
5. Память отвечает, посылая копию состояния битов в этой ячейке
памяти на шине данных, которую ЦП затем копирует в свой регистр
команд.
6. Указатель команд автоматически увеличивается, чтобы получить
адрес следующей команды в памяти.
7. ЦП выполняет команду в регистре команд.
8. Цикл повторяется с шага 3.
Шаги 3, 4 и 5 называются выборкой команд. Обратите внимание, что
шаги 3–8 составляют цикл выполнения команды, представленный
графически на Рисунке 9.
Рисунок 9. Выполнение программы в ЦП
Работа процессора определяется командами, которые он выполняет,
называемыми машинными командами или компьютерными
командами. Вся совокупность различных команд, которые может
выполнять процессор, называется набором команд процессора.
Элементы машинной команды.
Каждая команда должна содержать информацию, необходимую
процессору для выполнения. На рисунке 10 показаны этапы выполнения
команды и, косвенно, определены элементы машинной команды. Эти
элементы следующие:
1. Код операции.
Определяет выполняемую операцию (например, добавление,
ввод-вывод). Операция определяется двоичным кодом, известным
как код операции или opcode.
2. Ссылка на исходный операнд.
Операция может включать один или несколько исходных
операндов, то есть операндов, которые являются входными
данными для операции.
3. Ссылка на операнд результата.
Операция может привести к результату.
4. Ссылка на следующую команду.
Сообщает процессору, где взять следующую команду после
завершения выполнения этой команды.
Адрес следующей извлекаемой команды может быть реальным или
виртуальным, в зависимости от архитектуры. Как правило, различие
прозрачно для архитектуры набора команд. В большинстве случаев
следующая извлекаемая команда следует сразу за текущей командой. В
этих случаях нет явной ссылки на следующую команду. Когда требуется
явная ссылка, необходимо указать адрес основной или виртуальной
памяти.
Рис. 10. Диаграмма состояний командного цикла.
Операнды источника и результата могут находиться в одной из четырех
областей:
● Основная или виртуальная память.
Как и в случае со следующими командами, должен быть указан
адрес основной или виртуальной памяти.
● Регистр процессора.
За редкими исключениями процессор содержит один или несколько
регистров, на которые могут ссылаться машинные команды. Если
существует только один регистр, ссылка на него может быть
неявной. Если существует более одного регистра, то каждому
регистру присваивается уникальное имя или номер, и команда
должна содержать номер желаемого регистра.
● Немедленное выполнение.
Значение операнда содержится в поле выполняемой команды.
● Устройство ввода-вывода.
Команда должна указывать модуль ввода-вывода и устройство для
операции. Если используется ввод-вывод с отображением памяти,
это просто еще один адрес основной или виртуальной памяти.
Набор команд.
Текущие предложения x86 представляют собой результат десятилетий
усилий по проектированию компьютеров со сложным набором команд
(Complex Instruction Set Computers, CISC). X86 включает в себя
сложные принципы проектирования, которые когда-то встречались только
в мэйнфреймах и суперкомпьютерах, и служит прекрасным примером
проектирования CISC.
Альтернативный подход к проектированию процессора - компьютер с
сокращенным набором команд (Reduced Instruction Set Computer,
RISC). Архитектура ARM используется во множестве встраиваемых
систем и является одной из самых мощных и лучших на рынке систем на
основе RISC.
Дизайн набора команд.
Дизайн набора команд очень сложен, потому что он влияет на очень
многие аспекты компьютерной системы. Набор команд определяет
многие функции, выполняемые процессором, и, таким образом,
оказывает существенное влияние на реализацию процессора. Набор
команд — это средство программиста для управления процессором.
Таким образом, при разработке набора инструкций необходимо
учитывать требования программиста.
Некоторые из наиболее фундаментальных вопросов, касающихся
разработки наборов команд, остаются спорными. Вот перечень наиболее
важных проблем проектирования:
● Набор операций.
Сколько и какие операции предоставить, и насколько сложными
они должны быть.
● Типы данных.
Каковы будут типы данных, с которыми выполняются операции.
● Формат команды.
Определить длину команды (в битах), количество адресов, размер
различных полей и т. д.
● Регистры.
Каково количество регистров процессора, на которые могут
ссылаться команды, как они будут использоваться.
● Адресация.
Определение режима или режимов, в которых указывается адрес
операнда.
Количество различных кодов операций широко варьируется от машины к
машине. Однако есть одни и те же общие типы операций, которые мы
приводим в Таблице 1.
Таблица 1. Общие типы операций.
Тип операций
Описание
Вариант 1. Простой перенос данных из
одного места в другое.
1. Передачи данных
2. Арифметические
3. Логические
4. Преобразования
Вариант 2. Перенос данных при
задействовании памяти:
- определение адреса памяти,
- преобразование адреса виртуальной
памяти в реальный,
- проверка кэша,
- чтение из памяти/запись в память.
Может включать передачу данных до и/или
после.
Выполнение функции в ALU.
Установка кодов состояния и флагов.
То же, что в арифметических операциях.
Аналогично арифметике и логике. Может
включать специальную логику выполнения
преобразования.
Выдача команд модулю ввода/вывода.
5. Ввода/вывода
6. Управления системой
7. Передачи управления
Если ввод-вывод с отображением в
память, то дополнительно определяется
адрес с отображением в памяти.
Выполнение специальных команд для
работы в привилегированном режиме.
Обновление программного счетчика.
Управление передачей параметров и
связыванием для вызова подпрограммы
или возврата из нее.
Рассмотрим эти основные 7 типов операций подробнее.
1. Команды передачи данных.
Это самый фундаментальный тип машинных команд, перечень которых
мы представили в Таблице 2.
Инструкция по передаче данных должна указывать несколько вещей.
1. Необходимо указать расположение исходного и целевого
операндов. Каждое место может быть памятью, регистром или
вершиной стека.
2. Необходимо указать длину передаваемых данных.
3. Как и во всех инструкциях с операндами, необходимо указать
способ адресации для каждого операнда.
Таблица 2. Команды по передаче данных
Тип
Имя операции
Описание
Move (transfer)
Перенос слова или блока из
источника в приемник
Store
Передача слова из
процессора в память
Load (fetch)
Передача слова из памяти
в процессор
Exchange
Обмен содержимым
источника и приемника
Clear (reset)
Передача слова,
состоящего из нулей в
приемник
Set
Передача слова,
состоящего из единиц в
приемник
Push
Перенос слова из источника
в вершину стека
Pop
Перенос слова из вершины
стека в приемник
Передача данных
С точки зрения работы процессора, операции передачи данных, пожалуй,
самый простой тип. Если и источник, и место назначения являются
регистрами, то процессор просто вызывает передачу данных из одного
регистра в другой; это внутренняя операция процессора.
Если один или оба операнда находятся в памяти, процессор должен
выполнить некоторые или все из следующих действий:
1. Рассчитать адрес памяти, исходя из режима адресации.
2. Если адрес относится к виртуальной памяти, преобразовать адрес
виртуальной памяти в реальную.
3. Определить, находится ли адресуемый элемент в кэше.
4. Если нет, подать команду на модуль памяти.
2. Арифметические команды.
Большинство машин обеспечивают основные арифметические операции
сложения, вычитания, умножения и деления. Они всегда
предоставляются для целых чисел со знаком (с фиксированной точкой).
Часто они также предоставляются для чисел с плавающей запятой и
упакованных десятичных чисел.
Другие возможные операции включают множество команд с одним
операндом; например, absolute, negate, increment, decrement, как
показано в Таблице 3.
Таблица 3. Арифметические команды
Тип
Имя операции
Описание
Add
Вычисление суммы двух
операндов
Subtract
Вычисление разницы двух
операндов
Multiply
Вычисление произведения
двух операндов
Divide
Вычисление частного двух
операндов
Absolute
Замена операнда его
абсолютным значением
Negate
Изменение знака операнда
Арифметические
Increment
Увеличение операнда на 1
Decrement
Уменьшение операнда на 1
Выполнение арифметической инструкции может включать в себя
операции передачи данных для позиционирования операндов для ввода
в ALU и для доставки вывода ALU.
3. Логические команды.
Большинство машин также предоставляют множество операций для
манипулирования отдельными битами слова или другими адресуемыми
единицами, часто называемыми «перестановкой битов». Они основаны
на булевых операциях.
Некоторые из основных логических операций, которые можно выполнять
над булевыми или двоичными данными, показаны в Таблице 4.
Таблица 4. Логические команды
Тип
Имя операции
Описание
AND
Выполнение логического И
OR
Выполнение логического
ИЛИ
NOT
(дополнение) Выполнение
логического НЕ
Exclusive-OR
Выполнение логического
исключающего ИЛИ
Test
Проверка указанного
условия; установка флагов
на основе результата
Compare
Выполнение логического
или арифметического
сравнения двух или более
операндов; установка
флагов на основе
результата
Set Control
Variables
Класс команд для установки
элементов управления в
целях защиты, обработки
прерываний, управления
Логические
таймером и т. д.
Shift
Операнд сдвига влево
(вправо), введение констант
в конце
Rotate
Операнд циклического
сдвига влево (вправо)
В Таблице 5 представлены результаты некоторых логических операций.
Таблица 5. Таблица истинности для логических операций
P
Q
NOT P P AND
Q
P OR
Q
P XOR
Q
P=Q
0
0
0
1
0
0
0
0
1
0
1
1
0
1
1
1
0
1
0
0
0
1
1
1
0
1
1
0
1
1
0
0
1
4. Команды преобразования.
Команды преобразования — это команды, которые изменяют формат или
работают с форматом данных (Таблица 6). Примером является
преобразование из десятичной системы в двоичную.
Таблица 6. Команды преобразования
Тип
Имя операции
Input (read)
Логические
Output (write)
Описание
Передача данных из
указанного порта
ввода-вывода или
устройства в место
назначения (например, в
основную память или
регистр процессора)
Передача данных из
указанного источника в порт
ввода-вывода или
устройство
Start I/O
Test I/O
Translate
Конверсионные
Convert
Передача инструкции
процессору ввода/вывода
для инициирования
операции ввода/вывода.
Передача информации о
состоянии из системы
ввода-вывода в указанное
место назначения
Перевод значения в
разделе памяти на основе
таблицы соответствий
Преобразование
содержимого слова из
одной формы в другую
(например, из упакованного
десятичного числа в
двоичное)
5. Команды ввода/вывода.
Команды ввода/вывода охватывают несколько областей, включая
изолированный программный ввод/вывод, программируемый ввод/вывод
с отображением памяти, DMA и использование процессора
ввода/вывода. Многие реализации предоставляют только несколько
команд ввода-вывода с конкретными действиями, указанными
параметрами, кодами или командными словами.
6. Команды по управлению системой.
Команды системного управления могут выполняться только тогда, когда
процессор находится в определенном привилегированном состоянии или
выполняет программу в специальной привилегированной области
памяти. Как правило, эти команды зарезервированы для использования
операционной системой.
7. Команды передачи управления.
Для всех типов операций, рассмотренных до сих пор, следующая
команда, которая должна быть выполнена, - это та, которая в памяти
следует непосредственно за текущей командой. Однако значительная
часть команд в любой программе имеет своей функцией изменение
последовательности выполнения команд. Для этих команд процессором
выполняется операция по обновлению программного счетчика (ПК),
чтобы он содержал адрес некоторой команды в памяти (Таблица 7).
Таблица 7. Передача команд управления
Тип
Имя операции
Передача
управления
Jump (branch)
Описание
Безусловный переход;
загрузка ПК с указанным
адресом
Jump Conditional
Условный переход с
проверкой указанного
условия:
либо загрузка ПК с
указанным адресом,
либо ничего не делать
Jump to Subroutine
Переход по указанному
адресу подпрограммы
Return
Возврат из подпрограммы,
в ПК загружается ранее
сохраненный адрес
Execute
Получение операнда из
указанного места и
выполнение как команды;
ПК не модифицируется
Skip
Увеличение ПК, чтобы
пропустить следующую
команду
Skip Conditional
Увеличение ПК с проверкой
указанного условия:
либо пропуск,
либо ничего не делать в
зависимости от условия
Halt
Остановка выполнения
программы
Wait (hold)
Приостановка выполнения
программы:
неоднократное
тестирование указанного
условия; возобновление
выполнения, когда условие
выполнено
No operation
Никакая операция не
выполняется, но
выполнение программы
продолжается
Команда branch, также называемая командой jump, имеет в качестве
одного из своих операндов адрес следующей выполняемой команды.
Чаще всего команда представляет собой команду условного перехода. То
есть branch (обновление счетчика программы до равного адресу,
указанному в операнде) выполняется только при выполнении
определенного условия. В противном случае выполняется следующая
команда в последовательности (как обычно увеличивается программный
счетчик). Команда branch, в которой всегда выполняется переход,
является безусловным переходом.
Другой формой команды передачи управления является команда skip.
Команда skip включает неявный адрес. Обычно skip подразумевает
пропуск одной команды; таким образом, подразумеваемый адрес равен
адресу следующей команды плюс одна длина команды. Поскольку
команда skip не требует поля адреса назначения, она может выполнять
другие действия.
Пожалуй, самым важным нововведением в разработке языков
программирования является процедура.
Процедура представляет собой автономную
компьютерную программу, которая включена в большую
программу.
В любой точке программы процедура может быть запущена или вызвана.
Процессору дается указание пойти и выполнить всю процедуру, а затем
вернуться в точку, из которой был выполнен вызов.
Две основные причины использования процедур - это
экономия и модульность.
Процедура позволяет многократно использовать один и тот же фрагмент
кода. Это важно для экономии усилий по программированию и для
наиболее эффективного использования дискового пространства в
системе.
Процедуры также позволяют разбивать большие задачи
программирования на более мелкие блоки. Такое использование
модульности значительно облегчает задачу программирования.
Механизм процедуры включает в себя две основные команды:
- команду вызова, выполняющую переход от текущего
местоположения к процедуре,
- команду возврата, возвращающую из процедуры в место, из
которого она была вызвана.
Обе они являются формами команды branch.
CISC против RISC.
Компьютер с сокращенным набором команд (Reduced Instruction Set
Computer, RISC) — это тип процессора или Архитектура набора
инструкций (Instruction Set Architecture, ISA). Т.е. упоминая RISC, мы
можем говорить и о конкретном процессоре и об архитектуре как таковой.
RISC обычно относится к упрощенной версии своего предшественника,
компьютера с комплексным набором команд (CISC). На заре
процессоров не было формальной идентификации, известной как CISC,
но с тех пор этот термин был придуман для обозначения их отличия от
архитектуры RISC. Некоторые примеры архитектур набора команд
микропроцессора CISC (ISA) включают Motorola 68000 (68K) и несколько
поколений Intel x86.
Примеры процессоров с архитектурой RISC включают MIPS, PowerPC,
ARM, а также все современные микропроцессоры имеют хотя бы
некоторые элементы RISC.
В чем разница между RISC и CISC?
Машины на основе RISC выполняют одну команду за такт. Машины CISC
могут иметь специальные команды, а также команды, выполнение
которых занимает более одного цикла. Это означает, что одна и та же
команда, выполняемая в архитектуре CISC, может потребовать
несколько команд для выполнения на машине RISC. Архитектуре RISC
потребуется больше рабочей (RAM) памяти, чем CISC для хранения
значений, когда она загружает каждую команду, воздействует на нее, а
затем загружает следующую.
Архитектуры RISC и CISC представлены на Рисунке 11.
Рисунок 11. Архитектуры CISC и RISC.
Архитектура CISC может выполнять одну, хотя и более сложную команду,
которая выполняет все операции сразу непосредственно с памятью.
Таким образом, архитектура RISC требует больше ОЗУ, но всегда
выполняет одну команду за такт для предсказуемой обработки, что
хорошо для конвейерной обработки.
Одно из основных различий между RISC и CISC
заключается в том, что
RISC эффективнее в затрачиваемых циклах на команду,
а CISC эффективнее в количестве команд на программу.
Быстрый процессор зависит от того, сколько времени требуется для
выполнения каждого тактового цикла, сколько циклов требуется для
выполнения команд и количества команд в каждой программе. RISC
делает акцент на большие размеры программного кода (из-за меньшего
набора команд, поэтому несколько шагов, выполняемых подряд, могут
равняться одному шагу в CISC).
RISC ISA делает упор на программное обеспечение, а не на аппаратное.
Набор команд RISC требует написания более эффективного
программного обеспечения (например, компиляторов или кода) с
меньшим количеством команд. CISC ISA используют больше
транзисторов в аппаратном обеспечении для реализации большего
количества команд, а также более сложных команд.
RISC требует больше оперативной памяти, тогда как CISC делает упор на
меньший размер кода и в целом использует меньше оперативной памяти,
чем RISC. Однако сегодня многие микропроцессоры содержат сочетание
RISC- и CISC-подобных атрибутов, например, CISC-подобный ISA,
который обрабатывает команды, как если бы они были командной
строкой RISC-типа.
Некоторые основные различия между архитектурами CISC и RISC
перечислены в таблице 8.
Таблица 8. Некоторые различия между архитектурами набора команд
CISC и RISC
CISC
RISC
Оригинальный микропроцессор ISA
Модернизированная ISA, появившаяся в
начале 1980-х годов.
Инструкция может занять несколько тактов
Одноцикловые команды
Аппаратно-ориентированный дизайн - ISA
максимально использует аппаратную
схему
Программно-ориентированный дизайн Компиляторы высокого уровня берут на
себя большую часть бремени кодирования
многих шагов программного обеспечения
от программиста.
Более эффективное использование
оперативной памяти, чем RISC
Интенсивное использование ОЗУ (может
вызвать узкие места, если ОЗУ
ограничено)
Сложные команды переменной длины
Простые стандартизированные команды
Может поддерживать микрокод
(микропрограммирование, при котором
команды рассматриваются как небольшие
программы)
Только один слой команд
Большое количество команд
Небольшое количество команд
фиксированной длины
Составные режимы адресации
Ограниченные режимы адресации
Внутренняя (основная) память.
Основным элементом полупроводниковой памяти является ячейка
памяти. Независимо от используемой электронной технологии, все
полупроводниковые ячейки памяти обладают определенными
свойствами:
● Они демонстрируют два стабильных (или полустабильных)
состояния, которые можно использовать для представления
двоичных 1 и 0.
● Они могут быть записаны (хотя бы один раз) для установки
состояния.
● Их состояние можно считывать.
Существует три основных типа полупроводниковой памяти:
1. Оперативная память(ОЗУ).
Оперативная память энергозависима, можно легко и быстро как
считывать данные из памяти, так и записывать новые данные в
памяти.
2. Постоянная память(ПЗУ).
ПЗУ энергонезависимое. Содержит постоянную структуру данных,
которую нельзя изменить.
3. Флэш-память.
Электронная энергонезависимая память, которую можно
электрически стирать и перепрограммировать.
Полный список типов полупроводниковой памяти представлен в таблице
9.
Таблица 9. Типы полупроводниковой памяти
Тип памяти
Категория
Стирание
Механизм
записи
Энергозави
симость
Оперативная
память (ОЗУ)
Чтение-запись
памяти
Электрически,
байтовый
уровень
Электрически
Энергозависим
а
Постоянная
память (ПЗУ)
Только для
чтения памяти
Невозможно
Электрически
Энергозависим
а
Программируе
мое ПЗУ
(ПРОМ)
Только для
чтения памяти
Невозможно
Электрически
Энергозависим
а
Стираемое
ППЗУ (СППЗУ)
Память в
основном для
чтения
Невозможно
Электрически
Энергозависим
а
Электрически
стираемое
ППЗУ
Память в
основном для
чтения
Электрически,
байтовый
уровень
Электрически
Энергозависим
а
(ЭСППЗУ)
Флэш-память
Память в
основном для
чтения
Электрически,
блочный
уровень
Электрически
Энергозависим
а
Наиболее распространенный тип памяти называется памятью с
произвольным доступом (Random-Access Memory, RAM) или
оперативной памятью (оперативное запоминающее устройство,
ОЗУ). Одной из отличительных характеристик памяти, обозначаемой как
ОЗУ, является то, что можно легко и быстро как считывать данные из
памяти, так и записывать новые данные в память. И чтение, и запись
осуществляются с помощью электрических сигналов.
Другой отличительной чертой традиционной оперативной памяти
является ее энергозависимость. Оперативная память должна быть
обеспечена постоянным питанием. Если питание прерывается, то данные
теряются. Таким образом, оперативную память можно использовать
только как временное хранилище. В компьютерах используются две
традиционные формы ОЗУ: DRAM (динамическая RAM) и SRAM
(статическая RAM).
Динамическое ОЗУ (DRAM) состоит из ячеек, которые хранят данные в
виде заряда на конденсаторах. Наличие или отсутствие заряда в
конденсаторе интерпретируется как двоичная единица или 0. Поскольку
конденсаторы имеют естественную тенденцию к разрядке, динамические
ОЗУ требуют периодического обновления заряда для сохранения
данных.
Статическая оперативная память — это цифровое устройство, в котором
используются те же логические элементы, что и в процессоре. В SRAM
двоичные значения хранятся с использованием традиционных
конфигураций логических вентилей триггера. Статическая оперативная
память будет хранить свои данные, пока на нее подается питание.
Для поддержания значений битов в памяти ПЗУ не требуется источник
питания. Хотя ПЗУ можно прочитать, записать в него новые данные
невозможно.
Внешняя память.
Внешняя память - это память, используемая для долговременного
хранения компьютерных данных.
Магнитный диск.
Магнитный диск представляет собой круглую пластину, изготовленную из
немагнитного материала, называемого подложкой, покрытую
намагничивающимся материалом. Традиционно подложка представляет
собой материал из алюминия или алюминиевого сплава. Совсем недавно
стали использоваться стеклянные подложки (Рисунок 12).
Данные записываются на диск, а затем извлекаются с него через
проводящую катушку, называемую головкой чтения-записи (Рисунок 12,
маркер 1). Во многих системах есть две головки - головка чтения и
головка записи. Во время операции чтения или записи головка
неподвижна, а пластина диска (Рисунок 12, маркер 2) под ней вращается
на шпинделе (Рисунок 12, маркер 3).
Рисунок 12. Общая механика жестких дисков.
Механизм записи использует тот факт, что электричество, протекающее
через катушку, создает магнитное поле. Электрические импульсы
посылаются на записывающую головку, и полученные магнитные узоры
записываются на поверхность под ней с разными узорами для
положительных и отрицательных токов.
Механизм считывания использует тот факт, что магнитное поле,
движущееся относительно катушки, создает электрический ток в катушке.
Головка представляет собой относительно небольшое устройство,
способное считывать или записывать на часть диска, вращающегося под
ним. Это приводит к организации данных на диске в виде
концентрического набора колец, называемых дорожками (Рисунок 13).
Каждая дорожка имеет ту же ширину, что и головка. На каждой
поверхности тысячи дорожек.
Форматирование диска — программный процесс разметки области
хранения данных электронных носителей информации, расположенной
на магнитной поверхности (жёсткие диски, дискеты), оптических
носителях (CD/DVD/Blu-ray-диски), твердотельных накопителях
(флэш-память — flash module, SSD).
Пример форматирования диска показан на Рисунке 14. В этом случае
каждая дорожка содержит 30 секторов фиксированной длины по 600 байт
каждый. Каждый сектор содержит 512 байт данных плюс управляющая
информация, необходимая для контроллера диска. Поле ID - это
уникальный идентификатор или адрес, используемый для определения
местоположения определенного сектора. Байт SYNCH - это специальный
битовый шаблон, ограничивающий начало поля.
Номер дорожки определяет дорожку на поверхности. Номер головки
идентифицирует головку, потому что этот диск имеет несколько
поверхностей. Каждое из полей идентификатора и данных содержит код
обнаружения ошибок.
Рисунок 14. Формат диска Винчестера
Некоторые дисковые накопители вмещают несколько пластин,
установленных вертикально на расстоянии доли дюйма друг от друга.
Набор всех дорожек в одинаковом относительном положении на диске
называется цилиндром.
Твердотельные накопители.
Твердотельный накопитель (Solid State Drive, SSD) — это устройство
хранения данных нового поколения, используемое в компьютерах. В
твердотельных накопителях используется флэш-память, которая намного
быстрее, чем традиционный механический жесткий диск (Hard (magnetic)
Disk Drive).
Рисунок 15. Твердотельный накопитель формата M.2 в сравнении с HDD (фото с Flickr)
SSD имеют следующие преимущества перед HDD:
● Высокая производительность операций ввода-вывода в секунду
(IOPS).
● Прочность: менее восприимчив к физическим ударам и вибрации.
● Более длительный срок службы: твердотельные накопители не
подвержены механическому износу.
● Низкое энергопотребление: твердотельные накопители потребляют
значительно меньше энергии, чем жесткие диски сопоставимого
размера.
● Более тихая и холодная работа: требуется меньше места, меньше
затраты на электроэнергию.
● Более низкое время доступа и задержка: более чем в 10 раз
быстрее, чем вращающиеся диски в жестком диске.
Проблемы твердотельных накопителей.
Есть две практические проблемы, характерные для твердотельных
накопителей, с которыми не сталкиваются жесткие диски:
1. Производительность SSD снижается по мере использования.
2. Флэш-память в SSD становится непригодной после определенного
количества операций записи.
Файлы хранятся на диске в виде набора страниц, обычно размером 4 КБ.
Эти страницы не обязательно и не всегда хранятся как непрерывный
набор страниц на диске. Однако доступ к флэш-памяти осуществляется
блоками, с типичным размером блока 512 КБ, так что обычно имеется
128 страниц в блоке. Теперь подумайте, что нужно сделать, чтобы
записать страницу во флэш-память.
1. Весь блок должен быть прочитан из флэш-памяти и помещен в
буфер ОЗУ. Затем обновляется соответствующая страница в
буфере ОЗУ.
2. Прежде чем блок можно будет записать обратно во флэш-память,
весь блок флэш-памяти должен быть стерт — невозможно стереть
только одну страницу флэш-памяти.
3. Теперь весь блок из буфера записывается обратно во
флэш-память.
Теперь, когда флэш-накопитель относительно пуст и создается новый
файл, страницы этого файла записываются на диск непрерывно, так что
затрагивается один или только несколько блоков.
Однако со временем из-за того, как работает виртуальная память, файлы
становятся фрагментированными, а страницы разбросаны по нескольким
блокам. По мере того, как диск становится все более занятым,
увеличивается фрагментация, поэтому запись нового файла может
повлиять на несколько блоков. Таким образом, запись нескольких
страниц из одного блока становится тем медленнее, чем полнее занят
диск.
Оптическая память.
Оптический накопитель — это любой тип хранилища, в котором данные
записываются и считываются с помощью лазера.
И звуковой компакт-диск, и CD-ROM (постоянное запоминающее
устройство компакт-диска), и DVD-ROM (цифровой универсальный диск)
и т. д. используют аналогичную технологию.
Сам диск изготовлен из смолы, например, поликарбоната (Рисунок 16).
Записанная в цифровом виде информация (будь то музыка или
компьютерные данные) отпечатывается в виде серии микроскопических
ямок (питов, от англ. pit - яма) на поверхности поликарбоната. Это
делается, прежде всего, с помощью точно сфокусированного
высокоинтенсивного лазера.
Рисунок 16. Оптический диск и внешний привод.
Сначала создается так называемый мастер-диск, с помощью которого
изготавливают штамп для производства копий на поликарбонате.
Поверхность с ямками покрывается высокоотражающим слоем алюминия
или золота. А блестящую поверхность защищает от пыли и царапин
верхний слой из прозрачного акрила.
На обратную сторону диска обычно наклеивается этикетка, содержащая
необходимую информацию о содержимом диска или изображение (для
игр, аудио-дисков).
Таблица 10. Оптические диски
Продукт
CD
Описание
Компакт-диск. Нестираемый диск, на
котором хранится оцифрованная
аудиоинформация. Стандартная система
использует 12-сантиметровые диски и
может записывать более 60 минут
непрерывного воспроизведения.
CD-ROM
Компакт-диск Постоянное запоминающее
устройство. Нестираемый диск,
используемый для хранения компьютерных
данных. Стандартная система использует
12-сантиметровые диски и может хранить
более 650 Мбайт.
CR-R
Записываемый компакт-диск. Похоже на
CD-ROM. Пользователь может записать на
диск только один раз.
CD-RW
Перезаписываемый компакт-диск. Похоже
на CD-ROM. Пользователь может
многократно стирать и перезаписывать
данные на диск.
DVD
Универсальный цифровой диск.
Технология получения оцифрованного,
сжатого представления видеоинформации,
а также больших объемов других
цифровых данных. Используются как
диаметры 8, так и 12 см, с двухсторонней
емкостью до 17 Гбайт. Базовый DVD
доступен только для чтения (DVD-ROM).
DVD-R
DVD с возможностью записи. Аналогичен
DVD-ROM. Пользователь может записать
на диск только один раз.
DVD-RW
Перезаписываемый DVD. Аналогичен
DVD-ROM. Пользователь может
многократно стирать и перезаписывать
данные на диск.
Blu-ray-DVD
Видеодиск высокой четкости. Один слой на
одной стороне может хранить 25 Гбайт.
Информация извлекается с компакт-диска с помощью маломощного
лазера, размещенного в проигрывателе оптических дисков или приводе.
Лазер светит сквозь прозрачный поликарбонат, а двигатель вращает диск
мимо него. Интенсивность отраженного света лазера изменяется при
попадании в ямку. В частности, если лазерный луч падает на углубление
с несколько шероховатой поверхностью, свет рассеивается и слабо
отражается обратно к источнику, как показано на Рисунке 17.
Рисунок 17. Поверхность оптического диска.
Площадки между ямками называются лендами (от англ. land - земля).
Ленд - это гладкая поверхность, которая с большей интенсивностью
отражает сигнал обратно. Смена ямок и лендов регистрируется
фотодатчиком и преобразуется в цифровой сигнал. Датчик регулярно
проверяет поверхность. Начало или конец ямки представляет собой 1;
когда между интервалами не происходит изменения высоты,
записывается 0.
Система ввода/вывода.
Помимо процессора и набора модулей памяти, третьим ключевым
элементом компьютерной системы является набор модулей
ввода-вывода.
Каждый модуль взаимодействует с системной шиной или центральным
коммутатором и управляет одним или несколькими периферийными
устройствами.
Модуль ввода-вывода - это не просто набор механических разъемов,
соединяющих устройство с системной шиной. Скорее, модуль
ввода-вывода содержит логику для выполнения функции связи между
периферийным устройством и шиной.
Почему мы не можем подключить периферийные устройства напрямую к
системной шине? Причины следующие:
● Существует множество периферийных устройств с различными
методами работы. Было бы непрактично включать в процессор
необходимую логику для управления целым рядом устройств.
● Скорость передачи данных периферийных устройств часто намного
ниже, чем скорость передачи данных памяти или процессора.
Таким образом, непрактично использовать высокоскоростную
системную шину для прямой связи с периферийным устройством.
● С другой стороны, скорость передачи данных некоторых
периферийных устройств выше, чем у памяти или процессора.
Опять же, несоответствие может привести к неэффективности,
если им не управлять должным образом.
● Периферийные устройства часто используют другие форматы
данных и длины слов, чем компьютер, к которому они подключены.
Таким образом, требуется модуль ввода-вывода. Этот модуль
выполняет две основные функции:
● Функция интерфейса с процессором и памятью через системную
шину или центральный переключатель.
● Функция интерфейса с одним или несколькими периферийными
устройствами с помощью специализированных каналов передачи
данных.
Рисунок 18. Общая модель модуля ввода/вывода.
Основные функции или требования к модулю ввода-вывода делятся на
следующие категории:
● Контроль процесса передачи и временных интервалов.
● Связь с процессором.
● Связь с устройством.
● Буферизация данных.
● Обнаружение ошибок.
Операции ввода-вывода выполняются с помощью широкого набора
внешних устройств, обеспечивающих обмен данными между внешней
средой и компьютером.
Мы можем в целом разделить внешние устройства по трем классам:
1. Удобочитаемые.
Подходят для общения с пользователем компьютера(монитор,
клавиатура, принтер и т.д.)
2. Машиночитаемые.
Подходят для связи с оборудованием(внешняя память, например,
диски).
3. Коммуникационные.
Подходят для связи с удаленными устройствами(другими
компьютерами, терминалами и т.д.).
История архитектуры x86.
x86 (Intel 80x86) — это архитектура процессора и одноимённый набор команд, впервые
реализованные в процессорах компании Intel. Название образовано от двух цифр,
которыми заканчивались названия процессоров Intel ранних моделей — 8086, 80186,
80286 (i286), 80386 (i386), 80486 (i486).
4004.
4004 был первым чипом, который содержал все компоненты ЦП
одновременно.
Лучшей мерой точности и производительности является ширина шины данных:
количество битов данных, которые могут быть переданы или отправлены из
процессора за раз.
Другой мерой является количество битов в аккумуляторе или в наборе регистров
общего назначения. Зачастую эти меры совпадают, но не всегда. Например, был
разработан ряд микропроцессоров, которые работают с 16-битными числами в
регистрах, но могут считывать и записывать только 8 бит за раз.
Процессоры Intel 1970-х годов.
Следующим важным шагом в эволюции микропроцессора стало появление в 1972 году
Intel 8008. Это был первый 8-битный микропроцессор, который был почти вдвое
сложнее, чем 4004.
Таблица 1. Характеристики процессоров Intel 1970-х годов.
Характерист 4004
ика
8008
8080
8086
8088
Появление
1971
1972
1974
1978
1979
Тактовые
частоты
108 кГц
108 кГц
2 МГц
5 МГц, 8
5 МГц, 8
МГц, 10 МГц МГц
Ширина
шины
4 бита
8 бит
8 бит
16 бит
8 бит
Количество
транзисторо
в
2300
3500
6000
29000
29000
Размер
элемента(м
км)
10
8
6
3
6
Адресуемая
память
640 байт
16 КБ
64 КБ
1 МБ
1 МБ
Стоит перечислить некоторые основные моменты эволюции продуктовой линейки Intel:
● 8080 - первый в мире микропроцессор общего назначения. Это была 8-битная
машина с 8-битным путем данных к памяти. 8080 использовался в первом
персональном компьютере Altair.
● 8086 - гораздо более мощная 16-разрядная машина. В дополнение к более
широкому пути данных и большим регистрам, 8086 имел кэш команд или
очередь, которая предварительно выбирает несколько команд перед их
выполнением. Вариант этого процессора, 8088, использовался в первом
персональном компьютере IBM, обеспечив успех Intel. 8086 — это первое
появление архитектуры x86.
Процессоры Intel 1980-х годов.
К середине следующего десятилетия процессоры Intel становятся многозадачными, а к
концу 80-х начинают использовать технологию кэш-памяти.
Таблица 2. Характеристики процессоров Intel 1980-х годов.
80286
386 DX
386 SX
486 DX CPU
Появление
1982
1985
1988
1989
Тактовые
частоты
6-12,5 МГц
16-33 МГц
16-33 МГц
25-50 МГц
Ширина шины
16 бит
32 бита
16 бит
32 бита
Количество
транзисторов
134000
275000
275000
1,2 млн
Размер
элемента(мкм)
1,5
1
1
0,8 - 1
Адресуемая
память
16 МБ
4 ГБ
16 МБ
4 ГБ
Виртуальная
память
1 ГБ
64 ТБ
64 ТБ
64 ТБ
Кэш
-
-
-
8 КБ
●
●
●
80286 - это расширение 8086 позволило адресовать 16 МБ памяти вместо 1 МБ.
80386 - первая 32-разрядная машина Intel и основательная переработка
продукта. Благодаря 32-разрядной архитектуре 80386 мог соперничать по
сложности и мощности с мини-компьютерами и мейнфреймами,
представленными всего несколькими годами ранее. Это был первый процессор
Intel с поддержкой многозадачности, то есть он мог запускать несколько
программ одновременно.
80486 - первым использовал гораздо более сложную и мощную технологию
кэш-памяти и сложной конвейерной обработки команд. 80486 также предлагал
встроенный математический сопроцессор, разгружающий сложные
математические операции с основного ЦП.
Процессоры Intel 1990-х годов.
Основные вехи в развитии процессоров Intel в 1990-е годы таковы:
● Pentium. В Pentium Intel представлено использование суперскалярных
технологий, позволяющих выполнять несколько команд параллельно.
● Pentium Pro. Pentium Pro продолжил переход к суперскалярной организации,
начатый с Pentium, с агрессивным использованием переименования регистров,
прогнозирования ветвлений, анализа потока данных и спекулятивного
выполнения.
● Pentium II. Pentium II использует технологию Intel MMX, специально
предназначенную для эффективной обработки видео-, аудио- и графических
данных.
● Pentium III. Pentium III включает дополнительные команды с плавающей
запятой: Расширение набора команд Streaming SIMD Extensions (SSE)
добавило 70 новых команд, предназначенных для повышения
производительности, когда одни и те же операции должны выполняться над
несколькими объектами данных. Типичными приложениями являются цифровая
обработка сигналов и обработка графики.
Таблица 3. Характеристики процессоров Intel 1990-х годов.
486 SX
Pentium
Pentium Pro
Pentium II
Появление
1991
1993
1995
1997
Тактовые
частоты
16-33 МГц
60-166 МГц
150-200 МГц
200-300 МГц
Ширина шины
32 бита
32 бита
64 бита
64 бита
Количество
транзисторов
1,185 млн
3,1 млн
5.5 млн
7.5 млн
Размер
элемента (мкм)
1
0.8
0.6
0.35
Адресуемая
память
4 ГБ
4 ГБ
64 ГБ
64 ГБ
Виртуальная
память
64 ТБ
64 ТБ
64 ТБ
64 ТБ
Кэш
8 КБ
8 КБ
512 КБ L1 и 1
МБ L2
512 КБ L2
Процессоры Intel последнего поколения.
Таблица 4. Знаковые модели процессоров Intel последнего времени.
Pentium III
Pentium 4
Core 2 Duo
Core I7 EE
4960X
Появление
1999
2000
2006
2013
Тактовые
частоты
450-660 МГц
1,3-1,8 ГГц
1,06-1,2 ГГц
4 ГГц
Ширина шины
64 бита
64 бита
64 бита
64 бита
Количество
транзисторов
9.5 млн
42 млн
167 млн
1,86 млрд
Размер
элемента (мкм)
250
180
65
22
Адресуемая
память
64 ГБ
64 ГБ
64 ГБ
64 ГБ
Виртуальная
память
64 ТБ
64 ТБ
64 ТБ
64 ТБ
Кэш
512 КБ L2
512 КБ L2
2 МБ L2
1,5 МБ L2 / 15
МБ L3
Количество
ядер
●
●
●
1
1
2
6
Pentium 4. Pentium 4 включает дополнительные функции с плавающей запятой
и другие усовершенствования для мультимедиа.
Core. Это первый микропроцессор Intel x86 c реализацией двух ядер на одном
кристалле.
Core 2. Core 2 расширяет архитектуру Core до 64 бит. Core 2 Quad обеспечивает
четыре ядра на одном чипе. Более поздние предложения Core имеют до 10
ядер на чип. Важным дополнением к архитектуре был набор команд Advanced
Vector Extensions, который предоставлял набор 256-битных, а затем 512-битных
команд для эффективной обработки векторных данных.
Режимы работы x86-64.
x86-64 (также AMD64/Intel64/EM64T) — 64-битная версия
(изначально — расширение) архитектуры x86, разработанная
компанией AMD и представленная в 2000 году, позволяющая
выполнять программы в 64-разрядном режиме.
Процессоры x86-64 можно использовать как с 32-разрядной, так и с 64-разрядной
операционной системой. Функции ЦП, доступные программисту, зависят от режима
работы ЦП. Режимы, представляющие интерес для программиста приложений,
сведены в таблицу 5. В 32-разрядной операционной системе ЦП ведет себя
практически так же, как ЦП x86-32.
Табл. 5. Режимы работы x86-64.
Режим
IA-32e or Long
Подрежим
Операцион
ная
система
Адрес по
умолчанию
(биты)
Целое по
умолчанию
(биты)
64 битный
64 бит
64
32
Совместимый
Защищенный
.
Legacy
32
16
16
32 бит
32
32
16 бит
16
16
Virtual-8086
Реальный
ЦП может работать в одном из двух подрежимов под 64-битной операционной
системой:
●
●
Режим совместимости — большинство программ, скомпилированных для
32-битной или 16-битной среды, можно запускать без повторной компиляции.
64-битный режим — программа должна быть скомпилирована для 64-битного
исполнения.
Эти два режима нельзя смешивать в одной и той же программе.
Далее мы опишем вид процессора при работе в 64-битной операционной системе. В
руководствах Intel это называется режимом IA-32e, а в руководствах AMD — длинным
режимом.
Типы данных x86.
х86 может обрабатывать типы данных длиной:
● 8 бит (байт),
● 16 бит (слово),
● 32 бита (двойное слово),
● 64 бита (учетверенное слово),
● 128 (двойное учетверенное слово).
Чтобы обеспечить максимальную гибкость структур данных и эффективное
использование памяти, слова не нужно выравнивать по четным адресам; двойные
слова не нужно выравнивать по адресам, кратным 4; четверные слова не нужно
выравнивать по адресам, кратным 8; и так далее.
Однако при доступе к данным через 32-разрядную шину передача данных происходит
блоками двойных слов, начиная с адресов, кратных 4. Процессор преобразует запрос
несогласованных значений в последовательность запросов на передачу по шине. Как и
все машины Intel 80x86, x86 использует прямой порядок байтов; то есть младший
байт хранится по младшему адресу.
Байт, слово, двойное слово,
учетверенное слово и двойное учетверенное
слово называются общими типами данных.
Таблица 6. Типы данных x86-64.
Тип данных
Описание
General
Байт, слово (16 бит), двойное слово (32
бита), учетверенное слово (64 бита) и
двойное учетверенное слово (128 бит) с
произвольным двоичным содержимым.
Integer
Двоичное значение со знаком,
содержащееся в байте, слове или
двойном слове, использующее
представление с дополнением до двух.
Ordinal
Целое число без знака, содержащееся в
байте, слове или двойном слове.
Unpacked binary coded decimal (BCD)
Представление двоично-десятичной
цифры в диапазоне от 0 до 9 с одной
цифрой в каждом байте.
Packed BCD
Упакованное байтовое представление
двух двоично-десятичных цифр;
значение в диапазоне от 0 до 99.
Near pointer
16-битный, 32-битный или 64-битный
эффективный адрес, представляющий
смещение внутри сегмента.
Используется для всех указателей в
несегментированной памяти и для
ссылок внутри сегмента в
сегментированной памяти.
Far pointer
Логический адрес, состоящий из
16-битного селектора сегмента и
смещения 16, 32 или 64 бит. Дальние
указатели используются для ссылок на
память в модели сегментированной
памяти, где идентификатор доступного
сегмента должен быть указан явно.
Bit field
Непрерывная последовательность битов,
в которой положение каждого бита
рассматривается как независимая
единица. Битовая строка может
начинаться с любой битовой позиции
любого байта и может содержать до 32
бит.
Bit string
Непрерывная последовательность
байтов, слов или двойных слов,
содержащая от нуля до 223 — 1 байт.
Byte string
Непрерывная последовательность
байтов, слов или двойных слов,
содержащая от нуля до 223 — 1 байт.
Floating point
См. рис. 1.
Packed SIMD (single instruction, multiple
data)
Упакованные 64-битные и 128-битные
типы данных.
Кроме того, x86 поддерживает впечатляющий набор конкретных типов данных,
которые распознаются и обрабатываются с помощью определенных команд.
Целые числа со знаком представляются в виде дополнения до двух и могут иметь
длину 16, 32 или 64 бита. Тип с плавающей запятой на самом деле относится к набору
типов, которые используются модулем с плавающей запятой и обрабатываются
командами с плавающей запятой. Представления с плавающей запятой соответствуют
стандарту IEEE 754.
Рисунок 1. Форматы данных x86 с плавающей запятой.
Упакованные типы данных SIMD (single-instruction-multiple-data) были введены в
архитектуру x86 как часть расширений набора команд для оптимизации
производительности мультимедийных приложений. Эти расширения включают MMX
(multimedia extensions, мультимедийные расширения) и SSE (streaming SIMD
extensions, потоковые расширения SIMD). Основная концепция заключается в том, что
несколько операндов упакованы в один элемент памяти, на который ссылаются, и что
эти несколько операндов обрабатываются параллельно.
●
●
●
●
●
Упакованный байт и упакованное целое число байтов. Байты, упакованные
в 64-битное четверное слово или 128-битное двойное четверное слово,
интерпретируемое как битовое поле или целое число.
Упакованное слово и целое упакованное слово. 16-разрядные слова,
упакованные в 64-разрядное четверное слово или 128-разрядное двойное
четверное слово, интерпретируемое как битовое поле или целое число.
Упакованное двойное слово и целое упакованное двойное слово.
32-разрядные двойные слова, упакованные в 64-разрядное четверное слово
или 128-разрядное двойное четверное слово, интерпретируемые как битовое
поле или целое число.Упакованное двойное слово и целое упакованное
двойное слово. 32-разрядные двойные слова, упакованные в 64-разрядное
четверное слово или 128-разрядное двойное четверное слово,
интерпретируемые как битовое поле или целое число.
Упакованное учетверенное слово и целое упакованное учетверенное
слово. Два 64-битных четверных слова, упакованных в 128-битное двойное
четверное слово, интерпретируемое как битовое поле или целое число.
Упакованные значения с плавающей запятой одинарной точности и
упакованные числа с плавающей запятой двойной точности. Четыре
32-разрядных значения с плавающей запятой или два 64-разрядных значения с
плавающей запятой, упакованные в 128-разрядное двойное четверное слово.
Организация регистров.
Структура регистров включает в себя следующие виды регистров:
● General (регистры общего назначения).
Имеется восемь 32-битных регистров общего назначения. Их можно использовать для
всех типов команд x86; также они могут содержать операнды для вычисления адресов.
Кроме того, некоторые из этих регистров также служат специальным целям. Например,
строковые команды используют содержимое регистров ECX, ESI и EDI в качестве
операндов без необходимости явной ссылки на эти регистры в команде. В результате
ряд команд можно закодировать более компактно. В 64-битном режиме имеется
шестнадцать 64-битных регистров общего назначения.
● Segment.
Шесть 16-битных сегментных регистров содержат селекторы сегментов, указывающие
на адреса в таблицах сегментов.. Регистр сегмента кода (CS) ссылается на сегмент,
содержащий выполняемую команду. Регистр сегмента стека (SS) ссылается на
сегмент, содержащий видимый пользователю стек. Остальные регистры сегментов
(DS, ES, FS, GS) позволяют пользователю одновременно обращаться к четырем
отдельным сегментам данных.
● Flags.
32-разрядный регистр EFLAGS содержит коды условий и различные биты режима. В
64-битном режиме этот регистр расширяется до 64 бит и называется RFLAGS. В
текущем определении архитектуры старшие 32 бита RFLAGS не используются.
● Instruction pointer.
Это регистр, который содержит адрес текущей команды.
Таблица 7. Структура регистров x86 в 32-битном режиме
Integer Unit in 32-bit Mode
Тип
Количество
Длина(бит)
Назначение
General
8
32
Регистры
пользователей
общего
назначения
Segment
6
16
Содержит
селекторы
сегментов
EFLAGS
1
32
Биты
состояния и
управления
Instruction Pointer
1
32
Указатель
команды
Таблица 8. Структура регистров x86 в 64-битном режиме.
Integer Unit in 64-bit Mode
Тип
Количество
Длина
General
16
32
Назначение
Регистры
пользователей
общего назначения
Segment
6
16
Содержит
селекторы
сегментов
EFLAGS
1
64
Биты состояния и
управления
Instruction Pointer
1
64
Указатель команды
Регистр EFLAGS показывает состояние процессора и помогает контролировать
его работу.
Он включает шесть кодов условий (Сarry - перенос, Parity - паритет/четность, Auxiliary вспомогательный перенос, Zero - ноль, Sign - знак, Overflow - переполнение), которые
сообщают о результатах целочисленной операции.
Рисунок 2. Регистр x86 EFLAGS
Есть также регистры, специально предназначенные для модуля с плавающей запятой:
● Numeric. Каждый из 8-ми регистров содержит 80-битное число повышенной
точности с плавающей запятой. Эти регистры функционируют как стек, с
операциями push и pop, доступными в наборе команд.
● Control. 16-разрядный регистр управления содержит биты, управляющие
работой модуля с плавающей запятой, включая тип управления округлением;
одинарная, двойная или расширенная точность; и биты для включения или
отключения различных условий исключения.
● Status. 16-битный регистр состояния содержит биты, отражающие текущее
состояние модуля с плавающей запятой, включая 3-битный указатель на
вершине стека; коды состояния, сообщающие о результате последней
операции; и флаги исключения.
● Tag word. Этот 16-битный регистр содержит 2-битный тег для каждого
числового регистра с плавающей запятой, который указывает характер
содержимого соответствующего регистра. Четыре возможных значения:
действительные, нулевые, особые (NaN, infinity, denormalized) и пустые. Эти
теги позволяют программам проверять содержимое числового регистра без
выполнения сложного декодирования фактических данных в регистре.
Например, при переключении контекста процессору не нужно сохранять пустые
регистры с плавающей запятой.
Таблица 9. Регистры переменных с плавающей запятой
Тип
Количество
Длина(бит)
Назначение
Numeric
8
80
Хранить числа с
плавающей
запятой
Control
1
16
Биты управления
Status
1
16
Биты состояния
Tag Word
1
16
Определяет
содержимое
числовых
регистров
Instruction Pointer
1
48
Указывает на
команду,
прерванную
исключением
Data Pointer
1
48
Указывает на
операнд,
прерванный
исключением
В x86 используются четыре управляющих регистра (регистр CR1 не используется) для
управления различными аспектами работы процессора. Все регистры, кроме CR0,
имеют длину 32 или 64 бита, в зависимости от того, поддерживает ли реализация
64-битную архитектуру x86. Регистр CR0 содержит системные управляющие флаги,
которые управляют режимами или указывают состояния, применимые в целом к
процессору, а не к выполнению отдельной задачи.
Рисунок 3. Регистры управления
●
Protection Enable (PE).
●
●
●
●
●
●
●
●
●
●
Включение/отключение защищенного режима работы.
Monitor Coprocessor (MP).
Представляет интерес только при запуске программ с более ранних машин на
x86; это связано с наличием арифметического сопроцессора.
Emulation (EM).
Устанавливается, если процессор не имеет модуля с плавающей запятой и
вызывает прерывание при попытке выполнить команды с плавающей запятой.
Task Switched (TS).
Указывает, что процессор переключил задачи.
Extension Type (ET).
Не используется на компьютерах Pentium и более поздних версиях;
используется для обозначения поддержки команд математического
сопроцессора на более ранних машинах.
Numeric Error (NE).
Включает стандартный механизм сообщения об ошибках с плавающей запятой
на внешних линиях шины.
Write Protect (WP).
Если этот бит сброшен, то страницы пользовательского уровня, доступные
только для чтения, могут быть записаны процессом супервизора. Эта функция
полезна для поддержки создания процессов в некоторых операционных
системах.
Alignment Mask (AM).
Включает/отключает проверку выравнивания.
Not Write Through (NW).
Выбор режима работы кэша данных. Когда этот бит установлен, кэш данных
запрещается от операций сквозной записи в кэш.
Cache Disable (CD).
Включает/отключает механизм заполнения внутреннего кэша.
Paging (PG).
Включает/отключает пейджинг.
MMX-регистры.
MMX (Multimedia Extensions — мультимедийные расширения) — коммерческое
название дополнительного набора инструкций, разработанного компанией Intel и
впервые представленного в 1997 году одновременно с линией процессоров Pentium
MMX.
Команды MMX используют 3-битные поля адреса регистра, поэтому поддерживаются
восемь регистров MMX. На самом деле процессор не включает в себя определенные
регистры MMX. Вместо этого процессор использует метод псевдонимов. Для хранения
значений MMX используются существующие регистры переменных с плавающей
запятой. В частности, используются младшие 64 бита (мантисса) каждого регистра
переменных с плавающей запятой.
Прерывания и исключения.
Два класса событий заставляют x86 приостанавливать выполнение текущего потока
команд и реагировать на события:
● Прерывания(Interrupts).
Генерируется сигналом от оборудования и может возникать в случайные
моменты времени во время выполнения программы.
● Исключения(Exceptions).
Генерируется программным обеспечением и вызывается выполнением
команды.
В обоих случаях процессор сохраняет контекст текущего процесса и переходит к
предопределенной процедуре для обслуживания условия. Есть два источника
прерываний и два источника исключений.
Виды прерываний:
● Маскируемые прерывания.
Поступают на вывод INTR процессора. Процессор не распознает маскируемое
прерывание, если не установлен флаг разрешения прерывания (IF).
● Немаскируемые прерывания.
Поступают на вывод NMI процессора. Распознавание таких прерываний
невозможно предотвратить.
Виды исключений:
● Исключения, обнаруженные процессором.
Возникают, когда процессор обнаруживает ошибку при попытке выполнить
команду.
● Запрограммированные исключения.
Это команды, которые генерируют исключение (например, INTO, INT3, INT и
BOUND).
При обработке прерываний в архитектуре процессоров x86 используется таблица
векторов прерываний .
Каждому типу прерывания присваивается номер, и этот номер используется
для поиска в таблице векторов прерываний.
Рисунок 4. Прерывания и исключения.
Таблица прерываний содержит 256 32-битных векторов прерываний, которые являются
адресом (сегментом и смещением) процедуры обслуживания прерывания для этого
номера прерывания.
Переход к подпрограмме обработки прерываний использует системный стек для
хранения состояния процессора. Когда прерывание происходит и распознается
процессором, происходит следующая последовательность событий:
1. Если передача включает изменение уровня привилегий, то текущий регистр
сегмента стека и текущий регистр расширенного указателя стека (ESP)
помещаются в стек.
2. Текущее значение регистра EFLAGS помещается в стек.
3. Сбрасываются флаги прерывания (IF) и системного прерывания (TF). Это
отключает прерывания INTR и функцию trap или single-step.
4. Указатель текущего сегмента кода (CS) и указатель текущей команды (IP или
EIP) помещаются в стек.
5. Если прерывание сопровождается кодом ошибки, то код ошибки помещается в
стек.
6. Содержимое вектора прерывания извлекается и загружается в регистры CS и IP
или EIP. Выполнение продолжается с процедуры обслуживания прерывания.
Для выхода из прерывания процедура обслуживания прерывания выполняет команду
IRET. Это приводит к восстановлению всех значений, сохраненных в стеке;
выполнение возобновляется с точки прерывания.
Эволюция ARM.
ARM — семейство микропроцессоров и микроконтроллеров на базе
RISC, разработанных ARM Holdings, Кембридж, Англия.
Истоки технологии ARM восходят к британской компании Acorn
Computers. В начале 1980-х Acorn получила контракт от Британской
радиовещательной корпорации (BBC) на разработку новой
микрокомпьютерной архитектуры для проекта BBC Computer Literacy
Project. Успех этого контракта позволил Acorn приступить к разработке
первого коммерческого RISC-процессора, Acorn RISC Machine (ARM).
Первая версия, ARM1, заработала в 1985 году и использовалась для
внутренних исследований и разработок, а также использовалась в
качестве сопроцессора в машине BBC.
Но дальнейшее развитие вышло за рамки возможностей Acorn.
Соответственно, была организована новая компания с Acorn, VLSI и
Apple Computer в качестве партнеров-основателей, известная как ARM
Ltd. Acorn RISC Machine стала Advanced RISC Machines.
Чипы ARM — это высокоскоростные процессоры,
известные своим малым размером кристалла и низким
энергопотреблением.
Они широко используются в смартфонах и других портативных
устройствах, включая игровые системы, а также в большом количестве
потребительских товаров. Чипы ARM — это процессоры в популярных
устройствах Apple iPad и iPhone (а с 2020 года — во всех современных
ноутбуках и настольных компьютерах Apple), а также используются
практически во всех Android-смартфонах.
ARM Holdings лицензирует ряд специализированных микропроцессоров и
связанных с ними технологий, но основную часть их линейки продуктов
составляет семейство микропроцессорных архитектур Cortex.
Существует три архитектуры Cortex, которые обозначают инициалами A,
R и M.
Cortex-A
предназначен для мобильных устройств (и многого другого с
процессорами Apple серии M1).
Cortex-R
предназначен для поддержки приложений реального времени, в
которых время событий необходимо контролировать с быстрой
реакцией на события.
Cortex-M
разработан в первую очередь для области микроконтроллеров с
целью минимального энергопотребления.
Архитектура многоядерного процессора Cortex-A9 представлена на
Рисунке 1.
Типы данных ARM.
В современной вычислительной технике и цифровых системах связи
информация представлена в виде последовательности байтов.
Процессоры ARM поддерживают типы данных длиной:
1. 8 бит (байт),
2. 16 бит (полуслово),
3. 32 бита (слово).
Однако память адресуется на однобайтовом уровне; поэтому адрес
может быть «выровнен», что означает, что он начинается с границы
слова (полуслова), или «не выровнен», что означает, что это не так.
Для не выровненных попыток доступа архитектура поддерживает три
альтернативы:
● Обычный случай.
- Адрес обрабатывается как усеченный, при этом биты адреса
[1:0] обрабатываются как нулевые для доступа к слову, а бит
адреса [0] обрабатывается как нулевой для доступа к
полуслову.
- Команды загрузки одного слова ARM архитектурно
определены для чередования вправо выровненных по
словам данных, передаваемых по адресу, не выровненному
по слову, на один, два или три байта, в зависимости от
значения двух младших значащих битов адреса.
● Проверка выравнивания.
Когда установлен соответствующий управляющий бит, сигнал
прерывания данных указывает на ошибку выравнивания при
попытке не выровненного доступа.
● Доступ без выравнивания.
Когда эта опция включена, процессор использует один или
несколько обращений к памяти для создания требуемой передачи
смежных байтов прозрачно для программиста.
Для всех трех типов данных (байт, полуслово и слово) поддерживается
беззнаковая интерпретация, в которой значение представляет собой
неотрицательное целое число без знака. Все три типа данных также
могут использоваться для целых чисел со знаком, дополненных до двух.
Большинство реализаций процессоров ARM не
предоставляют аппаратных средств с плавающей
запятой, что экономит энергию и площадь.
Если в таких процессорах требуется арифметика с плавающей запятой,
она должна быть реализована программным обеспечением. ARM
поддерживает дополнительный сопроцессор с плавающей запятой,
который поддерживает типы данных с плавающей запятой одинарной и
двойной точности, определенные в IEEE 754.
Поддержка Endian.
В том случае, если число не может быть представлено одним байтом,
имеет значение, в каком порядке байты записываются в памяти
компьютера или передаются по линиям связи. Этот порядок может быть
от старшего к младшему (англ. big-endian) или от младшего к старшему
(англ. little-endian).
ARM процессоры поддерживают работу в любом из этих режимов.
Бит состояния (Е-бит) в регистре управления системой
определяет порядок байтов для загрузки и хранения
данных.
Е-бит устанавливается и сбрасывается программно с помощью команды
SETEND.
Рисунок 2 иллюстрирует функциональные возможности, связанные с
E-битом для операции загрузки или сохранения слова.
Этот механизм обеспечивает эффективную динамическую
загрузку/хранение данных для проектировщиков систем, которые знают,
что им нужен доступ к структурам данных с обратным порядком байтов
по отношению к их ОС/среде. Обратите внимание, что адрес каждого
байта данных фиксируется в памяти. Однако порядок байтов в
регистре другой.
Рисунок 2. Поддержка ARM Endian — загрузка/сохранение слов с помощью E-Bit.
Режимы процессора.
Многие операционные системы используют только два режима
процессора: пользовательский режим и режим ядра, причем
последний режим используется для выполнения привилегированного
системного программного обеспечения.
Напротив, архитектура ARM предоставляет операционным системам
гибкую основу для применения различных политик защиты.
Архитектура ARM поддерживает семь режимов
выполнения.
Большинство прикладных программ выполняются в
пользовательском режиме. Пока процессор находится в
пользовательском режиме, исполняемая программа не может получить
доступ к защищенным системным ресурсам или изменить режим, кроме
как через вызов исключения.
Остальные шесть режимов выполнения называются
привилегированными режимами. Эти режимы используются для
запуска системного программного обеспечения. Есть два основных
преимущества определения стольких различных привилегированных
режимов:
1. ОС может адаптировать использование системного программного
обеспечения к различным обстоятельствам.
2. Определенные регистры предназначены для использования в
каждом из привилегированных режимов, что позволяет быстрее
изменять контекст.
Привилегированные режимы имеют полный доступ к системным
ресурсам и могут свободно менять режимы. Пять из них известны как
режимы исключения. Они вводятся, когда возникают определенные
исключения. Каждый из этих режимов имеет несколько выделенных
регистров, которые заменяют некоторые регистры пользовательского
режима и используются для предотвращения искажения информации о
состоянии пользовательского режима при возникновении исключения.
Режимы исключения бывают следующие:
1. Режим супервизора(supervisor mode).
2.
3.
4.
5.
Обычно в нем работает ОС. Он активируется, когда процессор встречает
команду программного прерывания. Программные прерывания — это
стандартный способ вызова служб операционной системы на ARM.
Режим немедленного прекращения(abort mode).
Активируется в ответ на ошибки памяти.
Неопределенный режим(undefined mode).
Активируется, если процессор пытается выполнить команду, которая не
поддерживается ни основным целочисленным ядром, ни одним из
сопроцессоров.
Режим быстрого прерывания(fast interrupt mode).
Активируется всякий раз, когда процессор получает сигнал прерывания
от назначенного источника быстрого прерывания. Оно не может быть
прервано, но может прервать обычное прерывание.
Режим прерывания(interrupt mode).
Активируется всякий раз, когда процессор получает сигнал прерывания
от любого другого источника прерывания (кроме быстрого прерывания).
Режим может быть остановлен только быстрым прерыванием.
Оставшийся шестой привилегированный режим — это системный
режим (System mode). В этот режим не входят какие-либо исключения и
используются те же регистры, что и в пользовательском режиме (User
mode).
Системный режим используется для запуска определенных
привилегированных задач операционной системы. Задачи системного
режима могут быть прерваны любой из пяти категорий исключений.
Организация регистров.
В таблице 1 показаны видимые пользователю регистры для ARM.
Процессор ARM имеет в общей сложности 37 32-битных регистров,
которые классифицируются следующим образом:
● Тридцать один регистр упоминается в руководстве ARM как
регистры общего назначения. На самом деле, некоторые из них,
такие как программные счетчики, имеют специальное назначение.
● Шесть регистров состояния.
Таблица 1. Видимые пользователем регистры ARM.
Режимы
Привилегированные режимы
Режимы исключения
Пользова
тельский
Системн
ый
Супервиз
ора
Аварийно
го
прекраще
ния
Неопреде
ленный
Прерыва
ния
Быстрого
прерыван
ия
R0
R0
R0
R0
R0
R0
R0
R1
R1
R1
R1
R1
R1
R1
R2
R2
R2
R2
R2
R2
R2
R3
R3
R3
R3
R3
R3
R3
R4
R4
R4
R4
R4
R4
R4
R5
R5
R5
R5
R5
R5
R5
R6
R6
R6
R6
R6
R6
R6
R7
R7
R7
R7
R7
R7
R7
R8
R8
R8
R8
R8
R8
R8_fiq
R9
R9
R9
R9
R9
R9
R9_fiq
R10
R10
R10
R10
R10
R10
R10_fiq
R11
R11
R11
R11
R11
R11
R11_fiq
R12
R12
R12
R12
R12
R12
R12_fiq
R13(SP)
R13(SP)
R13_svc
R13_abt
R13_und
R13_irq
R13_fiq
R14(LR)
R14(LR)
R14_svc
R14_abt
R14_abt
R14_irq
R14_fiq
R15(PC)
R15(PC)
R15(PC)
R15(PC)
R15(PC)
R15(PC)
R15(PC)
CPSR
CPSR
CPSR
CPSR
CPSR
CPSR
CPSR
SPSR_svc
SPSR_abt
SPSR_und
SPSR_irq
SPSR_irq
Затемнение указывает на то, что обычный регистр, используемый
пользовательским или системным режимом, был заменен
альтернативным регистром, характерным для режима исключения.
SP = указатель стека;
CPSR = регистр текущего состояния программы;
LR = регистр связи;
SPSR = регистр состояния сохраненной программы;
PC = счетчик команд;
Регистры располагаются в частично перекрывающихся банках, при этом
текущий режим процессора определяет, какой банк доступен. В любое
время видны шестнадцать пронумерованных регистров и один или два
регистра состояния программы, всего 17 или 18 видимых программным
обеспечением регистров. Таблица 1 интерпретируется следующим
образом:
● Регистры с R0 по R7, регистр R15 (счетчик команд) и регистр
текущего состояния программы (CPSR) видны и используются во
всех режимах.
● Регистры с R8 по R12 используются во всех режимах, кроме
быстрого прерывания, для которого предусмотрены собственные
выделенные регистры с R8_fiq по R12_fiq.
● Все режимы исключения имеют собственные версии регистров R13
и R14.
● Все режимы исключения имеют специальный регистр состояния
сохраненной программы (SPSR).
Регистры общего назначения.
Регистр R13 обычно используется как указатель стека и также известен
как SP (stack pointer). Поскольку у каждого режима исключения есть
отдельный R13, они могут иметь свой собственный выделенный
программный стек.
R14 известен как регистр связи LR (link register) и используется для
хранения адресов возврата подпрограммы и возврата в режиме
исключения. Регистр R15 является счетчиком команд PC (program
counter).
Регистры состояния программы.
Регистр текущего состояния программы CPSR (Current Program Status
Register) доступен во всех режимах процессора.
Каждый режим исключения также имеет выделенный регистр
сохраненного состояния программы SPSR (Saved Program Status
Register), который используется для сохранения значения CPSR при
возникновении связанного с ним исключения.
Типы операций.
Архитектура ARM предоставляет большой набор типов операций. Ниже
приведены основные категории:
● Команды загрузки и сохранения.
В архитектуре ARM доступ к ячейкам памяти имеют только
команды по загрузке и сохранению; арифметические и логические
команды выполняются только с регистрами и непосредственными
значениями, закодированными в команде. Это ограничение
характерно для дизайна RISC. Архитектура ARM поддерживает два
широких типа команд, которые загружают или сохраняют значение
одного регистра или пары регистров из памяти или в память: (1)
●
●
●
●
●
●
загрузить или сохранить 32-битное слово или 8-битный байт без
знака, и (2) загрузить или сохранить 16-битное полуслово без
знака, а также загрузить и расширить знак 16-битного полуслова
или 8-битного байта.
Команды перехода.
ARM поддерживает команду перехода, которая допускает условный
переход вперед или назад до 32 МБ. Вызов подпрограммы может
быть выполнен вариантом стандартной команды перехода. Помимо
разрешения перехода вперед или назад до 32 МБ, команда со
ссылкой (BL) сохраняет адрес команды после перехода (адрес
возврата) в LR (R14). Переходы определяются 4-битным полем
условия в команде.
Команды обработки данных.
В эту категорию входят логические команды (И, ИЛИ, исключающее
ИЛИ), команды сложения и вычитания, а также проверки и
сравнения.
Команды умножения.
Команды целочисленного умножения работают с операндами слова
или полуслова и могут давать нормальные или длинные
результаты. Например, есть команда умножения, которая
принимает два 32-битных операнда и дает 64-битный результат.
Параллельные команды сложения и вычитания.
В дополнение к обычным командам обработки данных и умножения
существует набор параллельных команд сложения и вычитания, в
которых части двух операндов обрабатываются параллельно.
Например, ADD16 суммирует верхние полуслова двух регистров,
чтобы сформировать верхнее полуслово результата, и добавляет
нижние полуслова тех же двух регистров, чтобы сформировать
нижнее полуслово результата. Эти команды полезны в
приложениях для обработки изображений, подобно командам x86
MMX.
Команды расширения.
Существует несколько команд для распаковки данных по знаку или
нулю, расширяющих байты до полуслов или слов и полуслов до
слов.
Команды доступа к регистру состояния.
ARM предоставляет возможность чтения, а также записи частей
регистра состояния.
Обработка прерываний.
Как и в любом процессоре, ARM включает в себя средство, которое
позволяет процессору прерывать выполняемую в данный момент
программу для обработки исключительных ситуаций.
Исключения генерируются внутренними и внешними источниками, чтобы
заставить процессор обрабатывать событие. Состояние процессора
непосредственно перед обработкой исключения обычно сохраняется, так
что исходная программа может быть возобновлена после завершения
обработки исключения. При этом одновременно может возникнуть более
одного исключения.
Архитектура ARM поддерживает семь типов
исключений.
В Таблице 2 перечислены типы исключений и режим процессора,
который используется для обработки каждого типа. При возникновении
исключения принудительное выполнение начинается с фиксированного
адреса памяти, соответствующего типу исключения. Эти фиксированные
адреса называются векторами исключений.
Если ожидается более одного прерывания, они обрабатываются в
порядке приоритета. В таблице 2 перечислены исключения в порядке
приоритета, от высшего к низшему.
Таблица 2. Таблица векторов прерываний ARM
Тип исключения
Режим
Обычный адрес
входа
Описание
Reset
Supervisor
0x00000000
Происходит при
инициализации
системы.
Data abort
Abort
0x00000010
Происходит при
доступе к
недопустимому
адресу памяти,
например, если для
адреса нет
физической памяти
или отсутствуют
правильные права
доступа.
FIQ (fast
interrupt)
FIQ
0x0000001C
Происходит, когда
внешнее устройство
устанавливает
контакт FIQ на
процессоре.
Прерывание не
может быть
прервано, кроме как
с помощью FIQ.
FIQ предназначен
для поддержки
передачи данных
или процесса
канала и имеет
достаточно частных
регистров, чтобы
устранить
необходимость
сохранения
регистров в
приложениях, что
минимизирует
накладные расходы
на переключение
контекста. Быстрое
прерывание не
может быть
прервано.
IRQ (interrupt)
IRQ
0x00000018
Происходит, когда
внешнее устройство
устанавливает
контакт IRQ на
процессоре.
Прерывание не
может быть
прервано, кроме как
с помощью FIQ.
Prefetch abort
Abort
0x0000000C
Происходит, когда
попытка извлечения
команды приводит к
сбою памяти.
Исключение
возникает, когда
команда входит в
стадию выполнения
конвейера.
Undefined
instructions
Undefined
0x00000004
Происходит, когда
команда, не
входящая в набор
команд, достигает
стадии выполнения
конвейера.
Software
interrupt
Supervisor
0x00000008
Обычно
используется, чтобы
разрешить
программам
пользовательского
режима вызывать
ОС. Программа
пользователя
выполняет команду
SWI с аргументом,
идентифицирующи
м функцию, которую
хочет выполнить
пользователь.
Когда возникает исключение, процессор останавливает выполнение
после текущей команды. Состояние процессора сохраняется в SPSR,
соответствующем типу исключения, так что исходная программа может
быть возобновлена после завершения обработки исключения. Адрес
команды, которую процессор только собирался выполнить, помещается в
регистр связи соответствующего режима процессора. Для возврата после
обработки исключения SPSR перемещается в CPSR, а R14
перемещается в ПК.
Контрольные вопросы.
Сколько типов исключений поддерживает процессор
ARM?
Ответ: 7
2. Укажите все верные утверждения.
● 80386 — первый 32-битный процессор Intel.
1.
● Поддерживаются только восемь регистров MMX.
● Pentium - первый процессор Intel, в котором
использовались суперскалярные методы.
3. Укажите все общие типы данных x86-64.
● Байт;
● Слово;
● Двойное слово;
● Учетверенное слово;
4. На какой архитектуре основаны процессоры ARM?
RISC
5. Установите правильный порядок последовательности
событий при возникновении прерывания.
1 → Текущий регистр сегмента стека и текущий регистр расширенного
указателя стека (ESP) помещаются в стек.,
2 → Текущее значение регистра EFLAGS помещается в стек.,
3 → Флаг прерывания (IF) и флаг trap (TF) сбрасываются для
отключения прерываний INTR.,
4 → Указатель текущего сегмента кода (CS) и указатель текущей
команды (IP или EIP) помещаются в стек.,
5 → Содержимое вектора прерывания извлекается и загружается в
регистры CS и IP или EIP. Выполнение продолжается с процедуры
обслуживания прерывания.
6. Выберите первую микро компьютерную платформу
(размером с кредитную карту) для использования в
самодельных устройствах.
Arduino
7. Сопоставьте компьютерные устройства c их описаниями.
Первый компьютер с графическим интерфейсом пользователя →
XEROX PARC Alto (1974),
Первый полностью электронный компьютер → ENIAC (1946),
Первый успешный компьютер, управляемый мышью, с графическим
интерфейсом пользователя → Apple Macintosh (1976),
Первый пример вычислений с удаленным доступом → Complex
Number Calculator (1940)
8. Какой компонент обеспечивает внутреннюю память ЦП?
Регистры.
9. Какой регистр управления и состояния содержит адрес
команды, которую нужно выбрать?
Программный счетчик(PC)
10. В какой исключительный режим процессор ARM
переходит в ответ на сбои памяти?
Режим немедленного прекращения(abort mode).
11. Какой компонент традиционного однопроцессорного
компьютера перемещает данные между компьютером и
его внешней средой?
Система ввода-вывода.
12. Какой продукт, который произвел революцию в
компьютерном бизнесе, был запущен в 1981 году с
помощью масштабной маркетинговой кампании?
IBM PC.
История операционных систем.
Начало 1950-х годов
Предпосылки создания ОС
Первые компьютеры не имели операционных систем.
Каждая программа, которая работала на этих первых компьютерах,
должна была включать весь код, необходимый для работы, связи с
подключенным оборудованием и выполнения вычислений. В этой
ситуации даже самые простые программы становились очень сложными.
Середина 1950-х годов
Первые операционные системы.
В ответ на эту проблему владельцы таких компьютеров начали
разрабатывать системное программное обеспечение, которое облегчало
написание и выполнение программ, включенных в компьютер, и так
родились первые операционные системы.
Первая операционная система была создана General Motors в 1956
году
для запуска одного центрального компьютера IBM.
1960-е годы
Начало массового производства ОС.
В 1960-х годах IBM была первым производителем компьютеров, который
взял на себя задачу разработки операционных систем и начал
распространять операционные системы, включенные в ее
компьютеры.
Компьютеры приобрели более мощные операционные системы в 1960-х
годах с появлением разделения времени, которое требовало системы
для управления несколькими пользователями, совместно
использующими процессорное время и терминалы.
Двумя ранними системами разделения времени были CTSS
(совместимая система разделения времени), разработанная в
Массачусетском технологическом институте, и Dartmouth College Basic
System, разработанная в этом колледже.
Другие многопрограммные системы включали Atlas в Манчестерском
университете в Англии, и IBM OS/360, вероятно, самый сложный
программный пакет 1960-х годов.
В конце 1960-х компанией AT&T была разработана первая версия
операционной системы Unix для больших миникомпьютеров.
Написанная на языке программирования C и доступная бесплатно в
первые годы своего существования, Unix легко адаптировалась к
новым системам и быстро получила широкое признание.
1970-е годы.
Возможности мультипрограммирования.
В самом начале компьютерной эры ЭВМ могли одновременно запускать
только одну программу. Позже, в последующие десятилетия, компьютеры
стали включать в себя все больше и больше программ, иногда
называемых библиотеками, которые вместе положили начало
сегодняшним операционным системам.
После 1972 года Multics system for General Electric Co.’s GE 645
computer (а позже и для компьютеров Honeywell Inc.) стала самой
сложной системой с большинством возможностей
мультипрограммирования и разделения времени, которые позже
стали стандартными. Система MULTICS не получила распространения,
но оказала влияние на последующие ОС.
1980-е годы.
Победоносное шествие Windows.
Microsoft Windows была разработана в ответ на запрос IBM об
операционной системе для работы на ее линейке персональных
компьютеров.
Первая операционная система, созданная Microsoft, называлась MS-DOS
и была построена в 1981 году, когда они купили операционную систему
86-DOS у Seattle Computer Products и модифицировали ее для
соответствия требованиям IBM.
Название Windows впервые было использовано в 1985 году, когда был
создан графический пользовательский интерфейс, который был
сопряжен с MS-DOS.
1990-е годы и современность.
UNIX - прародитель многих современных ОС.
В 1990-х годах Linux, версия UNIX с открытым исходным кодом,
разработанная частично группой под руководством финского студента
информатики Линуса Торвальдса и частично группой под руководством
американского программиста Ричарда Столлмана, стала популярной как
на персональных компьютерах, так и на больших компьютерах.
Многие современные операционные системы, в том числе Apple macOS,
iOS, Android, восходят к ОС Unix или опираются на нее.
Сегодня на подавляющем большинстве современных операционных
систем доминируют Apple macOS, Microsoft Windows и различные формы
Linux (включая Android). Эти семейства мы рассмотрим подробнее в
нашей лекции.
Типы операционных систем.
Одна операционная система может принадлежать к нескольким типам
одновременно — она может быть как многопользовательской, так и
многозадачной, например.
Ниже приведены типы ОС, классифицированные по следующим
признакам:
1. По типу доступа пользователя:
● ОС пакетной обработки
● ОС с разделением времени
● ОС реального времени
2. По количеству параллельно выполняемых процессов:
● Однозадачные ОС
● Многозадачные ОС
3. По количеству пользователей:
● Однопользовательские ОС
● Многопользовательские ОС
4. По типу аппаратного уровня:
● Однопроцессорные ОС
● Мультипроцессорные ОС
● Сетевые ОС
● Распределенные ОС
● ОС с оперативной обработкой данных
● Мобильные ОС
Пакетная ОС Batch OS.
Пакетная обработка означает передачу заданий на ЦП пакетом или
группой для дальнейшей обработки. Эти задания сгруппированы в
пакеты, поскольку они имеют одинаковые требования.
В системе пакетной обработки пользователь и операционная система не
взаимодействуют напрямую с компьютерной системой. Пользователь
формирует задание, состоящее из программы, данных и отправляет его
оператору ЭВМ.
Задания с одинаковыми потребностями объединяются в пакеты и
обрабатываются системой как группа, чтобы ускорить обработку.
ОС с разделением времени Time-sharing OS.
Процесс совместного использования процессора несколькими
пользователями называется разделением времени. Разделение времени
— это механизм, в котором каждой задаче дается некоторое время на
выполнение, чтобы все задачи работали гладко и без проблем.
Задачи могут быть от одного пользователя или от разных пользователей,
и каждому пользователю отводится определенная доля времени. Эта
конкретная доля процессорного времени называется временным
интервалом, отрезком времени или квантом.
ОС реального времени - Real time OS.
Операционная система реального времени — это тип операционной
системы, который обрабатывает данные немедленно, без каких-либо
задержек, в течение очень короткого промежутка времени, а затем
производит вывод.
Такие ОС реагирует на любой ввод очень быстро . Время, необходимое
системе для обработки и ответа на входные данные, называется
временем отклика.
Области применения ОС реального времени:
● Бронирование авиабилетов.
● Научные эксперименты.
● Промышленные системы управления.
● Системы управления воздушным движением.
● Наблюдение за состоянием здоровья пациента в реанимации на
экране компьютера.
В свою очередь операционные системы реального времени разделяются
еще на 2 типа:
●
Системы жесткого реального времени.
Системы жесткого реального времени имеют четкие временные
ограничения и гарантируют своевременное выполнение важных
задач.
● Системы мягкого реального времени.
Системы мягкого реального времени менее ограничены. Задача
мягкого реального времени получает приоритет перед другими
задачами и сохраняет его до своего завершения.
Мультипрограммные ОС(многозадачные) Multi-Programming OS(multi-tasking).
Мультипрограммирование относится к совместному использованию
процессора независимыми программами.
В такой ОС несколько программ могут использоваться одновременно
одной и той же компьютерной системой. Эти программы можно
выполнять одну за другой, выделяя им процессорное время на короткий
промежуток.
При этом ОС не выполняет одновременно разные программы, а
просто быстро переключается между ними. Т.е. выполняет одну
программу в течение заданного промежутка времени, затем выполняет
другую программу в течение заданного промежутка времени и так далее.
Наиболее часто используемые мультипрограммные операционные
системы — это Windows, macOS, Linux и т. д.
Многопользовательские ОС - Multi-User OS.
В многопользовательской операционной системе, как ясно из названия,
несколько пользователей могут использовать или получать доступ к
одной и той же системе одновременно через сеть. Это позволяет
большему количеству пользователей запускать программы в одно и то же
время.
Это сложная и дорогая операционная система. К основным часто
используемыми многопользовательским ОС относятся Windows, Linux,
macOS и т. д.
Многопроцессорные ОС - Multi-processing OS.
Такие ОС работают на компьютерах, где есть два или более ЦП.
Если один из ЦП откажет или не сможет запустить программу, то другой
ЦП, несомненно, возьмет на себя задачу и начнет ее обрабатывать. Это
явление называется параллельной обработкой, которая повышает
производительность компьютерных систем.
Примерами многопроцессорных операционных систем являются
Windows-2000 и выше, UNIX, Linux, macOS.
Сетевые ОС - Network OS.
Сетевая операционная система предназначены для управления
сетевыми ресурсами.
Сетевые операционные системы включают в себя специальные функции
для подключения к локальной сети (LAN) и используются для запуска
компьютеров, которые действуют как сервер с возможностями
управления данными, пользователями, группами, безопасностью,
приложениями и другими сетевыми операциями.
Основной целью сетевой операционной системы является связь с
несколькими компьютерами, предоставление общего доступа к файлами
и аппаратным устройствам.
Наиболее распространенными сетевыми операционными системами
являются Microsoft Windows Server, UNIX, Linux, macOS и Novell NetWare.
Распределенная ОС - Distributed OS.
Распределенная операционная система представляет собой набор
независимых компьютеров, объединяет их ресурсы так, что делает такую
группу похожей на один компьютер.
Такие группы компьютеров называются слабосвязанными системами или
распределенными системами. Процессоры, подключенные к
распределенной системе, могут различаться по размеру и
функциональным возможностям.
Эти процессоры называются сайтами, узлами, компьютерами и т. д.
LOCUS является примером распределенной операционной системы.
ОС оперативной обработки данных - Online Processing
OS.
Оперативная обработка данных — это прямой автоматизированный
метод ввода и обработки данных.
В данной системе отдельная задача обрабатывается за один раз и не
требует большого объема для хранения данных. Пользователь напрямую
взаимодействует с компьютерной системой, и система предоставляет
прямой вывод пользователю.
ОС оперативной обработки данных требует браузер для связи с
пользователем.
В наши дни все больше предприятий предпочитают предоставлять
интерфейс ОС оперативной обработки данных для своих клиентов.
Мобильная ОС - Mobile OS.
Мобильные операционные системы — это те ОС, которые специально
предназначены для работы на смартфонах, планшетах и носимых
устройствах.
Одними из самых известных мобильных операционных систем являются
Android и iOS, а также BlackBerry, Web и watchOS.
Семейства операционных систем.
Дистрибутивы Linux.
Любой дистрибутив Linux содержит все компоненты, необходимые для
работы в режиме конечного пользователя или сервера. Даже если первая
установка была выполнена в базовом режиме, дополнительные
компоненты можно установить и настроить позже в любое время.
В настоящее время доступно множество десятков дистрибутивов Linux,
но есть 3 основные ветви, как показано на Рисунке 1:
● Debian – Ubuntu,
Debian - дистрибутив GNU/Linux, состоящий из бесплатного
программного обеспечения с открытым исходным кодом,
разработанного поддерживаемым сообществом проектом Debian.
Debian одна из старейших ОС, основанная на ядре Linux.
Ubuntu.
Дистрибутив Linux основан на Debian и состоит в основном из
бесплатного программного обеспечения с открытым исходным
кодом. Ubuntu официально выпущен в трех версиях: Desktop,
Server, Core для устройств Интернета вещей и роботов.
● Slackware – SuSE,
Slackware стремится к стабильности и простоте дизайна, а также к
тому, чтобы быть наиболее “Unix-подобным” дистрибутивом Linux.
Slackware не предоставляет графической процедуры установки и
автоматического разрешения зависимостей программных пакетов.
Он использует простые текстовые файлы и лишь небольшой набор
сценариев оболочки для настройки и администрирования.
SuSE Linux имеет немецкое происхождение, его название является
аббревиатурой от “Software und System-Entwicklung”(разработка
программного обеспечения и систем), и в основном он был
разработан в европе. Он построен на основе бесплатного ядра
Linux с открытым исходным кодом т распространяется вместе с
системным и прикладным программным обеспечением из других
проектов с открытым исходным кодом.
SLES.
SUSE Linux Enterprise(часто сокращенно SLE) - операционная
система на базе Linux, разработанная SUSE. Она доступна в двух
версиях с суффиксом Server(SLES) для серверов и мейнфреймов и
Desktop(SLED) для рабочих станций и настольных компьютеров.
● RedHat – Redhat Enterprise Linux, CentOS, Fedora.
RedHat.
RedHat Enterprise Linux - дистрибутив Linux, разработанный Red Hat
для коммерческого рынка. RedHat Enterprise Linux выпускается в
серверных версиях для x86-64, Power ISA, ARM64 и настольной
версии для x86-64.
CentOS.
Операционная система Community Enterprise - это дистрибутив
Linux, который предоставляет бесплатную вычислительную
платформу с открытым исходным кодом, поддерживаемую
сообществом и функционально совместимую с исходным кодом
RedHat Enterprise Linux.
Fedora.
Дистрибутив Linux разработан поддерживаемым сообществом
проектом Fedora, спонсируемым в основном Red Hat. Fedora
содержит программное обеспечение, распространяемое по
различным бесплатным лицензиям и лицензиям с открытым
исходным кодом, и стремится быть в авангарде свободных
технологий. Fedora - исходный код коммерческого дистрибутива
RHEL.
Версии Windows.
В отличие от дистрибутивов Linux (которые содержат любые компоненты
для конечного пользователя или сервера), дистрибутивы Windows
разделены по функциям, например Home, Professional, Server,
Datacenter и т. д.
Некоторые службы, не являющиеся необходимыми для серверных сред,
по умолчанию отключены из соображений стабильности, наиболее
заметными из которых являются службы «Windows Audio» и «Темы».
Аппаратное ускорение для отображения также отключено по умолчанию.
В последних версиях Server также есть установки Core или Nano, в
которых отсутствуют почти все утилиты с графическим интерфейсом.
Дистрибутивы серверов, начиная с Windows 2000, имеют год: 2000, 2003,
2008, 2012, 2016, 2019, 2022.
Дистрибутивы Windows для конечных пользователей называются
Windows 7, 8, 8.1, Windows 10 (версия 2004, 21H1, 21H2 и т. д.).
Первая версия Windows была представлена в 1985 году. Последняя
доступная версия — Windows 11.
Windows 1(1985).
16-битная многозадачная оболочка поверх существующей установки
MS-DOS.
Windows 3.11(1992).
Представлено несколько улучшений для платформы, все еще
основанной на MS-DOS, включая повышенную стабильность системы,
расширенную поддержку мультимедиа, шрифтов TrueType и работу в
сети для рабочих групп.
Windows 95(1995).
Microsoft объединила ранее отдельные продукты MS-DOS и Microsoft
Windows и продемонстрировала значительные улучшения по сравнению
со своим предшественником в графическом пользовательском
интерфейсе(GUI) и упрощенных функциях “plug-and-play”.
Windows XP(2001).
Первая потребительская версия Windows, не основанная на ядре
Windows 95 и MS-DOS.
Windows Vista(2006).
Основной выпуск включал обновленный графический интерфейс и
визуальный стиль, получивший название Aero, новый компонент поиска
под названием Windows Search, переработанные сетевые, звуковые
подсистемы печати и отображения, а также новые мультимедийные
инструменты.
Windows 7(2009).
Дальнейшие улучшения Windows Aero с добавлением переработанной
панели задач и новых функций управления окнами. В операционную
систему были добавлены и другие новые функции, в том числе
библиотеки, новая система обмена файлами и поддержка
мультисенсорного ввода.
Windows 8(2012).
Внесены серьезные изменения в платформу операционной системы и
пользовательский интерфейс, предназначенные для улучшения
взаимодействия с пользователем на планшетах с сенсорной оболочкой
Windows, начальным экраном, новой платформой для разработки
“приложений”, интеграцией с онлайн-сервисами и Магазином Windows.
Windows 10(2015).
Представлен интерфейс, ориентированный на рабочий стол, в
соответствии с предыдущими версиями Windows 8, ориентированного на
планшеты. Новые функции включают личного помощника Cortana и
замену Internet Explorer на Microsoft Edge.
Windows 10X(2020).
Первоначально анонсирована для использования на устройствах с двумя
экранами, таких как Surface Neo и других потенциальных форм-факторах,
10X отличался измененным пользовательским интерфейсом, включая
переработанное меню “Пуск” без плиток и использование технологии
контейнеров для запуска программного обеспечения Win32. Windows 10X
была отменена, ее основные технологии будут использоваться для
будущих продуктов Microsoft.
Windows 11(2021).
Содержит серьезные изменения в оболочке Windows, на которые
повлияла отмененная Windows 10X, включая переработанное меню
“Пуск”, возможность создавать мозаичные наборы окон и новые игровые
технологии, унаследованные от Xbox Series X и Series S. Windows 11
поддерживает только 64-разрядные системы, например, использующие
процессор x86-64 или ARM64.
Версии MacOS.
MacOS предустанавливается на все компьютеры Apple и содержит только
компоненты для конечных пользователей, любые обновления до
последних версий бесплатны. Дополнительные компоненты Сервера
можно приобрести отдельно. Кроме того, пользователь может установить
множество компонентов Linux с открытым исходным кодом, при
необходимости перекомпилировав их.
Первая версия совершенно новой операционной системы Apple
(отличная от Apple DOS, запущенной в 1978 году) работала на Macintosh
в 1985 году и называлась System 1. Позже она появилась в Mac OS, Mac
OS X, затем в macOS.
Последние выпуски: macOS 10.14 Mojave (последняя версия,
поддерживающая 32-разрядные приложения), 10.15 Catalina, 11 Big Sur
(первая версия с поддержкой компьютеров Mac на базе ARM), 12
Monterey.
Mac OS X 10.0 Cheetah(2000).
Первая версия новой линейки Apple OS. Это был прорыв - Finder
выглядел совсем по-другому. Apple представила Aqua, графический
интерфейс с множеством полупрозрачных функций, плавными краями и
сглаживанием, чтобы он выглядел более “реалистично”.
Mac OS X 10.2 Jaguar(2002).
Произошли значительные улучшения производительности, более
элегантный внешний вид и множество мощных улучшений
пользовательского интерфейса, включая Quartz Extreme для компоновки
графики непосредственно на видеокарте.
Mac OS X 10.3 Panther(2003).
Интерфейс Aqua начал исчезать, сменившись более “матовым
металлом”. Panther первой представила более быстрое переключение
пользователей, добавила оконный менеджер Expose и внедрила
шифрование FileVault на Mac. Panther также представила пользователям
Mac веб-браузер Safari и iChat AV, которые обеспечивали функции
видеоконференций.
Mac OS X 10.4 Tiger(2005).
Apple начала отказываться от поддержки старых машин, и Tiger работал
как на PowerPC, так и на Mac на базе Intel. Он представил Spotlight для
поиска файлов, панель инструментов, смарт-папки, смарт-почтовые
ящики, добавил Automator, VoiceOver, Core Image и Core Video.
Технология Rosetta позволила запускать приложения PowerPC на чипах
Intel.
Mac OS X 10.5 Leopard(2007).
Было представлено Time Machine, простое в использовании приложение
Apple для резервного копирования. Пробелы позволяли переключаться
между группами приложений. Leopard также обеспечил полную
поддержку 64-битных приложений и начал внедрять новые функции
безопасности.
Mac OS X 10.7 Lion(2011).
Среда Apple Rosetta исчезла вместе с Lion, а это означает, что
приложения PowerPC больше не поддерживаются в операционной
системе. Полосы прокрутки стали автоматически скрываться, а Mission
Control объединила Expose, Spaces, Dashboard и полноэкранные
приложения в единый интерфейс.
Mac OS X 10.10 Yosemite(2014).
Переработан пользовательский интерфейс, чтобы он больше напоминал
iOS 7, с “плоским” дизайном, эффектами полупрозрачности и более
насыщенными цветами. Handoff позволил пользователям iPhone отвечать
на телефонные звонки, получать и отправлять SMS-сообщения, а также
заполнять электронные письма iPhone на своих Mac.
Mac OS X 10.13 High Sierra(2017).
Главной новой функцией High Sierra стало введение файловой системы
Apple(APFS). APFS оптимизирован для твердотельного хранилища,
которое есть в большинстве новых компьютеров Mac. Это также
единственная файловая система, используемая всеми устройствами
Apple, включая Apple Watch, Apple TV, iPad, iPhone и iPod touch.
Mac OS X 10.15 Catalina(2019).
Catalina отказалась от поддержки 32-битных приложений, полагаясь
исключительно на 64-битные версии приложений. Начиная с macOS
Catalina, приложения iOS могут работать в macOS с Project Catalyst, но
требуется, чтобы приложение было совместимо.
Mac OS X 11 Big Sur(2020).
Mac OS 11 ознаменовала переход на Apple Silicon, поскольку Apple
начинает отходить от процессоров Intel. Rosetta 2 позволяет
приложениям на базе Intel работать на Apple Silicon, а Universal Binaries
будет изначально работать как на Intel, так и на Apple Silicon Mac.
Силиконовые Mac на базе ARM по умолчанию могут запускать все
приложения iOS.
Мобильные ОС.
iOS.
iOS — это собственная операционная система Apple, которая работает
на iPhone, iPod Touch и iPad. Apple разработала iOS для работы на
собственном ядре XNU.
iOS начала свой путь в 2007 году с появлением первого смартфона Apple
— iPhone.
iPhone OS 1(2007).
При первом выпуске официального названия не было. В маркетинговой
литературе Apple просто говорится, что iPhone работает под
управлением версии настольной операционной системы Apple, OS X.
iPhone OS 2(2008).
Вторая версия добавила множество улучшений в предустановленные
приложения. Это был первый выпуск, предлагающий AppStore, цифровую
витрину, позволяющую пользователям покупать или загружать
приложения.
iPhone OS 3(2009).
Добавлено много новых функций: вырезание, копирование, вставка;
пошаговая навигация с поддержкой земного магнитного компаса; запись
видео в приложении “Камера”. Опция “Найти iPhone”, позволяющая
пользователям MobileMe удаленно находить устройство и стирать
данные. Первый iPad был представлен вместе с iPhone OS 3.2.
iOS 4(2010).
Помимо множества улучшений, в новую версию добавлена поддержка
многозадачности с переключением приложений двойным нажатием
кнопки “Домой”.
iOS 5(2011).
В этой версии добавлена поддержка iCloud с синхронизацией и
резервным копированием пользовательских данных. Был анонсирован
цифровой помощник Siri, и все уведомления были сосредоточены в
Центре уведомлений.
iOS 6(2012).
Эта версия была последней версией со скевоморфизмом в графическом
интерфейсе. Добавлено множество функций для Siri, интеграция с
Facebook, возможность совершать звонки FaceTime по сотовой связи.
iOS 7(2013).
Добавлена поддержка приложений с 64-битной архитектурой.
32-разрядная подсистема загружается при запуске 32-разрядного
приложения, поскольку 64-разрядная подсистема теперь используется в
этой и будущих версиях IOS. Плоский дизайн пользовательского
интерфейса и уход от скевоморфизма в целом.
iOS 11(2017).
В этом выпуске Apple прекратила поддержку 32-разрядных устройств, а
также прекратила поддержку 32-разрядных приложений, сделав iOS
только 64-разрядной ОС, которая запускает только 64-разрядные
приложения.
iOS 13(2019).
Новые основные функции включают темный режим и поддержку Memoji
для устройств A9+. Линия iPad , была переименована в iPadOS. Она
похожа на iOS 13, но имеет некоторые функции исключительно для iPad.
iOS 14(2020).
Некоторые новые функции, представленные в iOS 14 и iPadOS 14,
включают переработанные виджеты, которые теперь можно размещать
прямо на главном экране(только для iOS), а также библиотеку
приложений, которая автоматически распределяет приложения по
категориям на одной странице.
Android.
Android — это операционная система на базе Linux с открытым
исходным кодом для мобильных устройств, таких как смартфоны и
планшетные компьютеры. Android был разработан Open Handset Alliance
под руководством Google и других компаний. Исходный код для Android
доступен по бесплатным лицензиям на программное обеспечение с
открытым исходным кодом.
Android 1.1 был первым выпуском, использованным в коммерческом
устройстве T-mobile G1 в октябре 2008 года.
Android 1.0 Apple Pie(2008).
Первая коммерческая версия программы с магазином приложений
Android Market. Первым коммерчески доступным Android-устройством
был HTC Dream.
Android 1.5 Cupcake(2009).
Это был первый выпуск, в котором официально использовалось кодовое
имя, основанное на десертном предмете, тема, использовавшаяся во
всех выпусках до Android Pie. Обновление включает в себя несколько
новых функций и поправок пользовательского интерфейса.
Android 1.6 Donut(2009).
В этой версии представлен многоязычный механизм синтеза речи,
позволяющий любому приложению Android “озвучивать” строку текста.
Android 2.3 Gingerbread(2010).
В новой версии добавлена поддержка нескольких камер на устройстве,
включая фронтальную камеру, если она доступна. Перешел с YAFFS на
ext4 на более новых устройствах.
Android 3.0 Honeycomb(2011).
Android 3.0 SDK - первое обновление Android только для планшетов,
выпущенное с упрощенной многозадачностью, возможностью
шифрования всех пользовательских данных и поддержкой многоядерных
процессоров.
Android 4.0 Ice Cream Sandwich(2011).
Эта версия была последней версией, которая официально поддерживала
Flash-плеер Adobe Systems. Он обновил приложение “Люди” с
интеграцией с социальными сетями, обновлениями статуса и
изображениями в высоком разрешении.
Android 4.4 KitKat(2013).
KitKat был оптимизирован для работы на большем количестве устройств,
чем в более ранних версиях Android, с рекомендуемым минимумом 512
МБ ОЗУ.
Android 5.0 Lollipop(2014).
Lollipop имеет переработанный пользовательский интерфейс,
построенный на языке адаптивного дизайна, называемом “материальный
дизайн”. Google внесла внутренние изменения в платформу: среда
выполнения Android(ART) официально изменила Dalvik для повышения
производительности приложений, а также с изменениями, направленные
на улучшение и оптимизацию использования батареи.
Android 8.0 Oreo(2017).
Oreo - это самое большое изменение в основах Android на сегодняшний
день: модульная архитектура, которая упрощает и ускоряет для
производителей оборудования выпуск обновлений Android. Oreo 8.1
включает ряд новых API: нейронные сети, общую память, цвета обоев.
Android 10(2019).
В этой версии обновлена полноэкранная навигация жестами с новой
анимацией открытия/закрытия приложения. Добавлен динамический
формат глубины для фотографий, который позволяет изменять размытие
фона после съемки фотографии. А также появление новой
общесистемной темной темы/режима.
Существуют и другие мобильные операционные системы, но уровень их
внедрения значительно ниже, чем у iOS и Android.
К наиболее известным относят KaiOS, Sailfish OS и Harmony OS от
Huawei.
Концепции операционных систем.
●
Операционная система — это программа, которая действует как интерфейс
между пользователем и компьютерным оборудованием и контролирует
выполнение всех видов программ.
Некоторые типичные функции операционной системы могут включать: управление
памятью, файлами, процессами, системой ввода-вывода и устройствами,
безопасностью и т. д.
Рисунок 1. Расположение операционной системы в структуре компьютера.
Управление памятью.
Управление памятью относится к управлению первичной или основной памятью
(RAM).
Основная память представляет собой большой массив слов или байтов, где
каждое слово или байт имеет собственный адрес.
Основная память обеспечивает быстрое хранилище, к которому ЦП может обращаться
напрямую. Чтобы программа выполнялась, она должна находиться в основной памяти.
Операционная система выполняет следующие действия по управлению памятью:
● Отслеживает первичную память, т. е. какая ее часть кем используется, какая
часть не используется.
● При мультипрограммировании ОС решает, какой процесс получит память, когда
и сколько.
● Выделяет память, когда процесс запрашивает это сделать.
● Освобождает память, когда процесс больше не нуждается в ней или был
завершен.
Управление процессором.
В мультипрограммной среде ОС решает, какой процесс получит процессор, когда и на
какое время. Эта функция называется планированием процессов . Операционная
система выполняет следующие действия по управлению процессором:
● Отслеживает процессор и состояние процесса. Программа, отвечающая за эту
задачу, известна как диспетчер трафика.
● Выделяет процессор (CPU) для процесса.
● Освобождает процессор, когда процесс больше не требуется.
Управление устройствами.
Операционная система управляет связью устройств через соответствующие драйверы.
Он выполняет следующие действия по управлению устройствами:
● Отслеживает все устройства. Программа, отвечающая за эту задачу,
называется контроллером ввода-вывода.
● Решает, какой процесс получит устройство, когда и на сколько времени.
● Освобождает устройства.
Управление файлами.
Файловая система обычно организована в каталоги для удобства навигации и
использования. Эти каталоги могут содержать файлы и другие направления.
Операционная система выполняет следующие действия по управлению файлами:
●
●
●
●
Отслеживает информацию, местоположение, использование, статус и т. д.
Коллективные средства часто называют файловой системой.
Решает, кто получает ресурсы.
Распределяет ресурсы.
Отменяет распределение ресурсов.
Другие важные действия.
Ниже приведены еще ряд важных действий, которые выполняет операционная
система:
● Обеспечение безопасности — с помощью пароля и других подобных методов
предотвращает несанкционированный доступ к программам и данным.
● Контроль над производительностью системы — запись задержек между
запросом на обслуживание и ответом от системы.
● Учет заданий — отслеживание времени и ресурсов, используемых различными
задачами и пользователями.
● Координация между другим программным обеспечением и
пользователями — назначение компиляторов, интерпретаторов, ассемблеров
и другого программного обеспечения различным пользователям компьютерных
систем.
Службы операционной системы.
Операционная система обслуживает как пользователей, так и программы:
●
●
предоставляет программам среду для выполнения;
предоставляет пользователям обслуживание по выполнению программ в
удобной форме.
Ниже приведены несколько общих служб, предоставляемых операционной системой:
● Исполнение программы.
● Операции ввода/вывода.
● Манипуляции с файловой системой.
● Коммуникация.
● Обнаружение ошибок.
● Распределение ресурсов.
● Защита.
Исполнение программы.
Операционные системы обрабатывают множество видов действий, от
пользовательских программ до системных программ, таких как диспетчер очереди
печати, серверы имен, файловый сервер и т. д. Каждое из этих действий
инкапсулировано в виде процесса.
Процесс включает в себя полный контекст исполнения (код для исполнения, данные
для манипулирования, регистры, используемые ресурсы ОС). Ниже приведены
основные действия операционной системы в отношении управления программами:
● Загружает программу в память.
● Исполняет программу.
● Обрабатывает исполнение программы.
● Обеспечивает механизм синхронизации процессов.
● Обеспечивает механизм обмена данными между процессами.
● Предоставляет механизм для обработки взаимоблокировок.
Манипуляции с файловой системой.
Файл представляет коллекцию связанной информации. Компьютеры могут хранить
файлы на диске для целей долгосрочного доступа. Примеры носителей информации
включают магнитную ленту, магнитный диск и оптические дисководы, такие как CD,
DVD. Каждый из них имеет свои собственные свойства, такие как скорость, емкость,
скорость передачи данных и способы доступа к данным.
Файловая система обычно организована в каталоги для упрощения навигации и
использования. Эти каталоги могут содержать файлы и другие каталоги. Когда
программе требуется прочитать файл или записать файл, операционная система дает
разрешение программе на работу с файлом (только чтение, чтение-запись, отказ и т.
д.).
Ниже перечислены основные действия операционной системы в отношении
управления файлами:
● Операционная система предоставляет пользователю интерфейс для
создания/удаления файлов.
● Операционная система предоставляет пользователю интерфейс для
создания/удаления каталогов.
● Операционная система предоставляет интерфейс для создания резервной
копии файловой системы.
Операция ввода/вывода.
Подсистема ввода-вывода состоит из устройств ввода-вывода и соответствующего им
программного обеспечения драйвера. Драйверы скрывают от пользователей
особенности конкретных аппаратных устройств.
Операционная система управляет связью между пользователем и драйверами
устройств, предоставляя доступ к требуемому устройству ввода-вывода, когда это
необходимо.
Коммуникация.
В случае распределенных систем, представляющих собой набор процессоров,
которые не используют общую память, периферийные устройства или часы,
операционная система управляет связью между всеми процессами. Несколько
процессов взаимодействуют друг с другом через линии связи в сети.
ОС обрабатывает стратегии маршрутизации и подключения, а также проблемы
конкуренции и безопасности.
Два процесса часто требуют передачи данных между ними, оба процесса могут быть
на одном компьютере или на разных компьютерах, но соединены через компьютерную
сеть.
ОС обеспечивает возможность реализации обмена данными двумя способами, либо с
помощью общей памяти, либо с помощью передачи сообщений.
Обработка ошибок.
Ошибки могут возникнуть в любое время и в любом месте. Ошибка может возникнуть в
ЦП, в устройствах ввода-вывода или в аппаратной памяти. Ниже приведены основные
действия операционной системы в отношении обработки ошибок:
● ОС постоянно проверяет возможные ошибки.
● ОС принимает соответствующие меры для обеспечения правильного и
последовательного вычисления.
Управление ресурсами.
В случае многопользовательской или многозадачной среды такие ресурсы, как
основная память, циклы процессора и хранилище файлов, должны быть выделены
каждому пользователю или заданию. Ниже приведены основные действия
операционной системы в отношении управления ресурсами:
● ОС управляет всеми видами ресурсов с помощью планировщиков.
● Для лучшего использования ЦП применяются алгоритмы планирования ЦП.
Защита.
Учитывая компьютерную систему с несколькими пользователями и одновременным
выполнением нескольких процессов, различные процессы должны быть защищены от
действий друг друга.
Защита относится к механизму или способу управления доступом программ,
процессов или пользователей к ресурсам, определенным компьютерной системой.
Основные действия операционной системы в отношении защиты:
● ОС гарантирует, что весь доступ к системным ресурсам контролируется.
● ОС обеспечивает защиту внешних устройств ввода-вывода от недопустимых
попыток доступа.
● ОС предоставляет функции аутентификации для каждого пользователя с
помощью паролей.
Абстракции операционной системы.
Большинство операционных систем предоставляют определенные базовые концепции
и абстракции, такие как процессы , адресные пространства и файлы, которые
являются центральными для их понимания.
Процессы.
Ключевым понятием во всех операционных системах является процесс.
Процесс — это, по сути, исполняемая программа.
С каждым процессом связано его адресное пространство, список ячеек памяти от 0
до некоторого максимума, которые процесс может читать и записывать. Адресное
пространство содержит исполняемую программу, данные программы и ее стек.
Также с каждым процессом связан набор ресурсов, обычно включающий регистры (в
том числе программный счетчик и указатель стека), список открытых файлов,
ожидающих сообщений, списки связанных процессов и всю другую информацию,
необходимую для запуска программы. По сути, процесс — это контейнер, содержащий
всю информацию, необходимую для запуска программы.
Давайте подумаем о многопрограммной системе. Пользователь мог запустить
программу редактирования видео и дать ей указание преобразовать одночасовое
видео в определенный формат (что может занять несколько часов), а затем
отправиться в Интернет. Между тем, возможно, начал работать фоновый процесс,
который периодически просыпается для проверки входящей электронной почты. Таким
образом, у нас есть (как минимум) три активных процесса: видеоредактор, веб-браузер
и получатель электронной почты. Периодически операционная система решает
остановить выполнение одного процесса и запустить другой, возможно, потому, что
первый израсходовал больше своей доли процессорного времени за последнюю
секунду или две.
Когда процесс временно приостанавливается подобным образом, позже его
необходимо перезапустить точно в том же состоянии, в котором он был до остановки.
Это означает, что вся информация о процессе должна быть явно сохранена где-то во
время приостановки. Например, у процесса может быть открыто для чтения сразу
несколько файлов. С каждым из этих файлов связан указатель, указывающий текущую
позицию (т. е. номер байта или записи, которая будет считана следующей). Когда
процесс временно приостановлен, все эти указатели должны быть сохранены, чтобы
вызов чтения, выполняемый после перезапуска процесса, считывал правильные
данные. Во многих операционных системах, вся информация о каждом процессе,
кроме содержания своего собственного адресного пространства, хранится в таблице
операционной системы называется таблицей процессов, которая является массивом
структур, по одному для каждого процесса в настоящее время существующему.
Рисунок 2. Дерево процессов.
Если процесс может создать один или несколько других процессов (называемых
дочерними процессами), а эти процессы, в свою очередь, могут создавать дочерние
процессы, мы быстро придем к древовидной структуре процессов на Рисунке 2.
Процесс A создал два дочерних процесса, B и C. Процесс B создал дочерние процессы
D, E и F. Связанные процессы, которые сотрудничают для выполнения какой-либо
работы, часто должны взаимодействовать друг с другом и синхронизировать свои
действия. Это взаимодействие называется межпроцессным взаимодействием.
Адресные пространства.
У каждого компьютера есть некоторая основная память, которую он использует для
хранения исполняемых программ. В очень простой операционной системе в каждый
момент времени в памяти находится только одна программа. Чтобы запустить вторую
программу, первую нужно удалить, а вторую поместить в память.
Более сложные операционные системы позволяют нескольким программам
одновременно находиться в памяти. Чтобы они не мешали друг другу (и операционной
системе), необходим какой-то механизм защиты. Хотя этот механизм должен быть
аппаратным, им управляет операционная система.
Обычно у каждого процесса есть некоторый набор адресов, который он может
использовать, как правило от 0 до некоторого максимума. В простейшем случае
максимальный объем адресного пространства, которым обладает процесс, меньше
основной памяти. Таким образом, процесс может заполнить свое адресное
пространство, и в основной памяти будет достаточно места для всего этого.
Однако на многих компьютерах адреса имеют длину 32 или 64 бита, что дает адресное
пространство 232 или 264 байта соответственно. Что произойдет, если процесс имеет
больше адресного пространства, чем основная память компьютера, и процесс хочет
использовать все это? В первых компьютерах с таким процессом просто не повезло. В
настоящее время существует технология, называемая виртуальной памятью , при
которой операционная система хранит часть адресного пространства в основной
памяти, а часть — на диске и перемещает части туда и обратно по мере
необходимости. По сути, операционная система создает абстракцию адресного
пространства как набора адресов, на которые может ссылаться процесс. Адресное
пространство отделено от физической памяти машины и может быть как больше, так и
меньше физической памяти.
Файлы.
Другой ключевой концепцией, поддерживаемой практически всеми операционными
системами, является файловая система. Как отмечалось ранее, основная функция
операционной системы — скрыть особенности дисков и других устройств
ввода-вывода и предоставить программисту красивую, четкую абстрактную модель
независимых от устройств файлов. Системные вызовы, очевидно, необходимы для
создания файлов, удаления файлов, чтения файлов и записи файлов.
Чтобы обеспечить место для хранения файлов, в большинстве операционных систем
ПК используется концепция каталога как способа группировки файлов. У студента,
например, может быть один каталог для каждого курса, который он изучает (для
программ, необходимых для этого курса), другой каталог для его электронной почты и
еще один каталог для его домашней страницы в Интернете. Затем системные вызовы
необходимы для создания и удаления каталогов. Также предусмотрены вызовы для
помещения существующего файла в каталог и для удаления файла из каталога.
Записи каталога могут быть как файлами, так и другими каталогами. Эта модель также
порождает иерархию — файловую систему — как показано на Рисунке 3.
Прежде чем файл можно будет прочитать, он должен быть расположен на диске
и открыт, а после чтения он должен быть закрыт, поэтому для этих целей
предусмотрены вызовы.
Иерархии процессов и файлов организованы в виде деревьев, но на этом сходство
заканчивается.
Рисунок 3. Иерархия файловой системы.
Иерархии процессов обычно не очень глубоки (более трех уровней — это необычно),
тогда как иерархии файлов обычно имеют четыре, пять или даже больше уровней.
Иерархии процессов обычно недолговечны, максимум минуты, тогда как иерархия
каталогов может существовать годами.
Владение и защита также различаются для процессов и файлов. Как правило, только
родительский процесс может управлять дочерним процессом или даже иметь к нему
доступ, но почти всегда существуют механизмы, позволяющие читать файлы и
каталоги более широкой группе, чем только владелец.
Ввод/вывод.
Все компьютеры имеют физические устройства для получения ввода и производства
вывода. В конце концов, что хорошего было бы в компьютере, если бы пользователи
не могли сказать ему, что делать, и не могли бы получить результаты после того, как он
выполнил запрошенную работу? Существует множество типов устройств ввода и
вывода, включая клавиатуры, мониторы, принтеры и т. д. Операционная система
должна управлять этими устройствами.
Следовательно, каждая операционная система имеет подсистему ввода-вывода для
управления своими устройствами ввода-вывода. Некоторое программное обеспечение
ввода-вывода не зависит от устройства, то есть одинаково хорошо применимо ко
многим или ко всем устройствам ввода-вывода. Другие его части, такие как драйверы
устройств, специфичны для конкретных устройств ввода/вывода.
Структура операционной системы.
Монолитные системы.
При монолитном подходе вся операционная система работает как единая программа в
режиме ядра. Операционная система написана как набор процедур, связанных
вместе в одну большую исполняемую двоичную программу. Когда используется этот
метод, каждая процедура в системе может вызывать любую другую, если последняя
обеспечивает некоторые полезные вычисления, необходимые первой. Возможность
вызывать любую процедуру, которую вы хотите, очень эффективна, но наличие тысяч
процедур, которые могут вызывать друг друга без ограничений, также может привести к
тому, что система станет громоздкой и трудной для понимания. Кроме того, сбой в
любой из этих процедур приведет к выходу из строя всей операционной системы.
Однако даже в монолитных системах возможна некоторая структура. Службы
(системные вызовы), предоставляемые операционной системой, запрашиваются
путем помещения параметров в четко определенное место (например, в стек) и
последующего выполнения команды прерывания. Эта команда переключает машину
из пользовательского режима в режим ядра и передает управление операционной
системе. Затем операционная система получает параметры и определяет, какой
системный вызов должен быть выполнен. После этого он индексирует таблицу,
содержащую в слоте k указатель на процедуру, выполняющую системный вызов k.
Эта организация предлагает базовую структуру операционной системы:
1. Основная программа, которая вызывает запрошенную служебную процедуру.
2. Набор служебных процедур, осуществляющих системные вызовы.
3. Набор служебных процедур, помогающих сервисным процедурам.
В этой модели для каждого системного вызова существует одна служебная процедура,
которая заботится о нем и выполняет его. Вспомогательные процедуры выполняют
действия, которые необходимы нескольким служебным процедурам, например
извлекают данные из пользовательских программ. Такое разделение процедур на три
уровня показано на Рисунке 4.
Рисунок 4. Модель структурирования монолитной системы.
В дополнение к основной операционной системе, которая загружается при загрузке
компьютера, многие операционные системы поддерживают загружаемые расширения,
такие как драйверы устройств ввода-вывода и файловые системы. Эти компоненты
загружаются по запросу. В UNIX они называются разделяемыми библиотеками. В
Windows они называются DLL (библиотеки динамической компоновки).
Многоуровневые системы.
Обобщение подхода, показанного на Рисунке 4, состоит в том, чтобы организовать
операционную систему в виде иерархии уровней, каждый из которых построен на
нижележащем. Первой системой, построенной таким образом, была система THE,
основанная в Высшей технической школе Эйндховена в Нидерландах Э. У. Дейкстра
(1968) и его учениками (Таблица 1).
Таблица 1. Структура операционной системы THE.
Уровень
Функция
5
Оператор
4
Пользовательские программы
3
Управление вводом/выводом
2
Оператор - процесс коммуникации
1
Управление памятью и барабанами
0
Выделение процессоров и
микропрограммирование
Уровень 0 имел дело с выделением процессора, переключением между процессами
при возникновении прерываний или истечении времени таймеров. Выше уровня 0
система состояла из последовательных процессов, каждый из которых можно было
запрограммировать, не беспокоясь о том, что несколько процессов выполняются на
одном процессоре.
Уровень 1 занимался управление памятью. Это выделенное пространство для
процессов в оперативной памяти и на барабане слов 512 КБ, используемом для
хранения частей процессов (страниц), для которых не было места в основной памяти.
Процессам выше уровня 1 не нужно было беспокоиться о том, находятся ли они в
памяти или на барабане; программное обеспечение уровня 1 позаботилось о том,
чтобы страницы загружались в память в тот момент, когда они были нужны, и
удалялись, когда они не нужны.
Уровень 2 обеспечивал связь между каждым процессом и консолью оператора (то
есть пользователем). Поверх этого уровня у каждого процесса фактически была
собственная консоль оператора.
Уровень 3 позаботился об управлении устройствами ввода-вывода и буферизации
входящих и исходящих информационных потоков. Выше уровня 3 каждый процесс
может иметь дело с абстрактными устройствами ввода-вывода с хорошими
свойствами, а не с реальными устройствами со многими особенностями.
На уровне 4 находились пользовательские программы. Им не нужно было
беспокоиться об управлении процессами, памятью, консолью или вводом-выводом.
Процесс системного оператора располагался на уровне 5.
Дальнейшее обобщение концепции многоуровневости было представлено в системе
MULTICS. Вместо слоев MULTICS была описана как имеющая ряд концентрических
колец, причем внутренние из них имеют более высокий приоритет, чем внешние (что,
по сути, одно и то же). Когда процедура во внешнем кольце хотела вызвать процедуру
во внутреннем кольце, ей приходилось делать эквивалент системного вызова, то есть
команду TRAP, параметры которой тщательно проверялись на допустимость, прежде
чем вызову разрешалось продолжить выполнение. Хотя вся операционная система
была частью адресного пространства каждого пользовательского процесса в MULTICS,
аппаратное обеспечение позволяло назначать отдельные процедуры (фактически
сегменты памяти) как защищенные от чтения, записи или выполнения.
Микроядра.
При многоуровневом подходе у разработчиков есть выбор, где провести границу
между пользователем и ядром. Традиционно все слои помещались в ядро, но это не
обязательно. На самом деле, можно привести веские доводы в пользу того, чтобы как
можно меньше использовать режим ядра, потому что ошибки в ядре могут мгновенно
вывести систему из строя. Напротив, пользовательские процессы могут быть
настроены так, чтобы иметь меньшую мощность и ошибка не могла быть фатальной.
Основная идея микроядра заключается в достижении высокой надежности за
счет разделения операционной системы на небольшие четко определенные
модули, только один из которых — микроядро — работает в режиме ядра, а
остальные работают как относительно менее мощные обычные
пользовательские процессы.
В частности, при запуске каждого драйвера устройства и файловой системы как
отдельного пользовательского процесса ошибка в одном из них может привести к сбою
этого компонента, но не к сбою всей системы. Таким образом, ошибка в звуковом
драйвере приведет к искажению или остановке звука, но не приведет к сбою
компьютера.
Структура процесса MINIX 3 показана на Рисунке 5, где обработчики вызовов ядра
помечены как Sys. Драйвер устройства для часов также находится в ядре, поскольку
планировщик тесно взаимодействует с ним. Другие драйверы устройств работают как
отдельные пользовательские процессы.
Рисунок 5. Упрощенная структура системы MINIX.
Вне ядра система структурирована как три уровня процессов, работающих в
пользовательском режиме. Самый нижний уровень содержит драйверы устройств.
Поскольку они работают в пользовательском режиме, они не имеют физического
доступа к пространству портов ввода-вывода и не могут напрямую выдавать команды
ввода-вывода. Вместо этого, чтобы запрограммировать устройство ввода-вывода,
драйвер строит структуру, сообщающую, какие значения записывать в какие порты
ввода-вывода, и делает вызов ядра, сообщая ядру о необходимости записи. Этот
подход означает, что ядро может проверить, что драйвер записывает (или читает) из
ввода-вывода, который ему разрешено использовать. Следовательно (и в отличие от
монолитной конструкции), глючный аудио драйвер не может случайно записать на
диск.
Над драйверами находится еще один уровень пользовательского режима, содержащий
серверы, которые выполняют большую часть работы операционной системы. Один или
несколько файловых серверов управляют файловой системой (системами), менеджер
процессов создает, уничтожает процессы и управляет ими и т. д. Пользовательские
программы получают службы операционной системы, отправляя короткие сообщения
на серверы с запросом системных вызовов POSIX. Например, процесс, которому
нужно выполнить чтение, отправляет сообщение на один из файловых серверов,
сообщая ему, что читать.
Модель "клиент-сервер".
Небольшая вариация идеи микроядра состоит в том, чтобы различать два класса
процессов:
- серверы, каждый из которых предоставляет какую-либо услугу,
- клиенты, которые используют эти услуги.
Эта модель известна как модель "клиент-сервер". Часто самый нижний уровень — это
микроядро, но это не обязательно. Суть в наличии клиентских процессов и серверных
процессов.
Связь между клиентами и серверами часто осуществляется путем передачи
сообщений. Чтобы получить услугу, клиентский процесс создает сообщение о том, что
ему нужно, и отправляет его соответствующей службе. Затем служба выполняет
работу и отправляет ответ. Если клиент и сервер работают на одной машине,
определенные оптимизации возможны, но концептуально мы все еще говорим здесь о
передаче сообщений.
Очевидным обобщением этой идеи является запуск клиентов и серверов на разных
компьютерах, соединенных локальной или глобальной сетью, как показано на Рисунке
6.
Рисунок 6. Модель клиент-сервер в сети.
Виртуальные машины.
Сердце системы, известное как монитор виртуальных машин, работает на голом
оборудовании и выполняет мультипрограммирование, предоставляя не одну, а
несколько виртуальных машин для следующего уровня. Эти виртуальные машины
являются точными копиями голого оборудования, включая режим ядра/пользователя,
ввод-вывод, прерывания и все остальное, что есть у реальной машины.
Поскольку каждая виртуальная машина идентична реальному оборудованию, каждая
из них может запускать любую операционную систему, которая будет работать
непосредственно на голом оборудовании. Разные виртуальные машины могут и часто
работают под управлением разных операционных систем.
В то время как IBM выпускала виртуальные машины уже четыре десятилетия (система
VM/370), за последние несколько лет сочетание новых потребностей, нового
программного обеспечения и новых технологий сделало эту тему горячей темой.
Виртуализация популярна в мире веб-хостинга. Без виртуализации клиенты
веб-хостинга вынуждены выбирать между виртуальным хостингом (который просто
дает им учетную запись для входа на веб-сервере, но не имеет контроля над
серверным программным обеспечением) и выделенным хостингом (который дает им
собственную машину, которая очень гибкая, но нерентабельна для малых и средних
веб-сайтов). Когда компания, предоставляющая веб-хостинг, предлагает виртуальные
машины в аренду, на одной физической машине может работать множество
виртуальных машин, каждая из которых выглядит полноценной машиной. Клиенты,
которые арендуют виртуальную машину, могут запускать любую операционную
систему и программное обеспечение, которые они хотят, но за небольшую часть
стоимости выделенного сервера (поскольку одна и та же физическая машина
поддерживает множество виртуальных машин одновременно).
Другое использование виртуализации предназначено для конечных
пользователей, которые хотят иметь возможность запускать две или более
операционных систем одновременно, скажем, Windows и Linux.
Эта ситуация проиллюстрирована на Рисунке 7 а).
Рисунок 7. Различия в типах гипервизоров.
Реальное различие между гипервизором типа 1 (например, VMWare ESXi) и
гипервизором типа 2 (например, VMware Workstation) заключается в том, что тип 2
использует основную операционную систему и ее файловую систему для создания
процессов, хранения файлов и т. д. Гипервизор типа 1 не имеет базовой поддержки и
должен сам выполнять все эти функции.
После запуска гипервизора типа 2 он считывает установочный компакт-диск (или файл
образа компакт-диска) для выбранной гостевой операционной системы и
устанавливает гостевую ОС на виртуальный диск, который представляет собой просто
большой файл в папке основной операционной системы хоста. Гипервизоры типа 1 не
могут этого сделать, потому что нет основной операционной системы для хранения
файлов. Они должны управлять своим собственным хранилищем на необработанном
разделе диска.
Когда гостевая операционная система загружается, она делает то же самое, что и на
реальном оборудовании, обычно запуская некоторые фоновые процессы, а затем
графический интерфейс. Для пользователя гостевая операционная система ведет себя
так же, как и при работе на «голом железе», хотя здесь это не так.
Основные обязанности системного
администратора.
Операционная система — это программа, которая действует как интерфейс
между пользователем и компьютерным оборудованием и контролирует
выполнение всех видов программ.
К типичным функциям операционной системы относятся управление памятью,
файлами, процессами, системой ввода-вывода и устройствами, безопасностью и
некоторые другие.
А системный администратор поддерживает оптимальную работоспособность
компьютеров и программного обеспечения для пользователей через управление
параметрами операционной системы.
Давайте разберемся, каковы же основные обязанности системного администратора.
1. Управление доступом.
Системный администратор создает учетные записи для новых пользователей, удаляет
учетные записи неактивных пользователей и обрабатывает все возникающие
проблемы с учетными записями (например, забытые пароли и потерянные пары
ключей).
Процесс фактического добавления и удаления учетных записей обычно
автоматизируется системой управления конфигурацией или централизованной
службой каталогов.
2. Добавление аппаратного обеспечения.
Администраторы, работающие с физическим оборудованием (в отличие от облачных
или размещенных систем), должны установить его и настроить для распознавания
операционной системой.
Работа по поддержке оборудования может варьироваться от простой задачи по
добавлению сетевой карты до настройки специализированного внешнего массива
хранения.
3. Автоматизация задач.
Использование инструментов для автоматизации повторяющихся и трудоемких задач
повышает вашу эффективность, снижает вероятность ошибок, вызванных
человеческим фактором, и улучшает вашу способность быстро реагировать на
меняющиеся требования.
Администраторы стремятся сократить количество ручного труда, необходимого для
бесперебойной работы систем. Знакомство с языками сценариев и инструментами
автоматизации — большая часть работы.
4. Контроль за резервными копиями.
Резервное копирование данных и их успешное восстановление при необходимости
являются важными административными задачами. Хотя резервное копирование
занимает много времени и является скучным, частота реальных аварий просто
слишком высока, чтобы можно было игнорировать эту работу.
Операционные системы и некоторые отдельные программные пакеты предоставляют
хорошо зарекомендовавшие себя инструменты и методы для облегчения резервного
копирования. Резервное копирование должно выполняться по регулярному
расписанию, а восстановление должно периодически тестироваться, чтобы убедиться,
что оно работает правильно.
5. Установка и обновление программного обеспечения.
Программное обеспечение должно быть выбрано, установлено и настроено, часто в
различных операционных системах. По мере выпуска исправлений и обновлений
безопасности их необходимо тестировать, проверять и включать в локальную среду, не
ставя под угрозу стабильность производственных систем.
Термин «поставка программного обеспечения» относится к процессу выпуска
обновленных версий программного обеспечения, особенно программного обеспечения,
разработанного собственными силами, для последующих пользователей.
«Непрерывная поставка» выводит этот процесс на новый уровень, автоматически
выпуская программное обеспечение для пользователей с определенной
периодичностью по мере его разработки. Администраторы помогают внедрить
надежные процессы поставки, отвечающие требованиям предприятия.
6. Мониторинг.
Обойти проблему обычно быстрее, чем потратить время на документирование и отчет
о ней, и пользователи внутри организации часто идут по пути наименьшего
сопротивления. Внешние пользователи с большей вероятностью озвучат свои жалобы
публично, чем откроют запрос в службу поддержки.
Администраторы могут помочь предотвратить оба этих результата, выявляя проблемы
и устраняя их до того, как произойдут общедоступные сбои.
Некоторые задачи мониторинга включают обеспечение быстрого и правильного ответа
веб-служб, сбор и анализ файлов журналов, а также отслеживание доступности
ресурсов сервера, таких как дисковое пространство. Все это отличные возможности
для автоматизации, и множество открытых и коммерческих систем мониторинга могут
помочь системным администраторам в решении этих задач.
7. Диагностика.
Сетевые системы выходят из строя неожиданным, а иногда и впечатляющим образом.
Работа администратора состоит в том, чтобы играть роль механика, диагностируя
проблемы и вызывая экспертов в данной области по мере необходимости. Найти
источник проблемы часто бывает сложнее, чем решить ее.
8. Ведение локальной документации.
Администраторы выбирают поставщиков, пишут сценарии, развертывают программное
обеспечение и принимают множество других решений, которые могут быть не
очевидны или непонятны другим.
Тщательная и точная документация — это благословение для членов команды,
которым в противном случае пришлось бы реконструировать систему для решения
проблем посреди ночи.
И помните, что любовно созданная сетевая диаграмма более полезна, чем множество
абзацев текста при описании проекта.
9. Тщательный контроль безопасности.
Администраторы — это первая линия защиты сетевых систем.
Администратор должен внедрить политику безопасности и настроить процедуры для
предотвращения взлома систем. Эта обязанность может включать в себя только
несколько основных проверок на предмет несанкционированного доступа или может
включать в себя сложную сеть ловушек и программ аудита, в зависимости от
контекста.
Системные администраторы осторожны по своей природе и часто являются главными
поборниками безопасности в технической организации.
10. Настройка производительности.
UNIX и Linux — это операционные системы общего назначения, которые хорошо
подходят практически для любых мыслимых вычислительных задач.
Администраторы могут настраивать системы для достижения оптимальной
производительности в соответствии с потребностями пользователей, доступной
инфраструктурой и услугами, предоставляемыми системами.
Когда сервер работает плохо, задача администратора состоит в том, чтобы изучить его
работу и определить области, требующие улучшения.
11. Разработка политик сайта.
По юридическим причинам и требованиям соответствия большинству сайтов
требуются политики, регулирующие допустимое использование компьютерных систем,
управление и хранение данных, конфиденциальность и безопасность сетей и систем, а
также другие области, представляющие интерес для регулирующих органов.
Системные администраторы часто помогают организациям разрабатывать разумные
политики, которые соответствуют букве и смыслу закона и при этом способствуют
прогрессу и производительности.
12. Работа с вендорами.
Большинство сайтов полагаются на третьи стороны для предоставления различных
вспомогательных услуг и продуктов, связанных с их вычислительной инфраструктурой.
К таким поставщикам могут относиться разработчики программного обеспечения,
поставщики облачной инфраструктуры, размещенные магазины программного
обеспечения как услуги (SaaS), сотрудники службы поддержки, консультанты,
подрядчики, эксперты по безопасности, а также поставщики платформ или
инфраструктуры.
Администраторам может быть поручено выбрать поставщиков, помочь в переговорах
по контракту и внедрить решения после завершения оформления документов.
13. Пожаротушение.
Хотя помощь другим людям в решении их различных проблем редко входит в
должностные обязанности системного администратора, эти задачи занимают
значительную часть рабочего дня большинства администраторов.
Системных администраторов забрасывают проблемами, начиная от «Вчера работало,
а сегодня нет! Что ты изменил? до «Я пролил кофе на клавиатуру! Мне вылить на него
воду, чтобы смыть?»
В большинстве случаев ваш ответ на эти вопросы влияет на вашу воспринимаемую
ценность как администратора гораздо больше, чем любые технические навыки,
которыми вы могли бы обладать.
Вы можете либо выть из-за несправедливости всего этого, либо радоваться тому
факту, что одна хорошо обработанная заявка на устранение неполадок приносит
больше баллов, чем пять часов полуночной отладки.
Лекция 7. Администрирование ОС
Linux.
Оболочка Linux.
Большинство пользователей компьютеров
сегодня знакомы только с графическим
пользовательским интерфейсом (GUI) и научены
поставщиками и экспертами, что интерфейс
командной строки (CLI) является ужасающим делом
прошлого.
Это печально, потому что хороший интерфейс командной строки — это
удивительно выразительный способ общения с компьютером, почти
такой же, как письменное слово для людей. Говорят, что «графические
пользовательские интерфейсы упрощают простые задачи, а интерфейсы
командной строки делают возможными сложные задачи», и это верно и
сегодня.
Поскольку Linux создан по образцу семейства операционных систем Unix,
он имеет то же богатое наследие инструментов командной строки, что и
Unix. Unix стал известен в начале 1980-х годов (хотя впервые он был
разработан десятью годами ранее), до широкого распространения
графического пользовательского интерфейса, и в результате вместо этого
был разработан расширенный интерфейс командной строки. На самом
деле, одной из главных причин, по которой ранние последователи Linux
предпочли ее, скажем, Windows NT, был мощный интерфейс командной
строки, который делал «сложные задачи возможными».
Документация.
Страницы руководства, обычно называемые “man pages”, потому что они
читаются с помощью команды man, представляют собой традиционную
«онлайновую» документацию. Справочные страницы конкретных
программ появляются при установке новых программных пакетов. Даже в
эпоху Google мы продолжаем обращаться к справочным страницам как к
авторитетному ресурсу, потому что они доступны из командной строки,
обычно содержат полную информацию о параметрах программы и
показывают полезные примеры и соответствующие команды.
Man-страницы — это краткие описания отдельных команд, драйверов,
форматов файлов или библиотечных процедур.
FreeBSD и Linux делят справочные страницы на разделы. В Таблице 1
показана основная схема. Другие варианты UNIX иногда определяют
разделы несколько иначе.
Таблица 1. Разделы справочных страниц
Раздел
Содержание
1
Команды и приложения пользовательского уровня
2
Системные вызовы и коды ошибок ядра
3
Библиотечные звонки
4
Драйверы устройств и сетевые протоколы
5
Стандартные форматы файлов
6
Игры и демонстрации
7
Разные файлы и документы
8
Команды системного администрирования
9
Непонятные спецификации ядра и интерфейсы
Точная структура разделов не важна для большинства тем, потому что
человек находит нужную страницу, где бы она ни хранилась. Просто
помните об определениях разделов, когда тема с одинаковым названием
появляется в нескольких разделах. Например, passwd является
одновременно и командой, и файлом конфигурации, поэтому имеет
записи как в разделе 1, так и в разделе 5.
man title - форматирует определенную справочную страницу и
отправляет ее на ваш терминал с помощью программы more, less или
любой другой программы, указанной в переменной среды PAGER. title
обычно является командой, устройством, именем файла или именем
библиотечной процедуры. Разделы руководства просматриваются
примерно в порядке номеров, хотя разделы, описывающие команды
(разделы 1 и 8), обычно ищутся в первую очередь.
Определение того, установлено ли уже ПО.
По разным причинам может быть немного сложно определить, какой
пакет содержит программное обеспечение, которое вам действительно
нужно. Вместо того, чтобы начинать с уровня пакета, проще использовать
команду оболочки which, чтобы узнать, находится ли соответствующий
двоичный файл в вашем пути поиска. Например, следующая команда
показывает, что компилятор GNU C уже установлен на этой машине:
ubuntu$ which gcc
/usr/bin/gcc
Если which не может найти нужную команду, попробуйте whereis; она
выполняет поиск в более широком диапазоне системных каталогов и не
зависит от пути поиска вашей оболочки.
Добавление нового ПО.
Если вам необходимо установить дополнительное программное
обеспечение, вам сначала необходимо определить каноническое имя
соответствующего пакета программного обеспечения. Например, вам
нужно будет перевести «Я хочу установить locate» на «Мне нужно
установить пакет mlocate» или перевести «Мне нужно named» на «Мне
нужно установить BIND». В этом могут помочь различные системные
индексы в Интернете, но Google обычно не менее эффективен.
Например, поиск по запросу «locate command» приведет вас сразу к
нескольким релевантным обсуждениям.
В следующих примерах показана установка команды tcpdump в каждой
из наших тестовых систем. tcpdump — это инструмент захвата пакетов,
который позволяет просматривать необработанные пакеты,
отправляемые в систему и из нее в сети.
Debian и Ubuntu используют APT, инструмент Debian Advanced Package
Tool:
ubuntu# sudo apt-get install tcpdump
Версия Red Hat и CentOS:
redhat# sudo yum install tcpdump
Пакеты межплатформенного программного обеспечения все чаще
предлагают ускоренный процесс установки, который управляется
сценарием оболочки, который вы загружаете из Интернета с помощью
curl, fetch или wget. Например, чтобы настроить машину в качестве
клиента Salt, вы можете запустить следующие команды:
$ curl -o /tmp/saltboot -sL
https://bootstrap.saltstack.com $ sudo sh /tmp/saltboot
Сценарий начальной загрузки исследует локальную среду, затем
загружает, устанавливает и настраивает соответствующую версию
программного обеспечения. Этот тип установки особенно распространен
в тех случаях, когда сам процесс несколько сложен, но поставщик очень
заинтересован в том, чтобы упростить работу пользователей.
Настройка среды оболочки.
Вы можете выбрать, какой интерпретатор команд оболочки использовать
(bash, sh, zsh…). Вы можете настроить свою оболочку, чтобы работать
более эффективно. Вы можете установить псевдонимы для создания
ярлыков ваших любимых командных строк и переменных среды для
хранения битов информации. Добавив эти настройки в файлы
конфигурации оболочки, вы можете иметь доступ к этим настройкам
каждый раз, когда открываете оболочку.
В Таблице 2 приведены несколько файлов конфигурации, которые
поддерживают поведение Вашей оболочки.
Таблица 2. Файлы конфигурации Bash
Файл
Описание
/etc/profile
Устанавливает информацию о пользовательской среде для
каждого пользователя. Он выполняется при первом входе в
систему. Этот файл предоставляет значения для вашего пути в
дополнение к настройке переменных среды для таких вещей,
как расположение вашего почтового ящика и размер ваших
файлов истории. Наконец, /etc/profile собирает параметры
оболочки из файлов конфигурации в каталоге /etc/profile.d.
/etc/bashrc
Выполняется для каждого пользователя, запускающего
оболочку bash каждый раз, когда она открывается. Он
устанавливает запрос по умолчанию и может добавить один или
несколько псевдонимов. Значения в этом файле могут быть
заменены информацией из файла ~/.bashrc каждого
пользователя.
~/. bash_profile
Используется каждым пользователем для ввода информации,
относящейся к его или ее использованию оболочки. Он
выполняется только один раз — когда пользователь входит в
систему. По умолчанию устанавливает несколько переменных
среды и выполняет файл .bashrc пользователя. Это хорошее
место для добавления переменных среды, поскольку после их
установки они наследуются будущими оболочками.
~/.bashrc
Он содержит информацию, специфичную для ваших оболочек
bash. Он читается при входе в систему, а также каждый раз,
когда вы открываете новую оболочку bash. Это лучшее место
для добавления псевдонимов, чтобы ваша оболочка их
подбирала.
~/. bash_logout
Выполняется каждый раз, когда вы выходите из системы (выход
из последней оболочки bash).
Оболочка хранит в переменных информацию,
которая может быть полезна для пользовательского
сеанса оболочки.
Примеры переменных включают $SHELL (которая идентифицирует
используемую вами оболочку) или $PATH (список каталогов,
разделенных двоеточиями, используемый для поиска вводимых вами
команд).
Вы можете увидеть все переменные, установленные для вашей текущей
оболочки, введя команду set. Подмножество ваших локальных
переменных называется переменными среды.
Переменные среды — это переменные, которые
экспортируются во все новые оболочки, открытые из
текущей оболочки.
Введите env, чтобы увидеть переменные среды.
Вы можете ввести echo $VALUE, где VALUE заменяется именем
конкретной переменной среды, которую вы хотите вывести.
bash# echo $USER
alex
Навигация по дереву файловой системы.
Когда вы входите в систему Linux и открываете оболочку, вы попадаете в
свой домашний каталог. Как пользователь Linux, большинство файлов,
которые вы сохраняете и с которыми работаете, вероятно, будут
находиться в этом каталоге или в созданных вами подкаталогах. В
Таблице 3 показаны команды для создания и использования файлов и
каталогов.
Таблица 3. Команды для работы с каталогами
Команда
Результат
cd
Переход в другой рабочий каталог
pwd
Выводит имя текущего рабочего каталога
mkdir
ls
Создает каталог
Выводит содержимое каталога
Перенаправление ввода-вывода.
Команды получают данные со стандартного ввода и отправляют их на
стандартный вывод. Используя конвейеры, вы можете направить
стандартный вывод одной команды на стандартный ввод другой. В
файлах можно использовать специальные символы для направления
данных в файлы и из файлов. В Таблице 4 перечислены символы
конвейера и перенаправления файлов:
Таблица 4. Спецсимволы для перенаправления ввода-вывода
Команда
Результат
Пример
|
Вывод одной команды может
быть направлен на ввод другой
команды:
#cat file1 | sort | pr
<
Направляет содержимое
файла команде.
#less < bigfile.txt
>
Направляет стандартный
вывод команды в файл.
Если файл существует,
содержимое этого файла
перезаписывается.
#less bigfile.txt > newfile.txt
2>
Направляет стандартную
ошибку (сообщения об
ошибках) в файл.
#command 2> error.log
&>
Направляет в файл как
стандартный вывод, так и
стандартную ошибку.
#command &> output.txt
>>
Направляет вывод
команды в файл,
добавляя вывод в конец
существующего файла.
#less file1 >> bigfile.txt
Сценарии оболочки.
Сценарий оболочки — это группа команд, функций, переменных или
почти всего, что вы можете использовать из оболочки. Эти элементы
вводятся в обычный текстовый файл. Затем этот файл можно запустить
как команду. В системах Linux традиционно используются сценарии
оболочки инициализации системы во время ее запуска для старта
команд, необходимых для работы служб. Вы можете создавать свои
собственные сценарии оболочки, чтобы автоматизировать задачи,
которые вам необходимо выполнять регулярно.
Вы можете выполнить сценарий оболочки двумя основными способами:
● Имя файла используется в качестве аргумента оболочки (как в
bash myscript.sh). В этом методе файл не обязательно должен
быть исполняемым; он просто содержит список команд оболочки.
Оболочка, указанная в командной строке, используется для
интерпретации команд в файле сценария. Это наиболее
распространено для быстрых, простых задач.
● Сценарий оболочки также может иметь имя интерпретатора,
помещенное в первую строку сценария, которому предшествует #!
(как в #!/bin/bash) и установить бит выполнения файла,
содержащего набор сценариев (используя chmod +x filename).
Затем вы можете запустить свой сценарий так же, как и любую
другую программу на своем пути, просто введя имя сценария в
командной строке.
Существуют специальные переменные, которые назначает оболочка.
Один набор часто используемых переменных называется
позиционными параметрами или аргументами командной строки и
обозначается как $0, $1, $2, $3. . .$n. $0 является специальным, и ему
назначается имя, используемое для вызова вашего сценария; остальным
присваиваются значения параметров, переданных в командной строке, в
порядке их появления. Например, предположим, что у вас есть сценарий
оболочки с именем testscript.sh, который содержит следующее:
#!/bin/bash
# Script to echo out command-line arguments
echo "The first argument is $1, the second is $2."
echo "The command itself is called $0."
echo "There are $# parameters on your command line"
echo "Here are all the arguments: $@"
После установки исполняемого бита и выполнения этого сценария вы
получите следующий вывод:
bash# chmod 755 /home/alex/testscript.sh
bash# testscript.sh foo bar
The first argument is foo, the second is bar.
The command itself is called /home/alex/testscript.sh.
There are 2 parameters on your command line
Here are all the arguments: foo bar
Настройка сервера Linux.
Файловая система Linux организована как иерархия каталогов, начиная с
корневого каталога (/).
В Таблице 5 перечислены некоторые базовые каталоги.
Таблица 5. Базовые каталоги Linux
Каталог
Описание
/bin
Содержит общие пользовательские команды Linux, такие как ls, sort,
date и chmod.
/boot
Имеет загрузочное ядро Linux, начальный RAM-диск и
файлы конфигурации загрузчика.
/dev
Содержит файлы, представляющие точки доступа к
устройствам в ваших системах. К ним относятся
терминальные устройства (tty*), жесткие диски (hd* или
sd*), оперативная память (ram*) и CD-ROM (cd*).
Пользователи могут получить доступ к этим устройствам
напрямую через эти файлы устройств; однако
приложения часто скрывают от конечных пользователей
фактические имена устройств.
/etc
Содержит файлы административной конфигурации.
Большинство этих файлов представляют собой
обычные текстовые файлы, которые при наличии у
пользователя соответствующих прав можно
редактировать в любом текстовом редакторе.
/home
Содержит каталоги, назначенные каждому обычному
пользователю с учетной записью для входа.
/media
Предоставляет стандартное расположение для
автоматического монтирования устройств (в частности,
съемных носителей). Если у носителя есть имя тома,
это имя обычно используется в качестве точки
монтирования. Например, USB-накопитель с именем
тома myusb будет смонтирован в /media/myusb.
/lib
Содержит общие библиотеки, необходимые
приложениям в /bin и /sbin для загрузки системы.
/mnt
Общая точка монтирования для многих устройств до
того, как она была вытеснена стандартным каталогом
/media. Некоторые загружаемые системы Linux
по-прежнему используют этот каталог для
монтирования разделов жесткого диска и удаленных
файловых систем. Многие до сих пор используют этот
каталог для временного монтирования локальных или
удаленных файловых систем, которые не монтируются
постоянно.
/opt
Структура каталогов, доступная для хранения
дополнительного прикладного программного
обеспечения.
/proc
Содержит информацию о системных ресурсах.
/root
Представляет домашний каталог пользователя root.
Домашний каталог для root не находится ниже /home из
соображений безопасности.
/sbin
Содержит административные команды и процессы
демона.
/sys
Содержит параметры для таких вещей, как настройка
блочного хранилища и управление контрольными
группами.
/tmp
Содержит временные файлы, используемые
приложениями.
/usr
Содержит пользовательскую документацию, игры,
графические файлы (X11), библиотеки (lib) и множество
других команд и файлов, которые не нужны в процессе
загрузки. Каталог /usr предназначен для файлов,
которые не изменяются после установки (теоретически
/usr может быть смонтирован только для чтения).
/var
Содержит каталоги данных, используемых различными
приложениями. Он также содержит все файлы
системного журнала (/var/log) и файлы спула в
/var/spool. Каталог /var содержит каталоги и файлы,
которые должны часто изменяться. На серверных
компьютерах каталог /var обычно создают как
отдельную файловую систему, используя тип файловой
системы, который можно легко расширить.
Файлы административной конфигурации.
Файлы конфигурации — еще одна опора администрирования Linux.
Почти все, что вы настраиваете для своего конкретного компьютера —
учетные записи пользователей, сетевые адреса или настройки
графического интерфейса — приводит к тому, что настройки сохраняются
в текстовых файлах. Это имеет некоторые преимущества и некоторые
недостатки.
Преимущество текстовых файлов в том, что их легко читать и изменять.
Подойдет любой текстовый редактор. Недостатком, однако, является то,
что при редактировании файлов конфигурации обычно проверка ошибок
не выполняется. Иногда вам нужно запустить программу, которая читает
эти файлы (например, сетевой демон или рабочий стол X), чтобы узнать,
правильно ли вы настроили файлы.
Некоторые из каталогов, содержащих важные файлы конфигурации,
перечислены в Таблице 6.
Таблица 6. Каталоги конфигурации
Каталог
Описание
/etc
Этот каталог содержит большинство основных файлов
конфигурации системы Linux.
/etc/rc?.d
Существует отдельный каталог rc?.d для каждого
допустимого состояния системы: rc0.d (состояние
выключения), rc1.d (однопользовательское
состояние), rc2.d (многопользовательское
состояние), rc3.d (многопользовательское
состояние плюс сетевое состояние), rc4.d
(состояние, определяемое пользователем), rc5.d
(многопользовательский режим, сеть, плюс
состояние входа в систему с графическим
интерфейсом) и rc6.d (состояние перезагрузки).
Эти каталоги поддерживаются для совместимости
со старыми службами инициализации UNIX
SystemV.
/etc/sysconfig
Содержит важные файлы конфигурации системы,
которые создаются и поддерживаются различными
службами (включая firewalld, samba и большинство
сетевых служб). Эти файлы имеют решающее
значение для дистрибутивов Linux, таких как Fedora
и RHEL, которые используют инструменты
администрирования с графическим интерфейсом,
но вообще не используются в других системах
Linux.
/etc/systemd
Содержит файлы, связанные со средством
systemd, для управления процессом загрузки и
системными службами. В частности, когда вы
запускаете команды systemctl для включения и
отключения служб, файлы, которые это делают,
сохраняются в подкаталогах системного каталога
/etc/systemd.
Пользователи.
Чтобы создать учетную запись пользователя, просто вызовите useradd в
командной строке, указав сведения о новой учетной записи в качестве
параметров.
# useradd -c "Greg Johnson" greg
Затем установите начальный пароль для greg с помощью команды
passwd. Вам будет предложено ввести пароль дважды:
# passwd greg
Changing password for user greg.
New password: **********
Retype new password: **********
При создании учетной записи для greg команда useradd выполняет
несколько действий:
● Читает файлы /etc/login.defs и /etc/default/useradd, чтобы
получить значения по умолчанию для использования при создании
учетных записей.
● Проверяет параметры командной строки, чтобы выяснить, какие
значения по умолчанию следует переопределить.
● Создает новую запись пользователя в файлах /etc/passwd и
/etc/shadow на основе значения по умолчанию и параметры
командной строки.
● Создает все новые записи групп в файле /etc/group. (Fedora
создает группу, используя имя нового пользователя.)
● Создает домашний каталог на основе имени пользователя в
каталоге /home.
● Копирует все файлы, расположенные в каталоге /etc/skel, в новый
домашний каталог.
Дополнительные команды для работы с пользователями: usermod –
изменить параметры учетной записи, userdel – удалить учетную запись
пользователя ( опция –r также удаляет домашний каталог пользователя).
Тема 8. Администрирование ОС
Windows.
В этой лекции Вы узнаете, где хранятся параметры ОС
Windows и как их можно настроить.
Вы также узнаете, как работать с оболочкой Windows CMD и
PowerShell.
Сервер Windows.
Большинство задач в клиентской и серверной версиях Windows можно
выполнять одинаково.
Мы поговорим о версии сервера и его администрировании.
Windows Server — это серверная операционная система, разработанная
Microsoft как часть семейства операционных систем Windows NT.
Эволюция Windows Server показана в Таблице 1.
Таблица 1. Эволюция Windows Server
Сервер для
массовой
эпохи
1996 - 2000
● Windows
NT Server
3.5
● Windows
NT Server
4.0
Windows NT
Workstation
Эпоха
предпринимательс
тва 2000 - 2008
Эпоха
центров
обработки
данных
2009 - 2013
Облако для
массовой
эпохи
2016 - по
настоящее
время
● Windows 2000
Server
● Windows Server
2003
● Windows
Server
2008
● Windows
Server
2012
● Windows
Server
2016
● Windows
Server
2019
Windows 7
Windows 8
Windows 10
Windows 11
Windows Server 2019 — это последняя версия серверной операционной
системы от Microsoft, входящая в семейство операционных систем
Windows NT. Объявленная в марте 2018 года, версия была выпущена для
общего доступа в октябре 2018 года. Как и Windows Server 2016, Windows
Server 2019 также основан на коде Windows 10.
Релизы, доступные в Windows Server 2019:
● Windows Server 2019 Datacenter — наиболее полная версия,
предназначенная для предприятий, которые владеют центрами
обработки данных с высокой степенью виртуализации или
выступают в качестве поставщиков облачных услуг.
● Windows Server 2019 Standard — это полнофункциональная
версия, предназначенная для компаний среднего размера,
владеющих локальными серверами.
● Windows Server 2019 Essentials предназначен для малых
предприятий, владеющих одним сервером в своей
IT-инфраструктуре.
● Microsoft Hyper-V Server 2019 разработан как бесплатный продукт,
обеспечивающий виртуализацию корпоративного класса для
центров обработки данных и гибридных облаков.
Windows Server 2019 предлагает три варианта установки. Однако
выбранный вариант установки влияет на доступность ролей и функций,
поэтому перед выбором нужного варианта установки следует
рассмотреть варианты:
● Возможности рабочего стола: Это вариант установки, который
содержит все компоненты Windows Server 2019, поэтому выбор
«Возможности рабочего стола» означает, что вы установили все
компоненты Windows Server 2019. Однако для использования
полнофункционального Графического Пользовательского
Интерфейса (GUI) ваше оборудование должно превышать
минимальные требования.
● Server Core: Этот вариант установки рекомендуется Microsoft из-за
минимального потребления аппаратных ресурсов и более высокой
безопасности. Роли и функции можно установить локально с
помощью Windows PowerShell или удаленно с помощью диспетчера
серверов.
● Nano Server: Это замена Server Core, которая требует гораздо
меньше аппаратных ресурсов, имеет меньше обновлений и
поддерживает только 64-разрядные приложения. Он
администрируется удаленно, поскольку не имеет возможности
локального входа в систему. Проще говоря, этот вариант установки
лучше всего понимается как поставил и забыл.
Основные обязанности администратора Windows
Server.
Ранее мы видели основные обязанности системного администратора,
говоря об ОС Linux. С этой точки зрения задачи администратора в ОС
Windows ничем не отличаются.
Давайте рассмотрим некоторые из них:
● Добавление аппаратного обеспечения.
● Установка и обновление ПО.
● Мониторинг.
● Автоматизация задач.
● Конфигурация настроек.
Обычно раздел устройств в настройках Windows используется для
управления устройствами, а Диспетчер устройств — для управления
драйверами устройств.
Вы можете установить, обновить, откатить, отключить или удалить
драйвер устройства. В основном все, что вам нужно сделать, это просто
подключить устройство к компьютеру, и тогда это устройство сразу же
распознается ОС Windows. Как только устройство идентифицируется ОС
Windows, оно использует свое хранилище драйверов для установки
драйвера устройства.
Установка нового приложения в Windows проста — вам нужно дважды
щелкнуть приложение установки и следовать мастеру или найти
приложение в Магазине Windows и нажать «Загрузить» или «Купить».
Для корректного удаления приложения Windows перейдите в
«Настройки» — «Установка и удаление программ».
Windows содержит множество инструментов для мониторинга и
устранения неполадок: монитор производительности, монитор
ресурсов, диспетчер задач, средство просмотра событий.
Доступ к командной строке и автоматизация задач могут быть выполнены
через командную строку (cmd.exe) или PowerShell.
Реестр Windows.
Многие настройки системы и приложений Windows хранятся в реестре
Windows — базе данных информации, настроек, параметров и других
значений для установленного программного и аппаратного обеспечения.
Верхний уровень реестра содержит кусты, каждый из которых
начинается с любопытного слова HKEY.
Таблица 2. Кусты реестра
Имя
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Аббревиатура
Содержание
HKCR
Информация,
используемая
программами для
ассоциации
файлов и обмена
информацией.
HKCU
Настройки и
конфигурация для
текущего
пользователя.
HKLM
Настройки и
конфигурация для
всех
пользователей.
HKU
Настройки и
конфигурация для
всех
пользователей на
компьютере;
информация в
HKCU копируется
из этого куста,
когда
пользователь
входит в систему.
HKEY_CURRENT_CONFIG
N/A
Аппаратная
информация о
ресурсах и
конфигурации ПК.
Под кустами находятся папки или ключи. У ключей также могут быть
подключи, так же как у папок есть подпапки.
Ключи содержат значения. Каждое значение имеет имя и данные. В
отличие от старых ini-файлов, данные могут быть чем-то другим, кроме
текста, включая числовые значения и двоичную информацию. Вы можете
найти несколько значений в одном ключе, ключ может быть пустым или
содержать только подразделы.
Как и в случае с файлами и папками, значения, хранящиеся в реестре,
можно найти по имени пути, которое указывает расположение
определенного ключа или значения.
Для редактирования реестра существует специальное приложение –
Registry Editor.
Рисунок 1. Редактор реестра
Командная оболочка Windows.
Исторически сложилось так, что термин «оболочка» описывает часть
программного обеспечения, которое позволяет вам получить доступ к
функциям, предоставляемым операционной системой. Другими словами,
оболочка — это интерпретатор командной строки. Эти два термина
могут использоваться по большей части взаимозаменяемо.
Командная строка или CMD (cmd.exe) — это интерпретатор командной
строки, в котором пользователь взаимодействует с командной строкой
через ее интерфейс. Его можно использовать для взаимодействия с
операционной системой Windows с помощью различных встроенных
команд. Это не кроссплатформенное приложение, так как оно родное для
Windows, в отличие от PowerShell, который работает во многих других
операционных системах.
Многие из основных функций в командной строке можно легко выполнять
с помощью основных операций мыши и меню, поэтому большинству
конечных пользователей никогда не понадобится использовать CMD. Тем
не менее, даже в эпоху компьютерных операций, в которых доминирует
мышь, есть множество полезных вещей, которые вы можете выполнить
только через командную строку в Windows.
Иногда вам нужно сообщить Windows, что у вас достаточно прав для
доступа к определенным каталогам и файлам. Сюда входят папки других
пользователей и конфиденциальные файлы в таких папках, как
System32, которые могут вызвать проблемы при несанкционированном
доступе. Кроме того, если вы собираетесь запускать пакетные сценарии
или использовать расширенные команды, вам потребуются повышенные
разрешения.
Самый простой способ запустить командную строку от имени
администратора — найти ее в меню «Пуск», затем щелкнуть ее правой
кнопкой мыши и выбрать в раскрывающемся меню пункт «Запуск от
имени администратора».
Чтобы найти аккуратный список всех основных команд в CMD, все, что
вам нужно сделать, это ввести справку и нажать клавишу ввода.
Существует другая команда документации, которая предоставляет более
подробную информацию для каждой команды.
Чтобы увидеть руководство для конкретной команды, вы можете набрать
help COMMAND или COMMAND /? оба из которых будут показывать ту
же информацию.
Чтобы очистить cmd от всего текста, вам нужно ввести cls, что означает
«Очистить экран». Это чрезвычайно полезно, когда ваша подсказка
начинает загромождать.
Вы можете вставить любой текст из буфера обмена, просто щелкнув
правой кнопкой мыши в любом месте окна командной строки.
Чтобы скопировать все, что выводит ваша команда, вы можете просто
добавить | скопировать после команды. Это скопирует все результаты в
буфер обмена.
Приятно отметить, что все команды в cmd НЕ чувствительны к
регистру, поэтому Вы можете писать как прописными, так и строчными
буквами. Например, help и HELP — это одна и та же команда, и они
прекрасно работают. Некоторые предпочитают писать все в нижнем
регистре, так как это быстрее.
Навигация по дереву файловой системы.
Изменить каталог (cd)
При запуске командной строки от имени администратора вы начинаете с
папки
C:\WINDOWS\system32.
Чтобы подняться на один уровень в иерархии папок, вам нужно набрать
cd .. поэтому, если вы выполните эту команду дважды, вы окажетесь в
корне вашего диска C:\. Кроме того, чтобы перейти непосредственно к
корневому уровню, в данном случае к базе диска C, вы можете просто
ввести cd / с пробелом или без него.
Если вы хотите изменить диск, на котором вы работаете, все, что вам
нужно сделать, это ввести букву диска, а затем двоеточие.
Например, если вы хотите перейти с C:\WINDOWS\system32 на X:\,
просто введите X: и готово.
Если вы хотите перейти к определенной папке в текущем каталоге, вы
можете ввести в cd DIRECTORYNAME, которая является одной из
наиболее часто используемых команд. Вы также можете нажать TAB во
время написания имени папки, чтобы оно заполнилось автоматически.
Чтобы перейти к определенному пути на текущем диске, вы можете
ввести весь путь после cd , чтобы перейти туда. Например, если вы
находитесь в C:, вы можете ввести cd Windows/System32, чтобы
перейти непосредственно к папке System32.
Если вы хотите перейти к другой иерархии на том же диске, вам нужно
начать с буквы диска. Например, вы можете ввести cd
C:/Users/TechTipVault, чтобы перейти непосредственно в эту папку, где
бы вы ни находились.
Наконец, стоит отметить, что рекомендуется заключать имена папок в
кавычки, если они содержат пробелы.
Список файлов и каталогов (dir)
Чтобы увидеть основную информацию о каждом файле и папке в
текущем каталоге, введите dir в командной строке.
Команда dir содержит множество параметров, управляющих просмотром
файлов и папок в зависимости от их видимости, метода сортировки
вывода, дополнительных опций.
Таблица 3. Параметры команды dir
Параметр
/A: ATTRIBUTE or /A:
-ATTRIBUTE
Пример
Объяснение
dir /A:D
Показать все папки
dir /A:R
Показать файлы
только для чтения
dir /A:H
Показать скрытые
файлы
dir /A: -D
НЕ показывать
папки
dir /A: -D-H
НЕ показывать
папки или скрытые
файлы
dir /O:N
Сортировать по
имени файла
dir /O:S
Сортировать по
размеру файла
dir /O:D
Сортировать по
дате и времени
dir /O:E
Сортировать по
расширению файла
dir /O: -D-N
Сортировка по дате
и убыванию имени
файла
dir /T:C
Сортировка или
просмотр по
времени создания
dir /T:A
Сортировка или
просмотр по
времени
последнего доступа
dir /T:W
Сортировка или
просмотр по
времени
последнего
написания
/S
dir /S
Включить все
подпапки
/B
dir /B
Чистый формат
(без заголовка,
/O: SORTINGORDER or /O:
-SORTINGORDER
/T: TIMEMODE
размера или
сводки)
/L
dir /L
Использовать
строчные буквы
/Q
dir /Q
Показать
владельца файла
dir /N
Длинный формат с
именами файлов
справа
dir /X
Длинный формат с
короткими именами
файлов
dir /C
Включить/скрыть
разделитель тысяч
в размере файла
/N
/X
/C or / -C
Запустить приложение
Чтобы запустить приложение, перейдите в нужную папку и введите имя
исполняемого файла.
Вы также можете запустить приложение через полный путь к файлу.
Например, чтобы запустить MS Paint, вы можете ввести
C:/Windows/System32/mspaint.exe, и программа запустится мгновенно.
Создать каталог (md)
Эта команда позволит вам создать новую папку или каталог. Команда md
является псевдонимом более длинной версии mkdir, обе из которых
делают одно и то же.
Чтобы создать новую папку в текущем рабочем каталоге, введите md
FOLDERNAME.
Вы также можете создать несколько вложенных папок, просто добавив их
с косой чертой. Например, если вы хотите одновременно создать папки и
подпапки, введите md TechTipVault/SubFolderName/EvenDeeperFolder,
и теперь у вас есть трехуровневая иерархия папок.
Если вы хотите создать несколько папок в одном каталоге, вам нужно
разделить имена папок пробелом. Например, чтобы создать 3 папки в
активном каталоге, введите md Folder1 Folder2 Folder3.
Переименовать файлы и папки (ren)
Простое переименование файла можно выполнить, набрав ren file1.txt
file2.txt. Вы также можете использовать этот же синтаксис для
переименования папки.
Копировать файлы (копировать)
Простая и легкая базовая функциональность этой команды
copy filename.ext newfilename.ext который скопирует файл с новым
именем в активный каталог.
Копировать файлы и папки (xcopy)
Основной синтаксис для копирования файлов с помощью xcopy такой
же, как и для обычной команды копирования, но xcopy предоставляет
больше параметров и переключателей, показанных в Таблице 4.
Таблица 4. Параметры команды xcopy
Параметр
(usage:
xcopy source target
parameter)
Объяснение
/S
Копировать папки и подпапки (включая
файлы внутри них) (исключая пустые
папки)
/E
Копировать папки и подпапки (включая
файлы внутри них) (включая пустые
папки)
/I
Предполагать, что целью является папка
(тип)
/Y
Подавить запрос на перезапись файлов.
(Перезаписывает дубликаты без
предупреждений)
Скопируйте всю структуру папок, но
игнорируйте любые файлы.
/T
(Комбинация /T /E также будет
включать пустые папки и подпапки)
/K
Скопируйте атрибуты (в противном
случае такие атрибуты, как атрибуты
только для чтения, будут сброшены)
Удалить файлы (del)
Команда delete может использоваться для удаления файлов. Однако с
его помощью нельзя удалить папки. Таким образом, если вы используете
его в папке, все файлы в папке будут удалены, но сама папка останется
нетронутой.
Изменить атрибуты файла (attrib)
Команда attribute — довольно простое, но полезное дело. Она позволяет
отображать атрибуты файлов или изменять их по своему вкусу. Атрибуты
означают такие функции, как доступ только для чтения или скрытые
файлы.
С помощью этой команды вы можете добавить и отключить атрибут с
символом. Два основных атрибута, которые вы будете использовать, это
R для «Только для чтения» и H для «Скрытый». Параметр «Скрытый»
работает и для папок, а атрибут «Только для чтения» применим только к
файлам. Есть также атрибуты A для архива и S для системы, но они
редко используются.
Вы также можете использовать модификатор /S, чтобы применить
атрибуты ко всем файлам в подпапках, а также /D, чтобы применить
изменения и к выбранным папкам. Как и в большинстве команд
редактирования файлов, вы также можете использовать подстановочные
знаки с командой attrib, чтобы легко изменить группу файлов, а не только
один.
Основной синтаксис для того, чтобы сделать файл скрытым и удалить
его свойство только для чтения, можно выполнить следующим образом:
attrib +h -r SuperSecretPasswords.txt
Последовательность команд, которые должны выполняться одна за
другой, может быть помещена в текстовый файл с расширением .bat или
.cmd и называется «сценарий командной оболочки».
PowerShell.
В начале 2000-х Microsoft заказала исследование, чтобы определить
области, в которых она могла бы улучшить свои предложения в области
серверов. Когда исследовательская группа сравнила управляемость
системы Windows с помощью командной строки с системой UNIX,
Windows оказалась ограниченной.
PowerShell — это новая среда командной строки/оболочки от Microsoft,
впервые выпущенная в 2006 году. Она установлена и активна в каждой
Windows, начиная с Windows 7 или Windows Server 2008 R2.
Рисунок 2. Окно консоли PowerShell.
Исходная грамматика PowerShell была основана на грамматике для
стандартной оболочки POSIX, определенной в спецификации IEEE
1003.2. Начав с оболочки POSIX, Microsoft получила четко определенную
и стабильную основу. И затем команда PowerShell захотела иметь
оболочку, оптимизированную для среды Windows, таким же образом, как
оболочки UNIX оптимизированы для этой среды UNIX.
Для PowerShell ключевым решением было использование объектной
модели .NET. NET — это унифицированное представление объектов,
которое используется во всех группах Microsoft. Благодаря этой общей
модели данных все компоненты Windows могут совместно использовать и
понимать данные друг друга.
Команды PowerShell, называемые cmdlets, используют пары
глагол-существительное, такие как Get-Date. Глагол Get-* повсеместно
используется в системе для доступа к объектам. Вы можете получить всю
информацию о свойствах членов объекта с помощью cmdlet Get-Member,
который расскажет вам все о свойствах объекта.
PowerShell состоит из двух основных частей:
● Механизм PowerShell, который интерпретирует команды
● Хост-приложение, которое передает команды от пользователя к
движку.
Чтобы начать интерактивный сеанс PowerShell с помощью хоста консоли,
выберите «Пуск» > «Все программы» > «Стандартные» > Windows
PowerShell > Windows PowerShell. PowerShell запустится, и вы увидите
экран, подобный показанному на Рисунке 2.
Редактирование командной строки в окне консоли PowerShell работает
так же, как и в cmd.exe. Доступные функции редактирования и сочетания
клавиш перечислены в Таблице 5.
Табл. 5. Функции редактирования команд
Последовательность
клавиш
Редактирование
Left/right arrows
Перемещает курсор редактирования влево и
вправо по текущей командной строке.
Ctrl-left arrow, Ctrt-right arrow
Удерживая нажатой клавишу Ctrl, одновременно
нажимая клавиши со стрелками влево и вправо,
курсор редактирования перемещается по текущей
командной строке по одному слову за раз, а не по
одному символу за раз.
Home
Перемещает курсор редактирования в начало
текущей командной строки.
End
Перемещает курсор редактирования в конец
текущей командной строки.
Up/down arrow
Перемещение вверх и вниз по истории команд.
Insert key
Переключение между режимами вставки символов
и перезаписывания символов.
Delete key
Удаляет символ под курсором.
Backspace key
Удаляет символ слева от курсора.
Рисунок 3. PowerShell ISE
Интегрированная среда сценариев PowerShell.
Самая верхняя панель в ISE — это редактор сценариев, который
понимает язык PowerShell. Этот редактор будет подсвечивать синтаксис
при вводе текста сценария.
ISE — это мощный способ организовать вашу работу и легко выполнять
многозадачность между различными действиями с возможностью
одновременного открытия нескольких файлов или сеансов на отдельных
вкладках.
Одной из наиболее полезных функций редактирования в PowerShell
является завершение команд, также называемое завершением
вкладок. Хотя в cmd.exe есть автодополнение с помощью табуляции,
реализация PowerShell значительно мощнее. По умолчанию PowerShell
выполняет завершение с помощью табуляции для файловой системы,
поэтому, если вы введете частичное имя файла, а затем нажмете Tab,
система сопоставит то, что вы набрали, с файлами в текущем каталоге и
вернет первое совпадающее имя файла.
Но PowerShell также выполняет автозавершение имен параметров. Если
вы введете команду, за которой следует частичное имя параметра, и
нажмете клавишу Tab, система переберет все возможные параметры для
этой команды.
Команды PowerShell для работы с файловой системой довольно знакомы
большинству пользователей. Вы перемещаетесь по файловой системе с
помощью команды cd. Файлы копируются с помощью команд copy или
cp, перемещаются с помощью команд move и mv и удаляются с
помощью команд del или rm.
Один набор имен знаком пользователям cmd.exe/DOS, а другой —
пользователям UNIX. На практике это псевдонимы одной и той же
команды, созданные для того, чтобы людям было проще начать работу с
PowerShell. Но хотя команды похожи, они не совсем такие же, как в
любой из двух других систем. Вы можете использовать команду Get-Help,
чтобы получить справку по этим командам.
Тема 9. Обзор языков
программирования, IDE в ОС
Windows, Linux, macOS.
В этой лекции Вы познакомитесь с языками программирования
и IDE, используемыми для создания программ популярных
операционных систем.
Вы также узнаете, как подготовить среду Linux и
скомпилировать простое приложение на языке С.
Обзор языков программирования.
Языки программирования позволяют нам давать команды компьютеру на
языке, который он в состоянии понять. Так же, как существует множество
языков для человеческого общения, существует масса языков
программирования, которые можно использовать для связи с
компьютером.
Часть языка, которую может понять компьютер,
называется «двоичной».
Перевод языка программирования в двоичный код известен как
«компиляция». Каждый язык, от языка C до Python, имеет свои
особенности, хотя во многих случаях между языками программирования
есть общие черты.
Сегодня в IT-индустрии используются десятки языков программирования:
● некоторые из них являются низкоуровневыми и используются для
написания ядра или низкоуровневых ОС,
● другие являются высокоуровневыми и используются для
программирования в пользовательском пространстве.
Многие языки могут использоваться в любой операционной системе
(например, C), но некоторые языки специфичны и подходят лишь для
одной операционной системы.
Языки программирования могут быть:
● интерпретируемыми; их код не переводится сразу в машинный, и
для запуска используется специальное приложение-интерпретатор,
● компилируемыми; для их запуска не требуются дополнительные
интерпретаторы.
Функциональные языки очень близки к чистой математике. В
функциональных языках часто легко решать сложные задачи, но труднее
делать простые вещи. Например: поиск пути можно выполнить с
помощью 10 строк кода на функциональном языке, даже если для
объектно-ориентированного требуется около 1000 строк кода.
Функциональные языки трудно выучить и понять, но они могут быть
невероятно мощными.
Объектно-ориентированный означает, что язык работает с объектами,
такими как, например, Player (у которого есть health и mana), Monster,
World и так далее. Объектно-ориентированные языки обычно имеют дело
с объектами все время, например, при добавлении Player в World. Эти
языки просты в изучении и понимании.
Ниже приведен обзор некоторых наиболее актуальных и востребованных
языков программирования.
C.
Язык С (си) — это структурно-ориентированный язык программирования
среднего уровня, который в основном используется для разработки
низкоуровневых приложений.
Язык C был разработан в 1972 году в Bell Labs специально для
реализации системы UNIX. В конечном итоге он породил множество
передовых языков программирования, включая C++, Java, C#, Obj C,
JavaScript и Pearl.
Характеристики C:
● Простой в освоении; нужно освоить всего 32 ключевых слова.
● Легко писать системные программы, такие как компиляторы и
интерпретаторы.
● Базовый язык для начинающих.
C++.
C++ — это объектно-ориентированный язык программирования общего
назначения среднего уровня, который является расширением языка C,
позволяющим программировать в «стиле C». В некоторых ситуациях
кодирование можно выполнять в любом формате, что делает C++
примером гибридного языка.
Выпущенный в 1983 году и часто считающийся
объектно-ориентированной версией языка C, C++ был создан для
компиляции компактного и эффективного кода, обеспечивая при этом
высокоуровневые абстракции для лучшего управления крупными
проектами разработки.
Характеристики C++:
● Зачастую является первым языком программирования, которому
обучают на уровне колледжа.
● Обладает механизмом быстрой обработки и компиляции.
● Имеет надежную стандартную библиотеку (STL).
C#.
Произносится как C-sharp (не C-hashtag), C# — это язык
программирования с несколькими парадигмами, который включает
строгую типизацию, императивную, декларативную, функциональную,
универсальную, объектно-ориентированную и
компонентно-ориентированную дисциплины.
C# был разработан в 2000 году как часть выпуска Microsoft .NET
framework; в 2003 году он стал стандартом ISO. C# был основан на
языках C, C++ и Java.
Характеристики C#:
● По функциональным возможностям похож на Java.
● Идеально подходит для начинающих.
● То, что нужно для работы с приложениями Microsoft.
Objective-C.
Objective-C — это простой объектно-ориентированный язык общего
назначения. Он использует систему передачи сообщений,
заимствованную из языка Smalltalk; когда объекту в Objective-C
отправляется сообщение, он может игнорировать или пересылать его
другому объекту, а не возвращать значение.
Objective-C был разработан в Apple в 1983 году для устранения
недостатков (в частности, отсутствия объектной ориентации) языка C. Он
был лицензирован NeXT в 1988 году.
Objective-C в основном используется разработчиками для создания
приложений для Apple iOS и macOS.
Характеристики Objective-C:
● Повышенная гибкость с динамической типизацией.
● Часто используется вместе с такими фреймворками, как Cocoa или
Cocoa Touch.
● Отличный первый язык для начинающих программистов.
Swift.
Swift — новейший мультипарадигмальный язык программирования Apple
с открытым исходным кодом для приложений iOS и OS X. Swift
объединяет именованные параметры и объектно-ориентированную
модель Objective-C, а также расширенный компилятор, отладчик и
инфраструктуру фреймворка.
Swift, основанный на языке программирования Objective-C, был
представлен на Всемирной конференции разработчиков Apple в 2014
году (WWDC).
Характеристики Swift:
● Поддерживает «игровые площадки», функцию, которая позволяет
программистам экспериментировать и сразу видеть результаты.
● Имеет простой для понимания синтаксис.
● Идеально подходит для написания production-ready code (кода,
готового к внедрению).
Java.
Java — это объектно-ориентированный язык программирования высокого
уровня общего назначения с несколькими функциями, которые делают
его идеальным для веб-разработки.
Первоначально известная как Oak, Java была разработана в 1990 году в
Sun Microsystems для расширения возможностей языка C++. Java был
разработан по принципу WORA (Write Once Run Anywhere). Язык был
представлен публике в 1995 году и в настоящее время принадлежит
Oracle.
Характеристики Java:
● Переносимость приложений.
● Надежный и интерпретируемый язык.
● Имеет обширную сетевую библиотеку.
Python.
Python — это продвинутый язык программирования, интерпретируемый,
объектно-ориентированный и построенный на гибкой и надежной
семантике.
Python был разработан в конце 1980-х годов в CWI в Нидерландах и
впервые выпущен для широкой публики в 1991 году.
Характеристики Python:
● Простой в освоении и легко читаемый язык.
● Имеет связанные веб-фреймворки (готовые программные
компоненты) для разработки веб-приложений.
● Бесплатный интерпретатор и стандартная библиотека доступны в
виде исходного кода или двоичного кода на основных платформах.
JavaScript.
JavaScript — это клиентский язык программирования, который
запускается внутри клиентского браузера и обрабатывает команды на
компьютере, а не на сервере. Обычно он помещается в файл HTML или
ASP. Несмотря на свое название, JavaScript не имеет отношения к Java.
JavaScript был разработан Netscape и первоначально назывался
LiveScript, а затем стал JavaScript в 1995 году.
Характеристики JavaScript:
● Основные функции просты в освоении.
● Имеет несколько фреймворков.
● Пользователи могут обращаться к JQuery, всеобъемлющей
библиотеке Javascript и многим другим.
● Надежный и интерпретируемый язык.
Интегрированная среда разработки.
Интегрированная среда разработки (англ. Integrated development
environment — IDE) — это комплекс программных инструментов для
разработки программного обеспечения.
Рассмотрим некоторые IDE, используемыми для создания программ
популярных операционных систем.
Microsoft Visual Studio.
Microsoft Visual Studio — это IDE от Microsoft. Он используется для
разработки компьютерных программ, а также веб-сайтов,
веб-приложений, веб-сервисов и мобильных приложений.
Visual Studio использует платформы разработки программного
обеспечения Microsoft, такие как Windows API, Windows Forms, Windows
Presentation Foundation, Windows Store и Microsoft Silverlight.
Visual Studio включает редактор кода, поддерживающий IntelliSense
(компонент завершения кода), а также рефакторинг кода.
Встроенный отладчик работает как отладчик уровня исходного кода, так и
отладчик уровня компьютера.
Другие встроенные инструменты включают профилировщик кода,
конструктор для создания приложений с графическим интерфейсом,
веб-дизайнер, конструктор классов и конструктор схемы базы данных. Он
принимает плагины, которые расширяют функциональность практически
на всех уровнях, включая добавление поддержки систем управления
версиями (таких как Subversion и Git) и добавление новых наборов
инструментов, таких как редакторы и визуальные дизайнеры для языков,
специфичных для домена, или наборов инструментов для других
аспектов жизненного цикла разработки программного обеспечения.
Рисунок 2. Интерфейс MS Visual Studio Code IDE
Visual Studio поддерживает 36 различных языков программирования и
позволяет редактору кода и отладчику поддерживать (в разной степени)
почти любой язык программирования, при условии, что существует
служба для конкретного языка.
Apple Xcode.
Apple Xcode — это приложение, которое разработчики macOS
используют для создания приложений, подходящих для различных
платформ Apple, таких как iPhone, iPad или Apple TV и Watch. Впервые он
был запущен в 2003 году.
Xcode также включает множество дополнительных инструментов,
необходимых для разработки приложений. Это один из самых
популярных инструментов для создания приложений и лучший выбор
разработчиков для написания кода и создания приложений, которые
можно использовать на различных устройствах и операционных
системах.
Xcode IDE — это неотъемлемый элемент, выступающий в качестве ядра
для всех других компонентов, доступных в пакете Xcode. Он показывает
файлы, над которыми ведется работа, а также окна для других
инструментов.
Интерфейс подобен другим средам, где код вводится в файл в главном
окне. IDE также расширяет поддержку и обеспечивает легкость
понимания кода, набираемого пользователями, а количество ошибок
сводится к минимуму.
Рисунок 3. Интерфейс Apple Xcode IDE
Разработчики получают рекомендации относительно того, что они могут
захотеть ввести в location. Также выделяются проблемы, когда
какой-либо из ожидаемых символов отсутствует или имена функций
введены неправильно. В большинстве случаев предлагаются средства
для устранения этих проблем.
Разработчики также могут открывать несколько вкладок и переключаться
между ними. Интерфейс обновляется в соответствии с обрабатываемым
файлом. Также доступно боковое представление каталога, которое
позволяет переходить от одного файла к другому и перечислять все
файлы и папки, используемые для любого конкретного проекта.
На этом список преимуществ не заканчивается. В процессе разработки
кода у пользователей есть возможность запускать несколько
экспериментов с кодом. Есть несколько готовых к использованию
проектов, которые полезны для обучения пользователей.
У разработчиков есть множество вариантов языков программирования,
когда дело доходит до написания кода в Xcode. Список языков
программирования, поддерживаемых Xcode, варьируется от Swift,
AppleScript, C, C++, Objective C, Python и т. д. Среди всех этих языков
Apple настоятельно рекомендует язык Swift для разработки на всей своей
платформе.
JetBrains CLion.
CLion (произносится как «морской лев») — это интегрированная среда
разработки C и C++ для Linux, macOS и Windows, интегрированная с
системой сборки CMake. Первоначальная версия поддерживает
компиляторы GNU Compiler Collection (GCC) и Clang, а также отладчик
GDB, LLDB и Google Test. Помимо C и C++, CLion напрямую или через
плагины поддерживает и другие языки: Kotlin, Python, Rust, Swift и другие.
IntelliJ IDEA.
IntelliJ IDEA — первая интегрированная среда разработки JetBrains. Она
в первую очередь предназначена для технологий на основе JVM, таких
как Java, Groovy, Kotlin и Scala, но также поддерживает Java EE и
веб-разработку. Версия с открытым исходным кодом доступна под
названием IntelliJ IDEA Community Edition, а проприетарная версия — как
IntelliJ IDEA Ultimate Edition. IntelliJ IDEA Ultimate Edition может включать
набор функций PhpStorm, PyCharm и RubyMine через плагины.
Рисунок 4. Интерфейс CLion IDE
Создание приложений в Linux.
Рассмотрим процесс создания приложения в ОС Linux. Обратите
внимание, что текст ниже применим только к языку C, который является
компилируемым языком, в отличие от интерпретируемых языков (Perl,
Python, Shell).
Прежде всего, нам нужно убедиться, что в нашей системе Linux
установлены все необходимые инструменты. Нам понадобится:
- компилятор, а именно gcc, пакет binutils,
- текстовый редактор или IDE.
В зависимости от используемого дистрибутива Linux и параметров
установки у нас уже могут быть установлены необходимые инструменты.
Процесс компиляции начинается с исходного кода, который мы
написали, и если все пойдет хорошо, результатом будет исполняемый
двоичный код или библиотека. Рабочий процесс показан на Рисунке 5.
Рисунок 5. Рабочий процесс компиляции
Препроцессор (cpp) берет исходный код, ищет команды препроцессора
(в C они начинаются с hash) и, если все выглядит правильно, результатом
является вывод, понятный компилятору.
Компилятор (gcc) выполняет всю тяжелую работу, включая оптимизацию
кода для базового оборудования. В результате получается
ассемблерный код, тесно связанный с машиной, из которой будут
генерироваться двоичные файлы.
В конце концов, в зависимости от опций и кода, ld свяжет исполняемый
файл со всеми необходимыми библиотеками с конечным результатом:
бинарной программой.
Если вы хотите увидеть все полученные промежуточные файлы,
используйте флаг gcc -save-temps.
Давайте воспользуемся программой «Hello, world», чтобы
проиллюстрировать самую базовую структуру программы и основные
шаги.
#include <stdio.h>
/* This is a comment */
int main()
{
printf("Hello, world!\n");
return 0;
}
Теперь используйте простую командную строку для компиляции и
выполнения программы «Hello World» на C:
$ gcc -o hello hello.c
$ ./hello
Hello, world!
Ну а чтобы сделать действительно сложное и полезное приложение,
советуем использовать некоторые из IDE, которые мы рассмотрели ранее
в этой лекции.
Тема 10. Процессы и потоки в ОС.
В этой лекции Вы познакомитесь с основными понятиями
типичной ОС — процессами и потоками.
Вы разберетесь с общим жизненным циклом и возможными
состояниями процесса.
Также Вы познакомитесь с методами межпроцессного
взаимодействия.
Процессы.
Самой центральной концепцией любой операционной системы является
процесс - абстракция работающей программы.
Процессы — одна из старейших и наиболее
важных абстракций, предоставляемых
операционными системами.
Они поддерживают возможность (псевдо)параллельной работы, даже
если доступен только один ЦП. Они превращают один ЦП в несколько
виртуальных ЦП. Без абстракции процессов современные вычисления не
могли бы существовать.
При загрузке системы тайно запускаются многие процессы, часто
неизвестные пользователю. Например, процесс может быть запущен для
ожидания входящей электронной почты. Другой процесс может
запускаться от имени антивирусной программы для периодической
проверки наличия новых определений вирусов. Кроме того, могут
выполняться явные пользовательские процессы, печатающие файлы и
резервные копии фотографий пользователя на USB-накопителе, и все
это в то время, когда пользователь просматривает веб-страницы. Всей
этой деятельностью необходимо управлять, и здесь очень кстати
оказывается мультипрограммная система, поддерживающая несколько
процессов.
В любой мультипрограммной системе ЦП быстро переключается с
процесса на процесс, выполняя каждый из них в течение десятков или
сотен миллисекунд. Если, строго говоря, в каждый момент времени ЦП
выполняет только один процесс, то в течение 1 секунды он может
работать над несколькими из них, создавая иллюзию параллелизма.
Иногда в этом контексте говорят о псевдопараллелизме, чтобы
противопоставить его истинному аппаратному параллелизму
многопроцессорных систем (в которых два или более ЦП совместно
используют одну и ту же физическую память).
Людям трудно отслеживать несколько параллельных действий. Поэтому
разработчики операционных систем на протяжении многих лет
разработали концептуальную модель (последовательные процессы),
которая упрощает работу с параллелизмом.
Модель процесса.
В этой модели все работающее программное обеспечение на
компьютере, иногда включая операционную систему, организовано в виде
ряда последовательных процессов или просто процессов для краткости.
Процесс — это всего лишь экземпляр
исполняемой программы, включая текущие значения
счетчика программ, регистров и переменных.
Концептуально каждый процесс имеет свой собственный
виртуальный ЦП.
В действительности, конечно, настоящий ЦП переключается с
процесса на процесс и обратно, но для понимания системы гораздо
проще представить набор процессов, выполняющихся
(псевдо)параллельно, чем пытаться отслеживать, как ЦП переключается
с программы на программу. Это быстрое переключение туда и обратно
называется мультипрограммированием.
На Рисунке 1 а) мы видим компьютер, мультипрограммирующий четыре
программы в памяти.
На Рисунке 1 б) мы видим четыре процесса, каждый со своим потоком
управления (т. е. собственным логическим счетчиком программ), и
каждый работает независимо от других. Конечно, существует только один
физический счетчик программ, поэтому при запуске каждого процесса его
логический счетчик программ загружается в реальный счетчик программ.
Когда он завершен (на данный момент), физический счетчик программ
сохраняется в сохраненном логическом счетчике программ процесса в
памяти.
На Рисунке 1 в) мы видим, что при рассмотрении достаточно длительного
интервала времени все процессы добились прогресса, но в любой
данный момент фактически работает только один процесс.
Когда ЦП переключается между процессами, скорость, с которой процесс
выполняет свои вычисления, будет неравномерной и, вероятно, даже
невоспроизводимой, если одни и те же процессы будут запущены снова.
Таким образом, процессы не должны быть запрограммированы со
встроенными предположениями о времени.
Рассмотрим, например, аудиопроцесс, который воспроизводит музыку
для сопровождения высококачественного видео, воспроизводимого
другим устройством. Поскольку звук должен начинаться немного позже
видео, он сигнализирует видеосерверу о начале воспроизведения, а
затем запускает цикл ожидания 10 000 раз перед воспроизведением
звука. Все идет хорошо, если цикл является надежным таймером, но
если ЦП решит переключиться на другой процесс во время цикла
простоя, аудиопроцесс может не запуститься снова до тех пор, пока
соответствующие видеокадры уже не появятся и не исчезнут, а видео и
аудио будет раздражающе рассинхронизировано.
Когда процесс предъявляет такие критические требования к реальному
времени, как этот, то есть определенные события должны произойти в
течение определенного количества миллисекунд, должны быть приняты
специальные меры, чтобы гарантировать, что они действительно
произойдут. Однако обычно на большинство процессов не влияет
лежащее в их основе мультипрограммирование ЦП или
относительные скорости различных процессов.
Процесс – это некая деятельность. У него есть программа, вход, выход
и состояние. Один процессор может совместно использоваться
несколькими процессами, при этом некоторый алгоритм планирования
используется для определения того, когда остановить работу над одним
процессом и обслуживать другой. Напротив, программа — это то, что
может храниться на диске, ничего не делая.
Стоит отметить, что если программа запущена дважды, она считается
двумя процессами. Например, часто можно дважды запустить
текстовый редактор или распечатать два файла одновременно, если
доступно два принтера. Тот факт, что два процесса запускают одну и ту
же программу, не имеет значения; это разные процессы.
Операционная система может делиться кодом между ними, поэтому в
памяти находится только одна копия, но это техническая деталь, которая
не меняет концептуальной ситуации двух запущенных процессов.
Создание процесса.
Операционные системы нуждаются в каком-то способе создания
процессов. В очень простых системах или в системах, предназначенных
для работы только с одним приложением (например, контроллером в
микроволновой печи), может оказаться возможным наличие всех
процессов, которые когда-либо понадобятся, при запуске системы.
Однако в системах общего назначения необходим какой-то способ для
создания и завершения процессов по мере необходимости во время
работы.
Четыре основных события вызывают создание процессов:
1. Инициализация системы.
2. Выполнение системного вызова создания процесса запущенным
процессом.
3. Запрос пользователя на создание нового процесса.
4. Запуск пакетного задания.
При загрузке операционной системы обычно создается множество
процессов.
Некоторые из них являются процессами переднего плана, то есть
процессами, которые взаимодействуют с пользователями (людьми) и
выполняют за них работу. Другие работают в фоновом режиме и не
связаны с конкретными пользователями, а выполняют определенные
функции. Процессы, которые остаются в фоновом режиме для обработки
некоторых действий, таких как электронная почта, веб-страницы,
новости, печать и т. д., называются демонами.
В дополнение к процессам, созданным во время загрузки, впоследствии
могут быть созданы новые процессы. Часто работающий процесс выдает
системные вызовы для создания одного или нескольких новых
процессов, помогающих ему выполнять свою работу.
Создание новых процессов особенно полезно, когда работу, которую
необходимо выполнить, можно легко сформулировать в терминах
нескольких связанных, но в остальном независимых взаимодействующих
процессов. Например, если большой объем данных извлекается по сети
для последующей обработки, может быть удобно создать один процесс
для извлечения данных и помещения их в общий буфер, в то время как
второй процесс удаляет элементы данных и обрабатывает их. В
многопроцессорной среде запуск каждого процесса на отдельном ЦП
также может ускорить выполнение задания.
Технически, новый процесс создается, когда существующий процесс
выполняет системный вызов создания процесса. Этим процессом
может быть работающий пользовательский процесс, системный процесс,
вызываемый с помощью клавиатуры или мыши, или процесс пакетного
менеджера. Этот процесс выполняет системный вызов для создания
нового процесса. Системный вызов приказывает операционной системе
создать новый процесс и прямо или косвенно указывает, какую
программу в нем запускать.
В UNIX (включая почти все системы на основе POSIX, такие как Linux,
FreeBSD, macOS, Solaris и т. д., а также в некоторой степени Android и
iOS) существует только один системный вызов для создания нового
процесса: fork.
Этот вызов создает точную копию вызывающего процесса. После
разветвления два процесса, родительский и дочерний, имеют один и
тот же образ памяти, одни и те же строки окружения и одни и те же
открытые файлы. Это все, что есть. Затем дочерний процесс обычно
выполняет execve или аналогичный системный вызов, чтобы изменить
свой образ памяти и запустить новую программу. Например, когда
пользователь вводит команду, скажем, sort, в оболочку, оболочка
отделяет дочерний процесс, и этот процесс выполняет sort. Причина
этого двухэтапного процесса состоит в том, чтобы позволить дочернему
процессу манипулировать своими файловыми дескрипторами после fork,
но перед выполнением execve, чтобы перенаправить стандартного
ввода, стандартного вывода и стандартной ошибки.
В Windows, напротив, один вызов функции Win32 CreateProcess
обрабатывает как создание процесса, так и загрузку правильной
программы в новый процесс. Этот вызов имеет 10 параметров, включая
программу, которую нужно выполнить, параметры командной строки для
передачи этой программе, различные атрибуты безопасности, биты,
управляющие наследованием открытых файлов, информацию о
приоритете, спецификацию окна, которое должно быть создано для
процесса (если таковой имеется), и указатель на структуру, в которой
информация о вновь созданном процессе возвращается вызывающему.
Помимо CreateProcess, в Win32 есть около 100 других функций для
управления и синхронизации процессов и связанных тем.
Как в системах UNIX, так и в Windows после создания процесса,
родительский и дочерний процессы имеют свои собственные
адресные пространства. Если какой-либо процесс изменяет слово в
своем адресном пространстве, это изменение не видно другому
процессу. В UNIX начальное адресное пространство дочернего объекта
является копией родительского, но определенно задействованы два
различных адресных пространства; доступная для записи память не
используется совместно.
Некоторые реализации UNIX совместно используют текст программы
между ними, поскольку его нельзя изменить. В качестве альтернативы
дочерний элемент может совместно использовать всю родительскую
память, но в этом случае память используется совместно с копированием
при записи. Это означает, что всякий раз, когда один из двух хочет
изменить часть памяти, этот фрагмент памяти явно копируется первым,
чтобы убедиться, что модификация происходит в частной области
памяти. Опять же, доступная для записи память не используется
совместно. Однако вновь созданный процесс может совместно
использовать некоторые другие ресурсы своего создателя, например,
открытые файлы.
В Windows родительское и дочернее адресные пространства отличаются
с самого начала.
Завершение процесса.
После того, как процесс был создан, он начинает выполнять свою работу.
Однако ничто не длится вечно, даже процессы. Рано или поздно новый
процесс завершится, как правило, из-за одной из 4-х причин. Причины
завершения процесса могут быть как произвольными, так и
принудительными.
К произвольным причинам завершения процесса относят случаи:
1. Процесс завершился, потому что выполнил свою работу - это
самый частый случай. Когда компилятор компилирует переданную
ему программу, он выполняет системный вызов, чтобы сообщить
операционной системе о завершении. Этот вызов является exit в
UNIX и ExitProcess в Windows.
2. Ошибка, вызванная процессом, часто из-за ошибки в
программе.
Примеры включают выполнение недопустимой команды,
обращение к несуществующей памяти или деление на ноль. В
некоторых системах (например, UNIX) процесс может сообщить
операционной системе, что он хочет сам обработать определенные
ошибки, и в этом случае процесс получает сигнал (прерывается), а
не завершается при возникновении одной из ошибок.
К принудительным случаям завершения процесса относят следующие:
1. Процесс обнаруживает фатальную ошибку.
Например, если пользователь вводит команду cc foo.c для
компиляции программы foo.c, а такого файла не существует,
компилятор просто объявляет об этом факте и завершает работу.
Интерактивные процессы, ориентированные на экран, обычно не
завершаются, если заданы неверные параметры. Вместо этого они
выводят диалоговое окно и просят пользователя повторить
попытку.
2. Процесс выполняет системный вызов, сообщающий
операционной системе о завершении другого процесса.
В UNIX этот вызов kill. Соответствующая функция Win32 —
TerminateProcess. В обоих случаях "убийца" должен иметь
необходимые полномочия "на действия убийцы". В некоторых
системах, когда процесс завершается добровольно или иным
образом, все созданные им процессы также немедленно
уничтожаются. Однако ни UNIX, ни Windows не работают таким
образом.
Иерархия процесса.
В некоторых системах, когда процесс создает другой процесс,
родительский и дочерний процессы продолжают быть определенным
образом связаны. Дочерний процесс может сам создавать другие
процессы, формируя иерархию процессов.
Обратите внимание, что у процесса есть только
один родитель (но ноль, один, два или более
потомков).
В UNIX процесс и все его дочерние и последующие потомки вместе
образуют группу процессов. Когда пользователь отправляет сигнал с
клавиатуры, сигнал доставляется всем членам группы процессов,
которые в данный момент связаны с клавиатурой (обычно это все
активные процессы, созданные в текущем окне). По отдельности каждый
процесс может перехватить сигнал, проигнорировать сигнал или
выполнить действие по умолчанию, которое должно быть уничтожено
сигналом.
В качестве еще одного примера того, где иерархия процессов играет
ключевую роль, давайте посмотрим, как UNIX инициализирует себя при
запуске сразу после загрузки компьютера. В загрузочном образе
присутствует специальный процесс, называемый init. Когда процесс
начинает работать, он читает файл, сообщающий, сколько терминалов
имеется. Затем он создает новый процесс для каждого терминала. Эти
процессы ждут, пока кто-нибудь войдет в систему. Если вход в систему
выполнен успешно, процесс входа в систему запускает оболочку для
приема команд. Эти команды могут запускать дополнительные процессы
и т. д. Таким образом, все процессы во всей системе принадлежат
одному дереву с init в корне.
Напротив, в Windows нет концепции иерархии процесса. Все
процессы равны. Единственный намек на иерархию процессов
заключается в том, что при создании процесса родителю дается
специальный токен (называемый дескриптором ), который он может
использовать для управления дочерним процессом. Однако этот токен
можно свободно передать какому-либо другому процессу, тем самым
сделав иерархию недействительной. Процессы в UNIX не могут лишить
наследования своих потомков.
Состояния процесса.
Хотя каждый процесс является независимым объектом со своим
счетчиком программ и внутренним состоянием, процессам часто
необходимо взаимодействовать с другими процессами. Один процесс
может генерировать некоторые выходные данные, которые другой
процесс использует в качестве входных данных. В команде оболочки
cat chapter1 chapter2 chapter3 | grep tree
первый процесс, запускающий cat, объединяет и выводит три файла.
Второй процесс, запускающий grep, выбирает все строки, содержащие
слово «tree». В зависимости от относительных скоростей двух процессов
(которые зависят как от относительной сложности программ, так и от
того, сколько процессорного времени было у каждого из них), может
случиться так, что grep готов к запуску, но для него нет ожидающих
входных данных. Затем он должен блокироваться до тех пор, пока не
будет доступен какой-либо ввод.
Когда процесс блокируется, он делает это, потому что логически не может
продолжить работу, обычно потому, что ожидает ввода, который еще не
доступен.
Также возможно, что процесс, который концептуально готов и может быть
запущен, может быть остановлен, потому что операционная система
решила на время выделить ЦП другому процессу.
Эти два условия совершенно разные.
1. В первом случае приостановка заложена в проблеме (вы не можете
обработать пользовательскую командную строку, пока она не будет
набрана).
2. Во втором случае это технические особенности системы (недостаточно
процессоров, чтобы выделить каждому процессу свой собственный
процессор).
На Рисунке 2 мы видим диаграмму состояний, показывающую три
состояния, в которых может находиться процесс:
1. Работает (фактически использует ЦП в данный момент).
2. Готов (работоспособен; временно остановлен для запуска другого
процесса).
3. Заблокирован (невозможно запустить, пока не произойдет какое-то
внешнее событие).
Рисунок 2. Состояния процесса
Логически первые два состояния аналогичны. В обоих случаях процесс
готов к запуску, только во втором для него временно нет доступного
процессора. Третье состояние принципиально отличается от первых двух
тем, что процесс не может работать, даже если ЦП бездействует и ему
больше нечего делать.
Как показано, среди этих трех состояний возможны четыре перехода.
Переход 1 происходит, когда операционная система обнаруживает, что
процесс не может продолжаться прямо сейчас. В некоторых системах
процесс может выполнить системный вызов, такой как пауза, чтобы
перейти в заблокированное состояние. В других системах, включая UNIX,
когда процесс читает из канала или специального файла (например,
терминала) и нет доступных входных данных, процесс автоматически
блокируется.
Переходы 2 и 3 вызываются планировщиком процессов, частью
операционной системы, причем процесс даже не знает о них. Переход 2
происходит, когда планировщик решает, что запущенный процесс
проработал достаточно долго, и пришло время предоставить другому
процессу немного процессорного времени. Переход 3 происходит, когда
все остальные процессы получили свою справедливую долю, и настало
время для первого процесса снова запустить ЦП. Вопрос планирования,
то есть решения, какой процесс должен выполняться, когда и как долго,
является важным; мы рассмотрим его позже в этой главе. Было
разработано множество алгоритмов, чтобы попытаться сбалансировать
конкурирующие требования эффективности для системы в целом и
справедливости для отдельных процессов.
Переход 4 происходит, когда происходит внешнее событие, которого
ожидал процесс (например, поступление некоторого ввода). Если в этот
момент не запущен ни один другой процесс, сработает переход 3, и
процесс запустится. В противном случае ему, возможно, придется
немного подождать в состоянии готовности, пока не освободится ЦП и не
наступит его очередь.
Используя модель процесса, становится намного проще думать о том,
что происходит внутри системы. Некоторые процессы запускают
программы, выполняющие команды, вводимые пользователем. Другие
процессы являются частью системы и обрабатывают такие задачи, как
выполнение запросов к файловым службам или управление деталями
работы с диском или ленточным накопителем. Когда происходит
прерывание диска, система принимает решение остановить выполнение
текущего процесса и запустить дисковый процесс, который был
заблокирован в ожидании этого прерывания. Таким образом, вместо того,
чтобы думать о прерываниях, мы можем думать о пользовательских
процессах, дисковых процессах, терминальных процессах и т. д., которые
блокируются, когда ожидают, что что-то произойдет. Когда диск прочитан
или введен символ, ожидающий его процесс разблокируется и может
быть запущен снова.
Это представление приводит к модели, показанной на Рисунке 3.
Рисунок 3. Планировщик (самый низкий уровень, который обрабатывает прерывания и планирование) и
процессы
Здесь самым низким уровнем операционной системы является
планировщик, над которым находятся различные процессы. Вся
обработка прерываний и детали фактического запуска и остановки
процессов спрятаны в том, что здесь называется планировщиком,
который на самом деле представляет собой не так много кода. Остальная
часть операционной системы хорошо структурирована в форме
процесса.
Потоки.
В традиционных операционных системах каждый процесс имеет
адресное пространство и единственный поток управления.
Фактически, это почти определение процесса. Во многих ситуациях
желательно иметь несколько потоков управления в одном и том же
адресном пространстве, работающих квазипараллельно, как если бы они
были (почти) отдельными процессами (за исключением общего адресного
пространства).
Оказывается, есть несколько причин, по которым эти мини-процессы
(своего рода процесс внутри процесса) называются потоками.
Основная причина наличия потоков заключается в том, что во многих
приложениях одновременно выполняется несколько действий.
Некоторые из них могут время от времени блокироваться. Разбивая
такое приложение на несколько последовательных потоков, работающих
квазипараллельно, модель программирования упрощается.
Это именно аргумент в пользу наличия процессов. Вместо того, чтобы
думать о прерываниях, таймерах и переключениях контекста, мы можем
думать о параллельных процессах. Только теперь с потоками мы
добавляем новый элемент: возможность для параллельных сущностей
совместно использовать адресное пространство и все его данные между
собой. Эта возможность важна для некоторых приложений, поэтому
наличие нескольких процессов (с их отдельными адресными
пространствами) не будет работать.
Второй аргумент в пользу наличия потоков заключается в том, что,
поскольку они легче, чем процессы, их легче (т. е. быстрее) создавать и
уничтожать, чем процессы. Во многих системах создание потока
происходит в 10–100 раз быстрее, чем создание процесса. Когда
количество необходимых потоков изменяется динамически и быстро,
полезно иметь это свойство.
Третьей причиной наличия потоков также является аргумент
производительности. Потоки не дают прироста производительности,
когда все они привязаны к ЦП, но когда есть существенные вычисления,
а также значительный ввод-вывод, наличие потоков позволяет этим
действиям перекрываться, тем самым ускоряя приложение.
Наконец, потоки полезны в системах с несколькими процессорами, где
возможен настоящий параллелизм.
Предположим, что текстовый редактор написан как двухпоточная
программа. Один поток взаимодействует с пользователем, а другой
обрабатывает переформатирование в фоновом режиме. Как только
предложение удаляется со страницы 1, интерактивный поток сообщает
потоку переформатирования переформатировать всю книгу. Тем
временем интерактивный поток продолжает слушать клавиатуру и мышь
и реагировать на простые команды, такие как прокрутка страницы 1, в то
время как другой поток безумно выполняет вычисления в фоновом
режиме. Если повезет, переформатирование будет завершено до того,
как пользователь попросит просмотреть страницу 600, поэтому ее можно
будет отобразить мгновенно.
Почему бы не добавить третий поток? Многие текстовые процессоры
имеют функцию автоматического сохранения всего файла на диск
каждые несколько минут, чтобы защитить пользователя от потери
дневной работы в случае сбоя программы, сбоя системы или сбоя
питания. Третий поток может обрабатывать резервные копии дисков, не
мешая двум другим.
Если бы программа была однопоточной, то при каждом запуске
резервного копирования диска команды клавиатуры и мыши
игнорировались бы до завершения резервного копирования.
Пользователь наверняка воспримет это как вялую производительность. В
качестве альтернативы, события клавиатуры и мыши могут прервать
резервное копирование диска, обеспечивая хорошую
производительность, но приводя к сложной модели программирования,
управляемой прерываниями. С тремя потоками модель
программирования намного проще. Первый поток просто
взаимодействует с пользователем. Второй поток переформатирует
документ по указанию. Третий поток периодически записывает
содержимое оперативной памяти на диск.
Должно быть ясно, что наличие трех отдельных процессов здесь не
сработает, поскольку над документом должны работать все три потока.
Имея три потока вместо трех процессов, они совместно используют
общую память и, таким образом, все имеют доступ к редактируемому
документу. С тремя процессами это было бы невозможно.
Как правило, любой процесс может быть
структурирован с потоком ввода, потоком обработки и
потоком вывода.
Входной поток считывает данные во входной буфер. Поток обработки
берет данные из входного буфера, обрабатывает их и помещает
результаты в выходной буфер. Выходной буфер записывает эти
результаты обратно на диск. Таким образом, ввод, вывод и обработка
могут происходить одновременно. Конечно, эта модель работает, только
если системный вызов блокирует только вызывающий поток, а не весь
процесс.
Классическая модель потока.
Один из способов взглянуть на процесс - это
сгруппировать связанные ресурсы вместе.
У процесса есть адресное пространство, содержащее текст программы и
данные, а также другие ресурсы. Эти ресурсы могут включать открытые
файлы, дочерние процессы, ожидающие оповещения, обработчики
сигналов, учетную информацию и многое другое. Если объединить их в
виде процесса, ими будет легче управлять.
Другая концепция процесса — поток выполнения, обычно сокращаемый
до простого потока.
Поток имеет
- программный счетчик, который отслеживает, какую команду
выполнять следующей,
- регистры, в которых хранятся текущие рабочие переменные,
- стек, который содержит историю выполнения, с одним фреймом
для каждой вызванной, но еще не возвращенной процедуры.
Хотя поток должен выполняться в каком-то процессе, поток и его процесс
— разные понятия, и их можно рассматривать отдельно. Процессы
используются для группировки ресурсов; потоки — это объекты,
запланированные для выполнения на ЦП.
Что потоки добавляют к модели процесса, так это возможность
выполнения нескольких операций в одной и той же среде процесса, в
значительной степени независимо друг от друга.
Параллельное выполнение нескольких потоков в
одном процессе аналогично параллельному
выполнению нескольких процессов на одном
компьютере.
В первом случае потоки совместно используют адресное пространство и
другие ресурсы. В последнем случае процессы совместно используют
физическую память, диски, принтеры и другие ресурсы. Поскольку потоки
обладают некоторыми свойствами процессов, их иногда называют
облегченными процессами. Термин «многопоточность» также
используется для описания ситуации, когда допускается несколько
потоков в одном и том же процессе. Некоторые процессоры имеют
прямую аппаратную поддержку многопоточности и позволяют
переключать потоки в наносекундном масштабе.
На Рисунке 4 а) мы видим три традиционных процесса. Каждый процесс
имеет собственное адресное пространство и единственный поток
управления.
Напротив, на Рисунке 4 б) мы видим один процесс с тремя потоками
управления.
Хотя в обоих случаях у нас есть три потока, на Рисунке 4 а) каждый из
них работает в своем адресном пространстве, тогда как на Рисунке 4 б)
все три потока используют одно и то же адресное пространство.
Рисунок 4. Классическая модель потока
Когда многопоточный процесс запускается в однопроцессорной системе,
потоки выполняются по очереди.
Переключаясь между несколькими процессами, система создает
иллюзию параллельного выполнения отдельных
последовательных процессов.
Многопоточность работает так же. ЦП быстро переключается между
потоками, создавая иллюзию параллельного выполнения потоков, хотя и
на более медленном ЦП, чем реальный. С тремя вычислительными
потоками в процессе кажется, что потоки выполняются параллельно,
каждый на ЦП с одной третью скорости реального ЦП.
Различные потоки в процессе не так независимы, как разные процессы.
Все потоки имеют точно такое же адресное пространство, что
означает, что они также используют одни и те же глобальные
переменные. Поскольку каждый поток может получить доступ к каждому
адресу памяти в адресном пространстве процесса, один поток может
читать, записывать или даже стирать стек другого потока.
Защиты между потоками нет, потому что это невозможно, и в этом нет
необходимости.
В отличие от разных процессов, которые могут быть от разных
пользователей и которые могут быть враждебными друг другу, процесс
всегда принадлежит одному пользователю, который
предположительно создал несколько потоков, чтобы они могли
сотрудничать, а не бороться.
В дополнение к совместному использованию адресного пространства все
потоки могут совместно использовать один и тот же набор открытых
файлов, дочерних процессов, аварийных сообщений, сигналов и т. д.
Таким образом, организация на Рисунке 4 а) будет использоваться, когда
три процесса по существу не связаны между собой, тогда как на Рисунке
4 б) будет уместна, когда три потока фактически являются частью одного
и того же действия и активно и тесно взаимодействуют друг с другом.
В колонках ниже перечислены элементы, доступные для процесса и
потока.
Элементы процесса
Элементы потока
Адресное пространство
Счетчик команд
Глобальные переменные
Регистры
Открытые файлы
Стек
Дочерние процессы
Состояние
Ожидание аварийного сообщения
Сигналы и обработчики сигналов
Элементы в первой колонке — это свойства процесса, а не свойства
потока. Например, если один поток открывает файл, этот файл виден
другим потокам процесса, и они могут его читать и записывать. Это
логично, поскольку единицей управления ресурсами является процесс, а
не поток.
Если бы у каждого потока было собственное адресное пространство,
открытые файлы, ожидающие оповещения и т. д., это был бы отдельный
процесс. То, чего мы пытаемся достичь с помощью концепции потока, —
это возможность для нескольких потоков выполнения совместно
использовать набор ресурсов, чтобы они могли тесно работать вместе
для выполнения некоторой задачи.
Подобно традиционному процессу (т. е. процессу
только с одним потоком), поток может находиться в
одном из нескольких состояний: выполняется,
заблокирован, готов или завершен.
Работающий поток в настоящее время занимает ЦП и является
активным. Напротив, заблокированный поток ожидает некоторого
события, чтобы разблокировать его. Например, когда поток выполняет
системный вызов для чтения с клавиатуры, он блокируется до тех пор,
пока не будет введен ввод. Поток может быть заблокирован в ожидании
какого-либо внешнего события или пока какой-либо другой поток не
разблокирует его. Готовый поток планируется запустить, и он будет
запущен, как только подойдет его очередь. Переходы между состояниями
потока такие же, как и между состояниями процесса.
Важно понимать, что каждый поток имеет свой собственный стек, как
показано на Рисунке 5. Стек каждого потока содержит один кадр для
каждой вызванной процедуры, но еще не возвращенной из нее. Этот
фрейм содержит локальные переменные процедуры и адрес возврата,
который будет использоваться после завершения вызова процедуры.
Например, если процедура X вызывает процедуру Y, а Y вызывает
процедуру Z, то во время выполнения Z фреймы для X, Y и Z будут
находиться в стеке. Каждый поток обычно вызывает разные процедуры и,
следовательно, имеет разную историю выполнения. Вот почему каждому
потоку нужен свой собственный стек.
Рисунок 5. Стек потока
Когда присутствует многопоточность, процессы обычно начинаются с
одного присутствующего потока. Этот поток имеет возможность создавать
новые потоки, вызывая библиотечную процедуру, такую как
thread_create. Параметр thread_create указывает имя процедуры для
запуска нового потока. Нет необходимости (и даже возможно) указывать
что-либо об адресном пространстве нового потока, поскольку он
автоматически запускается в адресном пространстве создающего потока.
Иногда потоки иерархичны, с отношениями родитель-потомок, но часто
таких отношений не существует, и все потоки равны. С иерархическими
отношениями или без них создающему потоку обычно возвращается
идентификатор потока, который называют новый поток.
Когда поток завершил свою работу, он может выйти, вызвав
библиотечную процедуру, скажем, thread_exit. Затем он исчезает и
больше не подлежит планированию. В некоторых системах потоков один
поток может ожидать выхода (конкретного) потока, вызывая процедуру,
например, thread_join. Эта процедура блокирует вызывающий поток до
тех пор, пока (конкретный) поток не завершится. В этом отношении
создание и завершение потока очень похоже на создание и завершение
процесса с примерно такими же опциями.
Другим распространенным вызовом потока является thread_yield,
который позволяет потоку добровольно отказаться от ЦП, чтобы
позволить другому потоку работать. Такой вызов важен, потому что нет
прерывания по часам, чтобы фактически обеспечить
мультипрограммирование, как это происходит с процессами.
Таким образом, важно, чтобы потоки были
вежливы и время от времени добровольно уступали
ЦП, чтобы дать возможность другим потокам
работать.
Другие вызовы позволяют одному потоку ждать, пока другой завершит
какую-то работу, и поток объявит, что он закончил некоторую работу, и так
далее.
Проблемы потока.
Хотя потоки часто полезны, они также вносят ряд сложностей в модель
программирования.
Для начала рассмотрим последствия системного вызова UNIX fork.
Если родительский процесс имеет несколько потоков, должны ли они
быть и у дочернего процесса? В противном случае процесс может
работать неправильно, поскольку все они могут быть необходимы.
Однако если дочерний процесс получает столько же потоков, сколько и
родительский, что произойдет, если поток в родительском будет
заблокирован при вызове чтения, скажем, с клавиатуры? На клавиатуре
теперь заблокированы два потока, один в родительском и один в
дочернем? Когда строка набирается, оба потока получают ее копию?
Только родитель? Только ребенок? Та же проблема существует с
открытыми сетевыми подключениями.
Другой класс проблем связан с тем, что потоки совместно используют
множество структур данных. Что произойдет, если один поток закроет
файл, пока другой все еще читает его? Допустим, один поток замечает,
что памяти слишком мало, и начинает выделять больше памяти. На
полпути происходит переключение потока, и новый поток также замечает,
что памяти слишком мало, и также начинает выделять больше памяти.
Память, вероятно, будет выделена дважды. Эти проблемы можно
решить, приложив некоторые усилия, но для того, чтобы многопоточные
программы работали правильно, необходимы тщательное обдумывание и
проектирование.
Преобразование однопоточного кода в
многопоточный.
Многие существующие программы были написаны для однопоточных
процессов. Преобразование их в многопоточные намного сложнее, чем
может показаться на первый взгляд.
Начнем с того, что код потока обычно состоит из нескольких
процедур, как и процесс. Они могут иметь локальные переменные,
глобальные переменные и параметры. Локальные переменные и
параметры не вызывают проблем, но переменные, глобальные для
потока, но не глобальные для всей программы, представляют собой
проблему. Это переменные, которые являются глобальными в том
смысле, что многие процедуры в потоке используют их (как они могут
использовать любую глобальную переменную), но логически другие
потоки должны оставить их в покое.
Следующая проблема при превращении однопоточной программы в
многопоточную состоит в том, что многие библиотечные процедуры не
являются реентерабельными. То есть они не предназначены для
повторного вызова какой-либо данной процедуры, пока предыдущий
вызов еще не завершен. Например, отправка сообщения по сети вполне
может быть запрограммирована так, чтобы сообщение собиралось в
фиксированном буфере в библиотеке, а затем перехватывалось ядром
для его отправки. Что происходит, если один поток собрал свое
сообщение в буфере, а затем прерывание по часам заставляет
переключиться на второй поток, который немедленно перезаписывает
буфер своим собственным сообщением?
Точно так же процедуры распределения памяти, такие как malloc в
UNIX, поддерживают важные таблицы об использовании памяти,
например, связанный список доступных фрагментов памяти. Пока
malloc занят обновлением этих списков, они могут временно находиться в
несогласованном состоянии с указателями, которые никуда не указывают.
Если переключение потока происходит, когда таблицы несовместимы, а
новый вызов поступает из другого потока, может использоваться
недопустимый указатель, что приводит к сбою программы.
Далее рассмотрим сигналы. Некоторые сигналы логически зависят от
потока, а другие нет. Например, если поток вызывает сигнал тревоги,
имеет смысл передать результирующий сигнал потоку, выполнившему
вызов. Однако, когда потоки полностью реализованы в пользовательском
пространстве, ядро даже не знает о потоках и вряд ли может направить
сигнал в нужный. Дополнительная сложность возникает, если процесс
может одновременно иметь только одно ожидающее оповещение, а
несколько потоков независимо вызывают оповещение.
Другие сигналы, такие как прерывание клавиатуры, не зависят от потока.
Кто должен их ловить? Одна назначенная нить? Все потоки? Недавно
созданная всплывающая ветка? Кроме того, что произойдет, если один
поток изменит обработчики сигналов, не сообщив об этом другим
потокам? А что произойдет, если один поток захочет перехватить
определенный сигнал (скажем, пользователь нажимает CTRL-C), а другой
поток хочет, чтобы этот сигнал завершил процесс? Такая ситуация может
возникнуть, если один или несколько потоков выполняют стандартные
библиотечные процедуры, а другие написаны пользователем. Ясно, что
эти желания несовместимы. В общем, сигналами достаточно сложно
управлять в однопоточной среде. Переход к многопоточной среде не
упрощает их обработку.
Последней проблемой, связанной с потоками, является управление
стеком. Во многих системах, когда стек процесса переполняется, ядро
автоматически предоставляет этому процессу дополнительный стек.
Когда процесс имеет несколько потоков, он также должен иметь
несколько стеков. Если ядро не знает обо всех этих стеках, оно не может
автоматически увеличивать их при сбое стека. На самом деле он может
даже не осознавать, что сбой памяти связан с ростом стека какого-то
потока.
Межпроцессное взаимодействие.
Процессам часто необходимо взаимодействовать с другими
процессами. Например, в конвейере оболочки выходные данные
первого процесса должны быть переданы второму процессу и так далее
по цепочке. Таким образом, существует потребность в обмене данными
между процессами, предпочтительно в хорошо структурированном виде,
без использования прерываний. Давайте рассмотрим некоторые
вопросы, связанные с межпроцессным взаимодействием или IPC
(Inter Process Communications).
Если кратко, то тут три основных вопроса.
1. Вопрос первый: как один процесс может передавать
информацию другому?
2. Второй вопрос связан с обеспечением того, чтобы два или более
процессов не мешали друг другу, например, два процесса в
системе бронирования авиабилетов, каждый из которых пытается
занять последнее место в самолете для другого клиента.
3. Третий вопрос касается правильной последовательности при
наличии зависимостей: если процесс A создает данные, а
процесс B печатает их, B должен ждать, пока A не произведет
некоторые данные, прежде чем начать печать.
Также важно отметить, что два из этих вопроса в равной степени
применимы к потокам.
Первый — «передача информации» — удобен для потоков, поскольку
они совместно используют общее адресное пространство (потоки в
разных адресных пространствах, которым необходимо обмениваться
данными, подпадают под категорию взаимодействующих процессов).
Тем не менее, два других «не путать друг с другом» и «правильное
упорядочивание» в равной степени применимы к потокам. Существуют
одни и те же проблемы и применяются одни и те же решения. Поэтому
мы обсудим проблему в контексте процессов, но имейте в виду, что те же
проблемы и решения применимы и к потокам.
Например, UNIX предоставляет множество механизмов
межпроцессорного взаимодействия и синхронизации.
Каналы , сообщения и разделяемая память могут использоваться для
передачи данных между процессами, тогда как семафоры и сигналы
используются для запуска действий других процессов.
Каналы.
Pipe — это кольцевой буфер, позволяющий двум процессам
обмениваться данными по модели «производитель-потребитель».
Таким образом, это очередь «первым поступил — первым обслужен»,
которую записывает один процесс, а читает другой.
При создании канала ему присваивается фиксированный размер в
байтах. Когда процесс пытается записать в канал, запрос на запись
выполняется немедленно, если есть достаточно места; в противном
случае процесс блокируется. Точно так же процесс чтения блокируется,
если он пытается прочитать больше байтов, чем в данный момент
находится в канале; в противном случае запрос на чтение выполняется
немедленно. ОС применяет взаимное исключение: то есть только один
процесс может получить доступ к каналу одновременно.
Существует два типа каналов: именованные и безымянные. Только
связанные процессы могут совместно использовать неименованные
каналы, в то время как связанные или несвязанные процессы могут
совместно использовать именованные каналы.
Сообщения.
Сообщение представляет собой блок байтов с сопровождающим типом.
UNIX предоставляет системные вызовы msgsnd и msgrcv для
процессов, участвующих в передаче сообщений. С каждым процессом
связана очередь сообщений, которая функционирует как почтовый ящик.
Отправитель сообщения указывает тип сообщения для каждого
отправленного сообщения, и это может использоваться получателем в
качестве критерия выбора. Получатель может извлекать сообщения либо
в порядке поступления, либо по типу.
Разделяемая память.
Самая быстрая форма межпроцессного взаимодействия,
предусмотренная в UNIX, — это разделяемая память. Это общий блок
виртуальной памяти, разделяемый несколькими процессами.
Процессы читают и записывают разделяемую память, используя те же
машинные команды, которые они используют для чтения и записи других
частей своего пространства виртуальной памяти. Разрешение только
для чтения или чтения-записи определяется для каждого процесса
отдельно.
Семафоры.
Системные вызовы семафоров в UNIX являются обобщением
примитивов semWait и semSignal; несколько операций могут
выполняться одновременно, а операции увеличения и уменьшения могут
иметь значения больше 1. Ядро выполняет все запрошенные операции
атомарно; никакой другой процесс не может получить доступ к семафору,
пока не будут завершены все операции.
Семафор состоит из следующих элементов:
● Текущее значение семафора.
● Идентификатор последнего процесса, работавшего с
семафором.
● Количество процессов, ожидающих, когда значение семафора
превысит его текущее значение.
● Количество процессов, ожидающих, когда значение семафора
станет равным нулю.
Сигналы.
Сигнал — это программный механизм, который информирует процесс о
возникновении асинхронных событий.
Сигнал похож на аппаратное прерывание, но не использует
приоритеты. То есть все сигналы обрабатываются одинаково; сигналы,
возникающие в одно и то же время, представляются процессу по одному
без определенного порядка.
Процессы могут отправлять друг другу сигналы, или ядро может
отправлять сигналы внутри себя. Сигнал доставляется путем обновления
поля в таблице процессов для процесса, которому отправляется сигнал.
Поскольку каждый сигнал поддерживается как один бит, сигналы данного
типа не могут быть поставлены в очередь. Сигнал обрабатывается сразу
после пробуждения процесса для запуска или всякий раз, когда процесс
готовится вернуться из системного вызова.
Процесс может отреагировать на сигнал, выполнив какое-либо действие
по умолчанию (например, завершение), выполнив функцию
обработчика сигнала или проигнорировав сигнал.
Тема 11. Управление памятью.
В этой лекции Вы познакомитесь с основными абстракциями
памяти, рассмотрите проблемы и решения, которые требуют
новых стратегий, таких как подкачка страниц и виртуальная
память.
Вы также узнаете про процесс разделения памяти на страницы
и сегментацию.
Оперативная память.
Оперативная память - это важный ресурс, требующий тщательного
управления.
Объем памяти современного среднего домашнего компьютера вырос в
10 000 раз относительно IBM 7094 (крупнейшего компьютера мира
начала 1960-х годов).
Однако объемы программ растут еще быстрее, чем доступная память.
Чего хотел бы каждый программист, так это личной, бесконечно
большой, бесконечно быстрой и недорогой памяти, которая к тому же
была бы энергонезависима, т. е. не теряла своего содержимого при
отключении электроэнергии. К сожалению, в настоящее время
технологии не предоставляют такую память.
С годами люди построили концепцию иерархии памяти (Рисунок 1), в
которой компьютеры имеют:
● несколько мегабайт очень быстрой, дорогой, энергозависимой
кэш-памяти;
● несколько гигабайт среднескоростной, недорогой,
энергозависимой основной памяти;
● несколько терабайт медленного, дешевого, энергонезависимого
магнитного или твердотельного дискового хранилища (Рисунок 1).
Рисунок 1. Иерархия памяти
Задача операционной системы состоит в том, чтобы абстрагировать эту
иерархию в полезную модель, а затем управлять этой абстракцией.
Часть операционной системы, управляющая иерархией памяти,
называется диспетчером памяти.
Задача диспетчера памяти — эффективное
управление: отслеживать, какие части памяти
используются, выделять память процессам, когда они
в ней нуждаются, и освобождать ее, когда они
заканчивают работу.
Простейшая абстракция памяти — вообще не иметь абстракции. Ранние
мейнфреймы (до 1960 г.), ранние миникомпьютеры (до 1970 г.) и ранние
персональные компьютеры (до 1980 г.) не имели абстракции памяти.
Каждая программа просто видела физическую память. Таким образом,
модель памяти, предоставленная программисту, была просто физической
памятью, набором адресов от 0 до некоторого максимума, причем
каждый адрес соответствовал ячейке, содержащей некоторое количество
битов, обычно восемь.
В этих условиях невозможно было
одновременно иметь в памяти две запущенные
программы.
Если бы первая программа записала новое значение, скажем, в ячейку
2000, это стерло бы любое значение, хранившееся там второй
программой. Ничего не работало бы, и обе программы почти сразу
зависли бы.
Даже если модель памяти представляет собой просто физическую
память, возможны несколько вариантов. На Рисунке 2 показаны три
возможных случая:
● ОС находится в нижней части памяти в ОЗУ (оперативное
запоминающее устройство);
● ОС находится в ПЗУ (постоянное запоминающее устройство) в
верхней части памяти;
● драйверы устройств могут быть в верхней части памяти в ПЗУ, а
остальная часть системы внизу в ОЗУ.
Рисунок 2. Три простых способа организации памяти в операционной системе и один пользовательский
процесс. Существуют и другие возможности.
Первая модель - на рис. 2 а) раньше использовалась в мейнфреймах и
миникомпьютерах, но сейчас используется редко.
Вторая модель - на рис. 2 б) используется в некоторых карманных
компьютерах и встроенных системах.
Третья модель - на рис. 2 в) использовалась ранними персональными
компьютерами (например, работающими под управлением MS-DOS), где
часть системы в ПЗУ называлась BIOS (базовая система ввода-вывода).
Модели а) и б) имеют существенный недостаток - ошибка в
пользовательской программе может уничтожить операционную систему,
что может привести к катастрофическим последствиям.
Когда система организована таким образом, обычно одновременно может
выполняться только один процесс. Как только пользователь вводит
команду, операционная система копирует запрошенную программу с
диска в память и выполняет ее. Когда процесс завершается,
операционная система отображает символ подсказки и ожидает новой
команды пользователя. Когда операционная система получает команду,
она загружает в память новую программу, перезаписывая первую.
Один из способов добиться некоторого
параллелизма в системе без абстракции памяти —
программировать с несколькими потоками.
Поскольку предполагается, что все потоки в процессе видят один и тот же
образ памяти, тот факт, что они вынуждены это делать, не является
проблемой.
Предоставление физической памяти процессам имеет несколько
серьезных недостатков.
1. Во-первых, если пользовательские программы могут обращаться к
каждому байту памяти, они могут легко вывести из строя
операционную систему, преднамеренно или случайно, что приведет
к полной остановке системы. Эта проблема существует даже при
запуске только одной пользовательской программы (приложения).
2. Во-вторых, в этой модели сложно запустить несколько программ
одновременно. Но на персональных компьютерах обычно
одновременно открыто несколько программ, одна из которых имеет
текущий фокус, а другие повторно активируются щелчком мыши.
Поэтому, чтобы несколько приложений могли находиться в памяти
одновременно, не мешая друг другу, необходимо решить две проблемы:
защита и перемещение.
Примитивное решение защиты маркирует фрагменты памяти ключом
защиты и сравнивает ключ исполняемого процесса с ключом каждого
извлеченного слова памяти. Однако этот подход сам по себе не решает
последнюю проблему, хотя ее можно решить путем перемещения
программ по мере их загрузки, но это медленное и сложное решение.
Лучшее решение — изобрести новую абстракцию памяти: адресное
пространство.
Точно так же, как концепция процесса создает
своего рода абстрактный ЦП для запуска программ,
адресное пространство создает своего рода
абстрактную память для программ, в которой они
живут.
Адресное пространство — это набор адресов, которые процесс может
использовать для адресации памяти.
Каждый процесс имеет свое собственное адресное пространство,
независимое от тех, которые принадлежат другим процессам, за
исключением некоторых особых обстоятельств, когда процессы хотят
совместно использовать свои адресные пространства.
Это решение использует особенно простую версию динамического
перемещения. Оно просто сопоставляет адресное пространство каждого
процесса с другой частью физической памяти.
Классическое решение состоит в том, чтобы оснастить каждый ЦП двумя
специальными аппаратными регистрами, обычно называемыми базовым
и предельным регистрами.
При использовании этих регистров программы загружаются в
последовательные ячейки памяти везде, где есть место, и без
перемещения во время загрузки (Рисунок 3). Когда процесс запущен, в
базовый регистр загружается физический адрес начала его программы в
памяти, а в предельный регистр загружается длина программы.
Рисунок 3. Базовый и предельный регистры можно использовать для предоставления каждому процессу
отдельного адресного пространства.
Недостатком перемещения с использованием базового и предельного
регистров является необходимость выполнять сложение и сравнение для
каждой ссылки на память. Сравнение может выполняться быстро, но
сложение происходит медленно из-за времени распространения
переноса, если только не используются специальные схемы сложения.
Подкачка и виртуальная память.
В типичной системе Windows, macOS или Linux может запускаться от 50
до 100 или более процессов сразу после загрузки компьютера. Хранение
всех процессов в памяти все время требует огромного объема памяти и
не может быть выполнено при её нехватке.
За прошедшие годы были разработаны два общих подхода к борьбе с
перегрузкой памяти.
1. Простейшая стратегия, называемая подкачкой (swapping, от англ.
- обмен, переключение), состоит в том, чтобы полностью загрузить
каждый процесс, запустить его на некоторое время, а затем
вернуть на диск. Бездействующие процессы в основном хранятся
на диске, поэтому они не занимают памяти, когда не работают (хотя
некоторые из них периодически просыпаются, чтобы выполнить
свою работу, а затем снова засыпают).
2. Другая стратегия, называемая виртуальной памятью (virtual
memory), позволяет программам работать, даже если они лишь
частично находятся в основной памяти.
Работа системы подкачки показана на Рисунке 4. Изначально в памяти
находится только процесс A. Затем создаются или заменяются с диска
процессы B и C. На рисунке г) процесс A выгружается на диск. Затем
входит D, а B уходит. Наконец снова приходит А. Поскольку A теперь
находится в другом месте, содержащиеся в нем адреса должны быть
перемещены либо программно, либо аппаратно во время выполнения
программы.
Рисунок 4. Механизм подкачки
Когда подкачка создает несколько дыр в памяти, можно объединить их
все в одну большую, переместив все процессы как можно дальше вниз.
Этот метод известен как дефрагментация памяти. Этот процесс редко
используется, потому что требует много процессорного времени.
Сегменты данных большинства процессов могут увеличиваться,
например, за счет динамического выделения памяти из кучи, как во
многих языках программирования, и проблема возникает всякий раз,
когда процесс пытается увеличиться. Если к процессу примыкает дыра,
ее можно выделить и дать процессу возможность вырасти в дыру.
С другой стороны, если процесс находится рядом с другим, растущий
процесс должен быть либо перемещен в дыру в памяти, достаточно
большую для него, либо один или несколько процессов должны быть
выгружены, чтобы создать достаточно большую дыру.
Если процесс не может расти в памяти, а область подкачки на диске
заполнена, процесс придется приостановить до тех пор, пока не
освободится место (или его можно уничтожить).
Виртуальная память.
Хотя базовые и предельные регистры можно использовать для создания
абстракции адресных пространств, необходимо решить еще одну
проблему: управление раздутым программным обеспечением. В то
время как размеры памяти быстро увеличиваются, размеры
программного обеспечения увеличиваются гораздо быстрее.
В результате этих разработок возникла потребность в выполнении
программ, которые слишком велики для того, чтобы поместиться в
памяти, и, безусловно, существует потребность в системах,
поддерживающих одновременное выполнение нескольких программ,
каждая из которых умещается в памяти, но все они в совокупности
превышают объем памяти.
Подкачка не является приемлемым вариантом, поскольку типичный диск
имеет пиковую скорость передачи в несколько сотен МБ/с, а это означает,
что требуется несколько секунд, чтобы выгрузить программу размером 1
ГБ и столько же для загрузки программы объемом 1 ГБ.
Основная идея виртуальной памяти заключается
в том, что каждая программа имеет собственное
адресное пространство, которое разбито на
фрагменты, называемые страницами.
Каждая страница представляет собой непрерывный диапазон адресов.
Эти страницы отображаются в физической памяти, но не все страницы
должны одновременно находиться там для запуска программы.
Когда программа обращается к части своего адресного пространства,
находящейся в физической памяти, аппаратное обеспечение
выполняет необходимое сопоставление на лету.
Когда программа обращается к части своего адресного пространства,
которой нет в физической памяти, операционная система получает
предупреждение о том, что нужно найти недостающую часть и
повторно выполнить команду, которая не удалась.
Виртуальная память отлично работает в мультипрограммной системе,
когда в памяти одновременно находятся фрагменты многих программ.
Пока программа ожидает считывания своих частей, центральному
процессору может быть передан другой процесс.
Страничная организация памяти.
В большинстве систем с виртуальной памятью используется метод
страничной организации памяти, иначе называемый пейджингом (от
англ. page - страница).
На любом компьютере программы ссылаются на набор адресов памяти.
Адреса могут генерироваться с помощью индексации, базовых
регистров, сегментных регистров и другими способами.
Эти сгенерированные программой адреса называются виртуальными
адресами и образуют виртуальное адресное пространство.
На компьютерах без виртуальной памяти виртуальный адрес помещается
непосредственно на шину памяти и вызывает чтение или запись слова
физической памяти с тем же адресом.
Когда используется виртуальная память, виртуальные адреса не идут
напрямую на шину памяти. Вместо этого они обращаются к блоку
управления памятью БУП (Memory Management Unit, MMU ), который
сопоставляет виртуальные адреса с адресами физической памяти, как
показано на Рисунке 5.
Рисунок 5. Положение и функция БПУ (MMU).
Виртуальное адресное пространство состоит из единиц фиксированного
размера, называемых страницами. Соответствующие блоки в
физической памяти называются кадрами страниц (page frames).
Страницы и кадры страниц обычно имеют одинаковый размер.
В реальных системах используются размеры
страниц от 512 байт до гигабайта.
Например, имея 64 КБ виртуального адресного пространства, 32 КБ
физической памяти и размер страницы 4 КБ, мы получаем 16
виртуальных страниц и 8 страничных кадров страниц.
Передачи между оперативной памятью и диском
всегда выполняются целыми страницами.
Многие процессоры поддерживают несколько размеров страниц, которые
можно смешивать и сопоставлять по усмотрению операционной системы.
Например, архитектура x86-64 поддерживает страницы размером 4 КБ, 2
МБ и 1 ГБ, поэтому мы могли бы использовать страницы размером 4 КБ
для пользовательских приложений и одну страницу размером 1 ГБ для
ядра.
Обозначения на Рисунке 6 выглядят следующим образом. Диапазон,
помеченный 0K–4K, означает, что виртуальные или физические адреса
на этой странице находятся в диапазоне от 0 до 4095. Диапазон 4K–8K
относится к адресам от 4096 до 8191 и так далее. Каждая страница
содержит ровно 4096 адресов, начиная с числа, кратного 4096, и
заканчивая числом, кратным 4096.
Рисунок 6. Соотношение между виртуальными адресами и физическими адресами в таблице страниц.
Когда программа пытается получить доступ к адресу 0, в БПУ (MMU)
посылается виртуальный адрес 0. БУП видит, что этот виртуальный
адрес попадает на страницу 0 (от 0 до 4095), которая, согласно его
отображению, является страничным кадром 2 (от 8192 до 12287). Таким
образом, он преобразует адрес в 8192 и выводит его на шину. Память
вообще ничего не знает о БУП и просто видит запрос на чтение или
запись адреса 8192, который она соблюдает. Таким образом, БУП
фактически сопоставил все виртуальные адреса от 0 до 4095 с
физическими адресами от 8192 до 12287.
В реальном оборудовании бит присутствия/отсутствия отслеживает,
какие страницы физически присутствуют в памяти.
Отображение виртуальных адресов на
физические адреса можно резюмировать следующим
образом: виртуальный адрес разбивается на номер
виртуальной страницы (старшие биты) и смещение
(младшие биты).
Номер страницы используется в качестве индекса в таблице страниц, что
дает номер кадра страницы, соответствующего этой виртуальной
странице.
Если программа ссылается на неотображенный адрес, БУП замечает, что
страница не отображена, и заставляет ЦП перейти к обработке ловушки
(trap) в операционной системе. Эта ловушка называется ошибкой
страницы. Операционная система выбирает малоиспользуемый
страничный кадр и записывает его содержимое обратно на диск (если его
еще там нет). Затем он извлекает (также с диска) страницу, на которую
только что ссылались, в освобожденный кадр страницы, изменяет карту и
перезапускает прерванную команду.
Сегментация.
Существует еще один способ разделения адресуемой памяти, известный
как сегментация.
В то время как подкачка невидима для программиста и служит для
предоставления программисту большего адресного пространства,
сегментация обычно видна ему и предоставляется для удобства
организации программ и данных, а также как средство связывания
атрибутов привилегий и защиты с командами и данными.
Сегментация позволяет программисту
рассматривать память как состоящую из нескольких
адресных пространств или сегментов.
Сегменты имеют переменный размер. Обычно программист или ОС
назначают программы и данные разным сегментам. Может быть
несколько программных сегментов для различных типов программ, а
также несколько сегментов для данных. Каждому сегменту могут быть
назначены права доступа и использования. Ссылки на память состоят из
формы адреса (номер сегмента , смещение).
На Рисунке 7 показано сочетание механизмов сегментации и страничной
организации памяти на примере x86.
Рисунок 7. Пример механизмов преобразования адресов памяти Intel x86
Тема 12. Файловые системы.
В этой лекции Вы узнаете о типах устройств хранения,
познакомитесь с абстракцией файловой системы и ее
уровнями.
Вы получите представление о распространенных файловых
системах, таких как NTFS, EXT4, HFS+.
Вы также узнаете об особенностях разбиения устройств
хранения на тома, организации файлов и каталогов.
Хранение информации.
Все компьютерные приложения должны хранить и извлекать
информацию.
Пока процесс работает, он может хранить ограниченный объем
информации в своем собственном адресном пространстве. Однако
емкость хранилища ограничена размером виртуального адресного
пространства. Для некоторых приложений этого размера достаточно, но
большинству требуется гораздо больше места.
Вторая проблема с хранением информации в адресном пространстве
процесса состоит в том, что когда процесс завершается, информация
теряется. Для многих приложений (например, для баз данных)
информацию необходимо хранить в течение недель, месяцев или даже
вечно. Исчезновение информации при завершении процесса,
использующего ее, недопустимо.
Третья проблема заключается в том, что часто необходимо, чтобы
несколько процессов одновременно обращались к информации
(частям). Если у нас есть электронный телефонный справочник,
хранящийся в адресном пространстве одного процесса, то только этот
процесс может получить к нему доступ. Способ решить эту проблему
состоит в том, чтобы сделать саму информацию независимой от
какого-либо одного процесса.
Таким образом, формулируются
Основные требования к долговременному
хранению информации
● Должна быть возможность хранить очень большой объем
информации.
● Информация должна пережить завершение использующего ее
процесса.
● Несколько процессов должны иметь возможность одновременного
доступа к информации.
Блочные устройства.
Магнитные диски использовались в течение многих лет для
долговременного хранения. В последние годы все большую популярность
приобретают твердотельные накопители, так как в них нет движущихся
частей, которые могут сломаться. Кроме того, они предлагают быстрый
произвольный доступ. Ленты и оптические диски также используются, но
они имеют гораздо более низкую производительность и обычно
применяются для резервного копирования.
Чаще всего мы думаем о диске как о линейной последовательности
блоков фиксированного размера, поддерживающих две операции:
1. Прочитайте блок k.
2. Запишите блок k.
На самом деле их больше, но с помощью этих двух операций можно
было бы, в принципе, решить проблему долговременного хранения.
Однако это очень неудобные операции, особенно в больших системах,
используемых многими приложениями и, возможно, несколькими
пользователями (например, на сервере). Вот лишь несколько вопросов,
которые сразу возникают:
1. Как вы находите информацию?
2. Как запретить одному пользователю читать данные другого
пользователя?
3. Как узнать, какие блоки свободны?
Наиболее важными понятиями, относящимися к
операционным системам, являются процесс
(абстракция процессора), виртуальное адресное
пространство (абстракция физической памяти) и
файлы (логические единицы информации,
создаваемые процессами).
Диск обычно содержит тысячи или даже миллионы файлов, каждый из
которых независим от других. Фактически, мы можем думать о каждом
файле как о своего рода адресном пространстве, за исключением того,
что они используются для моделирования диска, а не для
моделирования ОЗУ.
Процессы могут читать существующие файлы и при необходимости
создавать новые. Информация, хранящаяся в файлах, должна быть
постоянной, то есть на нее не должно влиять создание и завершение
процесса. Файл должен исчезнуть только тогда, когда его удалит
владелец.
Файлы управляются операционной системой. Поэтому при
проектировании ОС важно определить, как файлы будут
структурироваться, именоваться, использоваться, исполняться,
управляться, как будет организован доступ к ним и защита.
Часть операционной системы, работающая с
файлами, называется файловой системой.
Файловая система.
Файловая система — это метод организации файлов на физических
носителях, таких как жесткие диски, компакт-диски и флэш-накопители.
Наиболее распространенные файловые системы представлены в
Таблице 1.
Таблица 1. Файловые системы и их характеристики
Имя
Базовая
ОС
Максимальны
й размер тома
FAT
2 ТБ
MS-DOS (рекомендует
ся 32 ГБ)
Максималь
ный
размер
файла
Дефрагмента
ция
Совместим
ость
4 ГБ
рекомендует
ся
Все ОС
Все ОС
кроме
Linux
Все ОС
exFAT
Windows
512 ТиБ
16 ЭиБ
довольно
часто
NTFS
Windows
16 ЭБ
16 ЭБ
рекомендует
ся
HFS+
MacOS
8 ЭБ
8 ЭБ
Все ОС
с
драйверам
и
EXT4
Linux
1 ЭиБ
16 ТБ
Linux
XFS
IRIX
8 ЭиБ
8 EiB
Linux
Эксбибайт (ЭиБ) — 1 эксбибайт = 1,153e18 байт = 1152921504606846976
байт = 1024 пебибайта
Пебибайт (ПиБ) — 1 пебибайт = 1,126e15 байт = 1125899906842624
байта = 1024 тебибайта
Эксабайт (ЭБ) - 1000000000000000000 байт = 1e18 байт = 1 миллион
терабайт = 1 миллиард гигабайт
Терабайт (ТБ) - 1000000000000 байт = 1e12 байт = 1000 гигабайт
Файловая система FAT.
Файловая система FAT (сокращение от File Allocation Table) — это
файловая система общего назначения, совместимая со всеми
основными операционными системами (Windows, macOS и Linux/Unix).
Она имеет относительно простую техническую основу и была файловой
системой по умолчанию для всех операционных систем Windows до
Windows 2000. Из-за слишком упрощенной структуры FAT страдает от
таких проблем, как чрезмерная фрагментация, повреждение файлов и
ограничения на имена и размер файлов.
Файловая система exFAT.
exFAT (Extended File Allocation Table) — это файловая система
Microsoft, совместимая с Windows и macOS 10.6+. Она также совместима
со многими мультимедийными устройствами, такими как телевизоры и
портативные медиаплееры.
Файловая система NTFS.
NTFS (сокращение от New Technology File System) — это современная,
хорошо сформированная файловая система, которая чаще всего
используется в ОС Windows, начиная с Windows NT. Она имеет
многофункциональную, но простую организацию, что позволяет
использовать её на очень больших объемах. Рекомендуется
использовать NTFS на всех носителях, которые в основном используются
с современными системами Windows. Её не следует использовать для
устройств, на которые системы macOS должны выполнять запись, или на
носителях, используемых в устройствах, несовместимых с NTFS.
Файловая система HFS.
HFS (Hierarchical File System) Plus — это файловая система,
разработанная Apple для macOS. Её также называют Mac OS Extended.
Файловая система EXT.
Расширенная файловая система (EXTended) была создана для
использования с ядром Linux. EXT4 — самая последняя версия EXT.
Файловая система XFS.
XFS — это высокопроизводительная 64-разрядная журналируемая
файловая система, созданная Silicon Graphics, Inc (SGI) в 1993 году.
RHEL 7.0, выпущенный в июне 2014 года, использует XFS в качестве
файловой системы по умолчанию, включая поддержку использования
XFS для раздела /boot.
Архитектура файловых систем.
Структура файловой системы в операционной системе состоит из трех
уровней, как показано на Рисунке 1:
● Физическая файловая система.
● Виртуальная файловая система.
● Логическая файловая система.
Эти уровни могут быть реализованы как независимые или тесно
связанные абстракции. Когда мы говорим о файловых системах, мы
имеем в виду один из этих уровней.
Хотя эти уровни различаются в разных операционных системах,
концепция практически одинакова.
Рисунок 1. Уровни файловой системы
Физический уровень является конкретной реализацией файловой
системы. Он отвечает за хранение и извлечение данных, а также за
управление пространством на устройстве хранения.
Физическая файловая система взаимодействует с реальным
оборудованием хранения через драйверы устройств.
Следующий уровень — это виртуальная файловая система, или VFS.
Виртуальная файловая система обеспечивает согласованное
представление различных файловых систем, смонтированных в одной и
той же операционной системе. Это означает, что
Операционная система может одновременно
использовать несколько файловых систем.
Операционная система должна обеспечивать единый интерфейс —
согласованное представление — между программами (файловыми
проводниками и другими приложениями, работающими с файлами) и
различными смонтированными файловыми системами (такими как NTFS,
APFS, EXT4, FAT32, exFAT и UDF).
Этот удобный слой между пользователем и нижележащими файловыми
системами обеспечивается VFS. VFS определяет контракт, который
должны реализовать все физические файловые системы, чтобы их
поддерживала операционная система.
Однако это соответствие не встроено в ядро файловой системы, а это
означает, что исходный код операционной системы не включает
поддержку каждой файловой системы. Вместо этого он использует
драйвер файловой системы для соблюдения правил VFS.
Драйвер — это специальная программа, которая
позволяет программному обеспечению
взаимодействовать с другим программным
обеспечением или оборудованием.
Однако пользовательские программы не взаимодействуют напрямую с
VFS. Вместо этого они используют унифицированный API, который
находится между программами и VFS. Это логическая файловая
система.
Логическая файловая система — это часть файловой системы, с которой
сталкивается пользователь, которая предоставляет собой интерфейс
прикладного программирования (application programming interface,
API).
Этот интерфейс позволяет пользовательским программам выполнять
различные операции с файлами, такие как OPEN, READ и WRITE без
необходимости иметь дело с каким-либо оборудованием для хранения.
Разбиение на тома.
Устройства хранения должны быть разбиты на разделы (тома) и
отформатированы перед первым использованием.
Разбиение (разделение) на тома — это
разделение устройства хранения на несколько
логических областей, после чего ими можно
управлять отдельно, как если бы они были
отдельными устройствами хранения.
Разбиение на разделы выполняется с помощью инструмента управления
дисками, предоставляемого операционной системой, или текстового
инструмента командной строки, предоставляемого прошивкой системы.
На устройстве хранения должен быть как минимум один раздел или, при
необходимости, несколько, как показано на Рисунке 2.
Рис. 2. Разбиение устройства хранения на разделы
Например, базовая установка Linux имеет три раздела:
- один раздел предназначен для операционной системы,
- другой раздел для пользовательских файлов
- и раздел подкачки.
Windows и macOS также имеют схожую компоновку, хотя они не
используют выделенный раздел подкачки. Вместо этого они управляют
подкачкой внутри раздела, на котором установлена операционная
система.
На компьютере с несколькими разделами вы можете установить
несколько операционных систем и каждый раз выбирать другой раздел
для загрузки вашей системы.
Утилиты восстановления и диагностики также находятся в выделенных
разделах.
Однако, разделение — это не просто способ
установки нескольких операционных систем и
инструментов. Оно также позволяет нам хранить
важные системные файлы отдельно от обычных
файлов.
Некоторые операционные системы, например Windows, назначают
разделам букву диска (A, B, C или D). Например, основной раздел в
Windows (на котором установлена Windows) обозначается как C: или
диск C.
Однако в Unix-подобных операционных системах разделы отображаются
как обычные каталоги в каталоге root (/).
Схема разделения.
При разделении устройства хранения у нас есть два метода на выбор:
● Схема главной загрузочной записи (Master Boot Record, MBR).
● Схема таблицы разделов (GUID Partition Table, GPT).
Независимо от того, какую схему разбиения вы
выберете, первые несколько блоков на устройстве
хранения всегда будут содержать важные данные о
ваших разделах.
Прошивка системы использует эти структуры данных для загрузки
операционной системы. Прошивка — это низкоуровневое программное
обеспечение, встроенное в электронные устройства или запускающее
другую программу для управления устройством.
Прошивки компьютеров реализуются на основе двух спецификаций:
● Базовый ввод/вывод (BIOS) - от англ. basic input/output system —
«базовая система ввода-вывода»).
● Унифицированный расширяемый интерфейс прошивки (UEFI).
Схема разделения MBR (Рисунок 3) является частью спецификаций BIOS
и используется прошивками на основе BIOS.
Рисунок 3. Пример файловой системы с MBR
На дисках с разделами MBR первый сектор устройства хранения,
называемый MBR, содержит важные данные для загрузки системы.
MBR содержит следующую информацию:
● Загрузчик, который представляет собой простую программу (в
машинном коде) для запуска первого этапа процесса загрузки.
● Таблицу разделов, которая содержит информацию о ваших
разделах.
Хотя MBR очень прост и широко поддерживается, у него есть некоторые
ограничения:
● Структура данных MBR ограничивает количество разделов только
четырьмя первичными.
● Размер каждого раздела может быть не более 2 ТиБ.
Содержимое сектора MBR не имеет резервной копии, а это означает, что
если MBR будет поврежден по неожиданной причине, у нас будет
бесполезное устройство хранения.
Схема разделения GPT (Рисунок 4) является более сложной, чем MBR, и
не имеет ограничений, присущих MBR.
GPT использует современную систему адресации логических блоков
(Logical Block Address, LBA) вместо применявшейся в MBR адресации
«Цилиндр — Головка — Сектор» (CHS).
В схеме разделов GPT первый сектор запоминающего устройства
зарезервирован для совместимости с системами на основе BIOS. Это
связано с тем, что некоторые системы могут по-прежнему использовать
прошивку на основе BIOS, но иметь устройство хранения данных с
разделами GPT.
Рисунок 4. Пример файловой системы с GPT
Этот сектор называется Protective MBR. Именно здесь загрузчик первого
уровня будет находиться на диске с разделами MBR.
После этого первого сектора сохраняются структуры данных GPT,
включая заголовок GPT и записи раздела.
В качестве резервной копии записи GPT и заголовок GPT также хранятся
в конце устройства хранения, поэтому их можно восстановить, если
основная копия будет повреждена. Эта резервная копия называется
Secondary GPT.
Файлы.
Файл представляет собой механизм абстракции. Он позволяет хранить
информацию на диске и считывать ее позже. Это должно быть сделано
таким образом, чтобы оградить пользователя от подробностей того, как и
где хранится информация, и как на самом деле работают диски.
Когда процесс создает файл, он присваивает ему имя. Когда процесс
завершается, файл продолжает существовать, и другие процессы могут
получить к нему доступ по его имени.
Точные правила именования файлов несколько различаются от системы
к системе, старые операционные системы допускают строки от одной до
восьми букв в качестве допустимых имен файлов (MS-DOS), многие
файловые системы в современных ОС поддерживают имена длиной до
255 символов.
Некоторые файловые системы различают прописные и строчные буквы
(UNIX), а другие нет (MS_DOS).
Многие операционные системы поддерживают имена файлов из двух
частей, причем две части , разделенные точкой, как и в prog.c.
Часть, следующая за точкой, называется
расширением файла и обычно указывает на тип
файла.
В MS-DOS, например, имена файлов могут содержать от 1 до 8 символов
плюс дополнительное расширение от 1 до 3 символов.
В UNIX размер расширения, если таковое имеется, зависит от
пользователя, и файл может даже иметь два или более расширений, как
в homepage.html.zip, где .html указывает веб-страницу в HTML, а .zip
указывает что файл (homepage.html) был сжат с помощью программы zip.
Некоторые распространенные расширения файлов показаны в Таблице
2.
Расширение
Значение
.bak
Файл резервного копирования
.c
Исходная программа на С
.gif
Изображение формата графического обмена
Compuserve
.hlp
Файл справки
.html
Язык гипертекстовой разметки документов
.jpg
Неподвижное изображение, закодированное в
стандарте JPEG.
.mp3
Музыка, закодированная в аудиоформате MPEG
Layer 3
.mpg
Фильм, закодированный по стандарту MPEG
.o
Объектный файл (еще не связанные выходные
данные компилятора)
.pdf
Файл переносимого формата документа
.ps
Файл в формате PostScript
.tex
Входные данные для программы форматирования
TEX
.txt
Общий текстовый файл
.zip
Сжатый архив
В некоторых системах (например, во всех разновидностях UNIX)
расширения файлов являются просто соглашениями и не применяются
операционной системой.
Файл с именем file.txt может быть каким-то текстовым файлом, но это
имя больше напоминание владельцу, чем передача какой-либо
фактической информации на компьютер.
С другой стороны, компилятор C может на самом деле настаивать на
том, чтобы компилируемые файлы заканчивались на .c, и он может
отказаться их компилировать, если это не так. Однако операционной
системе все равно.
Напротив, Windows знает о расширениях и присваивает им значение.
Пользователи (или процессы) могут регистрировать расширения в
операционной системе и указывать для каждого из них, какая программа
«владеет» этим расширением. Когда пользователь дважды щелкает имя
файла, программа, присвоенная его расширению файла, запускается с
файлом в качестве параметра.
Структура файла.
Файлы могут быть структурированы любым из нескольких способов. Три
общих варианта изображены на Рисунке 5.
Файл на Рисунке 5 а) представляет собой неструктурированную
последовательность байтов. По сути, операционная система не знает
и не заботится о том, что находится в файле. Все, что она видит, - это
байты. Любое значение должно быть определено программами
пользовательского уровня. И UNIX, и Windows используют этот подход.
Пользовательские программы могут помещать в свои файлы все, что
угодно, и называть их так, как им удобно. Операционная система не
помогает, но и не мешает.
Рисунок 5. Тип файловой структуры
Во второй модели на Рисунке 5 б) файл представляет собой
последовательность записей фиксированной длины, каждая из которых
имеет некоторую внутреннюю структуру. Центральное место в
представлении файла как последовательности записей занимает идея о
том, что операция чтения возвращает одну запись, а операция записи
перезаписывает или добавляет одну запись.
Файловая структура третьего типа показана на Рисунке 5 в). В этой
организации файл состоит из дерева записей, не обязательно
одинаковой длины, каждая запись содержит ключевое поле в
фиксированной позиции. Дерево отсортировано по ключевому полю,
чтобы обеспечить быстрый поиск определенного ключа. Основная
операция здесь не в том, чтобы получить «следующую» запись, хотя это
тоже возможно, а в том, чтобы получить запись с определенным ключом.
Этот тип файла явно сильно отличается от неструктурированных потоков
байтов, используемых в UNIX и Windows, и используется на некоторых
больших мэйнфреймах для коммерческой обработки данных.
Типы файлов.
Многие операционные системы поддерживают несколько типов файлов.
UNIX (включая macOS) и Windows, например, имеют обычные файлы и
каталоги. UNIX также имеет символьные и блочные специальные файлы.
Обычные файлы.
Те, которые содержат информацию пользователя.
Каталоги.
Являются системными файлами для поддержания структуры файловой
системы.
Специальные файлы символьного устройства.
Относятся к вводу/выводу и используются для моделирования
последовательных устройств ввода/вывода, таких как терминалы,
принтеры и сети.
Специальные блочные файлы.
Используются для моделирования дисков.
Обычные файлы представляют собой файлы ASCII или двоичные
файлы. ASCII (American standard code for information interchange) —
кодировочная таблица, в которой распространённым печатным и
непечатным символам сопоставлены числовые коды.
Файлы ASCII состоят из строк текста. В некоторых системах каждая
строка заканчивается символом возврата каретки. В других используется
символ перевода строки. Некоторые системы (например, Windows)
используют оба. Линии не обязательно должны быть одинаковой длины.
Большим преимуществом файлов ASCII является то, что их можно
отображать и печатать как есть, а также редактировать в любом
текстовом редакторе. Кроме того, если большое количество программ
использует файлы ASCII для ввода и вывода, легко соединить вывод
одной программы с вводом другой, как в конвейерах оболочки.
Другие файлы являются двоичными, это означает, что они не являются
файлами ASCII. Если распечатать их на принтере, получится непонятный
список, полный случайного мусора. При этом они имеют некоторую
внутреннюю структуру, известную использующим их программам.
Например, на Рисунке 6 а) мы видим простой исполняемый двоичный
файл, взятый из ранней версии UNIX. Хотя технически файл
представляет собой просто последовательность байтов, операционная
система выполнит файл только в том случае, если он имеет правильный
формат.
Он состоит из пяти разделов: заголовок, текст, данные, биты
перемещения и таблица символов.
Заголовок начинается с так называемого магического числа (Magic
number), идентифицирующего файл как исполняемый (для
предотвращения случайного запуска файла не в этом формате). Затем
идут размеры различных частей файла, адрес, с которого начинается
выполнение, и некоторые биты флага. За заголовком идут текст и данные
самой программы. Они загружаются в память и перемещаются с
помощью битов перемещения. Таблица символов используется для
отладки.
Рисунок 6. Примеры файловой структуры
На Рисунке 6 б) второй пример бинарного файла — архив, тоже из UNIX.
Он состоит из набора библиотечных процедур (модулей),
скомпилированных, но не связанных. Каждому из них предшествует
заголовок, сообщающий его имя, дату создания, владельца, код
защиты и размер. Как и в случае с исполняемым файлом, заголовки
модулей заполнены двоичными числами. Вывод их на печать приведет к
полной тарабарщине.
Каждая операционная система должна
распознавать как минимум один тип файлов:
собственный исполняемый файл.
Доступ к файлам.
Ранние операционные системы предоставляли только один вид доступа к
файлам: последовательный доступ. В этих системах процесс мог
читать все байты или записи в файле по порядку, начиная с самого
начала, но не мог пропускать и читать их не по порядку. Однако
последовательные файлы можно было перематывать назад, чтобы их
можно было читать столько раз, сколько необходимо. Последовательные
файлы были удобны, когда носителем информации была магнитная
лента, а не диск.
Когда диски стали использоваться для хранения файлов, стало
возможным читать байты или записи файла не по порядку или получать
доступ к записям по ключу, а не по позиции.
Файлы, байты или записи которых могут быть
прочитаны в любом порядке, называются файлами с
произвольным доступом.
Эти файлы требуются для многих приложений.
Можно использовать два метода для указания, с чего начать чтение.
1. В первом случае каждая операция read задает позицию в файле, с
которой начинается чтение.
2. Во втором предусмотрена специальная операция seek (поиск) для
установки текущей позиции. После поиска файл может быть
прочитан последовательно с установленной позиции. Последний
метод используется в UNIX и Windows.
Атрибуты файла.
У каждого файла есть имя и его данные. Кроме того, все операционные
системы также связывают с файлом другую информацию, например дату
и время последнего изменения файла и размер файла. Мы будем
называть эти дополнительные элементы атрибутами файла или
метаданными. Список атрибутов меняется от системы к системе. В
Таблице 3 показаны некоторые варианты, но существуют и другие. Ни в
одной системе нет полного этого списка, но каждый из них присутствует в
какой-то системе.
Таблица 3. Некоторые возможные атрибуты файла.
Атрибут
Защита
Значение
Кто может получить доступ к файлу и каким
образом
Пароль
Пароль, необходимый для доступа к файлу
Создатель
ID пользователя, создавшего файл
Владелец
Текущий владелец
Только для чтения
0 для чтения/записи; 1 только для чтения
Скрытый файл
0 для нормального режима; 1 не
отображать в списках
Системный
0 для обычных файлов; 1 для системного
файла
Архивный
0 для резервного копирования; 1 для
необходимости резервного копирования
ASCII/двоичный
0 для файла ASCII; 1 для двоичного файла
Произвольный доступ
0 только для последовательного доступа; 1
для произвольного доступа
Временный
0 для нормального режима; 1 для удаления
файла при завершении процесса
Блокировка
0 для разблокировки; не ноль для
блокировки
Длина записи
Количество байтов в записи
Ключевая позиция
Смещение ключа в каждой записи
Длина ключа
Количество байтов в ключевом поле
Время создания
Дата и время создания файла
Время последнего
доступа
Дата и время последнего доступа к файлу
Время последнего
изменения
Дата и время последнего изменения файла
Текущий размер
Количество байтов в файле
Максимальный размер
Количество байтов, до которого может
увеличиться файл
Файловые операции.
Файлы существуют для хранения информации и обеспечения ее
последующего извлечения. Различные системы обеспечивают различные
операции, позволяющие хранить и извлекать данные.
Создать(Create).
Создать пустой файл без данных. Цель вызова — объявить о появлении файла
и установить некоторые атрибуты.
Удалить(Delete).
Когда файл больше не нужен, его необходимо удалить, чтобы освободить
место на диске. Для этой цели всегда есть системный вызов.
Открыть(Open).
Прежде чем использовать файл, процесс должен его открыть. Цель этого
вызова — позволить системе получить атрибуты и список дисковых адресов в
основную память для быстрого доступа при последующих вызовах.
Закрыть(Close).
Когда все обращения завершены, атрибуты и дисковые адреса больше не
нужны, файл следует закрыть, чтобы освободить внутреннее табличное
пространство. Многие системы поощряют это, устанавливая максимальное
количество открытых файлов для процессов. Диск записывается блоками, и
закрытие файла приводит к записи последнего блока файла, даже если он
может быть еще не полностью заполнен.
Прочитать(Read).
Данные считываются из файла. Обычно байты исходят из текущей позиции.
Вызывающий должен указать, сколько данных необходимо, а также должен
предоставить буфер для их размещения.
Записать(Write).
Данные снова записываются в файл, обычно в текущую позицию. Если текущая
позиция является концом файла, размер файла увеличивается. Если текущая
позиция находится в середине файла, существующие данные
перезаписываются и теряются навсегда.
Добавить(Append).
Этот вызов является ограниченной формой записи. Он может добавлять
данные только в конец файла. Системы, предоставляющие минимальный
набор системных вызовов, редко имеют функцию append. Но многие системы
предоставляют несколько способов выполнения одной и той же операции, и в
этих системах иногда используется функция append.
Искать(Seek).
Для файлов с произвольным доступом необходим метод, чтобы указать, откуда
брать данные. Одним из распространенных подходов является системный
вызов seek, который перемещает указатель файла в определенное место в
файле. После завершения этого вызова данные могут быть прочитаны или
записаны в эту позицию.
Получить атрибуты(Get attributes).
Процессам часто необходимо читать атрибуты файлов для выполнения своей
работы.
Установить атрибуты(Set attributes).
Некоторые атрибуты устанавливаются пользователем и могут быть изменены
после создания файла.
Переименовать(Rename).
Часто бывает, что пользователю нужно изменить имя существующего файла.
Данный системный вызов делает это возможным. Это не всегда строго
необходимо, потому что обычно файл можно скопировать в файл с новым
именем, а старый потом удалить.
Каталоги.
Одноуровневые системы каталогов.
Простейшей формой системы каталогов является наличие одного
каталога, содержащего все файлы. Иногда его называют корневым
каталогом, даже если он единственный. На ранних персональных
компьютерах эта система была распространена отчасти потому, что был
только один пользователь.
Пример системы с одним каталогом приведен на Рисунке 7. Здесь
каталог содержит четыре файла. Преимуществом этой схемы является
ее простота и возможность быстрого поиска файлов — в конце концов,
искать можно только в одном месте. Иногда он все еще используется на
простых встроенных устройствах, таких как цифровые камеры и
некоторые портативные музыкальные плееры.
Рисунок 7. Одноуровневый каталог
Иерархические системы каталогов.
Одного уровня достаточно для очень простых специализированных
приложений, но для современных пользователей с тысячами файлов
было бы невозможно что-либо найти, если бы все файлы находились в
одном каталоге.
Нужна иерархия - дерево каталогов. При таком подходе каталогов может
быть столько, сколько необходимо для естественной группировки
файлов. Кроме того, если несколько пользователей совместно
используют общий файловый сервер, как это имеет место во многих
корпоративных сетях, каждый пользователь может иметь собственный
корневой каталог для своей собственной иерархии. Этот подход показан
на Рисунке 8. Здесь каталоги A, B и C, содержащиеся в корневом
каталоге, принадлежат разным пользователям, двое из которых создали
подкаталоги для проектов, над которыми они работают.
Рисунок 8. Иерархическая система каталогов
Возможность создавать произвольное количество подкаталогов
предоставляет пользователям мощный инструмент структурирования для
организации своей работы. По этой причине почти все современные
файловые системы организованы таким образом.
Имена путей.
Когда файловая система организована в виде дерева каталогов,
необходим какой-то способ указания имен файлов. Обычно используются
два различных метода.
1. В первом методе каждому файлу дается абсолютный путь,
состоящий из пути от корневого каталога до файла. Например, путь
/home/alex/letter означает, что корневой каталог содержит
подкаталог home, который, в свою очередь, содержит подкаталог
alex, имеющий файл letter. Абсолютные пути всегда начинаются с
корневого каталога и уникальны. В UNIX компоненты пути
разделяются символом /. В Windows разделителем является \.
Таким образом, одно и то же имя пути будет записано в этих
системах следующим образом:
Windows \home\alex\letter
UNIX /home/alex/letter
Независимо от того, какой символ используется, если первый
символ имени пути является разделителем, то путь является
абсолютным.
2. Другой вид имени -- это относительный путь. Используется в
сочетании с концепцией рабочего каталога (также называемого
текущим каталогом). Пользователь может назначить один каталог
текущим рабочим каталогом, и в этом случае все пути, не
начинающиеся с корневого каталога, берутся относительно
рабочего. Например, если текущий рабочий каталог — /home/alex ,
то на файл, абсолютный путь которого — /home/alex/letter, можно
ссылаться просто как letter.
Другими словами, команда UNIX cp /home/alex/letter
/home/alex/letter.bak
и команда cp letter letter.bak
сделает то же самое, если рабочий каталог /home/alex.
Относительная форма часто более удобна, но делает то же самое, что и
абсолютная форма.
Тема 13. Система управления
вводом-выводом.
Из этой лекции Вы узнаете о последней основной абстракции
ОС — системе ввода-вывода.
Вы также изучите методы доступа к памяти внешних устройств,
познакомитесь с уровнями программного обеспечения
ввода-вывода, системой обработки прерываний и исключений.
Система ввода-вывода.
В дополнение к предоставлению абстракций, таких как процессы,
адресные пространства и файлы, операционная система также
управляет всеми устройствами ввода-вывода компьютера.
Она должна выдавать команды устройствам, перехватывать
прерывания и обрабатывать ошибки.
Операционная система также должна обеспечивать простой и удобный в
использовании интерфейс между устройствами и остальной частью
системы. Этот интерфейс должен быть одинаковым для всех устройств
(независимо от их вида).
Рисунок 1. Монитор, клавиатура, мышь, принтер, звуковые колонки — все это внешние устройства
компьютера
Код ввода-вывода представляет собой значительную часть всей
операционной системы.
Устройства ввода-вывода.
Устройства ввода-вывода можно условно разделить на три категории:
Блочные устройства ввода/вывода.
Жесткие диски,
диски Blu-ray,
USB-накопители.
Символьные устройства ввода/вывода.
Принтеры,
сетевые интерфейсы,
мыши.
Другие устройства ввода/вывода.
Часы,
сенсорные экраны,
экраны memory-mapped.
Блочное устройство — это такое устройство, которое хранит
информацию в блоках фиксированного размера, каждый из которых
имеет собственный адрес. Стандартные размеры блоков находятся в
диапазоне от 512 до 65 536 байт. Все переводы осуществляются в
единицах одного или нескольких полных (последовательных) блоков.
Жесткие диски, диски Blu-ray и USB-накопители являются
распространенными блочными устройствами.
Существенным свойством блочного устройства
является возможность чтения или записи каждого
блока независимо от всех остальных.
Другой тип устройства ввода-вывода — это символьное устройство.
Символьное устройство доставляет или принимает поток символов
независимо от какой-либо блочной структуры. Оно не адресуемое и не
имеет операции поиска. Принтеры, сетевые интерфейсы, мыши и
большинство других устройств, не похожих на диски, можно
рассматривать как символьные устройства.
В третью группу отнесем устройства, которые не подходят под
классификацию "блочные/символьные". Часы, например, не имеют
блочной адресации. И они не генерируют и не принимают потоки
символов. Все, что они делают, это вызывают прерывания через четко
определенные промежутки времени. Экраны с отображением памяти и
сенсором тоже не подходят для этой модели.
Устройства ввода-вывода охватывают огромный диапазон скоростей, что
оказывает значительное давление на программное обеспечение. Ведь
необходимо обеспечить хорошую производительность в разных
диапазонах скоростей передачи данных.
В Таблице 1 показаны скорости передачи данных некоторых
распространенных устройств. Большинство из них имеют тенденцию
становиться быстрее с течением времени.
Таблица 1. Общие скорости передачи данных внешних устройств
Устройство
Скорость передачи данных
Клавиатура
10 байт/сек
Модем 56K
7 КБ/сек
Сканер с разрешением 300 dpi
1 МБ/сек
Беспроводная связь 802.11n
37,5 МБ/сек
USB 2.0
60 МБ/сек
Гигабитный Ethernet
125 МБ/сек
Дисковод SATA 3
600 МБ/сек
USB 3.0
625 МБ/сек
SSD диск
До 3500 МБ/сек
PCIe 3.0
8000 МБ/сек
Контроллеры устройств.
Блоки ввода-вывода часто состоят из механического компонента и
электронного компонента. Их можно разделить на две части, чтобы
обеспечить более модульную и общую конструкцию. Электронный
компонент называется контроллером устройства или адаптером.
На плате контроллера обычно имеется разъем, в который можно
подключить кабель, ведущий к самому устройству. Многие контроллеры
могут работать с двумя, четырьмя или даже восемью одинаковыми
устройствами. Если интерфейс между контроллером и устройством
является стандартным интерфейсом, либо официальным стандартом
ANSI, IEEE или ISO, либо стандартом де-факто, то компании могут
производить контроллеры или устройства, соответствующие этому
интерфейсу. Например, многие компании производят дисководы,
соответствующие интерфейсам SATA, SCSI, USB, Thunderbolt или
FireWire (IEEE 1394).
Интерфейс между контроллером и устройством часто является очень
низкоуровневым. Например, диск может быть отформатирован с 2 000
000 секторов по 512 байт на дорожку.
Однако на самом деле с накопителя выходит
последовательный битовой поток.
Задача контроллера состоит в том, чтобы преобразовать
последовательный поток битов в блок байтов и выполнить любую
необходимую коррекцию ошибок. Блок байтов обычно сначала
собирается, бит за битом, в буфере внутри контроллера. После проверки
контрольной суммы и объявления блока безошибочным его можно
скопировать в оперативную память.
Ввод-вывод с отображением памяти.
Каждый контроллер имеет несколько регистров, которые используются
для связи с ЦП.
Записывая в эти регистры, операционная система может дать команду
устройству доставлять данные, принимать данные, включаться или
выключаться, или иным образом выполнять какое-либо действие.
Читая данные из этих регистров, операционная система может узнать, в
каком состоянии находится устройство, готово ли оно принять новую
команду и т. д.
В дополнение к управляющим регистрам многие устройства имеют буфер
данных, который операционная система может читать и записывать.
Например, обычный способ для компьютеров отображать пиксели на
экране — это иметь видеопамять, которая в основном представляет
собой просто буфер данных, доступный для записи программ или
операционной системы.
ЦП взаимодействует с регистрами управления и с буферами данных
устройства, отображая все регистры управления в пространство памяти,
как показано на Рисунке 2.
Каждому управляющему регистру назначается уникальный адрес памяти,
которому не назначена память. Эта система называется
вводом-выводом с отображением памяти. В большинстве систем
назначенные адреса находятся в верхней части адресного пространства
или около него. Гибридная схема с отображаемыми в память буферами
данных ввода-вывода и отдельными портами ввода-вывода для
управляющих регистров показана на Рисунке 2 б).
x86 использует эту архитектуру с адресами от 640K до 1M-1,
зарезервированными для буферов данных устройств совместимых с IBM
PC, в дополнение к портам ввода-вывода от 0 до 64K-1.
Рисунок 2. Схемы отображения памяти
Если для чтения и записи регистров управления устройством требуются
специальные команды ввода-вывода, доступ к ним требует
использования ассемблерного кода, поскольку в C или C++ невозможно
выполнить команду IN или OUT. Вызов такой процедуры увеличивает
нагрузку на управление вводом-выводом.
Напротив, при вводе-выводе с отображением в память регистры
управления устройством являются просто переменными в памяти и могут
быть адресованы в C так же, как и любые другие переменные.
С вводом-выводом, отображаемым в память,
драйвер устройства ввода-вывода может быть
полностью написан на C. Без ввода-вывода,
отображаемого в память, требуется некоторый
ассемблерный код.
Прямой доступ к памяти.
ЦП должен обращаться к контроллерам устройств для обмена данными с
ними. Он может запрашивать данные у контроллера ввода-вывода по
одному байту за раз, но это тратит впустую время процессора, поэтому
часто используется другая схема, называемая DMA (прямой доступ к
памяти), как показано на Рисунке 3.
Рисунок 3. Операция передачи DMA
1. ЦП программирует контроллер DMA.
Сначала ЦП программирует контроллер DMA, устанавливая его
регистры, чтобы он знал, что куда передавать. Он также выдает команду
контроллеру диска, говорящую ему считать данные с диска во
внутренний буфер и проверить контрольную сумму. Когда допустимые
данные находятся в буфере контроллера диска, может начаться прямой
доступ к памяти.
Вызов прерывания после окончания передачи.
Контроллер DMA увеличивает используемый адрес памяти и уменьшает
количество байтов. Если счетчик байтов по-прежнему больше О, шаги со
2 по 4 повторяются до тех пор, пока счетчик не достигнет О. В это время
контроллер DMA прерывает ЦП, чтобы сообщить ему, что передача
завершена.
2. DMA запрашивает передачу в память.
Контроллер DMA инициирует передачу, посылая по шине запрос на
чтение дисковому контроллеру. Этот запрос на чтение выглядит как
любой другой запрос на чтение, и контроллер диска не знает, пришел ли
он от ЦП или от контроллера DMA. Как правило, адрес памяти для
записи находится на адресных линиях шины, поэтому, когда контроллер
диска извлекает следующее слово из своего внутреннего буфера, он
знает, куда его записать.
3. Данные передаются.
Запись в память - еще один стандартный цикл шины.
4. Подтверждение.
Когда запись завершена, контроллер диска отправляет сигнал
подтверждения на контроллер DMA также по шине.
Прерывания ввода-вывода.
В типичной системе персонального компьютера структура прерывания
показана на Рисунке 4. Когда устройство ввода-вывода завершает
возложенную на него работу, оно вызывает прерывание (при условии, что
прерывания разрешены операционной системой). Он делает это путем
подачи сигнала на линию шины, которая ему назначена. Этот сигнал
обнаруживается микросхемой контроллера прерываний на материнской
плате, которая затем решает, что делать.
Рисунок 4. Схема прерывания ввода-вывода
Если никаких других прерываний не ожидается, контроллер прерываний
немедленно обрабатывает его.
Однако, если выполняется другое прерывание или другое устройство
сделало одновременный запрос на линии запроса прерывания с более
высоким приоритетом на шине, это устройство на данный момент просто
игнорируется. В этом случае контроллер прерываний продолжает
подавать сигнал прерывания на шину до тех пор, пока не будет обслужен
ЦП.
Чтобы обработать прерывание, контроллер помещает число в адресные
строки, указывая, какое устройство требует внимания, и выдает сигнал
прерывания ЦП.
Драйверы устройств.
Программные уровни ввода-вывода.
Программное обеспечение ввода-вывода обычно состоит из четырех
уровней, как показано на Рисунке 5. Каждый уровень имеет четко
определенную функцию для выполнения и четко определенный
интерфейс со смежными уровнями. Функциональность и интерфейсы
различаются от системы к системе.
Рисунок 5. Программные уровни ввода/вывода
Программное обеспечение ввода-вывода.
Независимость от устройств.
Ключевой концепцией разработки программного обеспечения
ввода-вывода является независимость от устройств. Это означает, что
мы должны иметь возможность писать программы, которые могут
получить доступ к любому устройству ввода-вывода без необходимости
указывать устройство заранее. Например, программа, которая считывает
файл в качестве входных данных, должна иметь возможность читать
файл на жестком диске, DVD-диске или на USB-накопителе без
необходимости модификации для каждого отдельного устройства.
Цель единообразного именования тесно связана с независимостью
устройств. Имя файла или устройства должно быть просто строкой или
целым числом и никак не зависеть от устройства.
В UNIX все диски могут быть интегрированы в иерархию файловой
системы произвольным образом, поэтому пользователю не нужно знать,
какое имя соответствует какому устройству. Например, USB-накопитель
можно подключить поверх каталога /mnt/backup, чтобы при копировании
файла в /mnt/backup/Tuesday он копировался на USB-накопитель. Таким
образом, все файлы и устройства адресуются одинаково: по имени пути.
Обработка ошибок.
Другой важной концепцией является обработка ошибок. В общем,
ошибки должны обрабатываться как можно ближе к аппаратному
обеспечению. Если контроллер обнаруживает ошибку чтения, он должен
попытаться исправить ошибку сам, если это возможно. Если это
невозможно, драйвер устройства должен справиться с этим, возможно,
просто попытавшись снова прочитать блок.
Во многих случаях устранение ошибок может
быть выполнено прозрачно на низком уровне, при
этом верхние уровни даже не знают об ошибке.
Синхронные и асинхронные передачи.
Две следующие концепции: синхронные (блокирующие) и асинхронные
(управляемые прерываниями) передачи. Большая часть физического
ввода-вывода является асинхронной — ЦП начинает передачу и уходит,
чтобы сделать что-то еще, пока не поступит прерывание.
Пользовательские программы намного легче писать, если операции
ввода-вывода блокируются — после системного вызова чтения
программа автоматически приостанавливается до тех пор, пока данные
не будут доступны в буфере. Операционная система должна сделать
операции, которые фактически управляются прерываниями,
блокирующими для пользовательских программ. Однако некоторым
очень высокопроизводительным приложениям необходимо
контролировать все детали ввода-вывода, поэтому избранные
операционные системы предоставляют им доступ к асинхронному
вводу-выводу.
Буферизация.
Еще одна проблема программного обеспечения ввода-вывода —
буферизация. Часто данные, поступающие с устройства, не могут быть
сохранены непосредственно в месте их конечного назначения. Например,
когда пакет приходит из сети, операционная система не знает, куда его
поместить, пока не сохранит пакет где-нибудь и не проверит его.
Буферизация требует значительных объемов копирования и часто сильно
влияет на производительность ввода-вывода.
Программируемый ввод-вывод.
Рассмотрим пользовательский процесс, который хочет напечатать
восьмизначную строку «ABCDEFGH» на принтере через
последовательный интерфейс. Дисплеи на небольших встроенных
системах иногда работают следующим образом. Программное
обеспечение сначала собирает строку в буфере пользовательского
пространства, как показано на Рисунке 6 а).
Рисунок 6. Этапы печати строки
Сначала данные копируются в ядро. Затем операционная система входит
в замкнутый цикл, выводя символы по одному. Существенным аспектом
программируемого ввода-вывода, ясно показанным на этом Рисунке,
является то, что после вывода символа ЦП непрерывно опрашивает
устройство, чтобы увидеть, готово ли оно принять другой. Такое
поведение часто называют опросом или ожиданием в состоянии
занятости.
Пример части процедуры вывода строки в ядре:
copy_from_user(buffer, p, count);
buffer */
for (i=0; i<count; i++) {
character */
while (*printer_status_reg != READY);
ready */
*printer_data_register = p[i];
character */
}
return_to_user();
/* p is the kernel
/* loop on every
/* loop until
/*output one
Программируемый ввод-вывод прост, но имеет недостаток,
заключающийся в полной загрузке ЦП до тех пор, пока не будут
выполнены все операции ввода-вывода.
Управляемый прерываниями ввод-вывод.
Давайте рассмотрим случай печати на принтере, который не буферизует
символы, а печатает каждый по мере поступления.
Когда выполняется системный вызов для печати строки, буфер
копируется в пространство ядра, как мы показали ранее, и первый
символ копируется на принтер, как только он готов принять его. В этот
момент ЦП вызывает планировщик, и запускается какой-то другой
процесс. Процесс, запросивший строку на печать, блокируется до тех
пор, пока вся строка не будет напечатана.
Когда принтер напечатал символ и готов принять следующий, он
генерирует прерывание. Это прерывание останавливает текущий процесс
и сохраняет его состояние. Затем запускается процедура обслуживания
прерывания принтера. Здесь показана грубая версия этого кода:
copy_from_user(buffer, p, count);
enable_interrupts();
while (*printer_status_reg != READY);
*printer_data_register = p[0];
scheduler();
Ввод-вывод с использованием прямого доступа
к памяти.
Очевидным недостатком ввода-вывода, управляемого прерываниями,
является то, что прерывание возникает для каждого символа.
Прерывания требуют времени, поэтому эта схема тратит определенное
количество процессорного времени. Решением является использование
DMA. Здесь идея состоит в том, чтобы позволить контроллеру DMA
подавать символы на принтер по одному, не беспокоя центральный
процессор. По сути, DMA представляет собой программируемый
ввод-вывод, только всю работу выполняет контроллер DMA, а не
основной ЦП. Эта стратегия требует специального оборудования
(контроллера прямого доступа к памяти), но освобождает ЦП во время
ввода-вывода для выполнения другой работы.
DMA сокращает количество прерываний с одного
на символ до одного на печатаемый буфер.
Если символов много, а прерывания медленные, это может быть
большим улучшением. С другой стороны, контроллер прямого доступа к
памяти обычно намного медленнее основного процессора. Если
DMA-контроллер не способен управлять устройством на полной скорости
или ЦП обычно нечего делать в ожидании прерывания DMA, тогда
ввод-вывод, управляемый прерыванием, или даже программируемый
ввод-вывод может быть лучше.
Тема 14. Компьютерные сети.
В этой лекции Вы изучите модели компьютерных сетей, типы
сетевых устройств и особенности потока данных в сети.
Вы также познакомитесь с протоколами Ethernet, IPv4, IPv6 и
моделью клиент-серверного взаимодействия.
Типы компьютерных сетей.
Компьютерная сеть — это группа компьютеров, соединенных друг с
другом для совместного использования ресурсов. Ресурсами обычно
являются данные, сетевые службы и периферийные устройства. Сетевые
устройства показаны на Рисунке 1.
Рисунок 1. Сетевые устройства
В целом классификация компьютерных сетей состоит из области,
которую они охватывают, и цели, которой они служат.
Персональная сеть (Personal Area Network, PAN), представленная на
рисунке 2, — это компьютерная сеть, которая используется для
соединения и передачи данных между устройствами, расположенными в
частной области, частично или полностью защищенной от внешнего
доступа. Bluetooth и Wi-Fi являются наиболее распространенными
коммуникационными технологиями, используемыми для соединения
устройств в PAN. Часто PAN также называют домашней сетью (Home
Area Network, HAN).
Рисунок 2. Персональная сеть
Локальная сеть (LAN) — это компьютерная сеть, которая соединяет два
или более компьютеров в локальной области, например, в комнате, на
этаже или даже в здании.
В локальной сети обычно применяется
центральное устройство, которое использует витую
пару, коаксиальный или оптоволоконный кабель в
качестве сетевой среды для соединения
компьютеров.
В отличие от локальной сети, городская сеть (Metropolitan Area Network,
MAN) представляет собой группу локальных сетей, соединенных между
собой в пределах географических границ города (Рисунок 3). В
настоящее время для соединения локальных сетей и маршрутизации
трафика между ними используются гигабитные коммутаторы уровня 3 и
оптоволокно.
Рисунок 3. Городская сеть
В отличие от MAN, глобальная сеть (Wide Area Network, WAN)
представляет собой компьютерную сеть, охватывающую обширную
географическую область с использованием выделенных
телекоммуникационных линий, таких как телефонные линии, выделенные
линии или спутники. Глобальные сети охватывают большие области и
поэтому не имеют географических ограничений. Интернет — лучший
пример глобальной сети.
Рисунок 4. Глобальная сеть
Инфраструктура компьютерной сети.
Путь сообщения от источника к получателю может быть простым, как
один кабель, соединяющий один компьютер с другим, или сложным, как
сеть, которая буквально охватывает весь земной шар. Эта сетевая
инфраструктура является платформой, поддерживающей сеть. Она
обеспечивает стабильный и надежный канал, по которому может
осуществляться наша связь.
Сетевая инфраструктура содержит три категории аппаратных
компонентов, как показано на Рисунке 5:
Рисунок 5. Категории сетевых компонентов
Сетевые носители.
После того, как данные преобразованы в серию битов, они должны быть
конвертированы в сигналы, которые могут быть отправлены по сети к
месту назначения.
Носитель относится к физической среде, по
которой передаются сигналы.
Примерами носителя являются медный провод, оптоволоконный
кабель и электромагнитные волны, распространяющиеся по воздуху,
как показано на Рисунке 6.
Рисунок 6. Примеры сетевых носителей
Сигнал состоит из электрических или оптических шаблонов, которые
передаются от одного подключенного устройства к другому. Эти паттерны
представляют собой цифровые биты (то есть данные) и перемещаются
по среде от источника к месту назначения либо в виде серии импульсов
электричества, импульсов света или радиоволн.
Сигналы могут преобразовываться много раз, прежде чем в конечном
итоге достигнут пункта назначения, поскольку соответствующие носители
меняются между источником и пунктом назначения.
В сетях используются три распространенных метода передачи
сигналов:
Электрические сигналы.
Передача осуществляется путем представления данных в виде
электрических импульсов по медному проводу.
Оптические сигналы.
Передача осуществляется путем преобразования электрических
сигналов в световые импульсы.
Беспроводные сигналы.
Передача осуществляется с помощью инфракрасных, микроволновых
или радиоволн по воздуху.
В большинстве домов и малых предприятий сетевые сигналы
передаются по медным проводам (кабелям) или беспроводным
соединениям с поддержкой Wi-Fi. В более крупных сетях используются
оптоволоконные кабели для надежной передачи сигналов на большие
расстояния.
Конечные устройства.
Сетевые устройства, с которыми люди больше всего знакомы,
называются конечными устройствами или хостами. Эти устройства
образуют интерфейс между пользователями и базовой сетью связи.
Вот некоторые примеры конечных устройств:
● Компьютеры (рабочие станции, ноутбуки, файловые серверы,
веб-серверы).
● Сетевые принтеры.
● Телефоны и оборудование для телеконференций.
● Камеры наблюдения.
● Мобильные устройства (например, смартфоны, планшеты, КПК,
беспроводные считыватели дебетовых/кредитных карт и сканеры
штрих-кодов).
Конечное устройство (или хост) является либо источником, либо
получателем сообщения, передаваемого по сети. Для однозначной
идентификации хостов используются адреса. Когда хост инициирует
связь, он использует адрес хоста назначения, чтобы указать, куда должно
быть отправлено сообщение.
Промежуточные устройства.
По мере развития коммутаторов и маршрутизаторов различие между ними может
показаться размытым.
Остается одно простое различие: коммутаторы LAN обеспечивают подключение к
локальным сетям организации, в то время как маршрутизаторы соединяют локальные
сети и необходимы в среде глобальной сети (WAN).
Другими словами, коммутатор используется для подключения устройств в
одной сети. Маршрутизатор используется для соединения нескольких сетей
друг с другом.
Коммутатор отправляет данные только на одно устройство, для которого он
предназначен (это может быть другой коммутатор, маршрутизатор или компьютер
пользователя), а не в сети из нескольких устройств.
Маршрутизаторы выбирают пути, по которым пакеты данных проходят через сети и
достигают пунктов назначения. Маршрутизаторы делают это путем соединения с
различными сетями и пересылки данных от сети к сети – включая локальные сети,
глобальные сети (WAN), или автономные системы, которые представляют собой
крупные сети, составляющие Интернет (Рисунок 7).
Рисунок 7. Место маршрутизатора и коммутатора в потоке трафика.
Пропускная способность носителей.
Для просмотра фильмов или многопользовательских игр требуется
надежное и быстрое подключение. Для поддержки этих
«широкополосных» приложений сети должны быть способны передавать
и принимать биты с очень высокой скоростью.
Различные физические носители поддерживают передачу битов с разной
скоростью. Скорость передачи данных обычно обсуждается в терминах
пропускной способности и производительности.
Пропускная способность — это способность носителя передавать
данные. Цифровая пропускная способность измеряет количество данных,
которые могут передаваться из одного места в другое за заданный
промежуток времени. Пропускная способность обычно измеряется
количеством битов, которые (теоретически) могут быть отправлены по
среде за секунду. Основные единицы измерения пропускной
способности:
● Тысячи бит в секунду (кбит/с).
● Миллионы бит в секунду (Мбит/с).
● Миллиарды бит в секунду (Гбит/с).
Физические свойства среды, современные
технологии и законы физики — все это играет роль в
определении доступной пропускной способности.
В таблице показаны наиболее часто используемые носители с их
пропускной способностью.
Таблица 1. Пропускная способность носителя
Носитель
Пропускная способность
Медь
10 Мбит/с – 10 Гбит/с
Волокно
от 1 Гбит/с до сотен Гбит/с
Wi-Fi
11 Мбит/с — 750 Мбит/с
Производительность.
Как и пропускная способность, производительность является мерой
передачи битов через среду в течение заданного периода времени.
Однако из-за ряда факторов производительность обычно не
соответствует указанной пропускной способности. На
производительность влияют многие факторы, в том числе:
● Объем данных, отправляемых и получаемых по соединению.
● Типы передаваемых данных.
● Задержка, создаваемая количеством сетевых устройств,
обнаруженных между источником и получателем.
Под задержкой понимается количество времени,
включая время ожидания, в течение которого данные
перемещаются из одной точки в другую.
Измерения производительности не учитывают достоверность или
полезность передаваемых и принимаемых битов. Многие сообщения,
полученные через сеть, не предназначены для конкретных
пользовательских приложений. Примером могут служить управляющие
сообщения, регулирующие трафик сети и исправляющие ошибки.
В объединенной сети или сети с несколькими сегментами
производительность не может быть выше, чем у самого медленного
звена на пути от передающего устройства к принимающему устройству.
Даже если все или большинство сегментов имеют высокую пропускную
способность, потребуется только один сегмент с более низкой
пропускной способностью, чтобы вызвать замедление
производительности всей сети.
Существует множество онлайн-тестов скорости, которые могут показать
производительность интернет-соединения.
Серверы и клиенты.
Все компьютеры, подключенные к сети, которые непосредственно
участвуют в сетевой связи, классифицируются как хосты. Хосты могут
отправлять и получать сообщения в сети.
В современных сетях компьютерные хосты могут
действовать как клиент, сервер или и то, и другое.
Какую роль играет компьютер, определяет
программное обеспечение, установленное на нем.
Серверы — это хосты, на которых установлено программное
обеспечение, позволяющее предоставлять им информацию, такую как
электронная почта или веб-страницы, другим хостам в сети.
Для каждой службы требуется отдельное серверное ПО. Например, хосту
требуется программное обеспечение веб-сервера для предоставления
веб-служб в сети.
Клиенты — это хосты компьютеров, на которых установлено
программное обеспечение, позволяющее им запрашивать и отображать
информацию, полученную от сервера. Примером клиентского ПО
является веб-браузер, такой как Edge, Safari, Mozilla Firefox или Chrome.
Модель компьютерной сети.
Модель взаимодействия открытых систем (OSI).
Первоначальные две отдельные сетевые модели, задуманные в 1970-х
годах, когда компьютерные сети только начинали развиваться, были
объединены в 1983 году и опубликованы в 1984 году для создания
модели взаимодействия открытых систем (OSI).
В модели используются слои, чтобы дать визуальное описание того, что
происходит с конкретной сетевой системой. Это может помочь сетевым
администраторам сузить круг проблем (это физическая проблема или
что-то связанное с приложением?), а также программистам (при
разработке приложения с какими другими уровнями оно должно
работать?).
Поставщики технических средств, продающие новые продукты, часто
обращаются к модели OSI, чтобы помочь клиентам понять, с каким
уровнем работают их продукты и работают ли они «по всему стеку».
Рисунок 8. Модели OSI и TCP/IP
Большинство описаний модели OSI идет сверху вниз, а числа идут от
уровня 7 до уровня 1.
Уровень 7 — Прикладной.
Прикладной уровень (Application, уровень приложения) находится вверху
— это то, что видят большинство пользователей. В модели OSI это
уровень, который является «ближайшим к конечному пользователю». Он
получает информацию непосредственно от пользователей и отображает
поступающие данные пользователю. Сами приложения не находятся на
прикладном уровне. Вместо этого уровень облегчает связь через нижние
уровни, чтобы установить соединения с приложениями на другом конце.
Веб-браузеры (Google Chrome, Firefox, Safari и т. д.), TelNet и FTP
являются примерами связи, основанной на уровне 7.
Уровень 6 — Представления.
Представительский уровень (Presentation) — это подготовка или
преобразование формата приложения в сетевой формат или из сетевого
форматирования в формат приложения. Другими словами, уровень
«представляет» данные для приложения или сети. Хорошим примером
этого является шифрование и дешифрование данных для безопасной
передачи.
Уровень 5 — Сеансовый.
Когда двум устройствам, компьютерам или серверам необходимо
«общаться» друг с другом, необходимо создать сеанс, и это делается на
сеансовом (Session, сессионном) уровне. Функции на этом уровне
включают настройку, координацию (например, как долго система должна
ждать ответа) и завершение между приложениями на каждом конце
сеанса.
Уровень 4 – Транспортный.
Транспортный (Transport) уровень занимается координацией передачи
данных между конечными системами и хостами. Сколько данных для
отправки, по какой ставке, где они идут, и т.д. Самый известный пример
транспортного уровня - это протокол управления передачей (TCP),
который построен на вершине протокола Интернет (IP), широко
известный как TCP/IP . TCP и UDP номер порта работает на уровне 4, в
то время как IP - адрес будет работать на уровне 3, сетевой уровень.
Уровень 3 — Сетевой.
Здесь, на сетевом (Network) уровне, вы найдете большую часть функций
маршрутизатора. Этот уровень отвечает за пересылку пакетов, включая
маршрутизацию через разные маршрутизаторы. Возможно, вы знаете,
что ваш компьютер хочет подключиться к серверу в другой стране, но
есть миллионы разных путей. Маршрутизаторы на этом уровне помогают
сделать это эффективно.
IPv4 и IPv6 являются примерами протоколов уровня 3.
Уровень 2 – Канальный.
Канальный (Data Link) уровень обеспечивает передачу данных между
узлами (между двумя напрямую подключенными узлами), а также
обрабатывает исправление ошибок на физическом уровне. Здесь также
существуют два подуровня — уровень управления доступом к среде
(MAC) и уровень управления логическим каналом (LLC). В мире сетей
большинство коммутаторов работают на уровне 2. Некоторые
коммутаторы также работают на уровне 3, чтобы поддерживать
виртуальные локальные сети, которые могут охватывать более одной
подсети коммутатора, что требует возможностей маршрутизации.
Ethernet является примером протокола уровня 2.
Уровень 1 — Физический.
Внизу у нас есть физический (Physical) уровень — электрическое и
физическое представление системы. Этот уровень может включать в
себя все - от типа кабеля, радиочастотного канала (как в беспроводных
системах 802.11) до расположения контактов, напряжения и других
физических требований.
Сетевой поток данных.
В поисках более отказоустойчивой модели сети разработчики Интернета
обратили внимание на сети с коммутацией пакетов. В этом типе сети
одно сообщение может быть разделено на несколько отдельных блоков
сообщений, каждый из которых содержит адресную информацию,
идентифицирующую начальную точку и пункт назначения (Рисунок 9).
Пакеты - это блоки сообщений со встроенной
информацией, которые могут передаваться по сети
различными путями, а затем собираться в месте
получения в исходное сообщение.
Сами устройства в сети, как правило, не знают о содержимом отдельных
пакетов. Им видны только исходный и конечный адреса. Каждый пакет
отправляется независимо из одного места в другое.
В каждой промежуточной точке принимается решение о маршрутизации,
то есть о выборе пути, который будет использоваться для отправки
пакетов к месту назначения.
Рисунок 9. Поток данных сети с коммутацией пакетов
Если ранее использовавшийся путь больше недоступен, функция
маршрутизации может динамически выбирать следующий наилучший
доступный путь. Поскольку сообщения отправляются по частям, а не как
целое сообщение, некоторые пакеты могут быть потеряны, и в этом
случае их можно повторно отправить к месту назначения по другим
маршрутам.
Во многих случаях целевое устройство не знает,
произошли ли ошибки или изменения маршрута.
В сети с коммутацией пакетов нет необходимости в одном
зарезервированном пути от начала до конца. Любая часть сообщения
может быть отправлена по сети любым доступным путем. Кроме того,
пакеты с частями сообщений из разных источников могут передаваться
по сети одновременно.
Благодаря реализации метода динамического использования резервных
маршрутов без вмешательства пользователя Интернет стал
отказоустойчивым видом связи.
Инкапсуляция данных.
Всякий раз, когда мы отправляем данные с одного узла на другой в
компьютерной сети, данные инкапсулируются на стороне отправителя и
деинкапсулируются на стороне получателя.
Инкапсуляция данных на различных уровнях реализации модели OSI
добавляет к передаче данных разнообразные функциональные
возможности.
Наиболее важной функцией, которую она добавляет, является
безопасность и надежность передачи данных между двумя узлами в
сети.
Инкапсуляция данных — это процесс, в котором к элементу данных
добавляется некоторая дополнительная информация, чтобы добавить к
нему некоторые функции. Инкапсуляция данных добавляет информацию
о протоколе к данным, чтобы передача данных могла происходить
надлежащим образом. Эта информация может быть добавлена либо в
верхний, либо в нижний колонтитул данных (Рисунке 10).
Данные инкапсулируются на стороне отправителя, начиная с прикладного
уровня и заканчивая физическим уровнем.
Каждый уровень берет инкапсулированные
данные из предыдущего уровня и добавляет
дополнительную информацию для их инкапсуляции и
некоторые дополнительные функции с данными.
Эти функции могут включать в себя правильную последовательность
данных, обнаружение и контроль ошибок, управление потоком, контроль
перегрузки, информацию о маршрутизации и т. д.
Рисунок 10. Процесс инкапсуляции и деинкапсуляции
Деинкапсуляция данных — это обратный процесс инкапсуляции
данных. Инкапсулированная информация удаляется из полученных
данных для получения исходных. Этот процесс происходит на стороне
получателя. Данные деинкапсулируются на том же уровне на стороне
получателя, что и инкапсулированный уровень на стороне отправителя.
Добавленная информация заголовка и трейлера удаляется из данных в
этом процессе.
Адреса.
Сетевой уровень (3) и уровень канала передачи данных (2) отвечают за
доставку данных от исходного устройства к целевому устройству. Как
показано на Рисунке 11, протоколы обоих уровней содержат адрес
отправителя и получателя, но их адреса имеют разное назначение:
● Адреса источника и получателя на сетевом уровне отвечают за
доставку IP-пакета от исходного источника к конечному
получателю, который может находиться в той же или удаленной
сети.
● Адреса источника и назначения на уровне канала передачи данных
отвечают за доставку фрейма канала передачи данных с одной
карты сетевого интерфейса (Network Interface Card, NIC) на другую
карту NIC в той же сети.
Рисунок 11. Адресация на разных уровнях
Ethernet.
Ethernet — это технология, разработанная Xerox PARC в 1973 и 1974
годах для поддержки локальных сетей. С тех пор стандарт был расширен
и теперь включает в себя целое семейство технологий, поддерживающих
различные сетевые архитектуры и топологии, как часть рабочей группы
IEEE 802.3, занимающейся поддержкой сетей с использованием
физических соединений и устройств (т. е. не беспроводных).
В локальной сети Ethernet каждое сетевое устройство подключено к
одному и тому же общему носителю.
Протокол CSMA/CD (carrier sense multiple access/collision detection,
множественный доступ с контролем несущей и обнаружением коллизий)
был создан для определения того, как сетевые устройства реагируют,
когда два устройства пытаются использовать канал данных
одновременно и сталкиваются с конфликтом данных.
MAC-адрес (Media Access Control) используется для идентификации
физических исходных и целевых устройств (NIC) в сегменте локальной
сети. MAC-адресация обеспечивает метод идентификации
устройства на канальном уровне модели OSI.
MAC-адрес Ethernet представляет собой 48-битный адрес, выраженный
12 шестнадцатеричными цифрами, как показано на Рисунке 12.
Поскольку байт равен 8 битам, мы также можем сказать, что MAC-адрес
имеет длину 6 байтов.
Пример: 00-60-2F-3A-07-BC, 00:60:2F:3A:07:BC.
Рисунок 12. MAC-адрес сетевого устройства
Все MAC-адреса должны быть уникальными для
устройства Ethernet или интерфейса Ethernet.
Для этого все поставщики, продающие Ethernet-устройства, должны
зарегистрироваться в IEEE*, чтобы получить уникальный 6-значный
шестнадцатеричный (то есть 24-битный или 3-байтовый) код,
называемый уникальным идентификатором организации (OUI).
* - Institute of Electrical and Electronics Engineers (I triple E — «Ай трипл и»)
— международная некоммерческая ассоциация специалистов в области
техники, мировой лидер в области разработки стандартов по
радиоэлектронике, электротехнике и аппаратному обеспечению
вычислительных систем и сетей.
IP-протоколы.
IPv4.
В 1983 году протокол IPv4 впервые был использован в Сети управления
перспективными исследованиями и разработками (ARPANET),
предшественнице современного Интернета. IPv4 по-прежнему является
наиболее распространенным протоколом сетевого уровня и широко
используется в Интернете.
Пакет IPv4 состоит из двух частей:
● IP-заголовок : определяет характеристики пакета;
● Полезная нагрузка: содержит информацию о сегменте уровня 4 и
фактические данные.
В свою очередь сам IP-заголовок содержит несколько полей, основными
из которых являются:
● Исходный IP-адрес: содержит 32-битное двоичное значение,
представляющее исходный IP-адрес пакета.
● IP-адрес назначения: содержит 32-битное двоичное значение,
представляющее IP-адрес назначения пакета.
● Протокол: 8-битное двоичное значение, указывающее тип
полезной нагрузки данных, переносимых пакетом, что позволяет
сетевому уровню пересылать данные соответствующему протоколу
более высокого уровня.
● Время жизни (Time To Live, TTL): Содержит 8-битное двоичное
значение, используемое для ограничения времени жизни пакета.
Отправитель пакета устанавливает начальное значение времени
жизни (TTL), которое уменьшается на единицу при каждой
обработке пакета маршрутизатором. Если значение в поле TTL
уменьшается до нуля, маршрутизатор отбрасывает пакет и
отправляет сообщение о тайм-ауте ICMP (Internet Control Message
Protocol) на исходный IP-адрес. Команда traceroute использует это
поле для определения маршрутов, используемых между
источником и пунктом назначения.
Адрес IPv4 — это 32-разрядный иерархический адрес, состоящий из
сетевой части и хост-части. При определении сетевой части по
сравнению с хост-частью вы должны смотреть на 32-битный поток, как
показано на Рисунке 13.
Рисунок 13. Части IPv4-адреса
Биты в сетевой части адреса должны быть одинаковыми для всех
устройств, находящихся в одной сети. Биты в хост-части адреса
должны быть уникальными, чтобы идентифицировать конкретный хост
в сети. Если два хоста имеют одинаковый битовый шаблон в указанной
сетевой части 32-битного потока, эти два хоста будут находиться в одной
сети.
Маска подсети IPv4 используется, чтобы отличить сетевую часть от
хост-части адреса IPv4. Когда IPv4-адрес назначается устройству, маска
подсети используется для определения сетевого адреса устройства.
Сетевой адрес представляет собой все
устройства в одной сети.
Существуют различные способы отправки (рассылки) сообщений с
исходного устройства:
● Одноадресная отправка
Когда устройство отправляет пакет одному получателю, и IP-адрес
назначения в пакете является одноадресным.
● Широковещательная отправка
Когда устройство отправляет сообщение всем устройствам в сети в
режиме связи “один ко всем”.
● Многоадресная отправка
Когда устройство отправляет сообщение выбранному набору
получателей, которые подписаны на группу многоадресной
рассылки
Исходный IP-адрес может быть только одноадресным, поскольку
пакет может исходить только от одного источника. Это не зависит от того,
является ли IP-адрес назначения одноадресным, широковещательным
или многоадресным.
Шлюз по умолчанию — это устройство, которое направляет трафик из
локальной сети на устройства в удаленных сетях, как показано на
Рисунке 14. Дома или на малых предприятиях шлюз по умолчанию часто
используется для подключения вашей локальной сети к Интернету.
Рисунок 14. Шлюз по умолчанию локальной сети
Если узел отправляет пакет на устройство в другой IP-сети, он должен
перенаправить пакет через промежуточное устройство на шлюз по
умолчанию. Это связано с тем, что хост не хранит информацию о
маршрутизации за пределами локальной сети для доступа к удаленным
адресатам. Напротив, шлюз по умолчанию хранит такую информацию.
Шлюз по умолчанию, который чаще всего является маршрутизатором,
хранит таблицу маршрутизации. Таблица маршрутизации — это файл
данных в ОЗУ, который используется для хранения информации о
маршрутах напрямую подключенных сетей, а также записей об
удаленных сетях, о которых стало известно устройству.
Маршрутизатор использует информацию из
таблицы маршрутизации для определения
наилучшего пути к узлам назначения.
Протокол IPv6.
Адреса IPv6 имеют длину 128 бит и записываются в виде строки
шестнадцатеричных значений. Каждые четыре бита представлены одной
шестнадцатеричной цифрой; всего 32 шестнадцатеричных значения, как
показано на Рисунке 15.
Адреса IPv6 не чувствительны к регистру и могут быть записаны как в
нижнем, так и в верхнем регистре.
Рисунок 15. Структура адреса IPv6
Как и в случае с IPv4, существуют разные типы адресов IPv6. На самом
деле три широкие категории IPv6-адресов:
● Unicast — Адрес индивидуальной рассылки IPv6 однозначно
идентифицирует интерфейс на устройстве с поддержкой IPv6.
● Multicast — Групповой адрес IPv6 используется для отправки
одного пакета IPv6 нескольким адресатам.
● Anycast — Адрес произвольной рассылки IPv6 — это любой адрес
индивидуальной рассылки IPv6, который может быть назначен
нескольким устройствам. Пакет, отправленный на произвольный
адрес, направляется на ближайшее устройство, имеющее этот
адрес. Адреса Anycast выходят за рамки этого курса.
В отличие от IPv4, IPv6 не имеет широковещательного адреса. Однако
существует групповой адрес IPv6 для всех узлов, который по существу
дает тот же результат.
Префикс или сетевая часть в IPv6 называется длиной префикса. Он
представлен в виде косой черты и используется для обозначения сетевой
части адреса IPv6.
Длина префикса может находиться в диапазоне от 0 до 128.
Рекомендуемая длина префикса IPv6 для локальных сетей и
большинства других типов сетей — /64, как показано на Рисунке 16.
Рисунок 16. Пример префикса IPv6
Настоятельно рекомендуется использовать 64-битный идентификатор
интерфейса для большинства сетей. Это связано с тем, что
автоконфигурация адресов без сохранения состояния (StateLess
Address AutoConfiguration, SLAAC) использует 64 бита для
идентификатора интерфейса. Это также упрощает создание подсетей и
управление ими.
Транспортный уровень.
Транспортный уровень (4-ый в модели OSI) отвечает за логическую связь
между приложениями, работающими на разных хостах. Сюда могут
входить такие услуги, как установление временного сеанса между двумя
хостами и надежная передача информации для приложения.
Транспортный уровень не имеет сведений о типе
хоста назначения, типе носителя, по которому должны
перемещаться данные, пути, по которому идут
данные, перегрузке канала или размере сети.
Транспортный уровень включает два протокола:
● Протокол управления передачей (TCP).
● Протокол пользовательских датаграмм (UDP).
TCP считается надежным полнофункциональным протоколом
транспортного уровня, который гарантирует, что все данные будут
доставлены в пункт назначения. TCP включает в себя поля, которые
обеспечивают доставку данных приложения. Эти поля требуют
дополнительной обработки отправляющим и принимающим хостами.
Протокол TCP делит данные на сегменты.
UDP — более простой протокол транспортного уровня, чем TCP. UDP
делит данные на датаграммы, которые также называются сегментами.
Он не обеспечивает надежность и управление потоком, а значит, требует
меньше полей заголовка. Поскольку процессы UDP отправителя и
получателя не должны обеспечивать надежность и управление потоком,
это означает, что датаграммы UDP могут обрабатываться быстрее, чем
сегменты TCP.
Коммуникационный поток TCP и UDP, а также общие сервисы показаны
на Рисунке 17.
Рисунок 17. Коммуникационный поток протоколов TCP и UDP
Сетевые драйверы.
Сетевая подсистема ядра Linux спроектирована
так, чтобы быть полностью независимой от
протокола.
Это относится как к сетевым протоколам (Интернет-протокол IP по
сравнению с IPX или другими протоколами), так и к аппаратным
протоколам (Ethernet по сравнению с token ring и т.д.).
Взаимодействие между сетевым драйвером и ядром правильно работает
с одним сетевым пакетом за раз; это позволяет аккуратно скрыть
проблемы протокола от драйвера и физическую передачу от протокола.
Ядро реализует протоколы вплоть до транспортного уровня, в то время
как протоколы прикладного уровня обычно реализуются в
пользовательском пространстве (HTTP, FTP, SSH и т. д.), как показано на
Рисунке 18.
Рисунок 18. Многоуровневая схема сетевого взаимодействия в ОС
Сетевые интерфейсы — это третий стандартный класс устройств Linux
(после char и block).
Роль сетевого интерфейса в системе аналогична роли смонтированного
блочного устройства.
Блочное устройство регистрирует свои диски и методы в ядре, а затем
«отправляет» и «принимает» блоки по запросу с помощью своей функции
запроса. Точно так же сетевой интерфейс должен зарегистрироваться в
определенных структурах данных ядра, чтобы его можно было вызывать
при обмене пакетами с внешним миром.
Но диск существует в виде специального файла в каталоге /dev, тогда
как сетевой интерфейс не имеет такой точки входа. Также блочные
драйверы работают только в ответ на запросы ядра, тогда как сетевые
драйверы получают пакеты извне асинхронно.
Сетевые драйверы также должны быть готовы поддерживать ряд
административных задач, таких как установка адресов, изменение
параметров передачи и ведение статистики трафика и ошибок.
Сетевой драйвер вставляет структуру данных для каждого вновь
обнаруженного интерфейса в глобальный список сетевых устройств.
Каждый интерфейс описывается элементом структуры net_device,
который определен в <linux/netdevice.h>.
Структура net_device лежит в основе уровня сетевого драйвера и
содержит необходимые данные:
● Глобальная информация — содержит имя устройства, состояние
устройства, указатель на следующее устройство в глобальном
связанном списке и функцию инициализации.
● Информация об оборудовании — содержит низкоуровневую
информацию об оборудовании для относительно простых
устройств.
● Информация об интерфейсе — карты Ethernet могут полагаться
на результат функции ether_setup для большинства этих полей, но
поля flags и dev_addr зависят от устройства и должны быть явно
назначены во время инициализации.
● Методы устройства — те, которые необходимы для
использования интерфейса, а также для реализации более
продвинутых функций, которые не являются строго обязательными.
● Служебные поля — используются интерфейсом для хранения
полезной информации о состоянии.
Клиент-серверное взаимодействие.
Программирование сокетов — это способ соединения двух узлов в сети
для связи друг с другом. Один сокет (на серверном узле) прослушивает
определенный порт по IP-адресу, а другой сокет обращается к нему,
чтобы сформировать соединение. Сервер формирует сокет приемника, в
то время как клиент обращается к серверу.
Этапы коммуникационного процесса несколько различаются для сервера
и клиента, как показано на Рисунке 19.
Рисунок 19. Процесс клиент-серверного взаимодействия
Этапы процесса клиент-серверного взаимодействия:
1. Socket — создает сокет с такими параметрами, как тип протокола.
2. Bind (server) — связывает сокет с адресом и номером порта,
указанными в addr (собственная структура данных).
3. Listen (server) — переводит серверный сокет в пассивный режим,
где он ожидает, когда клиент подойдет к серверу для установления
соединения.
4. Connect (client) — подключает сокет, на который указывает
файловый дескриптор sockfd, к адресу, указанному в addr. Адрес и
порт сервера указаны в addr.
5. Accept — извлекает первый запрос на подключение из очереди
ожидающих подключений для прослушиваемого сокета, sockfd,
создает новый подключенный сокет и возвращает новый файловый
дескриптор, ссылающийся на этот сокет. На этом этапе между
клиентом и сервером устанавливается соединение, и они готовы к
передаче данных.
6. Send / Receive — читает данные с сервера или записывает данные
на сервер.
Тема 15. Безопасность ОС.
В этой лекции Вы познакомитесь с уровнями безопасности
операционной системы.
Вы узнаете, как установить права доступа к файлам и
настроить брандмауэры безопасности в операционных
системах Windows и Linux.
Уровни операционной системы.
Операционные системы можно разделить на несколько отдельных
уровней, каждый из которых имеет свои собственные привилегии. Эта
система известна как защитное кольцо.
Операционная система управляет ресурсами компьютера, такими как
время обработки ЦП и доступ к памяти. Компьютеры часто запускают
несколько программных процессов одновременно, и для этого требуются
разные уровни доступа к ресурсам и оборудованию.
Процессы выполняются в многоуровневых
«кольцах», где каждое кольцо имеет разные права
доступа к ресурсам.
Центральное кольцо имеет наивысшие привилегии, а каждый
последующий уровень имеет пониженный доступ. Обычная реализация
защитного кольца для процессоров x86 состоит из четырех колец,
пронумерованных от 0 до 3 (Рисунок 1).
Рисунок 1. Многоуровневая модель операционной системы
Многоуровневая модель предлагает два основных преимущества.
1. Во-первых, она защищает от сбоев системы. Ошибки в более
высоких кольцах обычно можно исправить. Это связано с тем, что
только кольцо 0 имеет прямой доступ к памяти и ЦП, поэтому в
случае сбоя процесса, работающего во внешнем кольце, его можно
перезапустить без потери данных или возникновения ошибки ЦП.
2. Во-вторых, многоуровневость обеспечивает повышенную
безопасность. Для выполнения команд, требующих большего
доступа к ресурсам, процесс должен запросить разрешения у
операционной системы. Затем ОС может решить, следует ли
удовлетворить запрос или отклонить его. Этот процесс выбора
помогает защитить вашу систему от нежелательного или
злонамеренного поведения.
Кольцо 0 доступно для ядра, которое является центральной частью
большинства операционных систем и может получить доступ ко всему.
Код, работающий здесь, выполняется в режиме ядра. Процессы,
запущенные в режиме ядра, могут повлиять на всю систему; если здесь
что-то пойдет не так, это, вероятно, приведет к отключению системы. Это
кольцо имеет прямой доступ к ЦП и системной памяти, поэтому здесь
будут выполняться любые команды, требующие их использования.
Кольца 1 и 2 имеют особые привилегии, которых нет у кольца 3 (режим
пользователя). Кольцо 1 используется для взаимодействия с
оборудованием, подключенным к вашему компьютеру, и управления им.
Воспроизведение песни через динамики/наушники или отображение
видео на мониторе — вот примеры команд, которые необходимо
выполнить в этом кольце. Кольцо 2 используется для команд, которые
должны взаимодействовать с системным хранилищем, загружая или
сохраняя файлы. Эти виды разрешений называются вводом и выводом,
поскольку они включают перемещение данных в рабочую память (ОЗУ)
или из нее. Например, загрузка документа Word из хранилища будет
происходить в кольце 2. Просмотр и редактирование документа будет
происходить в кольце 3, прикладном уровне.
Кольцо 3, наименее привилегированное кольцо, доступно для
процессов, работающих в пользовательском режиме. Здесь будет
находиться большинство приложений, запущенных на компьютере. Это
кольцо не имеет прямого доступа к ЦП или памяти и, следовательно,
должно передавать любые команды, связанные с ними, для кольца 0.
Безопасность многопользовательской ОС.
Поскольку в многопользовательской ОС к системным ресурсам
одновременно обращаются несколько пользователей, для системных
администраторов очень важно реализовать функции безопасности в
системе. Эти функции могут включать разделение учетных записей,
группы пользователей, роли и разрешения.
Разделение учетных записей — одна из наиболее
важных функций безопасности, которую необходимо
реализовать.
Это жизненно важно для обеспечения защиты, целостности и
конфиденциальности файлов и контента. У каждого пользователя
должна быть своя отдельная учетная запись, предоставляющая им
частную работу и место для хранения в системе. Кроме того, группы
пользователей, роли и разрешения должны быть созданы и назначены
каждому пользователю, чтобы гарантировать, что другие не будут
вмешиваться или удалять работу других пользователей, преднамеренно
или случайно.
Группа пользователей — это группа пользователей или людей со
схожими интересами или работой, имеющих доступ к конкретной
информации, которая может им понадобиться (Рисунок 2).
Роль определяется как назначение прав и правил, которые пользователь
назначает администратору или суперпользователю.
Разрешения включают авторизацию пользователя для доступа к
определенным ресурсам или файлам в определенной компьютерной
системе или сети.
Рисунок 2. Пример иерархии групп и пользователей Windows Active Directory
Установка разрешений для файлов и папок — еще одна хорошая
функция безопасности. Настройки разрешений определяют, кто может
просматривать, редактировать, создавать или удалять файлы и папки в
определенных областях.
Пользователи, имеющие доступ к определенному файлу или папке, могут
делиться файлами или скрывать их от других пользователей, а также
могут предоставлять им возможность вносить изменения.
В ОС Windows пользователь, который может устанавливать и
контролировать эти типы разрешений, известен как «Администратор».
Этот пользователь имеет доступ ко всему контенту в системе и может
читать и изменять что угодно.
В ОС Unix/Linux этот пользователь вызывает учетную запись «root» или
суперпользователя. Эта учетная запись является владельцем или
системным администратором компьютера.
Права доступа к файлам в Linux.
Несмотря на то, что в системах на основе Linux уже встроено много
хороших функций безопасности, при предоставлении локального доступа
может существовать одна очень важная потенциальная уязвимость — это
проблемы, связанные с правами доступа к файлам, возникающие из-за
того, что пользователь не назначает правильные разрешения для
файлов и каталогов.
Каждый файл и каталог имеет три группы разрешений, определяемые
для пользователей:
● владелец — разрешения владельца применяются только к
владельцу файла или каталога, они не влияют на действия других
пользователей.
● группа — разрешения группы применяются только к группе,
которая была назначена для файла или каталога, они не будут
влиять на действия других пользователей.
● все пользователи — разрешения «Все пользователи»
применяются ко всем другим пользователям в системе, это группа
разрешений, за которой вы хотите наблюдать больше всего.
Каждый файл или каталог имеет три основных типа разрешений:
● read — разрешение на чтение относится к способности
пользователя читать содержимое файла.
● write — разрешение на запись относится к возможности
пользователя записывать или изменять файл или каталог.
● execute — разрешение на выполнение влияет на возможность
пользователя выполнять файл или просматривать содержимое
каталога.
Разрешения можно посмотреть в выводе команды «ls -l» в терминале и
при работе в каталоге, в котором находится файл или папка (Рисунок 3).
Рисунок 3. Права доступа к файлам в Linux
●
●
●
●
●
●
Первый символ "File type"— это специальный флаг разрешения,
который может варьироваться.
Следующий набор из трех символов (rwx) предназначен для
разрешений владельца.
Второй набор из трех символов (rwx) предназначен для
разрешений группы.
Третий набор из трех символов (rwx) предназначен для
разрешений «Все пользователи».
После этой группировки целое число/цифра отображает количество
жестких ссылок на файл.
Последняя часть — это назначение владельца и группы в
формате owner:group.
Настройка разрешений.
Разрешения редактируются с помощью команды chmod. Вы можете
назначить разрешения двумя способами:
1) явно,
2) с помощью двоичной ссылки.
chmod a+rw file1
Используются следующие
группы разрешений:
u – Владелец
g – Группа
o – Другие
chmod 740 file1
Установите разрешение,
используя двоичные
ссылки, введя три целых
a – Все пользователи
числа/цифры. Числа
Используемые типы
разрешений:
r – Read
w – Write
x – Execute
представляют собой
двоичное представление
строки rwx.
r=4
w=2
x=1
Возможными операторами
присваивания являются +
(плюс) и – (минус); они
используются, чтобы сообщить
системе, следует ли добавлять
или удалять определенные
разрешения.
Первая цифра представляет
собой разрешение владельца;
второй представляет
разрешения группы; а
последнее число представляет
разрешения для всех
остальных пользователей.
Настройка владельца.
Команда chown, используемая для изменения назначений владельца и
группы, имеет простой синтаксис: chown owner:group filename, поэтому,
чтобы изменить владельца файла1 на пользователя1 и группу на семью,
вы должны ввести chown user1:family file1.
Права доступа к файлам Windows.
NTFS, что означает New Technology File System, является текущей
файловой системой Microsoft для операционной системы Windows.
Разрешения NTFS определяют, кто имеет доступ к файлам или папкам.
Разрешения можно назначать отдельным
пользователям или группам, но лучше всего по
возможности назначать их группам.
Разрешения NTFS задаются в списке управления доступом (Access
Control List, ACL).
Список контроля доступа (ACL) — это список пользователей или групп,
имеющих доступ к определенному объекту. Объект может быть файлом
или папкой. Каждая запись в ACL называется записью управления
доступом (Access Control Entry, ACE).
Пользователи или группы в ACL известны как доверенные лица. Права
доступа NTFS могут разрешать и запрещать доступ или создавать
события аудита.
Чтобы создать, отредактировать или просмотреть списки управления
доступом, щелкните правой кнопкой мыши файл или папку, затем
выберите «Свойства» в отображаемых параметрах, как показано на
Рисунке 4:
Рисунок 4. Пример разрешений для папки Windows
Затем щелкните вкладку «Безопасность», чтобы отобразить список
управления доступом (ACL) для выбранного файла или папки.
В среде Windows существует два типа разрешений:
● Явные: разрешения, которые по умолчанию применяются к
объекту при его создании или в результате действий пользователя.
● Унаследованные: разрешения, которые распространяются на
дочерний объект. Унаследованные разрешения облегчают задачи
управления, связанные с назначением разрешений, и
обеспечивают согласованность между всеми объектами в папке.
По умолчанию все объекты, созданные в одной
папке, наследуют разрешения соответствующей
родительской папки.
Вы можете назначить разрешения NTFS пользователю или группе для
определенной папки и, таким образом, контролировать их уровень
доступа. То, как эти разрешения распространяются на подпапки и их
соответствующие файлы, контролируется наследованием. В Таблице 1
перечислены и описаны все разрешения, которые могут быть разрешены
или запрещены для определенного пользователя или группы.
Таблица 1. Разрешения для папки NTFS.
Разрешение
Описание
Полный контроль
Указывает, есть ли у пользователя или группы все доступные
разрешения для папки.
Изменить
Указывает, может ли пользователь или группа изменять
содержимое папки. Оно более ограничено, чем полный
контроль, поскольку не позволяет пользователям/группам
изменять разрешения или брать на себя ответственность за
указанную папку.
Читать и выполнять
Указывает, может ли пользователь или группа читать данные
в папке и выполнять программы, содержащиеся в этой
папке.
Список содержимого Указывает, может ли пользователь или группа отображать
содержимое папки. Оно не позволяет пользователям/группам
папки
запускать какие-либо программы или читать какие-либо
данные в папке.
Читать
Указывает, может ли пользователь или группа читать данные
в папке. В отличие от «Чтения и выполнения», если в папке
есть исполняемый файл, пользователь или группа не смогут
его запустить.
Записывать
Указывает, может ли пользователь или группа создавать
файлы и папки, записывать данные и атрибуты для папки.
Разрешение на запись подразумевает возможность чтения
всех данных в папке.
Специальные
разрешения
В ТАБЛИЦЕ 3 приведен список и описание специальных
разрешений.
Вы можете назначить разрешения NTFS пользователю или группе для
определенного файла и, таким образом, контролировать их уровень
доступа. В следующей таблице перечислены и описаны все разрешения,
которые могут быть разрешены или запрещены для определенных
пользователей или групп.
Разрешения для файлов NTFS имеют приоритет
над разрешениями для папок NTFS.
Например, если у вас есть доступ к папке, но администратор запрещает
доступ к файлу в этой папке, вы не можете получить доступ к этому
файлу, даже если у вас есть необходимые разрешения для его
родительской папки.
Список прав доступа к файлам NTFS показан в Таблице 2:
Таблица 2. Разрешения для файлов NTFS.
Разрешение
Описание
Полный контроль
Указывает, есть ли у пользователя или группы
все доступные разрешения для файла.
Изменить
Указывает, может ли пользователь или группа
изменять файл. Оно более ограничено, чем
полный контроль, поскольку он не позволяет
пользователям/группам изменять разрешения
или становиться владельцем указанного файла.
Читать и выполнять
Указывает, может ли пользователь или группа
читать содержимое файла и выполнять
программы указанного файла.
Читать
Указывает, может ли пользователь читать
данные файла. В отличие от «Чтения и
выполнения», если рассматриваемый файл
является исполняемым, пользователь или группа
не смогут его запустить
Записывать
Указывает, может ли пользователь или группа
изменять содержимое или, другими словами,
записывать данные в файл. Разрешение на
запись подразумевает возможность чтения всех
данных, содержащихся в файле.
Специальные
разрешения
Обратитесь к следующей таблице за списком и
описанием специальных разрешений.
Специальные разрешения для файла или папки показаны в Таблице 3:
Таблица 3. Специальные разрешения.
Разрешение
Описание
Перейти к
папке/выполнить
файл
Переход к папке позволяет пользователю или
группе получить доступ к ней, вложенной в
дерево, даже если родительские папки в этом
дереве запрещают указанному
пользователю/группе доступ к содержимому
этих папок. Выполнение файла позволяет
пользователю или группе запускать программу.
Список папок/чтение
данных
Список папок позволяет пользователю или
группе видеть объекты (файлы и папки) внутри
папки. Чтение данных позволяет пользователю
или группе открывать и просматривать файл.
Чтение атрибутов
Позволяет пользователю или группе
просматривать основные атрибуты объекта
(только для чтения, системные, архивные,
скрытые).
Чтение расширенных
атрибутов
Позволяет пользователю или группе
просматривать расширенные атрибуты объекта.
Например: резюме, автор, заголовок и т. д. для
документа Word. Эти атрибуты варьируются от
программы к программе.
Создание
файлов/запись
данных
Создание файлов позволяет пользователю или
группе формировать новые объекты в папке.
Запись данных позволяет пользователю или
группе перезаписать существующий файл.
Создать
папки/Добавить
данные
Создание папки позволяет пользователю или
группе формировать вложенные папки.
Добавление данных позволяет пользователю
или группе вносить данные в существующий
файл, но не удалять их в этом файле или сам
файл.
Брандмауэр сетевой безопасности
Linux iptables.
Iptables — это брандмауэр (firewall, файрвол) для Linux. Он будет
отслеживать трафик с сервера и на сервер с помощью таблиц. Эти
таблицы содержат наборы правил, называемых цепочками, которые
будут фильтровать входящие и исходящие пакеты данных.
Возможные потоки пакетов через цепочки iptables показаны на Рисунке 5.
Рисунок 5. Поток пакетов в iptables
Когда пакет соответствует правилу, ему присваивается цель, которая
может быть другой цепочкой или одним из следующих специальных
значений:
● ACCEPT принять
разрешает прохождение пакета
● DROP бросить
не пропускает пакет
● RETURN вернуть
останавливает передачу пакета по цепочке и указывает ему
вернуться к предыдущей цепочке
Одна из таблиц по умолчанию называется filter. Она состоит из трех
цепочек:
1. INPUT — контролирует входящие пакеты на сервер.
Эта цепочка используется для управления поведением входящих
соединений. Например, если пользователь попытается подключиться по
SSH к вашему ПК/серверу, iptables попытается сопоставить IP-адрес и
порт с правилом в цепочке ввода.
2. FORWARD — фильтрует входящие пакеты, которые будут
перенаправлены в другое место.
Эта цепочка используется для входящих подключений, которые на самом
деле не доставляются локально. Подумайте о маршрутизаторе — данные
всегда отправляются на него, но редко на самом деле предназначены
для самого маршрутизатора; данные просто пересылаются к своей цели.
Если вы не выполняете какую-либо маршрутизацию, NAT или что-то еще
в своей системе, требующее переадресации, вы даже не будете
использовать эту цепочку.
3. OUTPUT — фильтрация пакетов, исходящих с вашего сервера.
Эта цепочка используется для исходящих соединений. Например, если
вы попытаетесь проверить соединение какого-то сайта .com, iptables
сверит свою выходную цепочку, чтобы узнать, какие правила относятся к
соединению какого-то сайта .com, прежде чем принимать решение о
разрешении или отклонении попытки подключения.
Некоторые примеры использования команды
iptables для настройки файрвола
iptables -L -v — вывести все правила
iptables -A <chain> -i <interface> -p <protocol (tcp/udp) > -s <source>
--dport <port no.> -j <target>
Описание опций, используемых в этой команде, приведено в Таблице 4.
Таблица 4. Параметры ввода для iptables
Опция
Значение
Описание
-A
append
Добавить правила в цепочку
-i
interface
Сетевой интерфейс, трафик которого вы хотите
отфильтровать, например eth0, lo, ppp0 и т. д.
-p
protocol
Сетевой протокол, по которому происходит ваш
процесс фильтрации. Это может быть либо tcp,
udp, udplite, icmp, sctp, icmpv6 и так далее.
Кроме того, вы можете ввести все, чтобы
выбрать каждый протокол.
-s
source
Адрес, с которого приходит трафик. Вы можете
добавить имя хоста или IP-адрес.
-dport
destination port
Номер порта назначения протокола, например,
22 (SSH), 443 (https) и т. д.
Имя цели (ACCEPT, DROP,
-j
target
RETURN). Вам нужно вставлять
это каждый раз, когда вы создаете
новое правило.
Брандмауэр Защитника Windows.
Брандмауэр Защитника Windows (Windows Defender Firewall) — это
программное обеспечение, разработанное Microsoft для защиты
компьютеров под управлением операционной системы Windows. Это ПО
разрешает или запрещает программам на компьютере доступ к сети или
Интернет-ресурсам. Он также разрешает или блокирует соединения с
другими компьютерами в сети.
Брандмауэр защищает операционную систему и пользовательские
данные на компьютере от неправомерного или несанкционированного
доступа, использования и возможного заражения.
В брандмауэре Windows есть три сетевых профиля, каждый из которых
имеет собственный набор политик и правил (Рисунок 6):
● Профиль домена — активен и используется, когда компьютер
подключен к сети, требующей аутентификации на контроллере
домена, например, в сети крупной компании.
● Частный профиль — активен и используется, когда компьютер
подключен к частной сети, такой как домашняя или рабочая (без
использования контроллера домена).
● Общедоступный профиль — активен и используется, когда
компьютер подключен к общедоступной сети, такой как сеть кафе,
отеля, библиотеки или ресторана.
Рис 6. Профили брандмауэра Защитника Windows
В брандмауэре Windows используются три важных типа правил (Рисунок
7):
● Входящие правила — они применяются к трафику, поступающему
из сети или Интернета на ваш компьютер или устройство с
Windows. Например, если вы загружаете файл через BitTorrent,
загрузка этого файла фильтруется с помощью входящего правила.
● Исходящие правила — эти правила применяются к трафику,
исходящему с вашего компьютера и идущему в сеть и Интернет.
Например, ваш запрос на загрузку веб-сайта университета в
веб-браузере является исходящим трафиком и фильтруется с
помощью правила исходящего трафика. Когда веб-сайт
скачивается и загружается вашим браузером, это входящий
трафик.
● Правила безопасности подключения — менее
распространенные правила, которые используются для защиты
трафика между двумя конкретными компьютерами, когда он
проходит через сеть. Этот тип правил используется в очень
контролируемых средах с особыми требованиями безопасности. В
отличие от правил для входящего и исходящего трафика, которые
применяются только к вашему компьютеру или устройству, правила
безопасности подключения требуют, чтобы на обоих компьютерах,
участвующих в обмене данными, применялись одни и те же
правила.
Все правила можно настроить так, чтобы они относились к
определенным компьютерам, учетным записям пользователей,
программам, приложениям, службам, портам, протоколам или сетевым
адаптерам.
Рисунок 7. Входящие правила брандмауэра Защитника Windows
Правила брандмауэра Windows имеют набор параметров (показаны в
Таблице 5), которые можно редактировать.
Таблица 5. Параметры правил брандмауэра Защитника Windows.
Параметр
Описание
Имя
Название правила, которое вы просматриваете.
Группа
Группа, которой принадлежит правило. Обычно группа
описывает приложение или функцию Windows, к которой
принадлежит правило.
Профиль
Сетевое расположение/профиль, к которому применяется
правило: частный, общедоступный или доменный.
Разблокировка
Сообщает вам, разблокировано ли правило и применяется
ли оно брандмауэром Windows или нет.
Действие
Действие может «Разрешить» или «Блокировать» в
зависимости от того, что должно делать правило.
Переопределение
Сообщает вам, отменяет ли это правило существующее
правило блокировки. По умолчанию во всех правилах для
этого параметра должно быть установлено значение «Нет».
Программа
Программа для рабочего стола, к которой применяется
правило.
Локальный адрес
Сообщает вам, применяется ли правило только тогда, когда
ваш компьютер имеет определенный IP-адрес или нет.
Удаленный адрес
Указывает, применяется ли правило только при подключении
устройств с определенными IP-адресами или нет.
Протокол
Совместно использует сетевые протоколы, для которых
применяется правило.
Локальный порт
Сообщает вам, применяется ли правило для соединений,
сделанных через определенные локальные порты, или нет.
Удаленный порт
Сообщает вам, применяется ли правило для соединений,
сделанных на определенных удаленных портах, или нет.
Авторизованные
пользователи
Учетные записи пользователей, к которым применяется
правило (только для входящих правил).
Авторизованные
компьютеры
Компьютеры, для которых применяется правило.
Авторизованные
локальные участники
Учетные записи пользователей, к которым применяется
правило (только для исходящих правил).
Владелец локального
пользователя
Учетная запись пользователя, которая указана как
владелец/создатель правила.
Пакет приложения
Это относится только к приложениям из Магазина Windows и
имеет то же имя пакета, что и приложение, к которому
применяется правило.
Вы можете управлять настройками брандмауэра Windows из
графической консоли:
Панель управления -> Система и безопасность -> Брандмауэр Защитника
Windows.
Однако, начиная с Windows 8.1 (Windows Server 2012 R2), для
управления брандмауэром можно использовать встроенный модуль
NetSecurity PowerShell.
В модуле NetSecurity в Windows 10 доступно 85 команд. Вы можете
отобразить весь список с помощью Get-Command-Module NetSecurity.
Рисунок 8. Список доступных параметров модуля NetSecurity
Тема 16. Платформы
виртуализации, облачные
вычисления, мобильные ОС.
В этой лекции Вы познакомитесь с основными концепциями
облачных вычислений, их ключевыми характеристиками и
преимуществами.
Вы рассмотрите организацию облачных сервисов и погрузитесь
в некоторые функции их поставщиков.
Вы также узнаете о широко распространенных мобильных ОС и
их преимуществах.
Облачные вычисления.
Хотя общие концепции облачных вычислений восходят к 1950-м годам,
услуги облачных вычислений впервые стали доступны в начале 2000-х
годов, особенно для крупных предприятий. С тех пор облачные
вычисления распространились на малый и средний бизнес, а в
последнее время и на простых пользователей.
iCloud от Apple был запущен в 2012 году и уже через неделю после
запуска набрал 20 миллионов пользователей. Evernote, облачный сервис
для ведения заметок и архивирования, запущенный в 2008 году, привлек
100 миллионов пользователей менее чем за 6 лет.
Во многих организациях наблюдается все более заметная тенденция к
перемещению значительной части или даже всех операций с
информационными технологиями в инфраструктуру, подключенную к
Интернету, известную как корпоративные облачные вычисления. В то
же время отдельные пользователи ПК и мобильных устройств все
больше и больше полагаются на службы облачных вычислений для
резервного копирования данных, синхронизации устройств и
совместного использования с помощью персональных облачных
вычислений. NIST (The National Institute of Standards and Technology,
Национальный институт стандартов и технологий США) определяет
облачные вычисления в NIST SP-800-145 следующим образом:
“Облачные вычисления - модель обеспечения повсеместного,
удобного сетевого доступа по запросу к общему пулу настраиваемых
вычислительных ресурсов (например, сетей, серверов, хранилищ,
приложений и услуг), которые могут быть быстро предоставлены и
высвобождены с минимальными усилиями по управлению или
взаимодействию с поставщиком услуг.”
Определение облачных вычислений NIST SP-800-145
По сути, с облачными вычислениями вы получаете экономию за счет
масштаба, профессионального управления сетью и безопасностью.
5 основных характеристик облачных вычислений
Рисунок 1. 5 основных характеристик облачных вычислений
Разберем эти характеристики и преимущества подробнее.
1. Самообслуживание по требованию.
Ресурсы облачных вычислений могут предоставляться поставщиком
услуг без участия человека. Другими словами, производственная
организация может предоставлять дополнительные вычислительные
ресурсы по мере необходимости, не обращаясь к поставщику облачных
услуг. Это может быть место для хранения, экземпляры виртуальной
машины, экземпляры базы данных и т. д.
Производственные организации могут использовать веб-портал
самообслуживания в качестве интерфейса для доступа к своим
облачным учетным записям, чтобы просматривать свои облачные
службы, их использование, а также предоставлять и отключать услуги по
мере необходимости.
2. Широкополосный сетевой доступ.
Ресурсы облачных вычислений доступны по сети, и доступ к ним может
осуществляться с различных платформ клиентов. Другими словами,
облачные сервисы доступны через сеть — в идеале это
высокоскоростная линия связи — например, через Интернет, или, в
случае частного облака, это может быть локальная сеть (Local Area
Network, LAN).
Пропускная способность сети и задержка — очень важные аспекты
облачных вычислений и широкого доступа к сети, поскольку они связаны
с качеством обслуживания (Quality of Service, QoS) в сети. Это особенно
важно для обслуживания производственных приложений, чувствительных
ко времени.
3. Режим коллективной аренды и объединение ресурсов.
Ресурсы облачных вычислений предназначены для поддержки
многопользовательской модели. Режим коллективной аренды позволяет
нескольким клиентам совместно использовать одни и те же приложения
или одну и ту же физическую инфраструктуру, сохраняя при этом
конфиденциальность и безопасность своей информации. Это похоже на
людей, живущих в многоквартирном доме, использующих одну общую
систему газо-, электро- и водоснабжения, но имеющих свои отдельные
квартиры и сохраняющих приватность.
Объединение ресурсов означает, что несколько клиентов обслуживаются
одними и теми же физическими ресурсами. Пул ресурсов провайдеров
должен быть очень большим и достаточно гибким, чтобы обслуживать
многочисленные требования клиентов и обеспечивать экономию за счет
масштаба. Когда дело доходит до объединения ресурсов, их
распределение не должно влиять на производительность критически
важных производственных приложений.
4. Быстрая эластичность и масштабируемость.
Одна из замечательных особенностей облачных вычислений —
возможность быстро выделять ресурсы в облаке по мере необходимости
в них производственных организаций. А затем удалять их, когда они не
нужны. Ресурсы облачных вычислений могут быстро увеличиваться или
уменьшаться, а в некоторых случаях и автоматически, в ответ на
потребности бизнеса. Это ключевая особенность облачных вычислений.
Использование ресурсов, их мощность и, следовательно, стоимость
могут быть увеличены или уменьшены без дополнительных контрактов
или штрафов.
Эластичность — отличительная черта облачных вычислений,
подразумевающая, что производственные организации могут быстро
предоставлять и отключать любые ресурсы облачных вычислений.
Масштабируемость более спланирована и постепенна. Это означает, что
производственные организации постепенно планируют увеличение
емкости, и, конечно же, облако может справиться с этим увеличением
или уменьшением масштаба.
5. Измеренный сервис.
Использование ресурсов облачных вычислений измеряется, и
производственные организации платят соответственно за то, что они
использовали. Применение ресурсов можно оптимизировать, используя
возможности оплаты по мере использования. Это означает, что
использование облачных ресурсов — будь то запущенные экземпляры
виртуальных серверов или хранилище в облаке — отслеживается,
измеряется и декларируется поставщиком облачных услуг. Модель затрат
основана на «плате за то, что вы используете» — оплата варьируется в
зависимости от фактического потребления производственной
организацией.
Облачные сервисы.
Основная цель облачных вычислений — обеспечить удобную аренду
вычислительных ресурсов. Поставщик облачных услуг (Cloud Service
Provider, CSP) поддерживает вычислительные ресурсы и ресурсы
хранения данных, доступные через Интернет или частные сети. Клиенты
могут арендовать часть этих ресурсов по мере необходимости.
Как видно из рисунка 2 практически все облачные услуги
предоставляются с использованием одной из трех моделей:
● Инфраструктура как услуга - IaaS (Infrastructure as a Service)
● Платформа как услуга - PaaS (Platform as a Service)
● Программное обеспечение как услуга - SaaS (Software as a
Service)
Рисунок 2. Модели традиционной ИТ и облачных сервисов
Обратите внимание, что светлым цветом на рисунке отмечены блоки,
управление которыми осуществляется клиентом, а темным цветом блоки, управляемые провайдером облачных сервисов (Cloud Service
Provider, CSP).
Инфраструктура как услуга (IaaS).
С помощью IaaS клиент получает доступ к базовой облачной
инфраструктуре. IaaS предоставляет виртуальные машины и другое
абстрактное оборудование и операционные системы, которыми
можно управлять через интерфейс прикладного программирования
службы (Application Programming Interface, API).
IaaS предлагает клиентам обработку, хранение, сети и другие основные
вычислительные ресурсы, чтобы клиент мог развертывать и запускать
произвольное программное обеспечение, которое может включать
операционные системы и приложения.
Примерами IaaS являются Amazon Elastic Compute Cloud (Amazon EC2)
и Windows Azure.
OpenStack — это пример программного обеспечения IaaS, которое вы
можете установить и управлять им самостоятельно, чтобы иметь
собственное облако IaaS.
Платформа как услуга (PaaS).
Облако PaaS предоставляет услуги клиентам в виде платформы, на
которой могут работать приложения клиента. PaaS позволяет
заказчику выполнять развертывание в облачной инфраструктуре,
содержащей созданные или приобретенные заказчиком приложения.
Облако PaaS предоставляет полезные строительные блоки программного
обеспечения, а также ряд инструментов разработки, таких как языки
программирования, среды выполнения и другие инструменты,
помогающие развертывать новые приложения. По сути, PaaS — это
операционная система в облаке. PaaS полезен для организаций,
которые хотят разрабатывать новые или специализированные
приложения, оплачивая при этом необходимые вычислительные ресурсы
только по мере необходимости и только до тех пор, пока это необходимо.
Google App Engine и платформа Salesforce от Salesforce.com являются
примерами PaaS.
Kubernetes (k8s) и OpenShift от RedHat — хорошие примеры
программного обеспечения облачной инфраструктуры PaaS, которое вы
можете развернуть на собственном локальном оборудовании.
Программное обеспечение как услуга (SaaS).
Как следует из названия, облако SaaS предоставляет услуги клиентам в
виде программного обеспечения, в частности прикладного
программного обеспечения, работающего и доступного в облаке. SaaS
позволяет клиенту использовать приложения облачного провайдера,
работающие в облачной инфраструктуре провайдера.
Доступ к приложениям осуществляется с различных клиентских
устройств через простой интерфейс, например, веб-браузер. Вместо
получения настольных и серверных лицензий на используемые
программные продукты предприятие получает те же функции от
облачного сервиса. SaaS снижает сложность установки программного
обеспечения, обслуживания, обновлений и исправлений.
Примерами сервисов на этом уровне являются Gmail, служба
электронной почты Google и Salesforce.com, которые помогают фирмам
отслеживать своих клиентов.
Поставщики облачных услуг.
Сегодня всем мире доступно несколько десятков крупных поставщиков
облачных услуг. Они предоставляют услуги на всех уровнях от IaaS до
SaaS.
Рисунок 3. Основные мировые провайдеры облачных услуг
Кроме крупнейших игроков облачного рынка — Amazon Web Services и
Microsoft Azure, в России активно развиваются национальные
поставщики облачных услуг. Это такие технологические компании как
SberCloud, «Яндекс», Mail.Ru, МТС, а также системные интеграторы,
имеющие облачные компетенции.
Amazon Web Services.
Amazon Web Services (AWS) — самая комплексная и широко
распространенная облачная платформа в мире, предлагающая более
165 полнофункциональных сервисов из центров обработки данных по
всему миру.
AWS предлагает сотни сервисов. Некоторые из них включают
виртуальное частное облако, EC2, передачу данных AWS, простую
службу хранения, DynamoDB, Elastic Compute Cloud, службу управления
ключами AWS, AmazonCloudWatch, простую службу уведомлений, службу
реляционной базы данных, Route 53, простую службу очередей,
CloudTrail и Simple, службу электронной почты.
Безопасность AWS предлагает такие услуги, как безопасность
инфраструктуры, защита от DDoS-атак, шифрование данных,
инвентаризация и настройка, мониторинг и ведение журналов, контроль
идентификации и доступа, а также тестирование на проникновение.
Microsoft Azure.
Microsoft Azure — одно из самых быстрорастущих облачных хранилищ
среди них. Azure был запущен спустя годы после выпуска AWS и Google
Cloud, но все еще стучится в дверь, чтобы стать ведущим поставщиком
облачных услуг.
Azure предлагает сотни услуг в различных категориях, включая AI +
машинное обучение, аналитику, блокчейн, вычисления, контейнеры, базы
данных, инструменты разработчика, DevOps, идентификацию,
интеграцию, Интернет вещей, управление, мультимедиа, Microsoft Azure
Stack, миграцию, смешанную реальность, мобильные устройства, сеть,
безопасность, хранилище, Интернет и виртуальный рабочий стол
Windows.
Операционная система Microsoft Windows и база данных SQL Server
теперь доступны в облаке через Windows Virtual Desktop.
Популярный пакет Microsoft Office, корпоративные продукты, такие как
Sharepoint и Power BI, теперь доступны в облаке в виде инструментов
Office 365 и PowerXXX.
Azure предлагает самые передовые продукты и службы безопасности,
такие как доменные службы Azure Active Directory, Центр безопасности,
VPN-шлюз, защиту от DDoS-атак, Key Vault, Sentinel и многие другие.
Azure Stack — это служба Azure, которая позволяет предприятиям
запускать приложения в локальной среде и выполнять службы Azure в
вашем центре обработки данных.
Облачная платформа Google.
Облачная платформа Google — это облако Google. Подобно AWS и
Azure, Google Cloud также предлагает аналогичные услуги в различных
категориях, включая AI и машинное обучение, управление API,
вычисления, контейнеры, аналитику данных, базы данных, инструменты
разработчика, здравоохранение и медико-биологические науки,
гибридные и мультиоблачные среды, Интернет вещей, инструменты
управления, мультимедиа и игры, миграция, работа в сети, безопасность
и идентификация, бессерверные вычисления и хранилище.
Продукты Google также предлагаются в облаке, включая G Suite, Google
Maps Platform, Google Hardware, Google Identity, Chrome Enterprise,
Android Enterprise, Apigee, Firebase и Orbitera.
Мобильные операционные системы.
Мобильная операционная система — это программное обеспечение,
которое позволяет смартфонам, планшетным ПК и другим мобильным
устройствам запускать приложения и программы.
В дополнение к обычным задачам ОС мобильные
операционные системы также управляют
подключением к сотовой и беспроводной сети, а также
доступом к телефону.
В настоящее время наиболее распространенными мобильными ОС
являются Apple iOS и Google Android.
Существуют и другие мобильные операционные системы, но уровень их
внедрения значительно ниже, чем у iOS и Android. Эти другие
операционные системы включают KaiOS, Sailfish OS и Harmony OS от
Huawei.
KaiOS, основанная на снятой с производства ОС Mozilla Firefox, работает
в основном на простых телефонах. Эти мобильные устройства имеют
очень ограниченную вычислительную мощность, но последняя версия
KaiOS может предоставить более полный набор функций для этих
устройств, таких как магазин приложений и Google Assistant.
Sailfish OS основана на нескольких проектах с открытым исходным кодом
и работает в основном на смартфонах и планшетных компьютерах от
Jolla, разработавшей операционную систему, и на мобильных
устройствах Sony. ОС Sailfish и KaiOS работают на ядре Linux.
ОС Harmony от Huawei, первоначально выпущенная в августе 2019 года,
также может работать на устройствах IoT (Internet of Things). Harmony OS
работает на микроядре, разработанном Huawei.
Apple iOS.
Apple распространяет только те устройства, которые изначально
поддерживают iOS, и использует подход «огороженного сада». В нем
Apple регулирует все мобильные приложения и службы, которые могут
работать на устройствах iOS. Apple разработала iOS для работы на
собственном ядре XNU (X is Not Unix).
Apple также выпустила несколько мобильных операционных систем для
конкретных устройств, таких как watchOS для Apple Watch и iPadOS для
планшетов iPad.
iOS поддерживает программирование на C, C++, Objective-C и Swift в
Xcode IDE. Есть несколько мультиплатформенных IDE, которые также
могут создавать приложения для iOS.
Архитектура iOS представляет собой многоуровневую архитектуру. На
верхнем уровне iOS действует как посредник между базовым
оборудованием и приложениями. Приложения взаимодействуют с
оборудованием через набор четко определенных интерфейсных систем.
Эти интерфейсы упрощают написание приложений, которые стабильно
работают на устройствах с различными аппаратными возможностями.
В iOS есть четыре уровня абстракции:
Рисунок 4. Уровни абстракции в iOS.
● Уровень Cocoa Touch.
Содержит ключевые платформы для создания приложений iOS. Этот
уровень определяет базовую инфраструктуру приложений и поддержку
ключевых технологий, таких как многозадачность, сенсорный ввод,
push-уведомления и многие высокоуровневые системные службы.
●
Медийный уровень.
Содержит графические, аудио- и видео технологии, направленные на
создание «лучших» мультимедийных возможностей, доступных на
мобильном устройстве.
●
Уровень основных служб.
Содержит основные системные службы, которые используют все
приложения.
● Уровень ядра ОС.
Содержит функции низкого уровня, на которых построено
большинство других технологий.
Google Android.
Google использует другой подход к Android, исходный код которого
открыт. Это означает, что OEM-производители мобильных устройств
(производители оригинального оборудования) могут изменять исходный
код Android и настраивать его в соответствии со своими устройствами.
Архитектура Android содержит различное количество компонентов для
поддержки любых потребностей Android-устройства. Программное
обеспечение Android содержит ядро Linux с открытым исходным кодом,
имеющее набор библиотек C/C ++, которые доступны через службы
инфраструктуры приложений.
Среди всех компонентов ядро Linux обеспечивает основные функции
операционной системы для смартфонов, а виртуальная машина Dalvik
(Dalvik Virtual Machine, DVM) — платформу для запуска приложений
Android.
Основные компоненты архитектуры Android следующие:
Рисунок 5. Компоненты архитектуры Android
●
Приложения.
Верхний слой архитектуры Android. Предустановленные
приложения и приложения сторонних разработчиков будут
загружены только на этом уровне. Он работает в среде выполнения
Android с помощью классов и служб, предоставляемых платформой
приложения.
●
Каркас приложений.
Предоставляет несколько важных классов, которые используются
для создания приложения Android. Он обеспечивает общую
абстракцию для доступа к оборудованию, а также помогает в
управлении пользовательским интерфейсом с ресурсами
приложения. Как правило, он предоставляет услуги, с помощью
которых мы можем создать определенный класс и сделать этот
класс полезным для создания приложений. Также включает в себя
различные типы диспетчера активности служб, диспетчера
уведомлений, системы просмотра, диспетчера пакетов и т. д.,
которые полезны для разработки приложения в соответствии с
предварительными условиями.
●
Android Runtime.
Одна из самых важных частей Android. Содержит такие
компоненты, как основные библиотеки и DVM. В основном
обеспечивает основу для платформы приложения и поддерживает
приложение с помощью основных библиотек. Как и виртуальная
машина Java (JVM), Dalvik — это виртуальная машина на основе
регистров, специально разработанная и оптимизированная для
Android, чтобы гарантировать, что устройство может эффективно
запускать несколько экземпляров. Это зависит от уровня ядра Linux
для многопоточности и низкоуровневого управления памятью.
Базовые библиотеки позволяют нам реализовывать приложения
для Android, используя стандартные языки программирования JAVA
или Kotlin.
●
Библиотеки платформы.
Включают в себя различные основные библиотеки C/C++ и
библиотеки на основе Java, такие как Media, Graphics, Surface
Manager, OpenGL и т. д., для поддержки разработки под Android.
● Ядро Linux.
Сердце архитектуры Android. Он управляет всеми доступными
драйверами, такими как дисплей, камера, Bluetooth,
аудиодрайверы, драйверы памяти и т. д., которые требуются во
время выполнения. Ядро Linux обеспечивает уровень абстракции
между оборудованием устройства и другими компонентами
архитектуры Android. Оно отвечает за управление памятью,
питанием, устройствами и т. д.
Каждый компонент на рисунке 5 можно представить как уровень всей
архитектуры Android. Примеры единиц каждого уровня Android
перечислены на рисунке 6.
Рисунок 6. Единицы каждого уровня Android
Тема 17. Контейнеры и системы
управления ими.
В этой лекции Вы познакомитесь с технологиями
виртуализации, гипервизорами и контейнерами.
Вы узнаете об особенностях использования и преимуществах
Docker'а.
Вы также рассмотрите системы автоматизации развертывания,
масштабирования и управления контейнерными
приложениями, такими как Kubernetes и OpenShift.
Контейнеры.
Контейнеризация — это метод виртуализации, при котором ядро
операционной системы поддерживает несколько изолированных
экземпляров пространства пользователя вместо одного.
Эти экземпляры (обычно называемые контейнерами) с точки зрения
выполняемых в них процессов идентичны отдельному экземпляру
операционной системы. Поэтому контейнеризацию еще называют
виртуализацией на уровне операционной системы.
Чем контейнеры отличаются от виртуальных машин.
Контейнеры и виртуальные машины схожи по своим целям: изолировать
приложение и его зависимости в автономную единицу, которая может
работать где угодно.
Кроме того, контейнеры и виртуальные машины устраняют
необходимость в физическом оборудовании, позволяя более
эффективно использовать вычислительные ресурсы как с точки зрения
энергопотребления, так и экономической эффективности.
Виртуальная машина — это, по сути, эмуляция реального компьютера,
который выполняет программы, как настоящий компьютер. Виртуальные
машины работают поверх физической машины с использованием
гипервизора. Гипервизор, в свою очередь, работает либо на
хост-машине, либо на «голом железе».
Рисунок 1. Виртуальные машины
В отличие от виртуальной машины, обеспечивающей аппаратную
виртуализацию, контейнер обеспечивает виртуализацию на уровне
операционной системы за счет абстрагирования пользовательского
пространства.
Во всех смыслах контейнеры выглядят как виртуальные машины.
Например, у них есть личное пространство для обработки, они могут
выполнять команды от имени пользователя root, иметь частный сетевой
интерфейс и IP-адрес, разрешать настраиваемые маршруты и правила
iptable, могут монтировать файловые системы и т. д.
Одно большое различие между контейнерами и
виртуальными машинами заключается в том, что
контейнеры используют ядро хост-системы совместно
с другими контейнерами.
Каждый контейнер получает собственное изолированное
пользовательское пространство, позволяющее запускать несколько
контейнеров на одном хост-компьютере.
Рисунок 2. Изоляция приложений на основе контейнера
Docker.
Docker — это программное обеспечение для автоматизации
развертывания приложений в виде переносимых автономных
контейнеров, выполняемых в облаке или локальной среде. Это проект с
открытым исходным кодом, основанный на контейнерах Linux. Он
использует функции ядра Linux, такие как пространства имен и группы
управления, для создания контейнеров поверх операционной системы.
Контейнеры далеко не новы; Google уже много лет использует
собственную контейнерную технологию. Другие контейнерные технологии
Linux, такие как Solaris Zones, BSD jails и LXC, тоже существуют уже
много лет.
Преимущества Docker:
● Простота использования.
Благодаря Docker всем — разработчикам, системным
администраторам, архитекторам и другим пользователям — стало
намного проще использовать преимущества контейнеров для
быстрой сборки и тестирования переносимых приложений. Это
позволяет любому упаковать приложение на свой ноутбук, который,
в свою очередь, может без изменений работать в любом
общедоступном, частном облаке или даже на «голом железе».
Мантра звучит так: «Сделай один раз, беги куда угодно».
● Скорость.
Контейнеры Docker очень легкие и быстрые. Поскольку контейнеры
— это всего лишь изолированная среда, работающая на ядре, они
потребляют меньше ресурсов. Вы можете создать и запустить
контейнер Docker за считанные секунды, по сравнению с
виртуальными машинами, которые могут занять больше времени,
потому что им приходится каждый раз загружать полную
виртуальную операционную систему.
● Наличие Docker Hub.
Пользователи Docker также получают выгоду от все более богатой
экосистемы Docker Hub, которую можно рассматривать как
«магазин приложений для образов Docker». В Docker Hub есть
десятки тысяч образов, созданных сообществом, которые доступны
для использования. Невероятно легко искать образы, которые
соответствуют Вашим потребностям, готовые к использованию и
практически без изменений.
● Модульность и масштабируемость.
Docker позволяет легко разбить функциональность вашего
приложения на отдельные контейнеры. Например, ваша база
данных Postgres может работать в одном контейнере, а ваш сервер
Redis — в другом, а ваше приложение Node.js — в другом. С Docker
стало проще связать эти контейнеры вместе для создания вашего
приложения, что упрощает независимое масштабирование или
обновление компонентов в будущем.
Docker Engine.
Docker Engine («Движок» Docker) — это ядро механизма Докера.
«Движок» отвечает за функционирование и обеспечение связи между
основными Docker-объектами (реестром, образами и контейнерами).
По сути Docker Engine — это слой, на котором работает Docker (Рисунок
3), легкая среда выполнения и инструментарий.
Рисунок 3. Компоненты Docker Engine
Docker Engine изначально работает в системах Linux и состоит из:
1. Docker Daemon, работающий на хост-компьютере.
2. Docker Client, который связывается с демоном Docker для
выполнения команд.
3. REST API для удаленного взаимодействия с Docker Daemon.
Docker Client.
Docker Client — это пользовательский интерфейс для Docker, который
передает пользовательские команды Docker Daemon.
Docker Daemon.
Docker Daemon — это приложение, которое фактически выполняет
команды, отправляемые клиенту Docker, такие как создание, запуск и
распространение контейнеров. Docker Daemon работает на
хост-компьютере, но пользователь никогда не взаимодействует с ним
напрямую. Docker Client также может работать на хост-компьютере, но
это не обязательно. Он может функционировать на другом компьютере и
взаимодействовать с Docker Daemon, работающим на хост-компьютере.
Dockerfile.
Dockerfile содержит команды по созданию образа Docker. Это могут быть
следующие команды:
● RUN apt-get y install some-package
установить программный пакет
●
EXPOSE 8000
выставить порт
●
ENV ANT_HOME /usr/local/apache-ant
для передачи переменной окружения. После того, как вы настроили
свой Dockerfile, вы можете использовать команду docker build для
создания из него образа.
Ниже приведен пример Dockerfile:
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "scr/index.js"]
Docker-образ.
Образы — это шаблоны, доступные только для чтения, созданные из
набора команд, написанных в Dockerfile.
Docker-образ создается с помощью Dockerfile. Каждая команда в
Dockerfile добавляет к образу новый «слой», при этом слои представляют
собой часть файловой системы образов, которая либо добавляет, либо
заменяет слой под ним. Слои — ключ к легкой, но мощной структуре
Docker. Docker использует файловую систему Union для достижения этой
цели.
Реестр (Registry).
Реестр - это удаленное хранилище образов. Вы можете настроить его
самостоятельно либо использовать Docker Hub, хранящий десятки тысяч
готовых образов.
Union File Systems.
Docker использует Union File Systems для создания образа. Вы можете
думать о файловой системе Union как о стекируемой файловой системе,
то есть файлы и каталоги отдельных файловых систем (известных как
ветви) могут быть прозрачно наложены друг на друга, чтобы
сформировать единую файловую систему.
Содержимое каталогов, имеющих один и тот же путь в наложенных
ветвях, рассматривается как единый объединенный каталог, что
позволяет избежать необходимости создавать отдельные копии каждого
слоя. Вместо этого всем им могут быть даны указатели на один и тот же
ресурс; когда необходимо изменить определенные слои, он создаст
копию и изменит локальную копию, оставив оригинал без изменений. Вот
как файловые системы могут казаться доступными для записи,
фактически не разрешая запись.
Тома.
Тома — это часть данных контейнера, инициализируемая при создании
контейнера. Тома позволяют сохранять и совместно использовать
данные контейнера.
Тома данных отделены от Union File Systems по
умолчанию и существуют как обычные каталоги и
файлы в файловой системе хоста.
Поэтому, даже если вы уничтожите, обновите или перестроите свой
контейнер, тома данных останутся нетронутыми. Если вы хотите
обновить том, вы вносите в него изменения напрямую. Объемы данных
можно совместно и повторно использовать в нескольких контейнерах.
Docker-контейнеры.
Контейнер Docker упаковывает программное обеспечение приложения в
невидимую коробку со всем, что нужно приложению для запуска. Сюда
входят операционная система, код приложения, среда выполнения,
системные инструменты, системные библиотеки и т. д. Контейнеры
Docker создаются из образов Docker. Поскольку образы доступны только
для чтения, Docker добавляет файловую систему для чтения и записи
поверх файловой системы только для чтения образа, чтобы создать
контейнер.
Kubernetes.
Kubernetes (k8s) — это платформа для оркестровки контейнеров с
открытым исходным кодом, которая автоматизирует многие ручные
процессы, связанные с развертыванием, управлением и
масштабированием контейнеризированных приложений. Под
оркестровкой (оркестрацией) мы здесь понимаем автоматическое
размещение, координацию и управление.
Kubernetes предоставляет Вам платформу для планирования и запуска
контейнеров в кластерах физических или виртуальных машин.
Архитектура Kubernetes делит кластер на компоненты, которые работают
вместе для поддержания определенного состояния кластера, как
показано на Рисунке 4.
Рисунок 4. Архитектура Kubernetes
Кластеры Kubernetes — это группа узловых машин, которые
используются для запуска контейнеризированных приложений.
Вы можете визуализировать кластер Kubernetes как две части:
плоскость управления и вычислительные машины или узлы.
● Узлы.
Представляют собой рабочую машину в кластере Kubernetes. Она
может быть как физической, так и (что более вероятно) виртуальной.
Узел содержит все необходимые службы для размещения пода.
● Поды.
Представляют собой группу из одного или нескольких контейнеров,
которые совместно используют сеть и хранилище. Контейнеры в поде
считаются «тесно связанными», и они управляются и развертываются как
единое целое. Если бы приложение было развернуто в более
традиционной модели, содержимое пода всегда развертывалось бы
вместе на одном компьютере.
● Главный узел.
Кластеру всегда требуется главный узел, на котором установлены
управляющие службы (известные как главные компоненты). Эти сервисы
могут быть распределены на одной машине или на нескольких машинах
для резервирования. Они контролируют коммуникации, рабочую нагрузку
и планирование.
● Развертывания.
Способ декларативно установить состояние для ваших подов или
наборов реплик (групп подов, которые должны быть развернуты вместе).
В развертываниях используется формат «желаемого состояния» для
описания того, как должно оно выглядеть, а Kubernetes выполняет
фактические задачи развертывания. Развертывания можно обновлять,
откатывать, масштабировать и приостанавливать по желанию.
● Kubernetes API(интерфейс прикладного программирования).
Внешний интерфейс плоскости управления Kubernetes, с помощью
которого пользователи, внешние компоненты и части вашего кластера
взаимодействуют друг с другом. Сервер API определяет, действителен ли
запрос, а затем обрабатывает его.
Компоненты плоскости управления принимают глобальные решения о
кластере (например, планирование), а также обнаруживают события
кластера и реагируют на них (например, запуск нового пода, когда поле
реплик развертывания неудовлетворительно):
● kube-apiserver. Сервер API — это компонент плоскости управления
Kubernetes, который предоставляет доступ к API Kubernetes.
kube-apiserver предназначен для горизонтального
масштабирования, то есть он масштабируется за счет
развертывания большего количества экземпляров. Вы можете
запускать несколько экземпляров kube-apiserver и балансировать
трафик между этими экземплярами.
● etcd. Согласованная и высокодоступная база данных
«ключ-значение», используемая Kubernetes в качестве резервного
хранилища для всех данных кластера.
● kube-scheduler. Компонент плоскости управления, который
отслеживает вновь созданные поды без назначенного узла и
выбирает узел, на котором они будут работать. Факторы,
учитываемые при планировании, включают: индивидуальные и
коллективные требования к ресурсам,
аппаратные/программные/политические ограничения,
спецификации сходства и противоречия, расположение данных,
интерференция между рабочими нагрузками и крайние сроки.
● kube-controller-manager. Компонент плоскости управления,
который запускает процессы контроллера (контроллер узла,
контроллер заданий, контроллер конечных точек, учетная запись
службы и контроллер токенов).
Компоненты узла запускаются на каждом узле, поддерживая работающие
поды и обеспечивая среду выполнения Kubernetes:
● kubelet. Агент, работающий на каждом узле кластера. Это
гарантирует, что контейнеры работают в поде. kubelet принимает
набор PodSpec, предоставляемых с помощью различных
механизмов, и обеспечивает работоспособность контейнеров,
описанных в этих PodSpec. Kubelet не управляет контейнерами,
созданными не в Kubernetes.
● kube-proxy. Это сетевой прокси-сервер, который работает на
каждом узле в вашем кластере и реализует часть концепции
сервиса Kubernetes. kube-proxy поддерживает сетевые правила для
нод. Эти правила разрешают сетевое взаимодействие с вашими
подами из сетевых сеансов внутри или вне вашего кластера.
Работа с Kubernetes.
Большинство операций в кластере Kubernetes можно выполнять с
помощью интерфейса командной строки kubectl или других
инструментов командной строки, таких как kubeadm, которые, в свою
очередь, используют API Kubernetes. Однако вы также можете получить
доступ к API напрямую, используя вызовы REST.
kubectl apply управляет приложениями через файлы, в которых
определяются ресурсы Kubernetes. Это рекомендуемый способ
управления приложениями Kubernetes в рабочей среде.
Манифесты Kubernetes можно определить в YAML или JSON. Можно
использовать файлы с расширением .yaml, .yml и .json.
Вот пример объекта pod в формате YAML:
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-less
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000"
Tаблица 1. Основные команды управления кластером Kubernetes
Имя команды
Описание
kubectl get
используется для перечисления ресурсов,
таких как поды, узлы, службы,
развертывания и т. д.
kubectl describe
дает более подробное представление о
ресурсах.
kubectl scale
используется для увеличения или
уменьшения реплик ресурсов.
kubectl delete
удаляет упомянутый ресурс. В случае пода
он будет автоматически воссоздан
планировщиком, поэтому в основном это
означает холодный перезапуск пода.
Вы можете просмотреть журналы с помощью команды kubectl logs и
подключить терминал к запущенному контейнеру с помощью команды
kubectl exec.
OpenShift.
OpenShift — это семейство программных продуктов для
контейнеризации, разработанных Red Hat. Его флагманский продукт —
OpenShift Container Platform — локальная платформа как сервис,
построенный на основе контейнеров Linux, оркестрованных и
управляемых Kubernetes на базе Red Hat Enterprise Linux.
Основное различие между OpenShift и vanilla Kubernetes заключается в
концепции артефактов, связанных со сборкой. В OpenShift такие
артефакты считаются первоклассными ресурсами Kubernetes, к которым
могут применяться стандартные операции Kubernetes.
Клиентская программа OpenShift, oc, предлагает расширенный набор
стандартных возможностей, включенных в основную клиентскую
программу kubectl Kubernetes. Используя этот клиент, вы можете
напрямую взаимодействовать с ресурсами, связанными со сборкой, с
помощью подкоманд (таких как new-build или start-build).
В дополнение к этому, встроенная в OpenShift технология сборки подов
под названием Source-to-Image (S2I) доступна из коробки. Для
платформы OpenShift это обеспечивает возможности, эквивалентные
тому, что может сделать Jenkins.
Некоторые другие различия при сравнении OpenShift с Kubernetes:
● Линейка продуктов v4 использует среду выполнения CRI-O и
означает, что Docker daemons отсутствуют на главных или рабочих
узлах. Это повышает уровень безопасности кластера.
● Стандартная установка OpenShift поставляется с репозиторием
образов.
● ImageStreams (последовательность указателей на образы, которые
могут быть связаны с развертыванием) и Templates (механизм
упаковки компонентов приложения) уникальны для OpenShift и
упрощают развертывание приложений и управление ими.
● Команда new-app, которую можно использовать для запуска
развертывания приложения, автоматически применяет app label
(со значением метки, полученным из аргумента --name) ко всем
ресурсам, созданным в результате развертывания. Это позволяет
упростить управление ресурсами приложения.
● Реализация развертывания OpenShift, называемая
DeploymentConfig, основана на логике по сравнению с
объектами развертывания Kubernetes, основанных на контроллере.
● Встроенный OperatorHub. Это графический веб-интерфейс, в
котором пользователи могут просматривать и устанавливать
библиотеку операторов Kubernetes, упакованных для упрощения
управления жизненным циклом. К ним относятся созданные Red
Hat операторы, сертифицированные операторы Red Hat и
операторы сообщества.
OpenShift также жестко контролирует используемые операционные
системы. Основные компоненты должны работать под управлением Red
Hat CoreOS. Этот уровень контроля позволяет кластеру с минимальными
усилиями поддерживать обновления и исправления главных узлов.
Рабочие узлы могут работать под управлением других вариантов Linux
или даже Windows.
Работа с OpenShift.
Ресурсами OpenShift можно управлять командой oc:
Таблица 2. Основные команды управления кластером OpenShift
Имя команды
Описание
oc login
пройти аутентификацию в кластере
OpenShift
oc project
показать текущий контекст проекта. Проект
имеет то же значение, что и пространство
имен в Kubernetes, и используется для
разделения ресурсов разных приложений
oc new-project
создать новый проект в Openshift и изменить
его на этот контекст
oc new-app
создать новое приложение из исходного
кода, образа контейнера или шаблона
OpenShift
oc create
создать новый ресурс из имени файла или
стандартного ввода
oc get
получить ресурс (используйте -o для
дополнительных параметров вывода)
oc delete
удалить ресурс
oc logs
извлечь журналы для ресурса
(конфигурации сборки, конфигурации
развертывания и поды)
oc exec
выполнить команду в контейнере
oc scale
изменить количество реплик пода для
развертывания
Download