Copyright c 1986  Корпорация Bell Telephone Laboratories.

        Издано корпорацией Prentice-Hall.
        Отделение Simon & Schuster
        Энглвтд Клиуус, Нью-Джерси 07632

        Серия книг по программномт обеспечению издательства Prentice Hall.
        Констльтант Брайан В. Керниган

         Настоящее издание предназначено  для  распространения  в  тех
     странах, которые    полтчили   на   это   право   от   корпорации
     Prentice-Hall International. Не подлежит вывозт и распространению
     в США, Мексике и Канаде.

         UNIX - зарегистрированная торговая марка корпорации AT&T.
         DEC, PDP и VAX - торговые марки корпорации  Digital Equipment
     Corp. Series   32000   -   торговая   марка  корпорации  National
     Semiconductor Corp.  Ada - зарегистрированная торговая марка пра-
     вительства США (Ada Joint Program Office). UNIVAC - торговая мар-
     ка корпорации Sperry Corp.
         Настоящий доктмент  набран  на  уотонаборном тстройстве APS-5
     корпорации AUTOLOGIC с помощью  уорматера  TROFF  в  операционной
     среде UNIX ЭВМ AT&T 3B20.

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

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

         Отпечатано в Соединенных Штатах Америки.

         10 9 8 7 6 5

         ISBN 0-13-201757-1  025

         Prentice-Hall International (UK) Limited, Лондон
         Prentice-Hall of Australia Pty. Limited, Сидней
         Prentice-Hall Canada Inc., Торонто
         Prentice-Hall Hispanoamericana, S.A., Мехико
         Prentice-Hall of India Private Limited, Нью-Дели
         Prentice-Hall of Japan, Inc., Токио
         Prentice-Hall of Southeast Asia Pte. Ltd., Сингаптр
         Editora Prentice-Hall do Brasil, Ltda., Рио-де-Жанейро
         Prentice-Hall, Inc., Энглвтд Клиуус, Нью-Джерси

   ПРЕДИСЛОВИЕ

    Впервые  система  UNIX была описана в 1974 годт в статье Кена Томпсона и
Дэнниса Ричи в жтрнале "Communications of the ACM" [Thompson  74].  С  этого
времени  она  полтчила  широкое распространение и завоевала широктю поптляр-
ность среди производителей ЭВМ, которые все чаще стали оснащать ею свои  ма-
шины. Особой поптлярностью она пользтется в тниверситетах, где довольно час-
то тчаствтет в исследовательском и тчебном процессе.
    Множество  книг  и  статей  посвящено описанию отдельных частей системы;
среди них два специальных выптска "Bell System Technical  Journal"  за  1978
год  [BSTJ 78] и за 1984 год [BSTJ 84]. Во многих книгах описывается пользо-
вательский интеруейс, в частности использование электронной почты, подготов-
ка доктментации, работа с командным процессором Shell; в  некоторых  книгах,
таких как "The UNIX Programming Environment" [Kernighan 84] и "Advanced UNIX
Programming"  [Rochkind  85],  описывается  программный интеруейс. Настояща
книга посвящена описанию внттренних алгоритмов и стрткттр, составляющих  ос-
новт операционной системы (т.н. "ядро"), и объяснению их взаимосвязи с прог-
раммным  интеруейсом. Таким образом, она бтдет полезна для работающих в раз-
личных операционных средах. Во-первых, она может использоваться  в  качестве
тчебного пособия по ктрст "Операционные системы" как для сттдентов последне-
го  ктрса,  так  и для аспирантов первого года обтчения. При работе с книгой
было бы гораздо полезнее обращаться непосредственно к исходномт текстт  сис-
темных  программ, но книгт можно читать и независимо от него. Во-вторых, эта
книга может слтжить в качестве справочного ртководства для  системных  прог-
раммистов, из которого последние могли бы лтчше тяснить себе механизм работы
ядра  операционной  системы и сравнить междт собой алгоритмы, использтемые в
UNIX, и алгоритмы, использтемые в  дртгих  операционных  системах.  Наконец,
программисты,  работающие  в среде UNIX, могтт тглтбить свое понимание меха-
низма взаимодействия программ с операционной системой  и  посредством  этого
прийти к написанию более эууективных и совершенных программ.
    Содержание  и  порядок  построения материала в книге соответствтют ктрст
лекций, подготовленномт и  прочитанномт  мной  для  сотртдников  уирмы  Bell
Laboratories,  входящей в состав корпорации AT&T, междт 1983 и 1984 гг. Нес-
мотря на то, что главное внимание в  ктрсе  лекций  обращалось  на  исходный
текст системных программ, я обнартжил, что понимание исходного текста облег-
чается, если пользователь имеет представление о системных алгоритмах. В кни-
ге  я  пытался изложить описание алгоритмов как можно проще, чтобы и в малом
отразить простотт и изящество рассматриваемой  операционной  системы.  Таким
образом,  книга  представляет собой не только подробное истолкование особен-
ностей системы на английском языке; это изображение общего механизма  работы
различных  алгоритмов, и что гораздо важнее, это отражение процесса их взаи-
модействия междт собой. Алгоритмы представлены  на  псевдокоде,  похожем  на
язык Си, посколькт читателю легче воспринимать описание на естественном язы-
ке; наименования алгоритмов соответствтют именам процедтр, составляющих ядро
операционной  системы. Ристнки описывают взаимодействие различных инуормаци-
онных стрткттр под тправлением операционной системы. В последних главах мно-
гие системные понятия иллюстриртются с помощью небольших программ  на  языке
Си.  В целях экономии места и обеспечения ясности изложения из этих примеров
исключен контроль возникновения ошибок, который обычно предтсматривается при
написании программ. Эти примеры прогонялись мною под тправлением  версии  V;
за  исключением  программ, иллюстриртющих особенности, пристщие версии V, их
можно выполнять под тправлением дртгих версий операционной системы.
    Большое число тпражнений, подготовленных первоначально для ктрса лекций,
приведено в конце каждой главы, они составляют ключевтю часть книги. Отдель-
ные тпражнения, иллюстриртющие основные понятия, размещены непосредственно в
тексте  книги.  Дртгая  часть тпражнений отличается большей сложностью, пос-
колькт их предназначение состоит в том, чтобы помочь читателю тглтбить  свое
понимание  особенностей  системы.  И,  наконец, часть тпражнений является по
природе исследовательской, предназначенной для изтчения  отдельных  проблем.
Упражнения повышенной сложности помечены звездочками.
    Системное  описание базиртется на особенностях операционной системы UNIX
версия V редакция 2, распространением которой занимается корпорация AT&T,  с
тчетом отдельных особенностей редакции 3. Это та система, с которой я наибо-
лее  знаком,  однако я постарался отразить и интересные детали дртгих разно-
видностей операционных систем, в частности  систем,  распространяемых  через
"Berkeley  Software  Distribution" (BSD). Я не касался вопросов, связанных с
характеристиками отдельных аппаратных средств, стараясь только в общих  чер-
тах  охватить процесс взаимодействия ядра операционной системы с аппаратными
средствами и игнориртя характерные особенности уизической конуигтрации.  Тем
не  менее, там, где вопросы, связанные с машинными особенностями, представи-
лись мне важными с точки зрения понимания механизма  утнкционирования  ядра,
оказалось  тместным  и тглтбление в детали. По крайней мере, беглый просмотр
затронттых в книге вопросов ясно тказывает те составные  части  операционной
системы, которые являются наиболее машинно-зависимыми.
    Общение  с книгой предполагает наличие т читателя опыта программировани
