Реферат: Операционная система UNIX

Содержание

1. Основание и история

Проект операционной системыMultics: неудача с положительными последствиями

Возникновение и перваяредакция ОС UNIX

Исследовательский UNIX

Первый перенос ОС UNIX

Седьмая редакция

Возникновение группыуниверситета г. Беркли (BSD)

UNIX System III и первыекоммерческие версии системы

AT&T System V Release 2 иRelease 3

2. Основные понятия ОС UNIX ибазовые системные вызовы

Основные понятия

Пользователь

Интерфейс пользователя

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

Программы

Команды

Процессы

Перенаправление ввода/вывода

Основание и история

История ОС UNIX началась в недрах Bell Telephone Laboratories (теперьAT&T Bell Laboratories) и связана с известными теперь всем именами КенаТомпсона, Денниса Ритчи и Брайана Кернигана (два последних имени знакомычитателям и как имена авторов популярнейшей книги по языку программирования Си,издававшейся в нашей стране на русском языке).

Проект операционной системы Multics: неудачас положительными последствиями

С 1965 по 1969 год компания Bell Labs совместно с компанией General Electricи группой исследователей из Масачусетского технологического институтаучаствовала в проекте ОС Multics. Целью проекта было созданиемногопользовательской интерактивной операционной системы, обеспечивающейбольшое число пользователей удобными и мощными средствами доступа квычислительным ресурсам. В этом курсе мы не ставим задачу познакомитьслушателей с ОС Multics. Это могло бы быть темой отдельного большого курса.Однако отметим хотя бы некоторые идеи, которые содержались в проекте MAC (такназывался проект ОС Multics).

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

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

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

Операционная система Multics, хотя и не была полностью доведена до стадиикоммерческого продукта, обогатила мировое сообщество системных программистовмассой ценных идей, многие из которых сохраняют свою актуальность по сей день ииспользуются применительно не только к операционным системам. Основным недостаткомОС Multics, который, по всей видимости, и помешал довести систему до уровняпрограммного продукта, была ее чрезмерная сложность. Среди участников проектаMultics находились Кен Томпсон и Деннис Ритчи.

Решение о прекращении участия в проекте Multics было принято на самомверхнем уровне руководства Bell Labs, и сотрудники, по существу, былипоставлены перед свершившимся фактом. Более того, руководство компании,разочарованное результатами весьма дорогостоящего проекта, вообще не желалобольше вести какие-либо работы, связанные с операционными системами.

Возникновение и первая редакция ОС UNIX

Принято считать, что исходным толчком к появлению ОС UNIX явилась работаКена Томпсона по созданию компьютерной игры «Space Travel». Он делалэто в 1969 году на компьютере Honeywell 635, который до этого использовался дляразработки проекта MAC. В это же время Кен Томпсон, Деннис Ритчи и другиесотрудники Bell Labs предложили идею усовершенствованной файловой системы,прототип которой был реализован на компьютере General Electric 645. Однакокомпьютер GE-645, который был рассчитан на работу в режиме разделения времени ине обладал достаточной эффективностью, не годился для переноса Space Travel.Томпсон стал искать замену и обнаружил, что появившийся к этому времени18-разрядный компьютер PDP-7 с 4 килословами оперативной памяти и качественнымграфическим дисплеем вполне для этого подходит.

После того, как игра была успешно перенесена на PDP-7, Томпсон решилреализовать на PDP-7 разработанную ранее файловую систему. Дополнительнымоснованием для этого решения было то, что компания Bell Labs испытывалапотребность в удобных и дешевых средствах подготовки и ведения документации. Вскором времени на PDP-7 работала файловая система, в которой поддерживались:понятие inodes, подсистема управления процессами и памятью, обеспечивающаяиспользование системы двумя пользователями в режиме разделения времени, простойкомандный интерпретатор и несколько утилит. Все это еще не называлосьоперационной системой UNIX, но уже содержало родовые черты этой ОС.

