Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
спо_экзамен.docx
Скачиваний:
5
Добавлен:
27.09.2019
Размер:
3.3 Mб
Скачать

  1. Эволюция операционных систем

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

Более чем за полувековой период своего существования операционные системы прошли сложный путь, насыщенный многими важными событиями. Огромное влияние на развитие операционных систем оказали успехи в совершенствовании элементной базы и вычислительной аппаратуры, поэтому многие этапы развития ОС тесно связаны с появлением новых типов аппаратных платформ, таких как миникомпьютеры или персональные компьютеры. Серьёзную эволюцию операционные системы претерпели в связи с новой ролью компьютеров в локальных и глобальных сетях. Важнейшим фактором развития ОС стал Интернет (Internet). По мере того как эта сеть приобретает черты универсального средства массовых коммуникаций, ОС становятся всё более простыми и удобными в использовании, включают рáзвитые средства поддержки

мультимедийной информации, снабжаются надёжными средствами защиты.

Идея компьютера была предложена английским математиком Чарльзом Бэбиджем (Charles Babage) в середине XIX века. Его механическая «аналитическая машина» так и не смогла по-настоящему заработать, потому что технологии того времени не удовлетворяли требованиям, необходимым для изготовления нужных деталей точной механики. Конечно, никакой речи об операционной системе для этого «компьютера» не шло.

Вычислительные машины первого поколения (first generation) появились в середине 40-х годов прошлого века, вскоре после окончания Второй мировой войны, в связи с созданием первых ламповых вычислительных устройств. Они представляли собой громоздкие ламповые машины с быстродействием

10-20 тыс. операций в секунду и имели классическую фон-неймановскую архитектуру (von Neumann machine) (рисунок В.1).

Вычислительные машины первого поколения не имели операционных систем (нулевое поколение ОС). Фон-неймановская вычислительная машина любая ЭВМ, построенная на следующих принципах:

2

Память

Процессор

ПЛ ПК АЦПУ МЛ

ПЛ – перфолента; АЦПУ – алфавитно-цифровое печатающее устройство;

ПК перфокарта; МЛ магнитная лента

Рисунок В.1 Схема ЭВМ первого поколения

а) основными блоками её являются блок (устройство) управления (control unit), арифметико-логическое устройство (АЛУ) (arithmetic and logic unit), запоминающее устройство (ЗУ) и устройства ввода-вывода (УВВ);

б) программы и данные хранятся в одной и той же памяти и, таким образом, концепция хранимой программы является основной;

в) устройство управления и АЛУ, обычно объединённые в центральный процессор (ЦП) (CPU Central Processing Unit или CP Central Processor),

который может содержать внутреннюю память в виде накопителей и

разнообразных регистров, определяют действия, подлежащие выполнению, путём считывания команд из оперативной памяти (ОП). Отсюда следует, что программа для фон-неймановской ЭВМ состоит из набора команд, которые

проверяются одна за другой; адрес очередной ячейки памяти, из которой следует

брать команду, указывается счётчиком команд (РАК регистр адреса команд, IC instruction counter) в устройстве управления. Отсюда также следует, что

данные, с которыми работает программа, могут включать в себя переменные;

области памяти могут быть поименованы, так что к запомненным в них значениям можно впоследствии обращаться или изменять их во время выполнения программ с использованием присвоенных имён.

Подавляющее большинство ЭВМ на сегодняшний день – это фон-

неймановские машины. Своё название они получили в честь американского учёного Джона фон Неймана.

3

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

0, другому – 1. Логически такой физический элемент независимо от его технической реализации рассматривается как двоичный разряд бит (bit). Бит это наименьшая «порция» памяти, а следовательно, и информации в любой двоичной системе, реализованной в ЭВМ. Элементы памяти объединяются технически в байты (byte) (1 байт=8 бит), а логически их можно объединять в более крупные блоки, например, словá [слово – вектор битов, рассматриваемый аппаратной частью ЭВМ как единое целое; число битов в слове, называемое длиной или размером слова, равно разрядности процессора (16, 32 или 64); память ЭВМ обычно разделяется на слова и, возможно, подразделяется ещё на байты].

Программирование для ЭВМ первого поколения было абсолютно

«прозрачным» между программистом с его программой и ЭВМ не было никаких посредников. Все действия по подготовке и загрузке программ, а также по обеспечению программы необходимыми данными выполнялись пользователем

вручную. Программирование осуществлялось исключительно на машинном языке.

Не было никакого системного программного обеспечения (СПО), кроме библиотек математических и служебных подпрограмм (program library), которые

программист мог использовать для того, чтобы не писáть каждый раз коды,

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

управления (console консоль), который (пульт) представлял собой примитивное

устройство ввода-вывода, состоящее из кнопок, переключателей и индикаторов.

В машинах первого поколения процессор выполнял команды всех видов,

включая операции ввода-вывода (I/O input/output) (см. рисунок В.1). Появился

