Как стать автором
Обновить

Ранняя история UNIX

Время на прочтение 7 мин
Количество просмотров 26K
Автор оригинала: Amit Singh
Это перевод фрагмента из статьи, который, на мой взгляд, уместно вынести в отдельный пост. Основная статья: habrahabr.ru/post/193798

Проект МАС (Multiple Access Computer, Machine-Aided Cognition, Man and Computer) начался как чисто исследовательский в MIT в 1963 году. Потом он разросся в лабораторию компьютерных наук (LCS), а в наши дни назыается Лаборатория компьютерных наук и искусственного интеллекта

В начале 60-х был всплеск интереса к системам с разделением времени. Джон МакКарти написал заметку под заглавием “Программа для оператора с разделением времени для проекта IBM 709” в 1959 году. Корбато, Мервин-Даггет и Далей в 1962 году написали в статье, что “мы на пороге третьего глобального изменения к подходу использования компьюьтеров, из-за разделения времени”. Сначала это рассматривали как способ поднять эффективность использования компьютера, но очень быстро пришли к идее многопользовательской системы. Деннис Ритчи потом скажет, что самый медленный этап в цикле “написать-скомпилировать-выполнить-отладить” стал определяться человеком, а не машиной.

image

В рамках проекта МАС получился значительный вклад в системы с разделяемым временем, включая разработку операционной системы (тогда таких слов не было, но давайте так говорить для определенности — прим. перев.) CTSS (Compatible Time-Sharing System). Во второй половине 60-х было создано несколько других систем с разделением времени, например BBN, DTSS, JOSS, SDC, и пр. Но все это не имеет отношения к этой статье. А вот Multiplexed Information and Computing Service (MULTICS) — имеет.

Multics


Это совместная разработка MIT, Bell Telephone Laboratories (BTL) и General Electric (GE) по созданию ОС с разделением времени для компьютера GE-645.

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

Multics должен был стать прикладным ПО, которое может поддерживать до 1000 пользователей одновременно. Еще из ТЗ (цитируется по “Введению и обзору в систему Multics”, Корбато, Высоцкий, 1965):
  • Работа в режиме 24х7 без сбоев
  • Наличие фреймворка, который можно будет дописать и усовершенствовать по мере надобности
  • Поддержка различных языков программирования и интерфейсов пользователя. Саму систему писали в основном на языке высокого уровня PL/I.
  • Поддержка широкого набора приложений
  • Поддержка удобного, гибкого и быстрого удаленного доступа
  • Иметь иерархическую структуру контроля, распределения ресурсов и авторизации
  • Иметь надежную ФС
  • Поддержка управления доступа к данным
  • Наличие онлайн-документации

BTL отошел от этого проекта в начале 1969 года. Multics развивался как коммерческий продукт даже после череды перепродаж. Honeywell выкупил компьютерный бизнес GE, а Bull выкупил Honeywell. В целом, проект удался и заметно повлиял на многие последующие. Последний компьютер под управлением Multics выключили 31 октября 2000 года.

UNIX


Хотя BTL вышел из проекта, некоторые его сотрудники захотели продолжить самостоятельно. Например, Кен Томпсон, Деннис Ритчи, Стью Фельдман, Дуг МакИлрой, Боб Моррис, Джо Оссанна. Томпсон работал над игрой Space Travel на GE-635. Ее написали сначала для Multics, а потом переписали на Фортране под GECOS на GE-635. Игра моделировала тела Солнечной системы, а игроку надо было посадить корабль куда-нибудь на планету или спутник. Ни софт, ни железо этого компьютера не годились для такой игры. Томпсон искал альтернативу, и переписал игру под бесхозный PDP-7. Память была объемом 8К 18-битных слов, и еще был процессор векторного дисплея для вывода красивой для того времени графики. Томпсон с помощью Ритчи переписал игру для PDP-7 на ассемблере. В процессе работы также получился софтверный блок работы с плавающей запятой. Игра работала на голом железе, без ОС.

Нулевое издание (конец 1969 года)


