UNIX

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 14:06, 24 декабря 2016.
Unix
Arbol genealógico de UNIX.jpg
Разработчик Ken Thompson, Dennis Ritchie, Brian Kernighan, Douglas McIlroy, and Joe Ossanna at Bell Labs
Написана на C and assembly language
Линейка ОС Unix
Состояние разработки Current
Исходный код Historically closed-source, while some Unix projects (including BSD family and Illumos) are open-source
Дата первого релиза Development started in 1969; 51 years ago (1969)
First manual published internally in November 1971 (1971-11)[1]
Announced outside Bell Labs in October 1973 (1973-10)[2]
Доступно в English
Ядро (тип) Monolithic
По умолчанию
пользовательский
интерфейс
Command-line interface and Graphical (X Window System)
Лицензия Varies; some versions are proprietary, others are free/open-source software
Официальный веб-сайт unix.org

UNIX — семейство переносимых, многозадачных и многопользовательских операционных систем.

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

Обзор

Первая система UNIX была разработана в подразделении Bell Labs компании AT&T. С тех пор было создано большое количество различных UNIX-систем. Юридически право называться «UNIX» имеют лишь те операционные системы, которые прошли сертификацию на соответствие стандарту Single UNIX Specification. Остальные же, хотя и используют сходные концепции и технологии, называются UNIX-подобными операционными системами.

Особенности

Основное отличие UNIX-подобных систем от других операционных систем заключается в том, что это изначально многопользовательские многозадачные системы. То есть в один и тот же момент времени сразу множество людей может выполнять множество вычислительных задач (процессов). Даже популярную во всём мире систему Microsoft Windows нельзя назвать полноценной многопользовательской системой, так как кроме как на некоторых серверных версиях, в один и тот же момент за одним компьютером с Windows может работать только один человек. В Unix может работать сразу много людей, при этом каждый из них может выполнять множество различных вычислительных процессов, которые будут использовать ресурсы именно этого компьютера.

Вторая колоссальная заслуга Unix в её мультиплатформенности. Ядро системы написано таким образом, что его легко можно приспособить практически под любой микропроцессор, а не только под популярное семейство i-386 (i-686).

UNIX имеет и другие характерные особенности:

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

Применение

В настоящее время UNIX-системы распространены в основном среди серверов, а также как встроенные системы для различного оборудования. Среди ОС для рабочих станций и домашнего применения UNIX и UNIX-подобные ОС занимают после Microsoft Windows второе (OS X), третье (GNU/Linux) и многие последующие места.

История

Предшественники

В 1957 году в Bell Labs была начата работа по созданию операционной системы для внутренних нужд. Под руководством Виктора Высотского была создана система BESYS. Впоследствии он возглавил проект Multics, а затем стал главой информационного подразделения Bell Labs.

В 1964 году появились компьютеры третьего поколения, для которых возможности BESYS уже не подходили. Высотский и его коллеги приняли решение не разрабатывать новую собственную операционную систему, а подключиться к Multics — совместному проекту General Electric и MIT. Телекоммуникационный гигант AT&T, в состав которого входила Bell Labs, оказал проекту существенную поддержку, но в 1969 году вышел из него, поскольку проект не приносил финансовых выгод.

Первые UNIX-системы

История операционной системы UNIX началась в 1969 году в одном из подразделений AT&T Bell Laboratories, когда на «малоиспользуемой» машине DEC PDP-7 Кен Томпсон, Деннис Ричи и другие, прежде занимавшиеся созданием ОС Multics, начали работу над операционной системой, названной ими первоначально Unics (UNiplexed Information and Computing System). В течение первых 10 лет развитие UNIX происходило, в основном, в Bell Labs. Соответствующие начальные версии назывались «Version n» (Vn) и предназначались для ЭВМ DEC PDP-11 (16-битовая) и VAX (32-битовая).

Версии Vn разрабатывались группой Computer Research Group (CRG) в Bell Labs. Поддержкой занималась другая группа, Unix System Group (USG). Разработкой также занималась группа Programmer's WorkBench (PWB), привнесшая систему управления исходным кодом sccs, именованные каналы и ряд других идей. В 1983 году эти группы были объединены в одну, Unix System Development Lab.

Хронология основных событий в истории ОС UNIX