(кроме библиотек программ) первый элемент системного программного обеспечения ЭВМ абсолютный загрузчик (loader загрузчик,, программа загрузки обслуживающая программа, которая помещает выполняемую

программу в оперативную память и приводит её в состояние готовности к

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

адресами (absolute code, machine code абсолютный код, машинный код

программный код, пригодный для прямого выполнения центральным процессором).

С целью удобства подготовки программ были созданы системы

символического кодирования простые ассемблеры. [assembler программа, используемая для преобразования исходной программы на языке ассемблера в машинный код или перемещаемую программу (relocatable program или code –

программа или часть программы, которая может быть загружена в любую область памяти; обычно такая программа разделяется на управляющие секции, и все требуемые адреса памяти выражаются относительно начала соответствующей управляющей секции; компилятор или ассемблер создаёт таблицу всех таких обращений к памяти, а программа-загрузчик преобразует их в абсолютные адреса в процессе загрузки)]. Ассемблер позволяет числовые коды объектов программы заменить мнемоническими обозначениями.

Программа стала представляться в двух вариантах:

исходный модуль (source code – текст программы на языке

программирования), подлежащий преобразованию в эквивалентный объектный код компилятором (compiler программа, предназначенная для трансляции

высокоуровневого языка в абсолютный код или иногда на язык ассемблера); в

данном случае исходный модуль был на языке ассемблера; транслятор (translator), в отличие от компилятора, это программа, которая преобразует программу, написанную на одном языке, в программу, написанную на другом

языке; примером транслятора является компилятор;

абсолютный модуль.

Использование ассемблера породило следующую последовательность действий по обработке программ:

а) загрузка транслятора ассемблера с ленты, т.е. его размещение в ОЗУ

для исполнения;

б) трансляция (компиляция) исходного модуля и запись абсолютного модуля на ленту;

в) загрузка программы (абсолютного модуля) с ленты;

г) выполнение программы.

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

для прогнозирования погоды, решения задач атомной энергетики и ряда других научных проблем. Самыми первыми серийными машинами стали Ferranti Mark 1

(1951г., первая в мире коммерческая ЭВМ – Манчестер, Великобритания),

UNIVAC 1 (UNIVersal Automatic Computer, она стала второй в мире серийно выпускаемой вычислительной машиной и, начиная с 1951г., до середины 50-х годов была одной из лучших ЭВМ, США) и LEO 1 (Lyons Electronic Office –

электронная контора фирмы Lyons; 1953г., Великобритания).

С середины 50-х годов XX века начался новый период в развитии ВТ, связанный с появлением новой технической базы – полупроводниковых элементов. Второе поколение ЭВМ (second generation) и первое поколение ОС

берут своё начало с середины 50-х годов XX века. Выросло быстродействие

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

что на них можно было возложить выполнение действительно практически

важных задач. В машинах второго поколения использовались как электронные лампы, так и полупроводниковые приборы искретная транзисторная логика). Их оперативная память была построена на магнитных сердечниках. В это время

стал расширяться диапазон применяемого оборудования ввода-вывода, появились высокопроизводительные устройства для работы с МЛ и первые виды оперативно- доступной памяти (магнитные барабаны и магнитные диски – МД). Так, магнитные диски использовались в моделях IBM 1401-1410, а магнитные барабаны – в моделях UNIVAC LARC и 1105.

Наряду с совершенствованием аппаратуры заметный прогресс наблюдался также в области автоматизации программирования и организации вычислительных работ. В эти годы появились первые алгоритмические языки (Algol, Fortran, Cobol, BO, Commercial Translator, FACT, Mathmatic), и, таким образом, к библиотекам математических и служебных подпрограмм добавился новый тип системного ПО трансляторы.

Выполнение каждой программы стало включать большое количество

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

вывод результатов на периферийное устройство. В силу этого в штат многих

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

принципиально отделялся от машины и общение с ЭВМ вёл оператор.

Но как бы быстро и надёжно ни работали операторы, они никак не могли состязаться в производительности с работой устройств компьютера. Бóльшую

часть времени процессор простаивал в ожидании, пока оператор запустит

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

были разработаны первые системы пакетной обработки, которые

автоматизировали всю последовательность действий оператора по организации вычислительного процесса.

Прообразом современных операционных систем явились мониторные

системы пакетной обработки середины 50-х годов прошлого века, которые автоматизировали действия оператора по выполнению пакета заданий. Оператор составлял пакет заданий, которые (задания) в дальнейшем без его

участия последовательно запускались на выполнение управляющей программой

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

такие как отсутствие исходных данных, переполнение регистров, деление на

ноль, обращение к несуществующей области памяти и т.д. Сформировались понятия «задание» (job) и «задача» (task), как, соответственно, внешняя и

внутренняя единицы работы вычислительной системы. Задание (job) это

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

6

ускорения работы он мог переноситься на более удобный и ёмкий носитель, например, на МЛ или МД. Сама программа-монитор в первых реализациях также хранилась на перфокартах или перфоленте, а в более поздних – на МЛ и МД. В ходе реализации систем пакетной обработки был разработан формализованный язык управления заданиями (JCL Job-Control Language, command language), с помощью которого программист сообщал системе и оператору, какие действия и в какой последовательности он хочет выполнить на вычислительной машине. Типовой набор директив обычно включал признак начала отдельной работы, вызов транслятора, вызов загрузчика, признаки начала и конца исходных данных. Если в обычном языке программирования преобразуемые объекты и выполняемые над этими объектами операции соответствуют переменным исходной задачи, то в языке управления заданиями преобразуемыми объектами являются, например, целые программы или входные и выходные информационные потоки этих программ. В большинстве таких языков (JCL) имеются средства управления последовательностью выполняемых действий, в том числе и некоторые виды условных операторов.

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

– внесение любого исправления требовало значительно больше времени, чем при интерактивной работе за пультом машины. Эффективное использование ЭВМ (памяти и УВВ) являлось задачей языковых трансляторов и программ пользователей.