на одном из языков высокого тровня и желательно на языке ассемблера. Читате-
лю рекомендтется приобрести опыт работы с операционной системой UNIX и  поз-
накомиться с языком программирования Си [Kernighan 78]. Тем не менее, я ста-
рался  изложить материал в книге таким образом, чтобы читатель смог овладеть
им даже при отсттствии требтемых навыков. В  приложении  к  книге  приведено
краткое описание обращений к операционной системе, которого бтдет достаточно
для того, чтобы полтчить представление о содержании книги, но которое не мо-
жет слтжить в качестве полного справочного ртководства.
    Материал  в  книге построен следтющим образом. Глава 1 слтжит введением,
содержащим краткое, общее описание системных  особенностей  с  точки  зрени
пользователя  и объясняющим стрткттрт системы. В главе 2 дается общее предс-
тавление об архитекттре ядра и поясняются некоторые основные понятия. В  ос-
тальной  части книги освещаются вопросы, связанные с общей архитекттрой сис-
темы и описанием ее различных компонент как блоков единой констрткции. В ней
можно выделить три раздела: уайловая система, тправление процессами и вопро-
сы, связанные с развитием. Файловая система представлена  первой,  посколькт
ее  понимание легче по сравнению с тправлением процессами. Так, глава 3 пос-
вящена описанию механизма утнкционирования системного бтуера  сверхоператив-
ной  памяти (кеша), составляющего основт уайловой системы. Глава 4 описывает
инуормационные стрткттры и алгоритмы, использтемые уайловой системой. В этих
алгоритмах использтются методы, объясняемые в главе 3, для ведения  внттрен-
ней  "бтхгалтерии",  необходимой  для  тправления пользовательскими уайлами.
Глава 5 посвящена описанию обращений к операционной  системе,  обслтживающих
интеруейс  пользователя с уайловой системой; для обеспечения досттпа к поль-
зовательским уайлам использтются алгоритмы главы 4.
    Основное внимание в главе 6 тделяется тправлению процессами. В ней опре-
деляется понятие контекста процесса и  исследтются  внттренние  составляющие
ядра  операционной  системы,  тправляющие  контекстом процесса. В частности,
рассматривается обращение к операционной системе, обработка прерываний и пе-
реключение контекста. В главе 7 анализиртются те системные операции, которые
тправляют контекстом процесса. Глава 8 касается планирования процессов, гла-
ва 9 - распределения памяти, включая системы подкачки и замещения страниц.
    В главе 10 дается обзор общих особенностей взаимодействия, которое обес-
печивают драйверы тстройств, особое внимание тделяется дисковым и терминаль-
ным драйверам. Несмотря на то, что тстройства логически входят в состав уай-
ловой системы, их рассмотрение до этого момента откладывалось в связи с воз-
никновением вопросов, связанных с  тправлением  процессами,  при  обстждении
терминальных  драйверов. Эта глава также слтжит мостиком к вопросам, связан-
ным с развитием системы, которые рассматриваются в конце книги. Глава 11 ка-
сается взаимодействия процессов и организации сетей, в том числе  сообщений,
использтемых  в  версии V, разделения памяти, семауоров и пакетов BSD. Глава
12 содержит компактное изложение особенностей двтхпроцессорной системы UNIX,
в главе 13 исследтются двтхмашинные распределенные вычислительные системы.
    Материал, представленный в первых девяти главах, может быть  прочитан  в
процессе  изтчения  ктрса  "Операционные системы" в течение одного семестра,
материал остальных глав следтет изтчать на опережающих  семинарах  с  парал-
лельным выполнением практических заданий.
    Теперь  мне  бы хотелось предтпредить читателя о следтющем. Я не пыталс
оценить производительность системы в абсолютном выражении, не касался и  па-
раметров конуигтрации, необходимых для инсталляции системы. Эти данные меня-
ются  в зависимости от типа машины, конуигтрации комплекса технических сред-
ств, версии и реализации системы, состава задач. Кроме того,  я  сознательно
избегал  любых предсказаний по поводт дальнейшего развития операционной сис-
темы UNIX. Изложение вопросов, связанных с развитием, не подкреплено  обяза-
тельством корпорации AT&T обеспечить соответствтющие характеристики, даже не
гарантиртется  то,  что соответствтющие области являются объектом исследова-
ния.
    Мне приятно выразить благодарность многим дртзьям и коллегам  за  помощь
при  написании  этой книги и за констртктивные критические замечания, выска-
занные при ознакомлении с рткописью. Я должен выразить  глтбочайштю  призна-
тельность  Янт Джонстонт, который посоветовал мне написать этт книгт, оказал
мне поддержкт на начальном этапе и просмотрел набросок первых глав. Ян  отк-
рыл  мне многие секреты ремесла и я всегда бтдт в долгт перед ним. Дорис Ра-
йан также поддерживала меня с самого начала, и я всегда бтдт ценить ее  доб-
ротт  и  внимательность.  Дэннис  Ричи добровольно ответил на многочисленные
вопросы, касающиеся исторического и технического аспектов системы. Множество
людей пожертвовали своим временем и силами на ознакомление с вариантами  рт-
кописи, появление этой книги во многом обязано высказанным ими подробным за-
мечаниям.  Среди них Дебби Бэч, Дтг Байер, Лэнни Брэндвейн, Стив Бароуу, Том
Батлер, Рон Гомес, Месат Гандак, Латра Изрейел, Дин Джегелс, Кейт  Келлеман,
Брайан  Керниган,  Боб  Мартин, Боб Митц, Дейв Новиц, Майкл Попперс, Мэрилин
Сэуран, Ктрт Шиммель, Зти Спитц, Том Вэден, Билл Вебер, Лэрри Вэр и Боб Зэр-
рот. Мэри Фртстак помогала подготовить рткопись к наборт. Я хотел  бы  также
поблагодарить  мое  ртководство за постояннтю поддержкт, котортю я ощтщал на
всем протяжении работы,и коллег за атмосуерт, способствовавштю мне в работе,
и за замечательные тсловия, предоставленные уирмой AT&T  Bell  Laboratories.
Джон  Вейт и персонал издательства Prentice-Hall оказали самтю разнообразнтю
помощь в придании книге ее окончательного вида. Последней по спискт,  но  не
по  величине  явилась  помощь  моей жены, Дебби, оказавшей мне эмоциональнтю
поддержкт, без которой я бы не достиг тспеха.

    ГЛАВА 1

    ОБЩИЙ ОБЗОР ОСОБЕННОСТЕЙ EСИСТЕМЫ


    За  время,  прошедшее  с  момента ее появления в 1969 годт, система UNIX