1971 V1. Первая версия UNIX Time-Sharing System на ассемблере для PDP-11/20. Включала файловую систему, системный вызов fork() для порождения процессов, утилиты типа cat, ed, roff. Использовалась для обработки текстов при подготовке патентов. Системный вызов pipe() и поддержка программных каналов появилась в V2.
1973 V4. Версия, переписанная на языке C, что сделало UNIX легко переносимой на другие платформы. Язык C создавался для разработки ОС UNIX.
1974 V5. Появление первых версий в Bell Labs (PWB/UNIX, MERT).
1975 V6. Первая версия UNIX, широко распространенная за пределами Bell Labs, в частности, в университетах. С этого времени начинается появление множества других версий и UNIX становится популярной ОС. На базе этой версии в Калифорнийском университете в Беркли (UCB) создавалась 1.xBSD (для PDP-11).
1978 Версия 2.xBSD (Berkeley Systems Development) для PDP-11, созданная группой Computer Systems Research Group (CSRG) в Беркли. Поддержка сети DARPA, первая реализация стека протоколов TCP/IP. Командный интерпретатор csh. В дальнейших версиях (до 1980): поддержка виртуальной памяти, termcap, curses, редактор vi.
1979 V7. "Последняя настоящая UNIX", включала компилятор языка C, командный интерпретатор sh, систему uucp, была перенесена на 32-разрядный VAX. При этом размер ядра составлял около 40 Кбайт!
1981 4.1BSD: управление заданиями, автоматическое конфигурирование ядра. System III - первый коммерческий UNIX от AT&T, реализация именованных каналов (FIFO).
1982 UNIX начинают использовать создатели рабочих станций: SunOS 1.0 (на базе 4.1BSD) от Sun Microsystems и HP-UX (на базе System III) от Hewlett-Packard.
1983 4.2BSD: полная поддержка TCP/IP, сокетов, Ethernet. Файловая система UFS с поддержкой длинных имен файлов и символьных связей. AT&T System V: поддержка основных утилит и средств BSD, добавлен пакет средств межпроцессного взаимодействия (IPC).
1984 SVR2: функции в командном интерпретаторе sh, первые попытки стандартизации. SCO XENIX - первый коммерческий UNIX на Intel-архитектуре. Создание Free Software Foundation (FSF) и начало проекта GNU - создание свободно распространяемой UNIX-подобной ОС и соответствующих утилит.
1985 V8 (модули STREAMS). Появление архитектуры микроядра Mach. Реализации стандарта SVR2: SCO XENIX SystemV/286, Interactive 386/ix. Появление ОС Minix.
1986 4.3BSD для VAX. SVR3: модули STREAMS из V8, TLI, поддержка динамически загружаемых библиотек. V9 (дополнения из 4.3BSD). Появление операционных систем AIX (IBM) и A/UX (Apple).
1987 SVR3.2: SCO XENIX SV/386. Появление ОС IRIX (SVR3.0).
1988 4.3BSD Tahoe - 4.3BSD с исходниками. Создание SVR4 на базе System V, BSD и SunOS (X11, NFS, система виртуальной памяти, динамически подключаемые библиотеки). Добавлены: командный интерпретатор ksh, ANSI C, возможности поддержки национальных языков, соответствие стандартам POSIX, X/Open. Появление компьютера NeXT с ОС NeXTSTEP (4.3BSD + Mach 2.0).
1990 4.3BSD Reno: поддержка различных платформ, NFS, SLIP, Kerberos. SUN Solaris 1 (SunOS 4.1.4). Появление OSF/1 от Open Software Foundation: микроядро Mach 2.6 + SVR4, SMP, нити, Motif GUI.
1991 BSD Net2 (4.3BSD Lite) - не содержит спорного кода AT&T. Появление ОС GNU HURD. Появление ОС Linux (на базе Minix). Выделение из AT&T отдельного подразделения USL (Unix System Laboratories), владеющего кодом AT&T UNIX и System V.
1992 4.4BSD: виртуальная память как в Mach 2.5, журнализируемая файловая система UFS. Закрытие CSRG в Беркли. SVR4.2: журнализируемая файловая система Veritas FS, списки контроля доступа ACL, динамически загружаемые модули ядра. USL UnixWare 1 - реализация SVR4.2. SunOS 5 = Solaris 2 (SunOS 4 + SVR4).
1993 Появление ОС FreeBSD. Solaris 2.2. NeXTSTEP 3.2. IRIX 5.3, HP-UX 9.04, AIX 4.0, Linux 0.99, UnixWare 1.1.
1994 OSF 1.3: микроядро Mach 3, поддержка 64-битовых платформ. FreeBSD 2.0, SCO OpenDesktop 3.2.4. UnixWare 1.1.2. Linux 1.0.9. USL куплена компанией Novell.
1995 Появление OpenBSD и NetBSD. Solaris 2.5. Появление Digital UNIX (DEC OSF/1). Появление SCO OpenServer 5.0. UnixWare 2.0: SVR4.2 MP от Novell. Novell продает UnixWare и весь исходный код AT&T компании SCO. Выход HP-UX 10 (с добавлениями из UnixWare). Завершение работ над A/UX.
1996 FreeBSD 2.1.6. OpenBSD 2.0. IRIX 6.3. Linux 2.0.21. OpenSTEP 4 - завершение проекта NeXTSTEP. SCO UnixWare 2.1. Микроядро Mach 4.
1997 FreeBSD 2.2.5, OpenBSD 2.2, NetBSD 1.3, Solaris 2.6 (под SPARC и Intel), SCO OpenServer 5.0.4. IRIX 6.4. GNU Hurd 0.2 (+ Mach 4). Linux 2.0.28.
1998 FreeBSD 3.0 (+4.4BSD), Solaris 7, DigitalUNIX 4, SCO: OpenServer 5.0.5, UnixWare 7 (SVR5). HP-UX 11.0. Linux 2.0.36. IBM: проект Monterey (AIX 4.3 + SVR5).
1999 FreeBSD 3.4. OpenBSD 2.6, NetBSD 1.4. Появление Mac OS X и проекта Darwin (Mach 4 + FreeBSD 3.1). Solaris 8 beta. Компанию DEC купил Compaq: Tru64 Unix V.5.0. (DigitalUNIX). IRIX 6.5.6. SCO: OpenServer 5.0.5a, UnixWare 7.1.1. AIX 4.3.3. Linux 2.2.13.
2000 FreeBSD 4.0-4.2. OpenBSD 2.8. NetBSD 1.5. Solaris 8. Apple: Mac OS X Server, Darwin 1.2.1. Tru64 Unix V.5.1. IRIX 6.5.10. SCO: OpenServer 5.0.6. Компания SCO продала все свои ОС компании Caldera (Caldera OpenLinux). Hurd A1, Linux 2.4.0, 2.2.18. HP-UX 11i. AIX 5L alpha (проект Monterey).
2001 FreeBSD 4.4. OpenBSD 3.0. NetBSD 1.5.2. Mac OS X 10.1.2. SUN: Solaris 8 10/01, Solaris 9 alpha (не для Intel-архитектуры). Tru64 Unix V.5.1A, IRIX 6.5.13. SCO OpenServer 5.0.6a. Hurd H2. Caldera: OpenUNIX 8: UnixWare 7.1.1 + LKP=Linux 2.4.0 - прозрачная поддержка Linux-приложений. Linux 2.4.17, 2.0.39, 2.2.20. AIX 5L v.5.1.
2002 FreeBSD 4.7. OpenBSD 3.2. NetBSD 1.6. Mac OS X 10.2 (Jaguar). Darwin 6.2. SUN: Solaris 8 12/02, Solaris 9 OE. QNX 6.2. IRIX 6.5.18. Debian GNU/Hurd J2. SCO: UnixWare 7.1.3 (в продолжение OpenUNIX 8. Caldera снова стала SCO...). Linux (влияние IRIX и AIX, в частности, файловые системы): 2.5.2-2.5.52 - экспериментальное ядро. 2.4.20, 2.2.23. HP-UX 11i v1.6. AIX 5L v.5.2.
2003 FreeBSD 5.1, FreeBSD 4.9. OpenBSD 3.4. NetBSD 1.6.1. Mac OS X 10.3.2. Darwin 6.6-7.2. SUN: Solaris 9 OE 12/03, Solaris 9 x86 PE, Solaris 10 Preview. QNX 6.2.1. IRIX 6.5.22. Debian GNU/Hurd K5. Tru64 Unix V5.1B-1. SCO: UnixWare 7.1.3/OKP (OpenServer Kernel Personality), OpenServer 5.0.7. Linux: 2.6.0, 2.4.23, 2.2.25. HP-UX 11i v2 (в том числе, для Intel Itanium).
2004 FreeBSD 5.2. NetBSD 1.6.2. Solaris 10 Software Express 02/04. IRIX 6.5.23. Linux: 2.6.3, 2.4.25, 2.2.26, 2.0.40.