В 1965-1975 годах ХХ века переход от отдельных полупроводниковых элементов типа транзисторов к интегральным микросхемам открыл путь к появлению ЭВМ третьего поколения (third generation), на которое пришлось два поколения ОС. В этот период были реализованы практически все основные концепции, присущие современным ОС: мультипрограммирование, мультипроцессирование, поддержка многотерминального многопользователь- ского режима, виртуальная память, файловые системы, разграничение доступа и сетевая работа. В эти годы начинается расцвет системного программирования.

Революционным событием данного этапа явилась промышленная

реализация мультипрограммирования (multiprogramming system), связанная с отделением функции ввода-вывода от ЦП и передачи её специальным процессорам ввода-выводаканалам (рисунок В.2). Заметим, что в виде

концепции и экспериментальных систем этот способ организации вычислений

существовал уже около десяти лет.

Канал, или устройство обмена (channel), представляет собой специализированный процессор, выполняющий автономно (т.е. параллельно с

обработкой информации в ЦП) операции ввода-вывода. Обычно обеспечивает форматирование и буферизацию и имеет все необходимые средства управления для обеспечения синхронной работы с устройством ввода-вывода. Таким

7

ЦП

Память

Канал 1 Канал 2 Канал 3 Канал N

ПК Контроллер Контроллер Контроллер

АЦПУ

m

Т1 ТК

МЛ1 МЛn МД1 МД

Т – терминал; МД – магнитный диск

Рисунок В.2 Архитектура ЭВМ третьего поколения

образом, ЦП и каналы имеют доступ к общей информации в памяти, но скорость работы периферийных устройств (особенно содержащих механические части) и скорость работы ЦП несравнимы между собой (например, скорость выдачи строк печатающим устройством существенно ниже скорости их выдачи процессором). Отсюда следует, что для организации операционной системы необходимо накапливать вводимую и выводимую информацию в специальных областях буферах ввода-вывода (рисунок В.3), т.е. осуществлять буферизацию ввода-вывода.

К одному каналу могут подключаться несколько разных устройств ввода-

вывода (см. рисунок В.2), при этом для ввода-вывода потоков данных на то или иное устройство используются специальные схемы управления, предусмотренные

в составе канала. Если УВВ имеют относительно низкое быстродействие

(например, построчно-печатающие устройства, дисплеи и устройства считывания документов), то для их соединения с машиной используется

8

Слабая пропускная способность

Более высокая пропускная способность

Слабая пропускная способность

Ввод

Вводимые задания

Буфер ввода

ЦП

Обработка

Выводимые результаты

Буфер вывода

Печать

Вывод

Рисунок В.3 Буферизация вводаывода

мультиплексный канал. Операции ввода-вывода по такому каналу на отдельные устройства мультиплексированы, т.е. чередуются знак за знаком так, что одновременно могут работать несколько устройств. Если необходимо подключить несколько устройств с высоким быстродействием (например, магнитные диски или ленты), то используется селекторный канал. В этом случае за одну операцию ввода-вывода вводится или выводится целая запись (record – совокупность данных, обрабатываемых совместно при пересылках на периферийные устройства и обратно; файлы, хранимые во внешнем ЗУ, часто представляют собой последовательность записей; совокупность данных, передаваемых единым блоком, называется физической записью; в отличие от этого совокупность данных, связанных по смыслу, называется логической записью; число логических записей в одной физической записи называется коэффициентом блокирования; периферийное устройство, которое работает с блоками данных фиксированного размера – считыватель перфокарт, карточный перфоратор или устройство построчной печати, – называют устройством обработки единичных записей), а затем производится переключение на следующее устройство. Как правило, переключение на другое устройство выполняется после ввода-вывода не одной, а нескольких записей. Пока селекторный канал обслуживает одно устройство, другие устройства не могут пересылать информацию (в это время они могут осуществлять операции поиска, перемотки и т.д.). Контроллер (controller) устройство, управляющее работой подключённых к нему устройств; одна из функций контроллера заключается в обработке потока данных с целью их форматирования для передачи или записи на носитель. К контроллерам обычно подключаются периферийные устройства или каналы связи.

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

9

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

УВВ1 a

ЦП a b

УВВ2

0

b

а T t

УВВ1 a

ЦП a b

УВВ2 b

0 б T t

Т – общее время выполнения задач a

Рисунок В.4 – Схема выполнения программ а и b в однопрограммном (а) и мультипрограммном (б) режимах

Цель мультипрограммирования – максимально использовать вычислительные ресурсы за счёт совмещения операций ввода-вывода и вычислений. Мультипрограммный режим может быть организован как в однопроцессорной, так и в мультипроцессорной системах. Мультипрограммирование создало предпосылку для одновременного доступа к ЭВМ многих пользователей и было реализовано в двух вариантах в системах пакетной обработки и разделения времени.

Мультипрограммные системы пакетной обработки так же, как и их

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

пока одна программа выполняла операцию ввода-вывода (как это происходило при

последовательном выполнении программ в системах ранней пакетной обработки), а переключался на другую, готовую к выполнению программу. В результате достигалась сбалансированная загрузка всех устройств компьютера,

10

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

решаемых в единицу времени).

В мультипрограммных системах пакетной обработки пользователь по-

прежнему был лишён возможности интерактивно взаимодействовать со своими программами. Для того чтобы хотя бы частично вернуть пользователям

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