Название придумал Брайан Керниган. Он предложил назвать этудвухпользовательскую систему UNICS (Uniplexed Information and ComputingSystem). Название понравилось, поскольку, помимо прочего, оно напоминало обучастии сотрудников Bell Labs в проекте Multics. В скором времени UNICSпревратилось в UNIX (произносится так же, но на одну букву короче).

Первыми реальными пользователями UNIX стали сотрудники патентного отделаBell Labs. Однако существовали некоторые проблемы, связанные с PDP-7.Во-первых, эта машина не принадлежала компьютерной группе (была только вовременном пользовании). Во-вторых, возможности этого компьютера неудовлетворяли потребности исследователей. Поэтому в 1971 году был приобретенновый 16-разрядный компьютер фирмы Digital Equipment PDP-11/20, и на него былаперенесена UNIX. Существовавший к этому времени вариант системы был написан наязыке ассемблера, так что можно представить, что перенос был совсем не простымделом. На PDP-11 система поддерживала большее число пользователей. Кроме того,была реализована утилита форматирования текстовых документов roff (тоже наязыке ассемблера).

В ноябре 1971 года был опубликован первый выпуск документации по ОС UNIX(«Первая редакция»). В соответствии с этой «Первой редакцией»назвали и соответствующий документации вариант системы. Впоследствии это сталотрадицией: новая редакция ОС UNIX объявлялась при выходе в свет новой редакциидокументации.

Вторая редакция появилась в 1972 году. Наиболее существенным качеством«Второй редакции» было то, что система была переписана на языке Би(«B»). Язык и интерпретирующая система программирования былиразработаны Кеном Томпсоном под влиянием существовавшего языка BCPL. Во второйредакции появились программные каналы («pipes»).

Появление варианта системы, написанного не на языке ассемблера, былозаметным продвижением. Однако сам язык Би во многом не удовлетворялразработчиков. Подобно языку BCPL язык Би был бестиповым, в нем поддерживалсятолько один тип данных, соответствующий машинному слову. Другие типы данныхэмулировались библиотекой функций. Деннис Ритчи, который всегда увлекалсяязыками программирования, решил устранить ограничения языка Би, добавив в языксистему типов. Так возник язык Си («C»). В 1973 году Томпсон и Ритчипереписали систему на языке Си. К этому времени существовало около 25 установокОС UNIX, и это была «Четвертая редакция».

В июле 1974 года Томпсон и Ритчи опубликовали в журнале Communications ofthe ACM историческую статью «UNIX Timesharing Operating System»,которая положила начало новому этапу в истории системы. ОС UNIXзаинтересовались в университетах. Этому способствовала политика компании BellLabs, которая объявила о возможности бесплатного получения исходных текстовUNIX для использования в целях образования (нужно было платить только заноситель и документацию).

Появившуюся к этому времени «Пятую редакцию» ОС UNIX одними изпервых получили Калифорнийский университет г. Беркли и университет НовогоЮжного Уэльса г. Сидней (Австралия).

Исследовательский UNIX

В 1975 году компания Bell Labs выпустила «Шестую редакцию» ОСUNIX, известную как V6 или Исследовательский UNIX. Эта версия системы былапервой коммерчески доступной вне Bell Labs. К этому времени большая частьсистемы была написана на языке Си. Небольшие размеры языка и наличиесравнительно легко переносимого компилятора придавали ОС UNIX V6 новое качествореально переносимой операционной системы. Кроме того, потенциальное наличие наразных аппаратных платформах компилятора языка Си делало возможным разработкумобильного прикладного программного обеспечения.

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

Примерно в это же время Кен Томпсон во время своего академического отпускапосетил университет г. Беркли и установил там UNIX V6 на компьютере PDP-11/70.Билл Джой (основатель BSD — Berkeley Software Distribution, а впоследствииоснователь и вице-президент компании Sun Microsystems) был тогда дипломникомэтого университета.

Первый перенос ОС UNIX