Основные характеристики

ОС UNIX имеет следующие основные характеристики:

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

Архитектура ОС UNIX

Архитектура ОС UNIX — многоуровневая. На нижнем уровне, непосредственно над оборудованием, работает ядро операционной системы. Функции ядра доступны через интерфейс системных вызовов, образующих второй уровень. На следующем уровне работают командные интерпретаторы, команды и утилиты системного администрирования, коммуникационные драйверы и протоколы, - все то, что обычно относят к системному программному обеспечению. Наконец, внешний уровень образуют прикладные программы пользователя, сетевые и другие коммуникационные службы, СУБД и утилиты.

Основные функции ядра

Основные функции ядра UNIX (которое может быть монолитным или модульным) включают:

  • планирование и переключение процессов;
  • управление памятью;
  • обработку прерываний;
  • низкоуровневую поддержку устройств (через драйверы);
  • управление дисками и буферизация данных;
  • синхронизацию процессов и обеспечение средств межпроцессного взаимодействия (IPC).

Системные вызовы

Системные вызовы обеспечивают:

  • сопоставление действий пользователя с запросами драйверов устройств;
  • создание и прекращение процессов;
  • реализацию операций ввода-вывода;
  • доступ к файлам и дискам;
  • поддержку функций терминала.

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

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