пользователь работает за своим терминалом (телетайпного типа). Вариант

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

владения вычислительной машиной за счёт периодического выделения каждой

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

этот запрос с максимально возможной скоростью (часто в течение секунды и

менее) и (если требуется) выдаёт ответ на терминал пользователя. Диалоговый режим работы позволил в значительной степени повысить эффективность процесса разработки и отладки программ. Пользователь системы разделения

времени получил возможность обнаруживать и исправлять ошибки буквально за

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

системах разделения времени эффективность использования оборудования ниже,

чем в системах пакетной обработки, что явилось платой за удобства работы пользователя. В числе первых ОС разделения времени, разработанных в середине

60-х годов ХХ века, были TSS/360 (компании IBM), CTSS и MULTICS ассачусетский технологический институт совместно с Bell Labs и компанией

General Electric).

Многотерминальный режим использовался не только в системах разделения времени, но и в системах пакетной обработки. При этом не только

оператор, но и все пользователи получали возможность формировать свои задания и управлять их выполнением со своего терминала. Такие операционные системы получили название систем удалённого ввода заданий. Терминальные

комплексы могли располагаться на большом расстоянии от процессорных стоек,

соединяясь с ними с помощью различных глобальных связей – модемных соединений телефонных сетей или выделенных каналов. Для поддержания удалённой работы терминалов в ОС появились специальные программные

модули, реализующие различные (в то время, как правило, нестандартные)

протоколы связи. Такие вычислительные системы с удалёнными терминалами,

сохраняя централизованный характер обработки данных, в какой-то степени являлись прообразом современных сетей, а соответствующее системное

программное обеспечение прообразом сетевых ОС.

Произошло существенное изменение в распределении функций между аппаратными и программными средствами компьютера. Операционные системы

11

становились неотъемлемыми элементами компьютеров, играя роль

«продолжения» аппаратуры. В компьютерах 60-х годов бóльшую часть действий по организации вычислительного процесса взяла на себя операционная система. (В большинстве современных компьютеров не предусмотрено даже теоретической

возможности выполнения какой-либо вычислительной работы без участия ОС.

После включения питания автоматически происходит поиск, загрузка и запуск

ОС, а в случае её отсутствия компьютер просто останавливается).

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

системы реального (масштаба) времени (СРМВ), в которых компьютеры применялись для управления технологическими процессами производства,

например на нефтеперерабатывающих предприятиях. Для систем реального

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

времени часто работают со значительной недогрузкой, поскольку для подобных

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

столь дорого.

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

поддержку нового способа организации вычислительного процесса. При

разделении ресурсов компьютера (процессорного времени, памяти) между программами необходимо обеспечить быстрое переключение процессора с одной программы на другую, а также надёжно защитить кóды и данные одной

программы от непреднамеренной или преднамеренной порчи другой программой.

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

на другую (смена контекста процессора), средства защиты областей памяти, а

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

позволяли осуществлять распределение и защиту ресурсов компьютера.

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

пользовательских программ, которые выполнялись в непривилегированном

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

таких как каналы ввода-вывода, диски, принтеры и т.п. Аппаратная поддержка

операционных систем стала с тех пор неотъемлемым свойством практически любых компьютерных систем, включая персональные компьютеры.

12

века).

Перечисленные ОС составили второе поколения ОС (начало 60-х годов ХХ

Третье поколение операционных систем (середина 60-х середина 70-х

годов ХХ века) фактически появилось с представлением фирмой IBM в 1964г. семейства компьютеров System/360. Важной тенденцией этого периода является создание семейств программно-совместимых машин и операционных систем для них. Семейство ЭВМ (computer family) группа вычислительных машин, которая образована несколькими поколениями некоторой вычислительной системы; машины одного и того же семейства имеют, как правило, аналогичную, но не всегда идентичную архитектуру. Примерами семейств программно-совместимых машин, построенных на интегральных микросхемах, являются серии машин IBM/360 и IBM/370 (аналоги этих семейств советского производства машины серии ЕС), PDP-11 (советские аналоги СМ-3, СМ-4, СМ-1420). Вскоре идея программно-совместимых машин стала общепризнанной. Компьютеры третьего поколения были разработаны как машины общего назначения. Это были громоздкие, как правило, неэффективные компьютеры, которые предназначались для решения любых задач из любых областей приложений. Вообще, системы общего назначения рассчитаны на интерактивную работу одного или нескольких пользователей в режиме разделения времени при не очень жёстких требованиях ко времени реакции системы на внешние события. Как правило, в таких системах уделяется большое внимание защите самой системы, программного обеспечения и пользовательских данных от ошибочных и злонамеренных программ и пользователей. Обычно подобные системы используют встроенные в архитектуру процессора средства защиты и виртуализации памяти. Кстати, к ОС общего назначения относятся такие широко распространенные современные системы, как Windows 2000, системы семейства Unix. Ос третьего поколения были многорежимными системами. Некоторые из них обеспечивали работу сразу во всех известных режимах: пакетную обработку, разделения времени, режиме реального времени и мультипроцессорном режиме. Они были громоздкими и дорогостоящими. Так, разработка OS/360, объём кода для которой составил

8 Мбайт, стоила компании IBM 80 миллионов долларов. Однако, несмотря на необозримые размеры и множество проблем, OS/360 и другие подобные ей операционные системы этого поколения действительно удовлетворяли большинству требований потребителей. За это десятилетие был сделан огромный шаг вперёд и заложен прочный фундамент для создания современных ОС.

В начале 70-х годов ХХ века появились первые сетевые операционные системы, которые в отличие от многотерминальных ОС позволяли не только рассредоточить пользователей, но и организовать распределённое хранение и обработку данных между несколькими компьютерами, связанными электрическими связями. Любая сетевая ОС, с одной стороны, выполняет все функции локальной ОС, а с другой стороны, обладает некоторыми дополнительными средствами, позволяющими ей взаимодействовать по сети с операционными системами других компьютеров. Программные модули, реализующие сетевые функции, появлялись в операционных системах постепенно,

13

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

серверную часть ОС – средства предоставления локальных ресурсов и услуг в общее пользование;

клиентскую часть ОС – средства запроса доступа к удалённым ресурсам и услугам;

– транспортные средства ОС – средства, которые совместно с коммуникационной системой обеспечивают передачу сообщений между

компьютерами сети).

