находимся в системе, и о том, как она функционирует вокруг нас, мы мо-
жем легче строить растущие абстрактные модели на вершине тех моделей,
которые уже имеются. Компьютеры - это фактически рабочие модели
абстракций, так что чем больше мы понимаем модели, тем лучше мы можем
использовать их для упрощения и ускорения нашей работы.
Многообразие моделей на рис.1-1 . демонстрирует различные уровни,
функционирующие внутри компьютера. Нижний слой - это стартовая точка,
от которой многообразие растет вверх. Каждый уровень строится на пре-
дыдущем и используется для поддержки уровня, расположенного над ним.
Для каждого более высокого уровня среда более объемна и более "вирту-
альна" в том смысле, что имеет место меньше условных ограничений.
Верхние уровни используют для своей работы нижние и, таким образом,
скрывают подробности, необходимые для работы этих нижних уровней. Мы
можем создать модели высокого уровня, которые работают на машине более
низкого уровня, не зная ничего о нижних уровнях.
Давайте бросим беглый взгляд на уровни модели и поговорим о том,
какими из них оперирует данная книга.
Рис. 1-1
Многообразие компьютерных сред
---------------------------------------------------------------------------
\ L7 / Командные файлы (scripts)
\________________________________/
\ L6 / Прикладные программы,
\____________________________/ интерпретатор команд, языковые генераторы
\ L5 / Компилятор
\________________________/
\ L4 / Операционная система
\____________________/
\ L3 / Ядро
\________________/
\ L2 / Условная машина, ассемблер
\____________/
\ L1 / Микропрограммы
\________/
\ L0 / Логические схемы, аппаратные средства
\____/
---------------------------------------------------------------------------
УРОВЕНЬ 0 - АППАРАТНЫЕ СРЕДСТВА
На самом нижнем уровне находятся аппаратные средства и логические
цепи. Этот уровень определяет способ хранения и обработки данных во
всех аппаратных средствах. Поскольку технология изготовления кремние-
вых микросхем продолжает развиваться, этот уровень становится физи-
чески меньше и проще, тогда как скорости запоминания и обработки про-
должают расти. На этом уровне компонентами являются центральный про-
цессор (ЦП), память, микросхемы поддержки и системная шина.
Отметим, что хотя прогресс на этом уровне продолжается, это вызы-
вает очень малые изменения на верхнем слое пирамиды. Философия системы
UNIX состоит в том, чтобы изолировать низкоуровневый аппаратный слой и
обеспечить единообразные интерфейсы к нему, которые не нуждаются в из-
менениях "наверху". Верхний слой даже не должен знать о нижнем слое.
Это не значит, что события в мире аппаратуры не важны в реальном мире,
ведь противоречия реального мира влияют на скорость и емкость
ресурсов, не говоря уже об их стоимости.
УРОВЕНЬ 1 - МИКРОКОМАНДЫ
Этот уровень во многом похож на язык программирования. Он явля-
ется инструментом, который использует архитектор системы для создания
"родного" машинного языка. Машинный язык сообщает аппаратуре, какую
конкретную команду следует выполнить.
В начале эволюции ЦП большинство наборов команд были аппаратно
кодированными. Это значит, что когда ЦП получал команду, декодирование
и выполнение производилось непосредственно цепями в кремниевой мик-
росхеме. Благодаря прогрессу в технологии ЦП, некоторые микросхемы мо-
гут быть программируемыми на уровне исполнения команд, что позволяет
конструкторам создавать и реализовывать новые наборы команд с мини-
мальными усилиями.
УРОВЕНЬ 2 - УСЛОВНАЯ МАШИНА
Данный уровень обеспечивает трансляцию из мнемоник языка ассемб-
лера в коды операций и данные машинного языка. Язык ассемблера - это
некоторая англо-подобная нотация, которая облегчает человеку понимание
и управление работой компьютеров.
Условная машина поддерживается ассемблером. Ассемблер может прев-
ращать идеи более высокого уровня в цепочки чисел, которые могут быть
затем выполнены. Наряду с ассемблером, применяются модели, помогающие
использовать аппаратуру компьютера. Здесь мы можем определить такие
вещи, как стеки, вектора прерываний и периферийный ввод-вывод.
УРОВЕНЬ 3 - ЯДРО
Ядро является следующим логическим продвижением вверх и концепци-
ей, которую можно теперь реализовать программно на условной машине.
Ядро предоставляет среду, поддерживающую еще большие абстракции, чем
те, что рассматривались до сих пор. Двумя наиболее важными абстракция-
ми на уровне ядра являются управление процессами для мультипрограмми-
рования и многозадачности, и файловая система, которая управляет хра-
нением, форматом, поиском файлов и т.п. Когда эти две области перепле-
таются, мы имеем базовую функцию многопользовательской машины и ядро
операционной системы.
Одной из наиболее важных областей, которыми управляет ядро, явля-
ется безопасность. Проверки идентификации пользователя выполняются в
системных вызовах внутри ядра. Определенные механизмы используются яд-
ром для управления безопасностью файлов, устройств, памяти и про-
цессов. Единственный способ отключить механизмы безопасности состоит
в изменении исходного кода ядра и перекомпиляции всей системы, что
крайне нежелательно.
УРОВЕНЬ 4 - ОПЕРАЦИОННАЯ СИСТЕМА
Данный уровень строится на ядре, чтобы создать полную операцион-
ную среду. Потребность в дополнительных функциях системы можно удов-
летворить созданием автономных программ, имеющих конкретное назначе-
ние. Таким образом, совокупность всех специфических функций определяет
операционную систему.
УРОВЕНЬ 5 - КОМПИЛЯТОРЫ
Компилятор - это инструмент (или программа), построенный на опе-
рационной системе для дальнейшей разработки более совершенных и более
мощных сред. Новые среды могут предполагать еще большие абстракции,
чем на нижнем уровне, и делать больше допущений о том, что уже сущест-
вует. Это делает возможным символические конструкции более высокого
уровня, такие как структуры данных и управляющие структуры. Результа-
том является прикладная программа.
С помощью компилятора мы можем определить совершенно новый язык и
сделать его рабочим на компьютере, написав компилирующую программу,
которая читает этот новый язык. Это открывает целые новые области во
взаимодействии человека с машиной. Высокоуровневые языки могут вопло-
щать различные подходы к решению задач, например, процедурную модель
или объектно-ориентированную модель, и в конце концов, очевидно, могут
достичь выразительной мощи разговорного языка типа английского.
УРОВЕНЬ 6 - ПРИКЛАДНЫЕ ПРОГРАММЫ
В наше время прикладные программы могут означать массу разнооб-
разных вещей. Мы можем предположить, что любая программа, которая сде-
лана с помощью компилятора, является прикладной программой. Примерами
возможных прикладных программ являются следующее поколение языков, ин-
терпретаторов и генераторов прикладных программ. Интерпретатор - это
программа, написанная на распространенном языке высокого уровня, кото-
рая может декодировать и исполнять другой синтаксис (или язык). Приме-
ром, который интересует нас в системе UNIX, является командный про-
цессор shell. Это программа на языке Си, созданная для чтения и испол-
нения команд, записанных по правилам синтаксиса, определенных команд-
ным процессором shell.
Генератор прикладных программ - это программа, написанная на язы-
ке высокого уровня. Она предназначена для получения достаточной инфор-
мации от пользователя о его приложении и может использовать компиля-
торный язык, например Си, для написания прикладной программы, реализу-
ющей то, что требуется. Пользователь ничего не программирует. Выходом
генератора является рабочая программа.
UNIX не делает особых различий между уровнями. Некоторые особен-
ности системы, например, конвейеры, являются частью ядра на нижнем
уровне. Команда типа cat выполняет довольно простую функцию на уровне
операционной системы. Нечто подобное ls напоминает простую прикладную
программу с относительно малым набором опций. Большие программы, по-
добные семейству roff, определенно являются полновесными приложениями,
а средства типа sed и awk являются фактически интерпретаторами неболь-
ших языков программирования. Замечательной особенностью системы UNIX
является единообразие, которое она вносит в этот широкий диапазон
функций.
УРОВЕНЬ 7 - КОМАНДНЫЕ ФАЙЛЫ
Этот верхний уровень является языком, который интерпретирует
программа /bin/sh (в случае командного процессора Bourne shell). Ее
синтаксис поддерживает полный язык программирования. Хотя этот язык
лишен ряда встроенных структур и функций современного языка высокого
уровня, он имеет все необходимое для написания полезных программ.
Большим плюсом является то, что языку командного процессора доступны в
качестве внешних функций любые средства, утилиты и программы, которые
имеются в системе UNIX. Это значит, что алгоритмы, которые могут пот-
ребовать сто или более строк на языке низкого уровня типа Си, язык ко-
мандного процессора может выразить в двадцать строк. За счет потери
производительности, разумеется.
ВАШ "РЕГИСТРАЦИОННЫЙ КАТАЛОГ"
Поскольку UNIX создавалась как многопользовательская система,
многое сделано для того, чтобы система была безопасной и удобной для
каждого пользователя. Вам выделяется определенная часть файловой
системы (т.е. область на диске), которая является полностью вашей и
больше ничей. Вы можете заблокировать вашу область так, чтобы никто не
мог заглянуть вовнутрь, или же можете оставить ее открытой, чтобы дру-
гие люди могли читать эту область или писать в нее.
Помимо определения вашего места в системе, можно привязать "до-
машний" каталог (home-catalog) к вашим точным спецификациям. "Регист-
рационный каталог" - это не только область файловой памяти, но и вся
ваша среда. Можно установить переменные командного языка для определе-
ния путей по системе. Можно создать инструментарий, чтобы помочь вам в
работе.
ЧТО ТАКОЕ СОСЕДСТВО?
Во многих более старых мини- и микрокомпьютерах среда имеет
"плоскую" файловую систему. Это значит, что все файлы размещаются в
одной огромной области хранения и нет логических разделов для их разг-
раничения. Отсутствие разделов порождает массу файлов, через которые
нужно пробраться, когда вы хотите найти определенный элемент. Некото-
рые системы имели в своих файловых системах групповые разделы, но
обычно такие разделы были различными плоскими файловыми системами.
Время показало, что такой тип среды (или модели) - не лучшее решение.
Решение, которое использует UNIX,- перевернутая модель дерева.
Корень системы находится наверху, а ветви растут в стороны и вниз.
Имеется один и только один корень наверху. Ветви могут исходить в лю-
бом направлении и простираться вниз на любую глубину. Кроме того, вы
можете иметь присоединяемые ветви, которые можно изъять из системы, а
затем вернуть обратно. Они монтируются на существующую в системе дре-
вовидную структуру.
Когда вы регистрируетесь в системе, вы можете попасть в любое
место древовидной структуры. Регистрационный каталог определяется в
файле паролей. К ней можно обратиться по имени $HOME, которая является
одной из предопределенных переменных командного языка для вашего
использования. Теперь у вас есть персональная древовидная структура
под этим именем каталога. Она полностью ваша и может быть сделана не-