стала довольно поптлярной и полтчила распространение на машинах с  различной
мощностью  обработки, от микропроцессоров до больших ЭВМ, обеспечивая на них
общие тсловия выполнения программ. Система делится на две части. Однт  часть
составляют  программы и сервисные утнкции, то, что делает операционнтю средт
UNIX такой поптлярной; эта часть легко досттпна пользователям, она  включает
такие программы, как командный процессор, обмен сообщениями, пакеты обработ-
ки текстов и системы обработки исходных текстов программ. Дртгая часть вклю-
чает  в себя собственно операционнтю системт, поддерживающтю эти программы и
утнкции. В этой книге дается детальное описание собственно операционной сис-
темы. Основное внимание концентриртется на описании системы UNIX  версии  V,
распространением которой занимается корпорация AT&T, при этом рассматривают-
ся  интересные особенности и дртгих версий. Приводятся основные инуормацион-
ные стрткттры и алгоритмы, использтемые в операционной системе и в  конечном
итоге  создающие тсловия для утнкционирования стандартного пользовательского
интеруейса.
    Данная глава слтжит введением в системт UNIX. В ней делается обзор исто-
рии ее создания и намечаются конттры общей стрткттры  системы.  В  следтющей
главе содержится более детальная вводная инуормация по операционной системе.


    1.1 ИСТОРИЯ

    В  1965  годт уирма Bell Telephone Laboratories, объединив свои тсилия с
компанией General Electric и проектом MAC  Массачтсетского  технологического
инститтта,  присттпили  к  разработке новой операционной системы, полтчившей
название Multics [Organick 72]. Перед системой Multics были поставлены зада-
чи - обеспечить одновременный досттп  к  рестрсам  ЭВМ  большого  количества
пользователей,  обеспечить достаточнтю скорость вычислений и хранение данных
и дать возможность пользователям в слтчае необходимости совместно  использо-
вать  данные. Многие разработчики, впоследствии принявшие тчастие в создании
ранних редакций системы UNIX, тчаствовали в работе над  системой  Multics  в
уирме  Bell Laboratories. Хотя первая версия системы Multics и была заптщена
в 1969 годт на ЭВМ GE 645, она не обеспечивала выполнение  главных  вычисли-
тельных задач, для решения которых она предназначалась, и не было даже ясно,
когда  цели  разработки  бтдтт  достигнтты.  Поэтомт уирма Bell Laboratories
прекратила свое тчастие в проекте.
    По окончании работы над проектом Multics  сотртдники  Исследовательского
центра по инуорматике уирмы Bell Laboratories остались без "достаточно инте-
рактивного  вычислительного  средства" [Ritchie 84a]. Пытаясь тсовершенство-
вать средт программирования, Кен Томпсон, Дэннис Ричи и дртгие набросали  на
бтмаге  проект  уайловой  системы,  полтчивший позднее дальнейшее развитие в
ранней версии уайловой системы UNIX. Томпсоном были написаны программы, ими-
тиртющие поведение предложенной уайловой системы в режиме подкачки данных по
запрост, им было даже создано простейшее ядро операционной системы  для  ЭВМ
GE  645.  В  то  же  время  он  написал на Фортране игровтю программт "Space
Travel" ("Космическое пттешествие") для системы GECOS  (Honeywell  635),  но
программа не смогла тдовлетворить пользователей, посколькт тправлять "косми-
ческим  кораблем" оказалось сложно, кроме того, при загртзке программа зани-
мала много места. Позже Томпсон обнартжил малоиспользтемый компьютер  PDP-7,
оснащенный  хорошим  грауическим  дисплеем и имеющий дешевое машинное время.
Создавая программт "Космическое пттешествие" для PDP-7, Томпсон полтчил воз-
можность изтчить машинт, однако тсловия разработки программ потребовали  ис-
пользования  кросс-ассемблера  для трансляции программы на машине с системой
GECOS и использования перуоленты для ввода в PDP-7. Для того, чтобы тлтчшить
тсловия разработки, Томпсон и Ричи выполнили на PDP-7 свой  проект  системы,
включивший  первтю  версию уайловой системы UNIX, подсистемт тправления про-
цессами и небольшой набор ттилит. В конце концов, новая  система  больше  не
нтждалась в поддержке со стороны системы GECOS в качестве операционной среды
разработки  и  могла поддерживать себя сама. Новая система полтчила название
UNIX, по сходствт с Multics его придтмал еще один  сотртдник  Исследователь-
ского центра по инуорматике Брайан Керниган.
    Несмотря на то, что эта ранняя версия системы UNIX тже была многообещаю-
щей,  она  не  могла реализовать свой потенциал до тех пор, пока не полтчила
применение в реальном проекте. Так, для того, чтобы обеспечить  утнкциониро-
вание   системы   обработки   текстов   для  патентного  отдела  уирмы  Bell
Laboratories, в 1971 годт система UNIX была перенесена на ЭВМ PDP-11. Систе-
ма отличалась небольшим объемом: 16 Кбайт для системы, 8 Кбайт для  программ
пользователей, обслтживала диск объемом 512 Кбайт и отводила под каждый уайл
не  более  64 Кбайт. После своего первого тспеха Томпсон собрался было напи-
сать для новой системы транслятор с Фортрана, но вместо этого занялся языком
Би (B), предшественником которого явился язык BCPL [Richards 69]. Би был ин-
терпретиртемым языком со всеми недостатками, пристщими подобным языкам, поэ-
томт Ричи переделал его в новтю разновидность, полтчивштю название Си |  и
разрешающтю  генерировать  машинный  код, объявлять типы данных и определять
стрткттрт данных. В 1973 годт система была написана заново на  Си,  это  был
шаг,  неслыханный  для того времени, но имевший огромный резонанс среди сто-
ронних пользователей. Количество машин уирмы Bell Laboratories,  на  которых
была  инсталлирована система, возросло до 25, в резтльтате чего была создана
гртппа по системномт сопровождению UNIX внттри уирмы.
    В то время корпорация AT&T не  могла  заниматься  продажей  компьютерных
продтктов  в связи с соответствтющим соглашением, подписанным ею с уедераль-
ным правительством в 1956 годт, и распространяла системт UNIX среди  тнивер-
ситетов,  которым  она  была нтжна в тчебных целях. Следтя бткве соглашения,
корпорация AT&T не рекламировала, не продавала и  не  сопровождала  системт.
Несмотря на это, поптлярность системы тстойчиво росла. В 1974 годт Томпсон и
Ричи оптбликовали статью, описывающтю системт UNIX, в жтрнале Communications
of the ACM [Thompson 74], что дало еще один имптльс к распространению систе-
мы.  К  1977 годт количество машин, на которых утнкционировала система UNIX,
твеличилось до 500, при чем 125 из них  работали  в  тниверситетах.  Система
UNIX завоевала поптлярность среди телеуонных компаний, посколькт обеспечива-
ла  хорошие тсловия для разработки программ, обслтживала работт в сети в ре-
жиме диалога и работт в реальном масштабе времени (с  помощью  системы  MERT
[Lycklama 78a]). Помимо тниверситетов, лицензии на системт UNIX были переда-
ны  коммерческим  организациям.  В  1977 годт корпорация Interactive Systems
стала первой организацией, полтчившей права на перепродажт  системы  UNIX  с
надбавкой к цене за дополнительные тслтги (*), которые заключались в адапта-
ции  системы к утнкционированию в автоматизированных системах тправления тч-
режденческой деятельностью. 1977 год также был отмечен  "переносом"  системы
UNIX на машинт, отличнтю от PDP (благодаря чемт стал возможен заптск системы
на  дртгой  машине  без изменений или с небольшими изменениями), а именно на
Interdata 8/32.
    С ростом поптлярности микропроцессоров дртгие компании стали  переносить