В конце 60-х годов прошлого века в США были начаты работы по созданию глобальной сети ARPANET (по инициативе Министерства обороны

США для объединения суперкомпьютеров оборонных и научно- исследовательских центров в единую сеть), явившейся отправной точкой для Интернета, глобальной общедоступной сети, которая стала для многих

сетевых ОС испытательным полигоном, позволившим проверить в реальных

условиях возможности их взаимодействия, степень масштабируемости,

способность работы при экстремальной нагрузке.

Четвёртое поколение ЭВМ (fourth generation of computers) обобщённое название ЭВМ, разработанных где-то со середины 70-х годов (четвёртое

поколение ОС от середины 70-х годов до наших дней). Наиболее важный в концептуальном отношении критерий, по которому четвёртое поколение ЭВМ

можно отделить от ЭВМ третьего поколения, состоит в том, что ЭВМ (в том

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

средств отладки и диагностики). Основной режим работы больших ЭВМ

(мэйнфреймов) – режим разделения времени (РВ) (time sharing – техника разделения времени работы ЦП между несколькими заданиями, при которой

подключение задания к выполнению и отключение его происходит так быстро,

что применительно к выполнению конкретного задания использование ЭВМ выглядит монопольным; впервые техника разделения времени работы процессора была предложена Кристофером Стрейчем). Основное отличие РВ от собственно

мультипрограммирования: в последнем случае система ведёт себя пассивно и,

например, длинная задача может захватить процессор; в РВ же время использования процессора квантуется по тем или иным правилам.

К середине 70-х годов прошлого века наряду с мэйнфреймами широкое распространение получили мини-компьютеры, такие как PDP-11, Nova, HP.

Мини-компьютеры первыми использовали преимущества больших интегральных схем (БИС), позволившие (преимущества) реализовать достаточно мощные

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

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

14

ограниченность ресурсов мини-компьютеров. ОС мини-компьютеров часто стали специализированными, например только для управления в реальном времени (OC RT-11 для мини-компьютеров PDP-11) или только для поддержания режима разделения времени (ОС RSX-11M для тех же компьютеров). Эти операционные системы не всегда были многопользовательскими, что во многих случаях оправдывалось невысокой стоимостью компьютеров. Доступность мини- компьютеров послужила мощным стимулом для создания локальных сетей. Предприятие, которое теперь могло себе позволить иметь несколько мини- компьютеров, нуждалось в организации совместного использования данных и дорогого периферийного оборудования. Первые локальные сети строились с помощью нестандартного коммуникационного оборудования и нестандартного ПО.

Важной вехой в истории мини-компьютеров и, вообще, в истории развития ОС явилось создание ОС UNIX, которая сравнительно легко переносилась на различные типы компьютеров (массовое использование UNIX началось с середины 70-х годов). Первоначально эта ОС предназначалась для поддержания режима разделения времени в мини-компьютере PDP-7. К середине

70-х годов программный код для UNIX был на 90% написан на языке С. Широкое распространение эффективных С-компиляторов сделало UNIX уникальной для того времени ОС, обладающей возможностью сравнительно лёгкого переноса на различные типы компьютеров. Поскольку эта ОС поставлялась вместе с исходными кодами, то она стала первой открытой ОС, которую могли совершенствовать простые пользователи-энтузиасты. Хотя ОС UNIX была первоначально разработана для мини-компьютеров, её гибкость, мощные функциональные возможности и открытость позволили её занять прочные позиции во всех классах компьютеров (суперкомпьютерах, мэйнфреймах, мини- компьютерах, серверах и рабочих станциях на базе RISC-процессоров, персональных компьютерах).

К наиболее важным событиям развития ОС в 80-е годы ХХ века можно отнести разработку стека протоколов TCP/IP, становление Интернета, стандартизацию технологий локальных сетей, появление персональных компьютеров и операционных систем для них, а также попытки разработки ЭВМ пятого поколения.

В конце 70-х годов был создан рабочий вариант стека протоколов TCP/IP

(Transmission Control Protocol протокол управления передачей). Это стек представлял набор общих протоколов для разнородной вычислительной среды и предназначался для связи экспериментальной сети ARPANET с другими

«сателлитными» сетями В 1983 году стек протоколов TCP/IP был принят

Министерством обороны США в качестве военного стандарта. Внедрение протоколов TCP/IP в ARPANET придало этой сети все основные черты, которые

отличают современный Интернет. В 1983 году сеть ARPANET была разделена на

две части: MILNET, поддерживающую военные ведомства США, и новую ARPANET. Для обозначения составной сети ARPANET и MILNET стали использовать название Internet. Независимость от производителей, гибкость и

15

эффективность, доказанные успешной работой в Интернете, а также открытость и доступность стандартов сделали протоколы TCP/IP не только главным транспортным механизмом Интернета, но и основным стеком большинства сетевых ОС.

Начало 80-х годов ХХ века ознаменовалось появлением персональных

компьютеров (ПК). С точки зрения архитектуры ПК ничем не отличались от класса мини-компьютеров типа PDP-11, но их стоимость была существенно ниже. Если мини-компьютер позволил иметь собственную вычислительную машину

отделу предприятия или университету, то персональный компьютер дал такую

возможность отдельному человеку. Компьютеры стали широко использоваться неспециалистами, что потребовало разработки «дружественного» ПО, и

предоставление этих «дружественных» функций стало прямой обязанностью ОС.

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

поддержка сетевых функций стала для ОС ПК необходимым условием.

Однако, и дружественный интерфейс, и сетевые функции появились у операционных систем ПК не сразу. Первая версия наиболее популярной ОС раннего этапа развития персональных компьютеров – MS-DOS компании Microsoft

– была лишена этих возможностей. Это была однопрограммная

однопользовательская ОС с интерфейсом командной строки, способная стартовать с дискеты. Основными задачами для неё были управление файлами,

расположенными на гибких и жёстких дисках в UNIX-подобной иерархической

файловой системе, а также поочередной запуск программ. MS-DOS не была защищена от программ пользователя, так как процессор Intel 8088 не поддерживал привилегированный режим работы. DOS загружает

пользовательскую программу в память и передаёт ей управление, после чего

программа делает с системой всё, что ей заблагорассудится. При завершении программы считается хорошим тоном оставлять машину в таком состоянии, чтобы

DOS могла продолжить работу. Если же программа приводит машину в какое-то

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

мультипрограммирования, поэтому в процессоре не были предусмотрены

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

требование программной совместимости с ранними моделями того же семейства

компьютеров.

Недостающие функции для MS-DOS и подобных ей ОС компенсировались внешними программами, предоставлявшими пользователю удобный графический

интерфейс (например, Norton Commander) или средства тонкого управления дисками (PC Tools). Наибольшее влияние на развитие ПО для ПК оказала

16

операционная среда Windows компании Microsoft, представлявшая собой надстройку над MS-DOS.

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

поддерживать многопользовательский режим, при котором один пользователь –

интерактивный, а остальные получают доступ к ресурсам компьютера по сети. В таком случае от ОС требуется хотя бы некоторый минимум функциональной поддержки многопользовательского режима. История сетевых средств MAS-DOS

началась с версии 3.1. Эта версия добавила к файловой системе необходимые

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

оболочки могли обеспечить разделение файлов между сетевыми пользователями.

Вместе с выпуском версии MS-DOS 3.1 в 1984г. компания Microsoft также выпустила продукт, называемый Microsoft Networks (неформальное название MS- NET). Некоторые концепции, заложенные в MS-NET, такие как введение в

структуру базовых сетевых компонентов редиректора и сетевого сервера

успешно перешли в более поздние сетевые продукты Microsoft: LAN Manager, Windows for Workgroups, а затем и в Windows NT.

Очень удобной и полезной функцией клиентской части ОС является способность отличить запрос к удалённому файлу от запроса к локальному файлу.

Если клиентская часть ОС умеет это делать, то приложения не должны заботиться о том, с локальным или удалённым файлом они работают, – клиентская программа

сама распознаёт и перенаправляет (redirect) запрос к удалённой машине. Отсюда и

название, часто используемое для клиентской части сетевой ОС, – редúректор. Иногда функции распознавания выделяются в отдельный программный модуль, и в этом случае редиректором называют не всю клиентскую часть, а только этот

модуль. Компьютер, занимающийся исключительно обслуживанием запросов

других компьютеров, играет роль выделенного сервера сети.

Сетевые оболочки для ПК выпускали и другие компании: IBM, Artisoft, Performance Technology и др. Иной путь выбрала компания Novell. Она изначально

сделала ставку на разработку ОС со встроенными сетевыми функциями и добилась на этом пути выдающихся успехов. Её сетевые ОС NetWare на долгое время стали эталоном производительности, надёжности и защищённости для

локальных сетей.

В 1987г. в результате совместных усилий фирм Microsoft и IBM появилась первая многозадачная ОС для ПК с процессором Intel 80286, в полной мере использующая возможности защищённого режима OS/2. Эта система была

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

виртуальную память, графический пользовательский интерфейс (не с первой версии) и виртуальную машину для выполнения DOS-приложений. Фактически

она выходила за пределы простой многозадачности с её концепцией

распараллеливания отдельных процессов, получившей название многопоточности. Операционная система OS/2 с её рáзвитыми функциями многозадачности и файловой системой HPFS со встроенными средствами многопользовательской

17

защиты оказалась хорошей платформой для построения локальных сетей ПК. Наибольшее распространение получили сетевые оболочки LAN Manager компании Microsoft и LAN Server компании IBM, разработанные этими компаниями на основе одного базового кода. Эти оболочки уступали по производительности файловому серверу NetWare и потребляли больше аппаратных ресурсов, но имели важные достоинства – они позволяли, во-первых, выполнять на сервере любые программы, разработанные для OS/2, MS-DOS и Windows, а во-вторых, использовать компьютер, на котором они работали, в качестве рабочей станции [workstation – рабочая станция, автоматизированное рабочее место (АРМ)– место оператора, которое оборудовано всеми средствами, необходимыми для выполнения определённых функций].