Томпсон и Ритчи полностью вели разработку на кросс-ассемблере на GE и переносили код на перфолентах. Томпсону это активно не нравилось, и он начал писать ОС для PDP-7, начиная с файловой системы. Система стала собираться на самой себе в конце 1969 года. Уже было ядро, редактор, ассемблер, простенький шелл и файловые утилиты типа cat, cp, rm. Это был UNICS, название — тонкий троллинг Multics. Потом оно мутировало в UNIX. Это можно считать нулевым изданием.

Первая версия команды cpобрабатывала аргументы попарно:

# cp file11 file12 file21 file22 ...


Команда dsw (delete using switches) позволяла интерактивно удалять файлы.

Влияние Multics и еще более ранней системы CTSS на современные юниксоподобные системы:
  • Шелл, в Multics он прямо так и назывался — shell. В UNIX подстановка результата выглядит как `command`, а в Multics — [command].
  • Многие команды типа ls, pwd, chdir (cwd в Multics), mail, man (help в Multics).
  • Конфигурация через файлы rc. В CTSS была программа RUNCOM.
  • roff, команда для рендеринга текста. В CTSS и Multics документация готовилась командой RUNOFF
  • Файл как простой поток байтов
  • Текст как поток символов и переводов строки
  • Древовидная файловая система
  • API для доступа к диску, которое скрывает низкоуровневые особенности железа
  • Структура аргументов для функций ввода-вывода включает в себя хендлер файла, буфер и количество символов
  • Перенаправление ввода-вывода

Ритчи писал в одной из статей по истории: “В целом, UNIX — очень консервативная система. Только небольшая часть реализованных в ней идей действительно новая. Но для наследия CTSS даже это неплохо. ”

У PDP-7 UNIX была файловая система с inodes, но они содержали очень мало информации — список физических блоков и минимальные метаданные: размер, время создания и тип файла. Специальные файлы и каталоги поддерживались, но не было путей к файлам. Зато была буферизация. Еще из существенных ограничений:
  • Создавать каталоги и специальные файлы можно только при создании файловой системы, потом нельзя
  • Может быть только один диск
  • Не поддерживалась мультипрограммность. В каждый момент времени в памяти может быть только одна программа
  • Физическое обращение к диску полностью блокировало систему
  • Не было вызовов fork, exec, wait. Шелл работал через костыли: при запуске программы шелл завершался, программа при своем завершении должна была запустить шелл заново.

PDP-7 UNIX также положил начало высокоуровневому языку B, который создавался под влиянием языка BCPL. Деннис Ритчи сказал, что В — это С без типов. BCPL помещался в 8 Кб памяти и был тщательно переработан Томпсоном. В постепенно вырос в С. Напомню, что ядро и программы PDP-7 UNIX были полностью написаны на ассемблере.

Пример ханойских башен на BCPL

UNIX также работал на PDP-9. В 1969 году также запустили первый узел ARPANET и опубликовали первый RFC.

Группа разработчиков UNIX уболтала BTL купить более продвинутый компьютер, PDP-11/20 с 24 Кб памяти. Они пообещали написать систему правки и редактирования документации для запуска без ОС, а UNIX использовать только для разработки. UNIX на новом компьютере запустили в начале 1971 года. 12 Кб памяти было занято ядром, еще немного — программами, а все остально ушло под рамдрайв.

Первое издание (ноябрь 1971 года)


Первое издание работало на PDP-11/20 без MMU и аппаратной защиты памяти. Так что стабильность работы и устойчивость к сбоям была не на высоте. Мультипрограммности тоже не было, но пути к файлам уже появились. Была документация к таким системным вызовам: break, cemt, chdir, chmod, chown, close, creat, exec, exit, fork, fstat, getuid, gtty, ilgins, intr, link, mkdir, mount, open, quit, read, rele, seek, setuid, smdate, stat, stime, stty, tell, time, umount, unlink, wait, write.

Из языков программирования поддерживались ассемблер, B, BASIC, FORTRAN. С еще не было.