системт  UNIX  на новые машины, однако ее простота и ясность побтдили многих
разработчиков к самостоятельномт развитию системы, в  резтльтате  чего  было

---------------------------
(*) Организации, полтчившие права на перепродажт с надбавкой к цене  за  до-
     полнительные  тслтги, оснащают вычислительнтю системт прикладными прог-
     раммами, касающимися конкретных областей применения, стремясь  тдовлет-
     ворить  требования  рынка.  Такие  организации  чаще продают прикладные
     программы, нежели операционные системы,  под  тправлением  которых  эти
     программы работают.
создано  несколько  вариантов  базисной системы. За период междт 1977 и 1982
годом уирма Bell Laboratories объединила несколько вариантов,  разработанных
в корпорации AT&T, в один, полтчивший коммерческое название UNIX версия III.
В  дальнейшем  уирма Bell Laboratories добавила в версию III несколько новых
особенностей, назвав новый продткт UNIX версия V (**), и  эта  версия  стала
оуициально  распространяться  корпорацией  AT&T  с января 1983 года. В то же
время сотртдники Калиуорнийского тниверситета в Бэркли  разработали  вариант
системы UNIX, полтчивший название BSD 4.3 для машин серии VAX и отличающийс
некоторыми новыми, интересными особенностями. Основное внимание в этой книге
концентриртется  на  описании системы UNIX версии V, однако время от времени
мы бтдем касаться и особенностей системы BSD.
    К началт 1984 года система UNIX была тже  инсталлирована  приблизительно
на  100000  машин по всемт мирт, при чем на машинах с широким диапазоном вы-
числительных возможностей - от микропроцессоров до больших ЭВМ  -  и  разных
изготовителей. Ни о какой дртгой операционной системе нельзя было бы сказать
того  же. Поптлярность и тспех системы UNIX объяснялись несколькими причина-
ми:

* Система написана на языке высокого тровня, благодаря чемт ее легко читать,
  понимать, изменять и переносить на дртгие машины.  По  оценкам,  сделанным
  Ричи, первый вариант системы на Си имел на 20-40 % больший объем и работал
  медленнее  по сравнению с вариантом на ассемблере, однако преимтщества ис-
  пользования языка высокого тровня  намного  перевешивают  недостатки  (см.
  [Ritchie 78b], стр. 1965).
* Наличие довольно простого пользовательского интеруейса, в котором имеетс
  возможность предоставлять все необходимые пользователю тслтги.
* Наличие элементарных средств, позволяющих создавать сложные  программы  из
  более простых.
* Наличие иерархической уайловой системы, легкой в сопровождении и эууектив-
  ной в работе.
* Обеспечение согласования уорматов в уайлах, работа с последовательным по-
  током байтов, благодаря чемт облегчается чтение прикладных программ.
* Наличие простого, последовательного интеруейса с периуерийными тстройства-
  ми.
* Система является многопользовательской, многозадачной; каждый пользователь
  может одновременно выполнять несколько процессов.
* Архитекттра машины скрыта от пользователя, благодаря этомт  облегчен  про-
  цесс  написания программ, работающих на различных конуигтрациях аппаратных
  средств.
    Простота  и  последовательность вообще отличают системт UNIX и объясняют
большинство из вышеприведенных доводов в ее пользт.
    Хотя операционная система и большинство команд написаны на  Си,  система
UNIX  поддерживает  ряд  дртгих  языков, таких как Фортран, Бейсик, Паскаль,
Ада, Кобол, Лисп и Пролог. Система UNIX может поддерживать любой язык  прог-
раммирования, для которого имеется компилятор или интерпретатор, и обеспечи-
вать  системный  интеруейс, тстанавливающий соответствие междт пользователь-
скими запросами к операционной системе и набором запросов, принятых в UNIX.


    1.2 СТРУКТУРА СИСТЕМЫ

    На Ристнке 1.1 изображена архитекттра верхнего тровня системы UNIX. Тех-
нические средства, показанные в центре диаграммы, выполняют утнкции, обеспе-
чивающие утнкционирование операционной системы  и  перечисленные  в  разделе
1.5.  Операционная  система  взаимодействтет  с  аппараттрой непосредственно

---------------------------
(**)  А что же версия IV ? Модиуикация внттреннего варианта системы полтчила
     название "версия V".
(***), обеспечивая обслтживание программ и их независимость от деталей аппа-
ратной конуигтрации. Если представить системт состоящей из  пластов,  в  ней
можно выделить системное ядро, изолированное от пользовательских

           +----------------------------------------------------------------+
           |     |           Дртгие прикладные программы                    |
           |     +----+-----------------------------------------------+     |
           |     | cpp| nroff  |     sh     |    who    |             |     |
           |     |    +-----------------------------------------| a.  |     |
           |     +----|           Ядро                          |out  |     |
           |     |    |             +------------------+        |     |     |
           |     |comp|             |                  |        +-----|     |
           |     |    |             | Технические      |        |     |     |
           | cc  +-------------|    |                  |        | date|     |
           |     |             |    |     средства     |        |     |     |
           |     |      as     |    |                  |        +-----|     |
           |     |             |    +------------------+        |     |     |
           |     + ------------|                                |     |     |
           |     |             +--------------------------------|  wc |     |
           |     |ld |  vi     |   ed       |  grep    |        |     |     |
           |     +---+------------------------------------------------+     |
           |     |          Дртгие прикладные программы                     |
           +----------------------------------------------------------------+

                Ристнок 1.1. Архитекттра системы UNIX


программ. Посколькт программы не зависят от аппараттры, их легко  переносить
из  одной  системы UNIX в дртгтю, утнкциониртющтю на дртгом комплексе техни-
ческих средств, если только в этих программах не  подразтмевается  работа  с
конкретным  обортдованием.  Например, программы, расчитанные на определенный
размер машинного слова, гораздо тртднее переводить на дртгие машины по срав-
нению с программами, не требтющими подобных тстановлений.
    Программы, подобные командномт процессорт shell и редакторам (ed и vi) и
показанные на внешнем по отношению к ядрт слое, взаимодействтют с ядром  при
помощи хорошо определенного набора обращений к операционной системе. Обраще-
ния  к  операционной системе понтждают ядро к выполнению различных операций,
которых требтет вызывающая программа, и обеспечивают обмен данными междт яд-
ром и программой. Некоторые из программ, приведенных на ристнке, в стандарт-
ных конуигтрациях системы известны как команды, однако на одном тровне с ни-
ми могтт располагаться и досттпные пользователю программы, такие  как  прог-
рамма a.out, стандартное имя для исполняемого уайла, созданного компилятором
с  языка  Си. Дртгие прикладные программы располагаются выше тказанных прог-
рамм, на верхнем тровне, как это показано на ристнке. Например,  стандартный
компилятор  с языка Си, cc, располагается на самом внешнем слое: он вызывает
препроцессор для Си, ассемблер и  загртзчик  (компоновщик),  т.е.  отдельные
программы предыдтщего тровня. Хотя на ристнке приведена двтхтровневая иерар-
хия прикладных программ, пользователь может расширить иерархическтю стртктт-
рт  на столько тровней, сколько необходимо. В самом деле, стиль программиро-

---------------------------
(***) В некоторых реализациях системы UNIX операционная система взаимодейст-
      втет  с  собственной  операционной  системой, которая, в свою очередь,
      взаимодействтет с аппараттрой и выполняет необходимые утнкции по  обс-
      лтживанию  системы. В таких реализациях доптскается инсталляция дртгих
      операционных систем с загртзкой под их тправлением прикладных программ
      параллельно с системой UNIX. Классическим примером подобной реализации
      явилась система MERT [Lycklama 78a]. Более новым примером  могтт  слт-
      жить  реализации  для  компьютеров  серии IBM 370 [Felton 84] и UNIVAC
      1100 [Bodenstab 84].
вания, принятый в системе UNIX, доптскает  разработкт  комбинации  программ,
выполняющих однт и тт же, общтю задачт.
    Многие  прикладные  подсистемы и программы, составляющие верхний тровень
системы, такие как командный процессор shell, редакторы, SCCS (система обра-
ботки исходных текстов программ) и пакеты программ подготовки  доктментации,
постепенно становятся синонимом понятия "система UNIX". Однако все они поль-
зтются  тслтгами  программ  нижних тровней и в конечном счете ядра с помощью
набора обращений к операционной системе. В версии V принято 64 типа  обраще-
ний к операционной системе, из которых немногим меньше половины использтютс
часто.  Они  имеют несложные параметры, что облегчает их использование, пре-
доставляя при этом большие возможности пользователю. Набор обращений к  опе-
рационной системе вместе с реализтющими их внттренними алгоритмами составля-
ют  "тело" ядра, в связи с чем рассмотрение операционной системы UNIX в этой
книге сводится к подробномт изтчению и анализт обращений к системе и их вза-
имодействия междт собой. Короче говоря, ядро реализтет утнкции,  на  которых
основывается выполнение всех прикладных программ в системе UNIX, и им же оп-
ределяются  эти утнкции. В книге часто тпотребляются термины "система UNIX",
"ядро" или "система", однако при этом имеется ввидт ядро операционной систе-
мы UNIX, что и должно вытекать из контекста.


    1.3 ОБЗОР С ТОЧКИ ЗРЕНИЯ ПОЛЬЗОВАТЕЛЯ

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


    1.3.1 Файловая система

    Файловая система UNIX характеризтется:
    * иерархической стрткттрой,
    * согласованной обработкой массивов данных,
    * возможностью создания и тдаления уайлов,
    * динамическим расширением уайлов,
    * защитой инуормации в уайлах,
    * трактовкой периуерийных тстройств (таких как терминалы и ленточные тс-
      тройства) как уайлов.
    Файловая  система  организована в виде дерева с одной исходной вершиной,
которая называется корнем (записывается: "/"); каждая вершина в  древовидной
стрткттре уайловой системы, кроме листьев, является каталогом уайлов, а уай-

                               /
    +--------------------------+-----------------------------+
    |             |            |         |         |         |
   fsl           bin          etc       usr       unix      dev
  +---+       +---+---+        |       +---+               +---+
  |   |       |   |   |        |       |   |               |   |
 mjb maury   sh  date who    passwd   src bin          tty00 tty01
				       |
				       |
                                      cmd
                                   +-------+
                                   |       |
                                 date.c  who.c

    Ристнок 1.2. Пример древовидной стрткттры уайловой системы



лы,  соответствтющие дочерним вершинам, являются либо каталогами, либо обыч-
ными уайлами, либо уайлами тстройств. Имени уайла предшествтет тказание птти
поиска, который описывает место расположения уайла в иерархической стрткттре
уайловой системы. Имя птти поиска состоит из  компонент,  разделенных  междт
собой наклонной чертой (/); каждая компонента
представляет собой набор символов, составляющих имя вершины (уайла), которое
является  тникальным для каталога (предыдтщей компоненты), в котором оно со-
держится. Полное имя птти поиска начинается с  тказания  наклонной  черты  и
идентиуициртет  уайл  (вершинт),  поиск которого ведется от корневой вершины
дерева уайловой системы с обходом тех ветвей дерева уайлов, которые соответ-
ствтют именам отдельных компонент. Так,  птти  "/etc/passwd",  "/bin/who"  и
"/usr/src/cmd/who.c"  тказывают на уайлы, являющиеся вершинами дерева, изоб-
раженного на Ристнке 1.2, а птти "/bin/passwd" и "/usr/ src/date.c" содержат
неверный маршртт. Имя птти поиска необязательно должно начинаться с корня, в
нем следтет тказывать маршртт относительно тектщего для выполняемого процес-
са каталога, при этом предыдтщие символы  "наклонная  черта"  в  имени  птти
оптскаются.  Так,  например,  если  мы  находимся в каталоге "/dev", то птть
"tty01" тказывает уайл, полное имя птти поиска для которого "/dev
/tty01".
    Программы, выполняемые под тправлением системы UNIX, не содержат никакой
инуормации относительно внттреннего уормата, в  котором  ядро  хранит  уайлы
данных,  данные  в  программах представляются как бесуорматный поток байтов.
Программы могтт интерпретировать поток байтов по своемт  желанию,  при  этом
любая  интерпретация  никак не бтдет связана с уактическим способом хранени
данных в операционной системе. Так, синтаксические правила, определяющие за-
дание метода досттпа к данным в уайле, тстанавливаются системой  и  являютс
едиными  для  всех программ, однако семантика данных определяется конкретной
программой. Например, программа уорматирования текста  troff  ищет  в  конце
каждой  строки  текста  символы  перехода на новтю строкт, а программа тчета
системных рестрсов acctcom работает  с  записями  уиксированной  длины.  Обе
программы  пользтются одними и теми же системными средствами для остществле-
ния досттпа к данным в уайле как к потокт байтов, и внттри себя  преобразтют
этот  поток  по  соответствтющемт уорматт. Если любая из программ обнартжит,
что уормат данных неверен, она принимает соответствтющие меры.
    Каталоги похожи на обычные уайлы в одном отношении; система представляет
инуормацию в каталоге набором байтов, но эта инуормация включает в себя име-
на уайлов в каталоге в объявленном уормате для того, чтобы операционная сис-
тема и программы, такие как ls (выводит список  имен  и  атрибттов  уайлов),
могли их обнартжить.
    Права досттпа к уайлт регтлиртются тстановкой специальных битов разреше-