По-видимому, первый перенос ОС UNIX на компьютер с архитектурой,принципиально отличающейся от PDP-11, был произведен в 1977 году в Австралии.Это произошло вскоре после того, как в университете Воллонгонга была образованакомпьютерная кафедра. Джюрис Рейндфельдс, ставший заведующим новой кафедры,решил использовать ОС UNIX как основу обучения студентов. Он специально посетилуниверситет г. Беркли и был вдохновлен возможностями, имеющимися в этомуниверситете (PDP-11/40 с ОС UNIX V6). Однако выяснилось, что в университетег.Воллонгонг отсутствовали средства, достаточные для приобретения PDP-11.

Профессор Рейндфельдс был вынужден купить 32-разрядный компьютер Interdata7/32, который был существенно дешевле, хотя и слабее по производительности.После нескольких попыток здравым образом дополнить «родную»операционную систему Interdata 7/32 OSMT/32 более развитыми средствамимногопользовательского режима использования было принято решение попробоватьперенести на эту 32-разрядную машину ОС UNIX V6.

Очень замысловатым образом (напомним, что в австралийском университете небыло доступного компьютера PDP-11) путем обмена магнитными лентами суниверситетом г. Беркли Ричард Миллер (канадец, работавший в Австралии) смог кянварю 1977 года получить компилятор языка Си, который мог успешнокомпилировать собственный исходный текст на Interdata 7/32. Это позволило ужечерез месяц получить некоторый вариант ОС UNIX, работающий на этой же машине.

Система Миллера представляла собой некий гибрид, основанный на ОС UNIX V6 ивыполняемый «поверх» OSMT/32. Версия системы не включала собственныхсредств управления терминалами и обработки прерываний и поддерживала околовосьми команд примитивного командного интерпретатора. Тем не менее, это былапервая успешная (и быстро выполненная) попытка переноса ОС UNIX на компьютер с32-разрядной архитектурой.

Седьмая редакция

После завершения своей работы Ричард Миллер отправился в Bell Labs с цельюобсудить полученные результаты с Томпсоном и Ритчи. Незадолго до этого в BellLabs был закуплен компьютер Interdata 8/32 (модель, следующая за Interdata7/32). В принципе, компания Bell Labs была удовлетворена возможностями и ценойкомпьютеров семейства PDP-11. Однако 16-разрядная организация этих компьютеровограничивала возможности ОС UNIX (слишком малый размер виртуальной памяти дляразработки больших и сложных программ). Переход на 32-разрядные архитектурыпозволял преодолеть эти ограничения.

Наличие 32-разрядного компьютера Interdata 8/32 и имеющийся положительныйопыт Ричарда Миллера по переносу (хотя и не полному) ОС UNIX на Interdataпривели к тому, что Томпсон и Ритчи решили произвести полный перенос UNIX насвою новую машину. Для начала требовалось развить язык Си, чтобы программистымогли использовать особенности 32-разрядных архитектур. Для этого Деннис Ритчирасширил систему типов языка Си типами union, short integer, long integer иunsigned integer. В дополнение к этому, в языке появились развитые средстваинициализации переменных, битовые поля, макросы и средства условной компиляции,регистровые и глобальные переменные и т.д. Одним словом, язык Си стал таким,каким он описан в известнейшей книге Кернигана и Ритчи «Языкпрограммирования Си» (сокращенно принято называть этот диалект языкаK&R).

Однако одного расширенного языка Си было недостаточно для переноса UNIX,поскольку сама организация UNIX V6 была слишком ориентирована на особенностиPDP-11. Пришлось полностью переписать подсистему управления оперативной ивиртуальной памятью и изменить интерфейс драйверов внешних устройств, чтобысделать систему более легко переносимой на другие архитектуры. Результатомработы стала «Седьмая редакция» UNIX (чаще ее называют UNIX Version7). В состав новой версии системы входил компилятор нового диалекта языка СиPCC (Portable C-Compiler), новый командный интерпретатор sh, называемый также вчесть своего создателя Bourne-shell, набор новых драйверов устройств и многоедругое.