Пользовательские процессы и процессы ядра

Пользовательские процессы образуют следующие два уровня и:

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

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

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

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

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

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

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

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

Системное программное обеспечение

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

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

Для решения этих задач системное ПО (работающее в пользовательском режиме) часто использует системные вызовы.

Пользователи и группы

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

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

Для отслеживания владельцев процессов и файлов используются числовые идентификаторы. Идентификатор пользователя и группы - целое число (обычно) в диапазоне от 0 до 65535. Присвоение уникального идентификатора пользователя выполняется при заведении системным администратором нового регистрационного имени. Значения идентификатора пользователя и группы — не просто числа, которые идентифицируют пользователя, - они определяют владельцев файлов и процессов. Среди пользователей системы выделяется один пользователь - системный администратор или суперпользователь, обладающий всей полнотой прав на использование и конфигурирование системы. Это пользователь с идентификатором 0 и регистрационным именем root.

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

Интересные факты

UNIX-время

UNIX-время — система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); время с этого момента называют «эрой UNIX».

UNIX-время представлено целым числом, которое увеличивается с каждой прошедшей секундой без необходимости вычислений для определения года, месяца, дня, часа или минуты для удобства восприятия человеком. Современное UNIX-время согласуется с UTC — отсчет происходит в секундах СИ. Временной промежуток одного дня почти всегда разбит на 86400 секунд, но при объявлении високосных секунд составляет 86401 секунду. Такие секунды, согласно Всемирному времени, сохраняют длительность дней синхронизированной со временем оборота планеты. В UNIX-времени соответствующие номера секунд повторяются, то есть високосные секунды не учитываются.

В момент времени 00:00:00 UTC 1 января 1970 года (четверг) UNIX-время равно нулю. Начиная с этого времени, число возрастает на определённое количество в день. Каждый день число, представляющее Unix-время вычисляется описанным образом в UTC (00:00:00Z), и увеличивается ровно на 1 в секунду, начиная с полночи. Следовательно, 16-09-2004 17:55:43.54, 64543.54 секунд с полуночи, из примера выше, будет представлено в UNIX-времени числом 1095292800 + 64543.54 = 1095357343.54. Для дат, предшествующих началу отсчета, число также возрастает, т.е. с течением времени приближается к нулю.

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

В программах для хранения UNIX-времени используется целочисленный знаковый тип. 32-битные числа со знаком могут ссылаться на моменты времени от пятницы 13 декабря 1901 года 20:45:52 до вторника 19 января 2038 года 03:14:07 включительно.

19 января 2038 года в 03:14:08 по всемирному времени значение переменной типа time_t, отсчитывающей число секунд, прошедших с 1 января 1970 года, достигнет 231, что может привести к ошибочной интерпретации этого числа как отрицательного. Возможное решение данной проблемы состоит в использовании для хранения времени не 32-битной, а 64-битной переменной (что и делается во всех современных 64-битных операционных системах), этого хватит на 292 млрд лет.

Проблема Apple iOS как UNIX-системы

У 64-битных iOS устройств от Apple существует проблема как UNIX системы. Если перевести время на устройстве с 64-битным процессором под управлением iOS на час ночи первого января 1970 года и перезагрузить устройство, будучи в часовом поясе от UTC +1:30 и больше, то после перезагрузки устройства оно не будет включаться, всё время будет светиться "белое яблоко". Происходит это из-за разницы в часовых поясах, то есть: если перевести время на 1:00 1 января 1970 года в часовом поясе UTC +1:30 или больше, то счётчик UNIX-time уходит в минус, так как отсчёт ведётся от UTC времени, что система понять не в состоянии, вследствие чего счётчик зависает. Устройство даже не восстанавливается через DFU, но у проблемы есть три решения другими способами. Первый способ: просто оставить включенным устройство и ждать пока счётчик UNIX-time уйдёт в плюс (пока не доказано, что данный способ работает). Второй способ: ждать пока аккумулятор телефона сядет полностью и счётчик сам сбросится на нулевое состояние. Третий способ: разобрать устройство и отключить аккумулятор на некоторое время, затем собрать устройство, счётчик так же сбросится на ноль и устройство будет работать.

Литература

  1. Дайсон П. «Операционная система UNIX. Настольный справочник» — М.: ЛОРИ, 1997. 400 с.
  2. Кэвин Р., Фостер-Джонсон Э. «UNIX: справочник» — СПб: Питер Ком, 1999. 384 с.

Примечания

  1. McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139. 
  2. Ritchie, D. M.; Thompson, K. (1974). "The UNIX Time-Sharing System" (PDF). CACM 17 (7): 365–375. 

Ссылки