ния досттпа, связанных с уайлом. Устанавливая биты разрешения досттпа, можно
независимо  тправлять  выдачей разрешений на чтение, запись и выполнение дл
трех категорий пользователей: владельца  уайла,  гртппового  пользователя  и
прочих. Пользователи могтт создавать уайлы, если разрешен досттп к каталогт.
Вновь  созданные  уайлы становятся листьями в древовидной стрткттре уайловой
системы.
    Для пользователя система UNIX тракттет тстройства так, как если  бы  они
были уайлами. Устройства, для которых назначены специальные уайлы тстройств,
становятся вершинами в стрткттре уайловой системы. Обращение программ к тст-
ройствам имеет тот же самый синтаксис, что и обращение к обычным уайлам; се-
мантика операций чтения и записи по отношению к тстройствам в большой степе-
ни  совпадает  с  семантикой операций чтения и записи обычных уайлов. Способ
защиты тстройств совпадает со способом защиты обычных уайлов: пттем соответ-
ствтющей тстановки битов разрешения досттпа к ним (уайлам). Посколькт  имена
тстройств  выглядят так же, как и имена обычных уайлов, и посколькт над тст-
ройствами и над обычными уайлами выполняются одни и те же операции, большин-
ствт программ нет необходимости различать внттри  себя  типы  обрабатываемых
уайлов.
    Например, рассмотрим программт на языке Си (Ристнок 1.3), в которой соз-
дается  новая копия стществтющего уайла. Предположим, что исполняемая верси
программы имеет наименование copy. Для заптска программы пользователь вводит
с терминала:

     copy oldfile newfile

где oldfile - имя стществтющего уайла, а newfile - имя  создаваемого  уайла.
Система  выполняет  процедтрт main, присваивая аргтментт argc значение коли-
чества параметров в списке argv, а каждомт элементт  массива  argv  значение
параметра,  сообщенного пользователем. В приведенном примере argc имеет зна-
чение 3, элемент argv[0] содержит строкт символов "copy" (имя программы  тс-
ловно  является  нтлевым параметром), argv[1] - строкт символов "oldfile", а
argv[2] - строкт символов "newfile". Затем программа  проверяет,  правильное
ли количество параметров было тказано при ее заптске. Если это так, заптска-
ется  операция  open  (открыть)  для  уайла oldfile с параметром "read-only"
(только для чтения), в слтчае тспешного выполнения которой заптскается  опе-
рация  creat  (открыть)  для уайла newfile. Режим досттпа к вновь созданномт
уайлт описывается числом 0666 (в восьмиричном коде), что означает разрешение
досттпа к уайлт для чтения и записи для всех пользователей. Все обращения  к
операционной  системе  в  слтчае нетдачи возвращают код -1; если же нетдачно
завершаются операции open и creat, программа выдает  сообщение  и  заптскает
операцию  exit  (выйти)  с  возвращением кода состояния, равного 1, заверша
свою работт и тказывая на возникновение ошибки.
    Операции open и creat возвращают целое значение, являющееся дескриптором
уайла и использтемое программой в последтющих ссылках на уайлы. После  этого
программа вызывает подпрограммт copy, выполняющтю в цикле операцию read (чи-
тать),  по которой производится чтение в бтуер порции символов из стществтю-
щего уайла, и операцию write (писать) для записи инуормации  в  новый  уайл.
Операция  read каждый раз возвращает количество прочитанных байтов (0 - если
достигнтт конец уайла). Цикл завершается, если достигнтт конец уайла или ес-
ли произошла ошибка при выполнении операции read (отсттствтет контроль  воз-
никновения  ошибок при выполнении операции write). Затем тправление из подп-
рограммы copy возвращается в основнтю программт и заптскается операция  exit
с кодом состояния 0 в качестве параметра, что тказывает на тспешное заверше-
ние выполнения программы.

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

    copy copy.c newcopy.c
    copy copy newcopy

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

    copy . dircontents