После выпуска UNIX Version 7 Деннис Ритчи поехал на конференцию в Австралиюи взял с собой магнитную ленту с исходными текстами системы. В Мельбурнскомуниверситете был осуществлен полный перенос системы на Interdata 8/32. Позднеев Воллонгонге система была повторно перенесена на Interdata 7/32. Такимобразом, в результате совместной плодотворной работы исследователей из США иАвстралии было продемонстрировано одно из наиболее ярких качеств ОС UNIX — мобильность. Кроме того, стало ясно, что полезно привлекать к работе над ОСUNIX сотрудников и студентов университетов.

Возникновение группы университета г. Беркли(BSD)

Как мы упоминали выше, в 1976 году Кен Томпсон провел свой академическийотпуск в университете г. Беркли и принял участие в проводившихся тамисследованиях. Это привело к возникновению серьезного интереса к ОС UNIX средипрофессоров и студентов. Появились местные знатоки системы, среди которых однимиз наиболее сильных был Билл Джой.

Билл Джой собрал вместе с целью дальнейшего распространения большой объемпрограммного обеспечения, включавший полный набор текстов UNIX V6, компиляторязыка Паскаль, свой собственный редактор ex(потом его стали называть vi)и другие программы. Все это было названо Berkeley Software Distribution (BSD1.0). Вокруг BSD сложилась небольшая, но очень сильная группа молодыхпрограммистов. Бытует мнение, что именно группа BSD смогла добиться практическиполного устранения ошибок в UNIX V6. Не будучи удовлетворенной структурой ифункциями ядра UNIX V6, группа BSD в своем втором выпуске (BSD 2.x) предприняласерьезную попытку переписать ядро системы.

В компьютерном отделении университета Беркли имелось несколько компьютеровсемейства VAX компании Digital. Группа BSD при участии сотрудников Bell LabsДжона Рейзера и Тома Лондона произвела перенос UNIX Version 7 на 32-разряднуюархитектуру VAX. Этот вариант UNIX назывался 32/V. В ядре системы появилисьновые свойства страничного замещения оперативной памяти и управлениявиртуальной памятью. Система стала основой третьего выпуска — BSD 3.x.

В группе BSD был разработан и впервые реализован стек транспортныхпротоколов TCP/IP (Transport Control Protocol/Internet Protocol). Эта работафинансировалась министерством безопасности США.

Bell Labs и университет Беркли заключили соглашение, в соответствии скоторым группа BSD могла распространять свои версии ОС UNIX среди любыхпользователей, которые располагали лицензией Bell Labs. Если учесть, что UNIXBSD исторически распространялся бесплатно (с исходными текстами!), а лицензияBell Labs к этому времени стоила уже весьма недешево, то можно понять группуBSD, которая, начиная с первой версии BSD 4.1 (1980 год), стремилась к тому,чтобы освободить пользователей UNIX BSD от необходимости приобретать лицензиюBell Labs. Подробности этого процесса и возникшие коллизии мы рассмотрим вразделе, посвященном современному состоянию ОС UNIX.

UNIX System III и первые коммерческие версиисистемы

В 1978 году в Bell Labs специально для поддержки ОС UNIX была организованаГруппа поддержки ОС UNIX (UNIX Support Group — USG). Эта группа выпустиланесколько версий системы, но они не имели хождения за пределами Bell Labs.

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

Одной из первых была компания UniSoft Corporation, которая производила своюверсию UNIX под названием UniPlus+. Microsoft Corporation совместно с SantaCruz Operation (SCO) произвели вариант UNIX под названием XENIX. В результате кконцу 70-х UNIX-подобные операционные системы были доступны на компьютерах,основанных на микропроцессорах Zilog, Intel, Motorola и т.д. Появились тысячиустановок с ОС UNIX.

В 1982 году USG выпустила за пределы Bell Labs свой первый вариант UNIX,получивший название UNIX System III. В этой системе сочетались лучшие качестваUNIX Version 7, V/32 и других вариантов UNIX, имевших хождение в Bell Labs.

AT&T System V Release 2 и Release 3