Не очень удачная рыночная судьба OS/2 не позволила системам LAN

Manager LAN и Server захватить заметную долю рынка, но принципы работы этих сетевых систем во многом нашли своё воплощение в более удачливой ОС 90-х годов – Microsoft Windows NT, содержащей встроенные сетевые компоненты,

некоторые из которых имеют приставку LM – от LAN Manager.

В 80-е годы были приняты основные стандарты на коммуникационные технологии для локальных сетей: в 1980-м году Ethernet, в 1985-м Token Ring, в конце 80-х FDDI. Это позволило обеспечить совместимость сетевых ОС на

нижних уровнях, а также стандартизовать интерфейс ОС с драйверами

сетевых адаптеров.

Для персональных компьютеров применялись не только специально разработанные для них ОС, подобные MS-DOS, NetWare и OS/2, но и

адаптировались уже существующие ОС. Появление процессоров Intel 80286 и особенно 80386 c поддержкой мультипрограммирования позволило перенести на платформу персональных компьютеров ОС UNIX. Наиболее известной системой

этого типа была версия UNIX компании Santa Cruz Operation (SCO UNIX).

В 1980-м году в Японии была опубликована программа разработки ЭВМ

пятого поколения (fifth generation), которая ориентировалась на использовании управления вычислениями с помощью потоков данных в отличие от машины фон

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

нескольких потоков команд на один или несколько потоков данных. Для такой

классификации параллелизма (concurrency) (и параллельных ЭВМ), предложенной

Флинном, необходимо ввести понятия «поток команд», «поток данных»,

«множественный поток команд» «множественный поток данных». Под потоком команд [instruction stream (flow) – IS (IF)] упрощённо понимают

последовательность команд одной программы (последовательность командных слов, поступающих из памяти в устройство управления). Поток данных [data

stream (flow) DS (DF)] это последовательность данных, обрабатываемых

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

18

