- •И.Н.Акуленок, а.В.Акуленок
- •Часть I. Основы операционной системы unix Утверждено советом университета
- •Введение
- •Глава 1. История создания ос unix
- •Реализации oc unix
- •Unix на платформе Intel
- •Доля компьютеров с ос unix (1993 год)
- •Продажи unix–серверов (III квартал 2007 года)
- •1.1. Первые шаги по созданию unix
- •1.2. Исследовательские версии unix
- •1.3. Основные стандарты
- •1.3.1. Основные задачи стандартизации
- •1.4. Разработчики операционных систем
- •1.4.1. Версии at&t
- •1.4.2. Версии Microsoft/sco
- •1.4.3. Версии университета Беркли
- •1.4.4. Версии компании Sun
- •1.4.5. Версии компании Nowell
- •1.4.6. Популярные версии unix
- •1.4.7. Свободно распространяемые системы unix
- •1.5. Реализация ядра unix
- •1.5.1. Микроядро Mach
- •1.5.2. Микроядро Chorus
- •1.6 Характеристики oc unix
- •1.6.1.Файловая система
- •1.6.2. Многозадачность
- •1.6.3. Многопользовательский режим
- •1.6.4. Мобильность
- •1.6.5. Виртуальная память
- •1.6.6. Связь между задачами
- •1.6.7. Внешние устройства
- •1.6.8. Связь между компьютерами
- •1.6.9. Графический пользовательский интерфейс
- •1.6.10. Безопасность
- •1.6.11. Поддержка баз данных
- •1.6.12. Наличие стандартов
- •1.6.13. Открытость
- •1.6.14. Разработка программного обеспечения
- •1.7. Контрольные вопросы
- •1.8. Тесты
- •Глава 2. Функционирование ос unix
- •2.1. Ядро
- •2.1.1. Функции ядра
- •2.1.2. Структура ядра
- •2.1.3. Файловая подсистема
- •2.1.4. Подсистема управления процессами
- •2.1.5. Подсистема ввода/вывода
- •2.2. Командный процессор Shell
- •2.3. Программы–утилиты
- •2.4. Контрольные вопросы
- •2.5. Тесты
- •Глава 3. Процессы
- •3.1. Контекст процесса
- •3.3. Типы процессов
- •3.3.1. Системные процессы
- •3.3.2. Демоны
- •3.3.3. Прикладные процессы
- •3.4. Атрибуты процесса
- •3.4.1. Идентификатор процесса
- •3.4.2. Идентификатор родительского процесса
- •3.4.3. Приоритет процесса
- •3.4.4. Терминальная линия
- •3.4.5. Реальный и эффективный идентификаторы пользователя
- •3.4.6. Реальный и эффективный идентификаторы группы
- •3.4.7. Идентификатор терминальной группы
- •3.5. Иерархия процессов
- •3.6. Взаимодействие процессов
- •3.6.1. «Отцы», «дети», «сироты», «зомби»
- •3.7. Системные вызовы
- •3.7.1. Механизм создания процесса и запуска программы
- •3.7.2. Графический пример дерева процессов
- •3.8. Связи между процессами
- •3.8.1. Сигналы
- •Сигналы posix 1.1
- •3.8.2. Очереди сообщений
- •3.8.3. Семафоры
- •3.8.4. Совместная память
- •3.8.5. Программные каналы
- •3.8.6. Программные гнезда
- •3.9. Контрольные вопросы
- •3.10. Тесты
- •Глава 4. Файловая система unix
- •4.1. Имена файлов
- •4.2. Структура файловой системы
- •4.2.1. Загрузочный блок
- •4.2.2. Суперблок
- •4.2.3 Дескрипторы файлов
- •4.2.4. Блоки данных и свободные блоки
- •4.3. Типы файлов
- •4.3.1. Обычные файлы
- •4.3.2. Каталоги
- •4.3.4. Символические связи
- •4.3.5. Fifo – Именованные каналы
- •4.3.6. Сокеты
- •4.3.7. Обозначение типов файлов
- •Типы файлов
- •4.4. Дескриптор обычного файла
- •4.5. Дескриптор каталога
- •4.6. Дескриптор специального файла
- •4.7. Системная таблица файлов
- •4.8. Монтирование файловых систем
- •4.9. Демонтирование файловых систем
- •4.10. Проверка и восстановление файловых систем
- •4.11. Журналирование файловых систем
- •4.12. Контрольные вопросы
- •4.13. Тесты
- •Глава 5. Этапы начальной загрузки ос Unix
- •5.1. Загрузка и инициализация ядра
- •5.2. Распознавание и конфигурирование устройств
- •5.3. Создание спонтанных процессов
- •5.4. Выполнение команд оператора
- •5.5. Выполнение командных файлов запуска системы
- •5.6. Переход в многопользовательский режим
- •5.7. Контрольные вопросы
- •5.8. Тесты
- •Глава 6. Обзор командных файлов
- •6.1. Процесс init
- •6.1.1. Формат файла inittab
- •6.1.2. Уровни выполнения
- •Уровни выполнения
- •6.1.3. Дисциплины обработки процесса
- •Дисциплины обработки процесса
- •6.1.4. Запуск и этапы работы процесса init
- •6.2. Процесс rc
- •6.2.1. Сценарии запуска системы Solaris
- •6.3. Процесс cron
- •6.4. Процесс регистрации пользователей
- •6.5. Контрольные вопросы
- •6.6. Тесты
- •Глава 7. Останов системы
- •7.1. Выключение питания
- •7.2. Команда shutdown
- •7.3. Команда halt
- •7.4. Изменение уровня выполнения процесса init
- •Глава 8. Задачи системного администрирования
- •8.1. Инструменты администрирования
- •8.1.1. Администрирование aix
- •8.1.2. Администрирование hp-ux
- •8.1.3. Администрирование Solaris
- •8.1.4. Администрирование Linux
- •8.2. Пользователь root
- •8.2.1. Команда su
- •8.3. Добавление новых пользователей в систему
- •8.3.1. Файл /etc/passwd
- •Идентификаторы пользователей
- •8.3.2. Файл /etc/group
- •8.4. Контрольные вопросы
- •8.5. Тесты
- •Литература
- •Содержание
- •Глава 1. История создания ос unix 6
- •Глава 2. Функционирование ос unix 51
- •Глава 3. Процессы 75
- •Глава 4. Файловая система unix 116
- •Акуленок Ирина Николаевна Акуленок Анатолий Васильевич
- •Часть I. Основы операционной системы unix
Глава 3. Процессы
Изучив данную главу, вы сможете:
дать определение процесса;
узнать, что хранится в таблице пользователя и в таблице процессов;
узнать о типах процессов, их характеристиках и свойствах;
узнать атрибуты процесса и дать их определение;
узнать о взаимодействии процессов и средствами связи между процессами.
Процесс – фундаментальное понятие в UNIX. С помощью процессов происходит управление памятью и ресурсами ввода–вывода, используемыми для выполнения программы. На первый взгляд, кажется, что в UNIX все происходит одновременно, однако на самом деле в конкретный момент времени выполняется только один процесс.
Некоторые машины имеют несколько центральных процессоров, но сути дела это не меняет, поскольку каждый центральный процессор может одновременно выполнять только один процесс. Иллюзию параллельного выполнения создает и поддерживает метод, называемый «квантованием времени», с помощью которого UNIX через определенные промежутки времени (как правило, максимум каждые 20 миллисекунд) меняет выполняемый процесс. Процессы сменяют друг друга настолько быстро, что, кажется, будто они выполняются одновременно, тогда, как в реальности выполнение каждого процесса занимает лишь малую долю суммарного времени.
Концепция процессов является базовой в OC UNIX. Само ядро UNIX существует для обеспечения потребностей процессов.
Если несколько пользователей одновременно запускают одну и ту же программу, то говорят о существовании одной программы, но нескольких процессов. Этим процессом может быть очень простая программа вывода текущей даты и времени или очень сложная система редактирования текстов. Сам интерпретатор shell является процессом.
Системный администратор имеет возможность контролировать статус процессов, управлять выделением времени центрального процессора каждому из них, посылать в процессы различные сигналы, приостанавливать и завершать их выполнение.
3.1. Контекст процесса
Каждый процесс UNIX имеет контекст, под которым понимается вся информация, требуемая для описания процесса. Эта информация сохраняется, когда выполнение процесса приостанавливается, и восстанавливается, когда планировщик предоставляет процессу вычислительные ресурсы. Контекст процесса состоит из нескольких частей:
Адресное пространство процесса в режиме задачи. Сюда входят код, данные и стек процесса, а также другие области, например, разделяемая память или код и данные динамических библиотек.
Управляющая информация. Ядро использует две основные структуры данных для управления процессом – ргос и user. Сюда же входят данные, необходимые для отображения виртуального адресного пространства процесса в физическое.
Окружение процесса. Переменные окружения процесса представляют собой строки пар вида:
переменная =значение
Они наследуются дочерним процессом от родительского и обычно хранятся в нижней части стека. Окружение процесса упоминалось в предыдущих главах, там же были показаны функции, позволяющие получить или изменить переменные окружения.
Аппаратный контекст. Сюда входят значения общих и ряда системных регистров процессора. К системным регистрам, в частности, относятся:
указатель инструкций, содержащий адрес следующей инструкции, которую необходимо выполнить;
указатель стека, содержащий адрес последнего элемента стека;
регистры плавающей точки;
регистры управления памятью, отвечающие за трансляцию виртуального адреса процесса в физический.
Переключение между процессами, необходимое для справедливого распределения вычислительного ресурса, по существу выражается в переключении контекста, когда контекст выполнявшегося процесса запоминается, и восстанавливается контекст процесса, выбранного планировщиком. Переключение контекста является достаточно ресурсоемкой операцией. Помимо сохранения состояния регистров процесса, ядро вынуждено выполнить множество других действий. Например, для некоторых систем ядру необходимо очистить кэш данных, инструкций или адресных трансляций, чтобы предотвратить некорректные обращения нового процесса. Поэтому запущенный процесс сначала вынужден работать по существу без кэша, что также сказывается на производительности.
Существуют четыре ситуации, при которых производится переключение контекста:
Текущий процесс переходит в состояние сна, ожидая недоступного ресурса.
Текущий процесс завершает свое выполнение.
После пересчета приоритетов в очереди на выполнение находится более высокоприоритетный процесс.
Происходит пробуждение более высокоприоритетного процесса.
Первые два случая соответствуют добровольному переключению контекста и действия ядра в этом случае достаточно просты. Ядро вызывает процедуру переключения контекста из функций sleep() или exit(). Третий и четвертый случаи переключения контекста происходят не по воле процесса, который в это время выполняется в режиме ядра и поэтому не может быть немедленно приостановлен. В этой ситуации ядро устанавливает специальный флаг runrun, который указывает, что в очереди находится более высокоприоритетный процесс, требующий предоставления вычислительных ресурсов. Перед переходом процесса из режима ядра в режим задачи ядро проверяет этот флаг и, если он установлен, вызывает функцию переключения контекста.
В системе UNIX программа представляет собой исполняемый файл. Это основа для построения контекста процесса при его порождении. По сути, порождение любого процесса в UNIX – это создание некоторой виртуальной машины. Она имеет свое особое адресное пространство, куда помещаются процедурный сегмент и сегмент данных (рис. 3.1).
Рис. 3.1. Структуры данных для управления обычными процессами
Системные данные, используемые ядром для идентификации процесса, которые существуют в течение всего времени жизни процесса, образуют дескриптор (описатель) процесса. Множество дескрипторов образуют таблицу процессов.
Каждая система UNIX сгенерирована с определенным числом элементов в таблице процессов, и это число ограничивает их максимальное количество.
Размер таблицы процессов, хотя и имеет допустимые ограничения, но в современных версиях UNIX позволяет создавать до нескольких сотен процессов. Дескриптор процесса содержит параметры процесса. Информация о состоянии включает расположение (адрес в памяти), размер выгружаемой части образа процесса, идентификаторы процесса и запустившего его пользователя.
Другая важная информация о процессе хранится в таблице пользователя (называемой также контекстом процесса). Сюда записываются:
идентификационные номера пользователя и группы, чтобы определить привилегии доступа к файлам;
ссылки на системную таблицу файлов для всех открытых процессом файлов;
указатель на индексный дескриптор текущего каталога в таблице индексных дескрипторов;
список реакций на различные сигналы.
В UNIX используются точные термины: образ программы и процесс.
Обычно программой называют совокупность файлов, будь то набор исходных текстов, объектных файлов или собственно выполняемый файл.
Для того чтобы программа могла быть запущена на выполнение, операционная система сначала должна создать окружение или среду выполнения задачи, куда относятся ресурсы памяти, возможность доступа к устройствам ввода/вывода и различным системным ресурсам, включая услуги ядра.
Это окружение (среда выполнения задачи) получило название процесса. Мы можем представить процесс как совокупность данных ядра системы, необходимых для описания образа программы в памяти и управления ее выполнением. Мы можем также представить процесс как программу в стадии ее выполнения, поскольку все выполняющиеся программы представлены в UNIX в виде процессов.
Процесс – это совокупность набора исполняющихся команд, ассоциированных с ним ресурсов (выделенная для исполнения память или адресное пространство, стеки, используемые файлы и устройства ввода–вывода) и текущего момента его выполнения (значения регистров, программного счетчика, состояние стека и значения переменных), находящуюся под управлением операционной системы.
Процесс состоит из:
инструкций, выполняемых процессором;
данных;
информации о выполняемой задаче, такой как размещенная память, открытые файлы и статус процесса.
Итак, процесс – это выполнение образа программы (загрузочного модуля).
В то же время не следует отождествлять процесс с программой хотя бы потому, что программа может породить более одного процесса. Простейшие программы, например, who(1) или cat(1), при выполнении представлены только одним процессом. Сложные задачи, например, системные серверы (печати), Telnet, порождают в системе несколько одновременно выполняющихся процессов.
Операционная система Unix является многозадачной. Это значит, что одновременно может выполняться несколько процессов, причем часть процессов может являться образами одной программы.
Выполнение процесса заключается в точном следовании набору инструкций, который никогда не передает управление набору инструкций другого процесса. Процесс считывает и записывает информацию в раздел данных и в стек, но ему недоступны данные и стеки других процессоров.
С технической точки зрения, образ представляет собой выполняемую программу в двоичном виде, которую не совсем правильно называют сегментом текста, а также различные структуры данных, содержащие контекст процесса и две ее рабочих области – сегмент данных и стек (рис. 3.2).
Сегмент текста еще называют процедурный сегмент, он доступен в ОЗУ только для чтения. Ядро защищает его от изменения и перезаписи во время выполнения. К другим областям можно обращаться свободно – на этапе выполнения они могут изменяться.
В процессе выполнения программы ее образ должен быть резидентен в оперативной памяти.
При всех кризисных ситуациях в жизни процесса происходит обращение в его таблицу. Создание процесса включает инициализацию соответствующего контекста и элемента таблицы процессов, а также формирования данных и текста этого процесса. Изменение состояния (выполнение, ожидание, свопинг на диск, возврат в память и т.д.) и получение сигнала от параллельного процесса – все это фиксируется в таблице процессов.
Рис. 3.2. Упрощенная схема образа программы
Каждому процессу в таблице процессов ядра соответствует свой элемент. Эта таблица представляет собой простой массив структур процессов. Каждая структура включает следующие поля:
признак состояния процесса;
приоритет;
резидентное время для планирования;
объем использования для ЦП;
признак годности (nice flag);
идентификатор пользователя процесса;
исполнительный идентификатор пользователя;
идентификатор группы и исполнительный идентификатор группы;
идентификатор процесса и идентификатор родительского процесса;
размер буфера обмена;
размер текста и стека;
массив необработанных сигналов.
Чтобы система работала сглажено, ядру необходимо отслеживать все эти данные.
Состояние процесса может многократно изменяться за время его существования. Он может переводиться в неактивное состояние, что означает его временную приостановку по каким–то причинам (таким как ожидание ввода–вывода или завершение других процессов). Обычно процесс выполняется до завершения, а затем прекращает свое существование. Процесс может также завершиться в результате возникновения какой–то ошибки или сигнала (такого как kill) от пользователя или другого процесса. При завершении процесса он удаляется из таблицы процессов, а занятая им оперативная память освобождается для новых процессов.