В начале 1983 года компания American Telephone and Telegraph BellLaboratories (AT&T Bell Labs) объявила о выпуске UNIX System V. Впервые вистории Bell Labs было также объявлено, что AT&T будет поддерживать этот ивсе будущие выпуски System V. Кроме того, была обещана совместимость выпущеннойверсии System V со всеми будущими версиями. ОС UNIX System V включала многоновых возможностей, но почти все они относились к повышению производительности(хеш-таблицы и кэширование данных). На самом деле UNIX System V являласьразвитым вариантом UNIX System III. К наиболее важным оригинальным особенностямUNIX System V относится появление семафоров, очередей сообщений и разделяемойпамяти.

В 1984 году USG была преобразована в Лабораторию по развитию системы UNIX(UNIX System Development Laboratories — USDL). В 1984 году USDL выпустила UNIXSystem V Release 2 (SVR2). В этом варианте системы появились возможностиблокировок файлов и записей, копирования совместно используемых страницоперативной памяти при попытке записи (copy-on-write), страничного замещенияоперативной памяти (реализованного не так, как в BSD) и т.д. К этому времени ОСUNIX была установлена на более чем 100000 компьютеров.

В 1987 году подразделение USDL объявило о выпуске UNIX System V Release 3(SVR3). В этой системе появились полные возможности межпроцессныхвзаимодействий, разделения удаленных файлов (Remote File Sharing — RFS),развитые операции обработки сигналов, разделяемые библиотеки и т.д. Кроме того,были обеспечены новые возможности по повышению производительности ибезопасности системы. К концу 1987 года появилось более 750000 установок ОСUNIX, и было зарегистрировано 4,5 млн. пользователей.

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

Таблица 1.1.
Характерные свойства версий AT&T UNIX начиная с 1982 года

1982 System III

Именованные программные каналы Очереди запуска

1983 System V

Хеш-таблицы Кэши буферов и inodes Семафоры Разделяемая память Очереди сообщений

1984 SVR2

Блокирование записей и файлов Подкачка по требованию Копирование по записи

1987 SVR3

Межпроцессные взаимодействия (IPC) Разделение удаленных файлов (RFS) Развитые операции обработки сигналов Разделяемые библиотеки Переключатель файловых систем (FSS) Интерфейс транспортного уровня (TLI) Возможности коммуникаций на основе потоков

1989 SVR4

Поддержка обработки в реальном времени Классы планирования процессов Динамически выделяемые структуры данных Развитые возможности открытия файлов Управление виртуальной памятью (VM) Возможности виртуальной файловой системы (VFS) Быстрая файловая система (BSD) Развитые возможности потоков Прерываемое ядро Квоты файловых систем Интерфейс драйвера с ядром системы

/>

Рис. 1.1. Генеалогическое дерево ОСUNIX

Основные понятия ОС UNIX и базовые системныевызовыОсновные понятия

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

Пользователь

С самого начала ОС UNIX замышлялась как интерактивная система. Другимисловами, UNIX предназначен для терминальной работы. Чтобы начать работать,человек должен «войти» в систему, введя со свободного терминала своеучетное имя (account name) и, возможно, пароль (password). Человек,зарегистрированный в учетных файлах системы, и, следовательно, имеющий учетноеимя, называется зарегистрированным пользователем системы. Регистрацию новыхпользователей обычно выполняет администратор системы. Пользователь не можетизменить свое учетное имя, но может установить и/или изменить свой пароль.Пароли хранятся в отдельном файле в закодированном виде. Не забывайте свойпароль, снова узнать его не поможет даже администратор!

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

Интерфейс пользователя

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

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

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

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

Ядро ОС UNIX идентифицирует каждого пользователя по его идентификатору (UID- User Identifier), уникальному целому значению, присваиваемому пользователюпри регистрации в системе. Кроме того, каждый пользователь относится кнекоторой группе пользователей, которая также идентифицируется некоторым целымзначением (GID — Group IDentifier). Значения UID и GID для каждогозарегистрированного пользователя сохраняются в учетных файлах системы и приписываютсяпроцессу, в котором выполняется командный интерпретатор, запущенный при входепользователя в систему. Эти значения наследуются каждым новым процессом,запущенным от имени данного пользователя, и используются ядром системы дляконтроля правомощности доступа к файлам, выполнения программ и т.д.