подвергающихся обработке командами. Согласно классификации Флинна (Flynn's classification) системы делятся на четыре категории:

ОКОД (SISD) система с одним потоком команд и одним потоком данных (обычные однопроцессорные ЭВМ);

ОКМД (SIMD) система с одним потоком команд и несколькими

потоками данных [векторно-конвейерные ЭВМ и процессорные матрицы (array processor матричные процессоры) для обработки данных, представленных в виде векторов и матриц; здесь используется преимущество внутреннего

параллелизма данных такого типа];

МКОД (MISD) система с несколькими потоками команд и одним потоком данных (в существующих ВС система МКОД в чистом виде не

применяется, поскольку не существует такого класса задач, в которых одна и та

же последовательность данных подвергалась бы обработке по нескольким программам; здесь реализована другая схема обработки, где один поток команд разделяется устройством управления на несколько потоков микроопераций,

каждая из которых реализуется своим АЛУ; поток данных проходит

последовательно через все или часть специализированных АЛУ и именно такого класса системы принято называть конвейерными или системами с магистральной обработкой информации);

МКМД (MIMD) – система с несколькими потоками команд и

несколькими потоками данных (многомашинные и мультипроцессорные системы).

В классе МКМД может быть реализовано управление от потока команд

(IF) (используется традиционное выполнение команд по мере их текущей готовности) и управление от потока данных (DF) (предполагает активацию операторов программы по мере их текущей готовности). В случае DF все

вершины информационного графа задачи вычисления выражения (рисунок В.5, а)

y ( x1

x2 ) x3

x4 x5

представляются в виде отдельных операторов (рисунок В.5, б), где:

КОП – код операции (её обозначение);

О1, О2 поле для приёма операндов от других операторов;

А3 – адрес (имя) оператора, куда посылается результат;

БС блок событий.

В БС записывается число, равное количеству операндов, которое нужно принять, чтобы начать выполнение данного оператора. После приёма очередного операнда из БС вычитается единица; когда в БС оказывается ноль, оператор начинает выполняться. Программа полностью повторяет информационный граф (см. рисунок В.5), но её операторы могут располагаться в памяти произвольно. Выполняться они будут независимо от начального расположения в памяти в следующем порядке:

19

х1 х2 х4 х5

1 3

у

1

1 х3

2

у13

КОП О1, О2, А3, БС

1 + х1, х2, 2, 2

2 * у11, х3, 4, 2

3 * х4, х5, 4, 2

2 3 4

у12

4

4 + у1 , у1 , у1 , 2

у=у14

а б

Рисунок В.5 – Пример информационного графа задачи и его реализации

Такты Номера операторов

1 1, 3

2 2

3 4

Во всех случаях последовательность вычислений определяется связями операторов, поэтому оператор 2 никогда не будет выполнен раньше оператора 1, оператор 4 – раньше операторов 2 и 3, т.е. сохраняется логика информационного графа. Здесь вычислительный процесс управляется готовностью данных, что и является управлением от потока данных. Считается, что такая форма представления информационного графа обеспечивает наибольший потенциальный параллелизм.

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

20

был взят в японской программе язык логического программирования PROLOG.

Ведутся активные исследования в области построения архитектур не- фон-неймановского типа, но массовое производство таких ЭВМ ещё не налажено. Примером таких ЭВМ могут служить потоковые машины (dataflow

machine), где управление вычислениями ведётся от операндов команд

(выполняются те команды, у которых готовы операнды) и редукционные машины (reduction machine), которые вычисляют арифметические выражения путём последовательного сокращения всех составляющих их подвыражений до тек пор,

пока не останутся просто значения данных. Вычисления осуществляются

способом подстановки, Для каждого выражения, которое не является просто значением данного, специальное множество правил определяет, какая именно

подстановка должна быть произведена при появлении этого выражения.

Вычислительная машина выполняет расчёт путём выбора для каждого подвыражения в вычисляемом выражении соответствующего ему правила и выполнения подстановок, определяемых этим правилом. Процесс подстановки

продолжается до тех пор, пока не останутся просто значения данных,

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

Основной целью создания редукционных машин является именно использование

такого параллелизма. Редукционные машины являются одним из основных примеров не-фон-неймановской архитектуры и представляют значительный

интерес для изучения.

Не-фон-неймановская архитектура (non von Neumann architecture) – архитектура, в которой модель вычислений радикально отличается от классической фон-неймановской модели. Не-фон-неймановская машина может не

предусматривать последовательной передачи управления (т.е. может работать без

какого-либо «счётчика команд», указывающего текущую точку, которая достигнута при выполнении программы); в ней, кроме того, может не быть

реализована концепция переменной (т.е. она может обходиться без

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

вычислительные машины. Для этих двух примеров характерна высокая степень

параллелизма и не реализация концепции переменной, а наличие постоянных связей между именами и конкретными константами. Заметим, что определение

«не-фон-неймановская» относится к машине, принципиально отличающейся от фон-неймановской модели, и обычно не используется применительно к

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

фон-неймановских машин.

Потоковая вычислительная машина (вычислительная машина, управляемая потоком данных) (dataflow machine) – вычислительная машина, в которой выполнение примитивных операций инициируется наличием операндов. В

21

классических фон-неймановских машинах реализована концепция последовательного потока команд управления: операции (команды) выполняются последовательно, по мере того как в алгоритме достигается та или иная операция. В противоположность этому в машине, управляемой потоком данных, имеется поток значений данных, который направлен от операций, генерирующих эти значения, к операциям, «потребляющим» эти значения в качестве операндов, причём операции выполняются сразу, как только будут известны все их операнды. Поскольку результат выполнения одной операции может быть операндом для многих других операций и, следовательно, может одновременно инициировать выполнение многих операций, создаются условия для реализации высокой степени параллелизма. Традиционные процедурные (императивные) языки программирования, которые предписывают строго определённый поток команд управления, плохо подходят для машин, управляемых потоком данных. Эти машины обычно программируются с использованием языков с однократным присваиванием или декларативных языков. Языки с однократным присваиванием (single-assignment languages) – эти языки выглядят как традиционные процедурные языки, поскольку включают в себя оператор присваивания и типичные конструкции, используемые для передачи управления, такие как операторы условного перехода и операторы цикла. Однако в них есть ограничение, состоящее в том, что никакой переменной не может быть присвоено значение более одного раза (для операторов присваивания в рамках цикла необходимо указывать специальные условия). Это ограничение существенно меняет природу оператора присваивания, который теперь может рассматриваться как оператор, постоянно связывающий имя переменной с некоторым значением её, в отличие от операции, которая динамически меняет значение переменной. Такая статическая природа позволяет ослабить обычные ограничения на порядок выполнения в процедурных языках, и операторы присваивания могут быть выполнены сразу же, как только будет вычислена правая часть выражения. Благодаря этому свойству языки с однократным присваиванием тесно связаны с вычислительной обработкой потоков данных (см. dataflow machine).

Для редукционных машин также совершенно не подходят традиционные процедурные (императивные) языки программирования [procedural language = imperative language – программа, написанная на процедурном языке, явно указывает способ получения желаемого результата, не определяя при этом ожидаемых свойств результата – результат неявно задаётся только способом получения его при помощи определённой процедуры. Процедура получения желаемого результата имеет вид последовательности операций, поэтому для процедурных языков характерно указание логики управления в программе и порядка выполнения операторов. В этих языках обычно присутствуют операторы присваивания, которые разрушают информацию – присваиваемое значение заменяет предыдущее значение переменной, и также зависят от порядка выполнения. Процедурные языки тесно связаны с фон-неймановской моделью вычислений и поэтому большинство популярных языков – COBOL, FORTRAN, Algol, PL/1, Ada, Pascal, C и др.– являются процедурными], поскольку здесь

22

должны использоваться декларативные (непроцедурные) языки [declarative language = nonprocedural language – при использовании декларативного языка в программе в явном виде указывается, какими свойствами должен обладать результат, но не говорится, каким способом он будет получен; подходит любой способ получения результата, обладающего требуемыми свойствами. Поскольку в основу декларативных языков заложены статические, а не динамические понятия, т.е. определяется «что», а не «как», то такие понятия как упорядочение и поток команд управления не имеют никакого отношения к этим языкам и в них нет каких-либо операторов присваивания. В идеальном случае программа на декларативном языке будет состоять только из неупорядоченной системы уравнений, характеризующей требуемый результат. Однако в реальной программе такая идеальная модель не выдерживается – для этого существующие декларативные языки должны иметь абсолютно совершенный синтаксис и стиль. Декларативные языки не привязаны к классической фон-неймановской модели вычислений, и в типичном случае алгоритм достижения требуемого результата может иметь высокую степень параллелизма].