2011. Машбук (1114722), страница 33
Текст из файла (страница 33)
постоянное запоминающееустройство (ПЗУ). В этой области памяти постоянно находится программа, котораяназывается аппаратный загрузчик компьютера. При включении компьютера схемыуправления запускают работу компьютера с адреса точки входа в этот аппаратныйзагрузчик. Данный загрузчик в общем случае имеет информацию о перечне и приоритетахсистемных устройств компьютера, которые априори могут содержать операционнуюсистему. (Системное устройство – это блок-ориентированное устройство прямого доступа,на котором может размещаться ОС.) Приоритет определяет тот порядок, в которомаппаратный загрузчик по списку осуществляет перебор устройств в поискахпрограммного загрузчика операционных систем. (Например, бывает полезно сделатьfloppy-диск наиболее приоритетным для загрузки ОС, так как в нормальном режимеаппаратный загрузчик этот диск не обнаружит, и загрузка будет осуществляться сжёсткого диска, а в случае «гибели» жёсткого диска мы как раз воспользуемсявозможностью загрузки с floppy-диска.) Аппаратный загрузчик «знает» структурусистемного устройства.
Обычно в нулевом блоке системного устройства находится т.н.программный загрузчик, который может содержать информацию о наличии вразличных разделах системного устройства различных операционных систем. Разделсистемного устройства — это последовательность подряд идущих блоков (выделенная навнешнем запоминающем устройстве), внутри которых используется виртуальнаянумерация этих блоков, т.е. каждый раздел начинается с нулевого блока.
Соответственно,если операционных систем несколько, то программный загрузчик может предложитьпользователю компьютера выбрать, какую систему загружать. После этого программныйзагрузчик обращается к соответствующему разделу данного системного устройства и изнулевого блока выбранного раздела считывает загрузчик конкретной операционнойсистемы, после чего начинает работать программный загрузчик конкретной ОС. Этотзагрузчик, в свою очередь, «знает» структуру раздела, структуру файловой системы инаходит в соответствующей файловой системе файл, который должен быть запущен вкачестве ядра операционной системы.Что касается Unix-систем, то программный загрузчик ОС осуществляет поиск,считывание в память и запуск на исполнение файла /unix, который содержит исполняемыйкод ядра ОС Unix.
Рассмотрим теперь действия ядра при запуске.Сначала происходит инициализация аппаратных и программных компонентовсистемы. Эта инициализация включает установку начальных параметров в аппаратныхинтерфейсах: устанавливаются системные часы (для генерации прерываний),формируется диспетчер оперативной памяти, устанавливаются средства защитыоперативной памяти. Затем, исходя из параметров настройки операционной системы,осуществляется формирование системных программных структур данных (в частности,создается таблица процессов, устанавливается размер КЭШ-буфера). После этого ядросоздает нулевой процесс.
При инициализации этого процесса резервируется память подего контекст и формируется нулевая запись в таблице процессов. Отметим, что здесь мыоперируем определением процесса в ОС Unix: ядро формирует нулевую запись в таблицепроцессов и более ничего, — это и есть создание нулевого процесса. Этому нулевомупроцесс в общем случае соответствует ядру ОС (это процесс ядра), но он имеетособенность – отсутствие в контексте процесса сегмента кода (отметим, что это вовсе неозначает, что нулевой процесс не имеет кода). Это означает, что нулевая запись таблицыпроцессов ссылается на контекст, в котором отсутствует ссылка на сегмент кода процесса.Итак, основными отличиями нулевого процесса являются следующие моменты:1171.
Данный процесс не имеет кодового сегмента — это просто структура данных,используемая ядром, и процессом его называют потому, что онкаталогизирован в таблице процессов.2. Он существует в течение всего времени работы системы (это чистосистемный процесс), и считается, что он активен, когда работает ядро ОС.0111КонтекстпроцессаКонтекстпроцессаКонтекстпроцессаКонтекстпроцессаКодовыйсегментКодовыйсегментКодовыйсегментexec()Рис.
88. Формирование нулевого и первого процессов.Следующим этапом ядро начинает формирование первого процесса, который такжесоздается нестандартным образом. При его создании выполняются следующие действия(Рис. 88). Ядро осуществляет копирование нулевой записи (в таблице процессов) впервую. После чего для первого процесса выделяется пространство оперативной памяти.В эту память загружается программа исполнения системного вызова exec(), после чеговнутри первого процесса происходит обращение к этому системному вызову с параметром/etc/init. Таким образом, можно отметить, что сам первый процесс формируетсянестандартным путем, но тело его в конце формируется уже «правильным» образомпосредством вызова exec().Итак, в итоге в рамках первого процесса сформирован процесс init, которыйсуществует в системе также на протяжении всего ее функционирования.
Процесс initподдерживает соответствующие режимы работы системы: однопользовательский либомногопользовательский. Эти режимы характеризуются параметрами, которыеопределяются на стадии загрузки ядра и инициализации системы. Соответственно,система опознает один из подключенных терминалов как системную консоль. Еслисистема работает в однопользовательском режиме, то происходит подключениеинтерпретатора команд к системной консоли (консоль регистрируется с корневымипривилегиями и доступ по каким-либо другим линиям связи невозможен). Если же режиммногопользовательский, то процесс init обращается к системной таблице терминалов,хранящей все терминальные устройства, которые могут быть в системе, и для каждогоготового к работе терминала из этого перечня он запускает процесс getty (Рис. 89).Процесс getty — это процесс, который обеспечивает работу конкретного терминала (т.е.сеанс работы пользователя).
Заметим, что процесс init создает процесс getty ужестандартным способом, и после вообще все процессы создаются лишь по схеме fork-exec.118“1”initgettyТерминал 1gettyТерминал 1…Терминал 1gettyРис. 89. Инициализация системы: создание многопользовательской среды.В свою очередь, процесс getty печатает на экране приглашение ввести логин(Рис. 90). После того, как пользователь вводит логин, процесс getty загружает на своеместо процесс подтверждения пароля login. Соответственно, процесс login запрашиваетввода пароля, после чего проверяет его. Если введенный пароль оказывается верным,начинается сеанс работы с пользователем.
Сеанс работы с пользователем, как и сеансработы всей системы, определяется конфигурационной информацией. Эта информацияможет храниться в зашифрованном виде в файле регистрации паролей passwd. Каждаязапись этого файла содержит имя зарегистрированного пользователя, пароль, учётнуюинформацию и некоторые настройки работы пользователя. В частности, к этимнастройкам относится т.н.
домашний каталог, т.е. тот каталог файловой системы, которыйстанет текущим, когда пользователь начинает сеанс работы. В этой же записи файлаpasswd содержится информация о том интерпретаторе команд (shell), который долженбыть загружен в начале сеанса работы пользователя. То есть, с одной стороны, системапозволяет варьировать интерпретаторы команд для каждого из пользователей, а, с другойстороны, в качестве интерпретатора команд можно запустить любую программу (этоможет быть, например, программа, проверки целостности файловой системы).С точки зрения интерпретатора команд, сеанс работы пользователя представляетсяв виде обменов с файлом (т.е.
в виде операций чтения и записи). Работа пользователя ссистемой заканчивается закрытием файла – подачей EOF (end of file) (код EOF вводитсяпутём нажатия комбинации клавиш Ctrl+D на клавиатуре). После получения отпользователя EOF интерпретатор завершает свою работу. Процесс init фиксирует этуситуацию и снова запускает процесс getty.Такова общая схема функционирования Unix-систем. Она строится наиспользовании нулевого и первого процессов. Это единственные процессы в системе,которые создаются нестандартным образом (без обращения к системному вызову fork()).initinitfork()/exec()вводлогинаПосле окончанияработы shell создаетновый gettyокончание работыgettyshellПечатает login иожидает входа всистемуВызываетпользовательскиепрограммыневерный парольloginЗапрашивает парольи проверяет егоРис.
90. Схема работы пользователя с ОС Unix.119верный пароль2.3Планирование2.4Взаимодействие процессов2.4.1 Разделяемые ресурсы и синхронизация доступа к нимОдной из важных проблем, которые появились в современных операционныхсистемах, является проблема взаимодействия процессов.Будем говорить, что процессы называются параллельными, если их выполнениехотя бы частично перекрывается по времени. Т.е. можно говорить, что все процессы,находящиеся в буфере обрабатываемых процессов, являются параллельными, т.к. в тойили иной степени времена их выполнения перекрываются друг с другом. Не стоитзабывать, что, говоря о параллельных процессах, речь идет лишь о псевдопараллелизме,поскольку реально на процессоре может исполняться только один процесс.Параллельные процессы могут быть независимыми и взаимодействующими.Независимые процессы используют независимые множества ресурсов; т.е.