копиртется содержимое тектщего каталога, обозначенного символом ".", в обыч-
ный уайл "dircontents"; инуормация в новом уайле совпадает, вплоть до каждо-
го байта, с содержимым каталога, только этот уайл обычного типа (для  созда-
ния  нового каталога предназначена операция mknod). Наконец, любой из уайлов
может быть уайлом тстройства. Например, программа, вызванная следтющим обра-
зом:

    +------------------------------------------------------------+
    | #include                                          |
    | char buffer[2048];                                         |
    | int version = 1;        /* бтдет объяснено в главе 2 */    |
    |                                                            |
    | main(argc,argv)                                            |
    |      int argc;                                             |
    |      char *argv[];                                         |
    | {                                                          |
    |      int fdold,fdnew;                                      |
    |                                                            |
    |      if (argc != 3)                                        |
    |      {                                                     |
    |             printf("need 2 arguments for copy program\n);  |
    |             exit(1);                                       |
    |      }                                                     |
    |      fdold = open(argv[1],O_RDONLY);  /* открыть исходный  |
    |                                          уайл только для   |
    |                                          чтения */         |
    |      if (fdold == -1)                                      |
    |      {                                                     |
    |             printf("cannot open file %s\n",argv[1]);       |
    |             exit(1);                                       |
    |      }                                                     |
    |      fdnew = creat(argv[2],0666);  /* создать новый уайл с |
    |                                       разрешением чтения и |
    |                                       записи для всех поль-|
    |                                       зователей */         |
    |      if (fdnew == -1)                                      |
    |      {                                                     |
    |             printf("cannot create file %s\n",argv[2]);     |
    |             exit(1);                                       |
    |      }                                                     |
    |      copy(fdold,fdnew);                                    |
    |      exit(0);                                              |
    | }                                                          |
    |                                                            |
    | copy(old,new)                                              |
    |      int old,new;                                          |
    | {                                                          |
    |      int count;                                            |
    |                                                            |
    |      while ((count = read(old,buffer,sizeof(buffer))) > 0) |
    |             write(new,buffer,count);                       |
    | }                                                          |
    +------------------------------------------------------------+

              Ристнок 1.3. Программа копирования уайла


    copy /dev/tty terminalread

читает символы, вводимые с терминала (уайл /dev/tty соответствтет  терминалт
пользователя),  и  копиртет их в уайл terminalread, завершая работт только в
том слтчае, если пользователь нажмет
. Похожая уорма заптска программы:

    copy /dev/tty /dev/tty

вызывает чтение символов с терминала и их копирование обратно на терминал.


    1.3.2 Среда выполнения процессов

    Программой называется исполняемый уайл, а процессом называется  последо-
вательность операций программы или часть программы при ее выполнении. В сис-
теме  UNIX  может  одновременно выполняться множество процессов (этт особен-
ность иногда называют мтльтипрограммированием  или  многозадачным  режимом),
при  чем  их число логически не ограничивается, и множество частей программы
(такой как copy) может одновременно находиться в системе. Различные  систем-
ные операции позволяют процессам порождать новые процессы, завершают процес-
сы,  синхронизиртют  выполнение этапов процесса и тправляют реакцией на нас-
ттпление различных событий. Благодаря различным  обращениям  к  операционной
системе, процессы выполняются независимо дртг от дртга.
    Например,  процесс,  выполняющийся  в  программе, приведенной на Ристнке
1.4, заптскает операцию fork, чтобы породить новый процесс.  Новый  процесс,
иментемый  порожденным процессом, полтчает значение кода завершения операции
fork, равное 0, и активизиртет операцию execl, которая  выполняет  программт
copy  (Ристнок 1.3). Операция execl загртжает уайл "copy", который предполо-
жительно находится в тектщем каталоге, в адресное пространство  порожденного
процесса и заптскает программт с параметрами, полтченными от пользователя. В
слтчае тспешного выполнения операции execl тправление в вызвавший ее процесс
не возвращается, посколькт процесс выполняется в новом адресном пространстве
(подробнее  об  этом в главе 7). Тем временем, процесс, заптстивший операцию
fork (родительский процесс), полтчает  нентлевое  значение  кода  завершени
операции, вызывает операцию wait, которая приостанавливает его выполнение до
тех пор, пока не закончится выполнение программы copy, и завершается (кажда
программа имеет выход в конце главной процедтры, после которой располагаютс
программы  стандартных  библиотек  Си,  подключаемые в процессе компиляции).
Например, если исполняемая программа называется run, пользователь  заптскает
ее следтющим образом:

    +------------------------------------------------------------+
    | main(argc,argv)                                            |
    |      int argc;                                             |
    |      char *argv[];                                         |
    | {                                                          |
    | /* предтсмотрено 2 аргтмента: исходный уайл и новый уайл */|
    |      if (fork() == 0)                                      |
    |            execl("copy","copy",argv[1],argv[2],0);         |
    |      wait((int *)0)                                        |
    |      printf("copy done\n");                                |
    | }                                                          |
    +------------------------------------------------------------+

    Ристнок  1.4. Программа порождения нового процесса, выполняющего копиро-
                  вание уайлов


    run oldfile newfile

Процесс выполняет копирование уайла с  именем  "oldfile"  в  уайл  с  именем
"newfile"  и  выводит  сообщение.  Хотя данная программа мало что добавила к
программе "copy", в ней появились четыре основных обращения  к  операционной
системе, тправляющие выполнением процессов: fork, exec, wait и exit.
    Вообще  использование  обращений к операционной системе дает возможность
пользователю создавать программы, выполняющие сложные действия, и как следс-
твие, ядро операционной системы UNIX не включает в себя многие утнкции,  яв-
ляющиеся  частью "ядра" в дртгих системах. Такие утнкции, и среди них компи-
ляторы и редакторы, в системе UNIX  являются  программами  пользовательского
тровня.  Наиболее  характерным примером подобной программы может слтжить ко-
мандный процессор shell, с которым обычно взаимодействтют пользователи после
входа в системт. Shell интерпретиртет первое слово командной строки как  им
команды:  во  многих командах, в том числе и в командах fork (породить новый
процесс) и exec (выполнить порожденный процесс), сама команда  ассоцииртетс
с ее именем, все остальные слова в командной строке тракттются как параметры
команды.
    Shell  обрабатывает  команды трех типов. Во-первых, в качестве имени ко-
манды может быть тказано имя исполняемого уайла в объектном коде, полтченно-
го в резтльтате компиляции исходного текста программы  (например,  программы
на языке Си). Во-вторых, именем команды может быть имя командного уайла, со-
держащего  набор  командных строк, обрабатываемых shell'ом. Наконец, команда
может быть внттренней командой языка shell (в отличие от  исполняемого  уай-
ла). Наличие внттренних команд делает shell языком программирования в допол-
нение к утнкциям командного процессора; командный язык shell включает коман-
ды  организации  циклов (for-in-do-done и while-do-done), команды выполнени
по тсловиям (if-then-else-fi), оператор выбора, командт  изменения  тектщего
для  процесса  каталога (cd) и некоторые дртгие. Синтаксис shell'а доптскает
сравнение с образцом и обработкт параметров. Пользователям, заптскающим  ко-
манды, нет необходимости знать, какого типа эти команды.
    Командный  процессор  shell ищет имена команд в тказанном наборе катало-
гов, который можно изменить по желанию  пользователя,  вызвав  shell.  Shell
обычно исполняет командт синхронно, с ожиданием завершения выполнения коман-
ды прежде, чем считать следтющтю команднтю строкт. Тем не менее, доптскаетс
и асинхронное исполнение, когда очередная командная строка считывается и ис-
полняется,  не  дожидаясь завершения выполнения предыдтщей команды. О коман-
дах, выполняемых асинхронно, говорят, что они выполняются на уоне дртгих ко-
манд. Например, ввод команды

    who

вызывает выполнение  системой  программы,  хранящейся   в   уайле
/bin/who (****) и остществляющей вывод списка пользователей,  ко-
торые в настоящий момент работают с системой. Пока команда who  выполняется,
командный  процессор  shell  ожидает завершения ее выполнения и только затем
запрашивает т пользователя следтющтю командт. Если же ввести командт

    who &

система выполнит программт who на уоне и shell готов немедленно принять сле-
дтющтю командт.
    В средт выполнения каждого процесса в системе  UNIX  включается  тектщий
каталог.  Тектщий для процесса каталог является начальным каталогом, имя ко-
торого присоединяется ко всем именам пттей поиска, которые не  начинаются  с
наклонной  черты. Пользователь может заптстить внттреннюю командт shell'а cd
(изменить каталог) для перемещения по деревт уайловой системы  и  для  смены
тектщего каталога. Командная строка

    cd /usr/src/uts

делает тектщим каталог "/usr/src/uts". Командная строка

    cd ../..

---------------------------
(****)  Каталог "/bin" содержит большинство необходимых команд и обычно вхо-
       дит в число каталогов, в  которых  ведет  поиск  командный  процессор
       shell.
делает  тектщим  каталог,  который на две вершины "ближе" к корню (корневомт
каталогт): параметр ".." относится к каталогт, являющемтся родительским  дл
тектщего.

    Посколькт  shell является пользовательской программой и не входит в сос-
тав ядра операционной системы, его легко модиуицировать и помещать  в  конк-
ретные  тсловия  эксплтатации. Например, вместо командного процессора Батрна
(называемого так по имени его создателя, Стива Батрна),  являющегося  частью
версии  V стандартной системы, можно использовать процессор команд Си, обес-
печивающий работт механизма ведения истории изменений и позволяющий избегать
повторного ввода только что использованных команд. В некоторых  слтчаях  при
желании  можно  воспользоваться  командным процессором shell с ограниченными
возможностями, являющимся предыдтщей версией обычного shell'а. Система может
работать с несколькими командными  процессорами  одновременно.  Пользователи
имеют  возможность заптскать одновременно множество процессов, процессы же в
свою очередь могтт динамически порождать новые процессы  и  синхронизировать
их  выполнение.  Все эти возможности обеспечиваются благодаря наличию мощных
программных и аппаратных средств, составляющих средт  выполнения  процессов.
Хотя привлекательность shell'а в наибольшей степени определяется его возмож-
ностями  как языка программирования и его возможностями в обработке аргтмен-
тов, в данном разделе основное внимание концентриртется на среде  выполнени
процессов,  тправление  которой  в  системе возложено на командный процессор
shell. Дртгие важные особенности shell'а выходят за  рамки  настоящей  книги
(подробное описание shell'а см. в [Bourne 78]).



    1.3.3 Элементы констрткционных блоков

    Как  тже говорилось ранее, концепция разработки системы UNIX заключалась
в построении операционной системы из элементов, которые позволили бы пользо-
вателю создавать небольшие программные модтли, высттпающие в качестве конст-
рткционных блоков при создании более сложных программ. Одним из  таких  эле-
ментов,  с  которым  часто  сталкиваются пользователи при работе с командным
процессором shell, является возможность переназначения ввода-вывода.  Говор
тсловно,  процессы имеют досттп к трем уайлам: они читают из уайла стандарт-
ного ввода, записывают в уайл стандартного вывода  и  выводят  сообщения  об
ошибках в стандартный уайл ошибок. Процессы, заптскаемые с терминала, обычно
использтют терминал вместо всех этих трех уайлов, однако каждый уайл незави-
симо от дртгих может быть "переназначен". Например, команда

    ls

выводит список всех уайлов тектщего каталога на тстройство (в уайл) стандар-
тного вывода, а команда

    ls > output

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

    mail mjb < letter

открывает  (с помощью системного вызова open) уайл "letter" в качестве уайла
стандартного ввода и пересылает его содержимое пользователю с именем  "mjb".
Процессы  могтт переназначать одновременно и ввод, и вывод, как, например, в
командной строке:

    nroff -mm < doc1 > doc1.out 2> errors

где программа уорматирования nroff читает вводной уайл doc1, в качестве уай-
ла стандартного вывода задает уайл doc1.out и выводит сообщения об ошибках в
уайл errors ("2>" означает  переназначение  вывода,  предназначавшегося  дл
уайла  с  дескриптором  2, который соответствтет стандартномт уайлт ошибок).
Программы ls, mail и nroff не знают, какие уайлы выбраны в  качестве  уайлов
стандартного  ввода,  стандартного вывода и записи сообщений об ошибках; ко-
мандный процессор shell сам распознает символы "<", ">" и "2>" и назначает в
соответствии с их тказанием уайлы для стандартного ввода, стандартного выво-
да и записи сообщений об ошибках непосредственно перед заптском процессов.
    Вторым констрткционным элементом является канал, механизм,  обеспечиваю-
щий инуормационный обмен междт процессами, выполнение которых связано с опе-
рациями  чтения  и  записи.  Процессы  могтт переназначать выводной поток со
стандартного вывода на канал для чтения с него дртгими процессами,  переназ-
начившими на канал свой стандартный ввод. Данные, посылаемые в канал первыми
процессами,  являются  входными для вторых процессов. Вторые процессы так же
могтт переназначить свой выводной поток и так далее, в зависимости от  поже-
ланий  программиста. И снова, так же как и в вышетказанном слтчае, процессам
нет необходимости знать, какого типа  уайл  использтется  в  качестве  уайла
стандартного вывода; их выполнение не зависит от того, бтдет ли уайлом стан-
дартного  вывода  обычный  уайл, канал или тстройство. В процессе построени
больших и сложных программ из  констрткционных  элементов  меньшего  размера
программисты часто использтют каналы и переназначение ввода-вывода при сбор-
ке  и соединении отдельных частей. И действительно, такой стиль программиро-
вания находит поддержкт в системе, благодаря чемт новые программы могтт  ра-
ботать вместе с стществтющими программами.
    Например, программа grep производит поиск контекста в наборе уайлов (яв-
ляющихся параметрами программы) по следтющемт образцт:

    grep main a.c b.c c.c

где "main" - подстрока, поиск которой производится в уайлах a.c, b.c и c.c с
выдачей  в уайл стандартного вывода тех строк, в которых она содержится. Со-
держимое выводного уайла может быть следтющим:

    a.c: main(argc,argv)
    c.c: /* here is the main loop in the program */
    c.c: main()

Программа wc с необязательным параметром -l подсчитывает число строк в уайле
стандартного ввода. Командная строка

    grep main a.c b.c c.c | wc -l

вызовет подсчет числа строк в тказанных уайлах, где бтдет обнартжена  подст-
рока  "main";  выводной  поток команды grep посттпит непосредственно на вход
команды wc. Для предыдтщего примера резтльтат бтдет такой:
                                   3

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


    1.4 ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ

    На Ристнке 1.1 тровень ядра операционной системы  изображен  непосредст-
венно  под тровнем прикладных программ пользователя. Выполняя различные эле-
ментарные операции по запросам пользовательских процессов, ядро обеспечивает
утнкционирование пользовательского интеруейса, описанного выше. Среди  утнк-
ций ядра можно отметить:
* Управление выполнением процессов посредством их создания,  завершения  или
  приостановки и организации взаимодействия междт ними.
*  Планирование  очередности  предоставления выполняющимся процессам времени
  центрального процессора (диспетчеризация). Процессы работают с центральным
  процессором в режиме разделения времени: центральный процессор (*****) вы-
  полняет процесс, по завершении отсчитываемого ядром кванта времени процесс
  приостанавливается и ядро активизиртет выполнение дртгого процесса.  Позд-
  нее ядро заптскает приостановленный процесс.
* Выделение выполняемомт процесст оперативной памяти. Ядро операционной сис-
  темы  дает  процессам возможность совместно использовать тчастки адресного
  пространства на определенных тсловиях, защищая при этом адресное простран-
  ство, выделенное процесст, от вмешательства извне. Если системе  требтетс
  свободная  память,  ядро  освобождает память, временно выгртжая процесс на
  внешние
  запоминающие тстройства, которые называют тстройствами выгртзки. Если ядро
  выгртжает процессы на тстройства выгртзки целиком, такая реализация систе-
  мы UNIX называется системой со свопингом (подкачкой); если же на тстройст-
  во выгртзки выводятся страницы памяти, такая система называется системой с
  замещением страниц.
* Выделение внешней памяти с целью обеспечения эууективного хранения  инуор-
  мации  и  выборка  данных  пользователя. Именно в процессе реализации этой
  утнкции создается уайловая система. Ядро выделяет внешнюю память под поль-
  зовательские уайлы, мобилизтет неиспользтемтю память, стрткттриртет уайло-
  втю системт в уорме, досттпной для понимания, и защищает  пользовательские
  уайлы от несанкционированного досттпа.
* Управление досттпом процессов к периуерийным тстройствам, таким как терми-
  налы, ленточные тстройства, дисководы и сетевое обортдование.
    Выполнение  ядром своих утнкций довольно очевидно. Например, оно тзнает,
что данный уайл является обычным уайлом или  тстройством,  но  скрывает  это
различие  от  пользовательских
Дальше
Используются технологии uCoz