Понятно, что администратор системы, который, естественно, тоже являетсязарегистрированным пользователем, должен обладать большими возможностями, чемобычные пользователи. В ОС UNIX эта задача решается путем выделения одногозначения UID (нулевого). Пользователь с таким UID называется суперпользователем(superuser)или root.Он имеет неограниченные права на доступ к любому файлу и на выполнение любойпрограммы. Кроме того, такой пользователь имеет возможность полного контролянад системой. Он может остановить ее и даже разрушить.

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

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

Программы

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

Поэтому программы, написанные на языке Си, при использовании правильногостиля программирования обладают весьма высоким уровнем мобильности, т.е. ихможно достаточно просто переносить на другие аппаратные платформы, работающиекак под управлением ОС UNIX, так и под управлением ряда других операционныхсистем (например, DEC Open VMS или MS Windows NT). Более подробно мы рассмотримпринципы мобильного программирования в среде ОС UNIX в четвертой части курса.

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

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

В последние годы все большую популярность получает редактор Emacs (разработанныйи непрерывно совершенствуемый президентом Free Software Foundation РичардомСтоллманом). Это очень мощный многооконный редактор, который позволяет нетолько писать программы (и другие тексты), но также и компилировать,компоновать и отлаживать программы (а также делать многое другое, например,принимать и отправлять электронную почту). Основным недостатком редактора Emacs являетсяисключительно большой набор (более 200) функциональных клавиш. Следует, правда,заметить, что при использовании Emacs в оконной системе X он обеспечивает болееудобный интерфейс.

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

После того, как текстовый файл создан, его нужно откомпилировать дляполучения объектного файла. Наиболее популярными компиляторами для языка Си всреде ОС UNIX сейчас являются pcc(Ритчи и Томпсон) и gcc(Ричард Столлман). Оба эти компилятора являются полностью мобильными и обладаютвозможностью генерировать код для разнообразных компьютеров, т.е. этикомпиляторы могут быть установлены практически на любой аппаратной платформепод управлением ОС UNIX.

Можно отметить следующие преимущества gcc.Во-первых, этот компилятор свободно, т.е. бесплатно (вместе со своими исходнымитекстами) распространяется Free Software Foundation. Во-вторых, gcc тщательноподдерживается и сопровождается. В-третьих, начиная с версии 2.0, gcc можеткомпилировать программы, написанные на языках Си, Си++ и Objective C, арезультирующая выполняемая программа может быть скомпонована из объектныхфайлов, полученных из текстовых файлов на любом из этих языков. В-четвертых,открытость исходных текстов gccи тщательно разработанная структура компилятора позволяют сравнительно простодобавлять к gccновые кодогенераторы. Относительным недостатком gcc является то, что используемыйдиалект языка Си включает слишком много расширений по сравнению со стандартомANSI/ISO (однако имеется режим, в котором компилятор указывает все расширенныеконструкции языка, встречающиеся в компилируемой программе).

Оба компилятора обрабатывают программу в два этапа. На первом этапесинтаксически правильный текст на языке Си преобразуется в текст на языкеассемблера. На втором этапе на основе текста на языке ассемблера генерируютсямашинные коды и получается объектный файл. Исторически в ОС UNIX использовалисьразличные форматы объектных модулей. Для обеспечения совместимости спредыдущими версиями почти все они поддерживаются в современных версияхкомпиляторов. Однако в настоящее время преимущественно используется формат COFF(Common Object File Format). При желании можно остановить процесс компиляциипосле первого этапа и получить для изучения файл с текстом программы на языкеассемблера.

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

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

В ОС UNIX имеется несколько стандартных библиотек. В большинстве случаевнаиболее важной является библиотека ввода/вывода (stdio). Грамотное использованиестандартных библиотек способствует созданию легко переносимых прикладныхпрограмм (мы вернемся к обсуждению стандартных библиотек ОС UNIX в четвертойчасти курса).

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

Команды

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

В свою очередь, набор команд последнего вида включает стандартные команды(системные утилиты, такие как vi,cc и т.д.)и команды, созданные пользователями системы. Для того, чтобы выполняемый файл,разработанный пользователем ОС UNIX, можно было запускать как команду shell, достаточноопределить в одном из исходных файлов функцию с именем main (имя main должно бытьглобальным, т.е. перед ним не должно указываться ключевое слово static). Еслиупотребить в качестве имени команды имя такого выполняемого файла, командныйинтерпретатор создаст новый процесс (см. следующий подраздел) и запустит в немуказанную выполняемую программу начиная с вызова функции main.

Тело функции main,вообще говоря, может быть произвольным (для интерпретатора существенно тольконаличие входной точки в программу с именем main),но для того, чтобы создать команду, которой можно задавать параметры, нужнопридерживаться некоторых стандартных правил. В этом случае каждая функция main должнаопределяться с двумя параметрами — argcи argv.После вызова команды параметру argcбудет соответствовать число символьных строк, указанных в качестве аргументоввызова команды, а argv — массив указателей на переменные, содержащие эти строки. При этом имя самойкоманды составляет первую строку аргументов (т.е. после вызова значение argc всегда большеили равно 1). Код функции mainдолжен проанализировать допустимость заданного значения argc исоответствующим образом обработать заданные текстовые строки.

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

#include<stdio.h>

main (argc, argv)

int argc;

char *argv[];

{

if (argc != 2)

{printf(«usage: %s your-text\n», argv[0]);

exit;

}

printf("%s\n",argv[1]);

}

Процессы

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

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

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

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

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

main()

{if(fork()==0)wait(0); /* родительский процесс */

elseexecl(«ls», «ls», 0); /* порожденный процесс */

}

Перенаправление ввода/вывода

Механизм перенаправления ввода/вывода является одним из наиболее элегантных,мощных и одновременно простых механизмов ОС UNIX. Цель, которая ставилась приразработке этого механизма, состоит в следующем. Поскольку UNIX — этоинтерактивная система, то обычно программы вводят текстовые строки с терминалаи выводят результирующие текстовые строки на экран терминала. Для того, чтобыобеспечить более гибкое использование таких программ, желательно уметьобеспечить им ввод из файла или из вывода других программ и направить их выводв файл или на ввод другим программам.

Реализация механизма основывается на следующих свойствах ОС UNIX. Во-первых,любой ввод/вывод трактуется как ввод из некоторого файла и вывод в некоторыйфайл. Клавиатура и экран терминала тоже интерпретируются как файлы (первый можнотолько читать, а во второй можно только писать). Во-вторых, доступ к любомуфайлу производится через его дескриптор (положительное целое число).Фиксируются три значения дескрипторов файлов. Файл с дескриптором 1 называетсяфайлом стандартного ввода (stdin),файл с дескриптором 2 — файлом стандартного вывода (stdout), и файл с дескриптором 3 — файлом стандартного вывода диагностических сообщений (stderr). В-третьих,программа, запущенная в некотором процессе, «наследует» отпородившего процесса все дескрипторы открытых файлов.

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

Конечно, то же самое может проделать и любая другая программа, запускающаятретью программу в специально созданном процессе. Следовательно, все, чтотребуется для нормального функционирования механизма перенаправленияввода/вывода — это придерживаться при программировании соглашения обиспользовании дескрипторов stdin,stdout и stderr. Это не оченьтрудно, поскольку в наиболее распространенных функциях библиотеки ввода/вывода printf, scanf и error вообще нетребуется указывать дескриптор файла. Функция printf неявно использует stdout, функция scanf — stdin, а функция error — stderr.

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

еще рефераты
Еще работы по информатике, программированию