Файлы среды разработки на В и ассемблере:
/bin/as ассемблер. Файл вывода по умолчанию называется a.out
/bin/ld редактор ссылок (по контексту скорее линковщик, но из оригинала такой перевод получить очень затруднительно — прим. перев.). В одной директории может одновременно работать только один пользователь из-за конфликта временных файлов
/bin/nm выводит таблицу символов из результата работы ассемблера или загрузчика
/bin/strip удаляет лишние символы из бинарников
/bin/un выводит список не определенных в программе символов
/etc/as2 второй проход ассемблера
/etc/ba ассемблер B (prog.i —> prog.s)
/etc/bc компилятор B (prog.b —> prog.i)
/etc/bilib библиотека интерпретатора В
/etc/brt1, /etc/brt2 рантайм В
/etc/liba.a ассемблерные подпрограммы
/etc/libb.a библиотека подпрограмм для В
/usr/b/rc шелл-скрипт для компиляции программы на В в бинарник. Работает по цепочке program.b —> program.i —> program.s —> a.out

В первом издании нигде не упомянут копирайт. Документация представляла собой внушительный семитомник: cm.bell-labs.com/cm/cs/who/dmr/1stEdman.html. Краткое содержание:
  1. Команды. Программы, которые вызывает непосредственно пользователь
  2. Системные вызовы. Вызывются через специальную команду процессора
  3. Подпрограммы. Вызываются пользовательскими программами
  4. Специальные файлы
  5. Форматы файлов
  6. Разное

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

Каждая логическая страница мануала называлась man page и содержала заглавие, краткое описание, текст, список затрагиваемых файлов, ссылки, диагностику, баги и автора. Документацию готовили в редакторе ed и форматировали программой roff. Самая первая страница была посвящена команде cat.

Второе издание (июнь 1972 года)


Во втором издании добавили компилятор С, сс. Он был написан на другом языке. Появились новые команды и системные вызовы: :(1), cc, echo(1), exit(1), goto(1), if(1), login(1), m6(1), man(1), mt(1), opr(1), stty(1), tmg(1), tss(1), kill(2), sleep(2), sync(2), atan(3), hypot(3), nlist(3), qsort(3), salloc(3), and sqrt(3).

:(1) Ничего не делает. Изначально это была метка для goto, нужно было научить шелл игнорировать такие строки
cc(1) компилятор С
m6(1) макропроцессор общего назначения
opr(1) отправляет задание на печать
tmg(1) компилятор компиляторов. TMG — это язык для написания компиляторов.
tss(1) интерфейс для удаленного доступа к ОС Honeywell TSS.
salloc(3) библиотека для работы со строками произвольной длины

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

Третье издание (Февраль 1973)


Эта версия заработала на PDP-11/45 с защитой памяти и поддержкой большого ее объема — до 256 Кб.

Из новых фич следует обратить внимание на конвейеры и мультипрограммность. Кроме того:
cdb(1) дебаггер С
crypt(3) процедура шифрования паролей
proof(1) прото-diff
ps(8) список процессов
sno(1) компилятор и интерпретатор SNOBOL III
speak(1) Синтезатор речи. На вход получает поток слов, выдает их произношение
typo(1) цитата из мануала: "… ищет в документе редкие слова, опечатки и hapax legomena и печатает их в стандартный вывод")
yacc(6) компилятор компиляторов

Четвертое издание (ноябрь 1973)


Это фактически третье издание, переписанное на С. Также поддерживаются новые модели PDP-11 — /60 и /70. Из-за разработки на языке более высокого уровня объем системы вырос на треть. Были небольшие обновления команд, язык В исключен из поставки.

Что еще есть на эту тему на Хабре


habrahabr.ru/post/114588
habrahabr.ru/post/126369
habrahabr.ru/post/147774 — очень хорошо написано. Текст местами повторяется, потому что обе статьи опираются на один и тот же первоисточник
habrahabr.ru/post/46432
Теги:
Хабы:
+44
Комментарии 4
Комментарии Комментарии 4

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн