- •И.Н.Акуленок, а.В.Акуленок
- •Часть 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
4.4. Дескриптор обычного файла
Каждый файл UNIX имеет описатель файла (или дескриптор) размером 64 байта (структуру его можно посмотреть в файле /usr/include/sys/inode.h), который содержит следующую информацию:
определение типа файла (обычный, каталог или специальный файл);
идентификатор владельца и группы;
режим доступа к файлу – разрешения, которые даны пользователям и пользовательским группам (разрешения на чтение, изменение и запуск файла);
счетчик числа ссылок на файл (связей);
размер – число байтов в файле;
дату и время создания файла, дату и время его последней модификации, и дату и время последнего обращения (доступа);
адреса блоков данных.
Описатель файлов хранится в составе таблицы дескрипторов (i-node table) на диске в некотором блоке. Дескриптор файла характеризуется своим индексом (местом) в таблице дескрипторов.
4.5. Дескриптор каталога
Наличие обычных файлов недостаточно для организации иерархических файловых систем. Требуется наличие каталогов, которые сопоставляют имена файлов или каталогов с их физическим описанием. Каталоги представляют собой особый вид файлов, которые хранятся во внешней памяти подобно обычным файлам, но структура которых поддерживается самой файловой системой.
Структура файла–каталога очень проста. Фактически, каталог – это таблица, каждый элемент которой состоит из двух полей: номера i–узла данного файла в его файловой системе и имени файла, которое связано с этим номером (конечно, этот файл может быть и каталогом). Если просмотреть содержимое текущего рабочего каталога с помощью команды ls –ai, то можно получить вывод, который демонстрирует, что в любом каталоге содержатся два стандартных имени – "." и "..". Имени "." сопоставляется i–узел, соответствующий самому этому каталогу, а имени ".." – i–узел, соответствующий "родительскому" каталогу данного каталога.
$ ls –ai
33 .
122 ..
54 first_file
65 second_file
65 second_again
77 dir2
В первом столбце указывается номер i-node, второй столбец – это имя файла.
"Родительским" (parent) каталогом называется каталог, в котором содержится имя данного каталога. Файлы с именами "first_file" и "second_file" – это разные файлы с номерами i–узлов 54 и 65 соответственно. Файл "second_again" представляет пример так называемой жесткой ссылки: он имеет другое имя, но реально описывается тем же i–узлом, что и файл "second_file". Наконец, последний элемент каталога описывает некоторый другой каталог с именем "dir2".
Дескрипторы файлов пронумерованы, начиная с единицы. Номер дескриптора файла хранится в полях элементов каталога.
Каталоги обеспечивают связь между именами файлов и собственно файлами. Элемент каталога длиной 16 байт содержит поле имени файла (14 байт – 14 символов), по которому обеспечивается доступ к файлу, и поле ссылки длиной 2 байта, содержащее номер дескриптора файла.
По номеру дескриптора проводится поиск дескриптора, который содержит адреса блоков данных файла (имя файла номер дескриптора данные). Взаимно однозначного соответствия между именем файла и самим файлом нет. Несколько каталогов могут содержать элементы (связи), содержащие в поле имени разные имена, а в поле ссылки соответствующие этим разным именам одинаковые номера. Таким образом, файл может иметь несколько имен и к одним и тем же данным обращение может быть по разным именам.
Это позволяет файловой системе следить за занятостью файла: как только счетчик ссылок станет равным нулю, индексный дескриптор освобождается, а дисковое пространство может быть использовано для записи других файлов. Ссылки на один и тот же файл могут находиться в любом каталоге файловой системы.
Информация о файле, содержащаяся в каталоге, – это единственная связь между именем файла и самим файлом.
Такие два обязательных элемента как «.» и «..» автоматически заносятся системой в каталог при его создании и не могут быть удалены пользователем. Каталог считается пустым, если он содержит только файлы «.» и «..».
С точки зрения ядра UNIX траектория, задаваемая полным именем файла, представляет собой переходы между каталогами и индексными дескрипторами. Пусть существует полное имя «../a/b» (рис. 4.3). Для того чтобы проследить эту цепочку, система выполняет следующие действия:
Выбирает индексный дескриптор текущего каталога. Этот дескриптор содержится в контексте процесса.
С помощью информации, хранящейся в этом дескрипторе, осуществляет поиск в текущем каталоге имени «..» и получает номер его дескриптора.
Выбирает индексный дескриптор «..».
С помощью информации, хранящейся в дескрипторе «..», осуществляет поиск в родительском каталоге файла «а» и получает номер его дескриптора.
Выбирает индексный дескриптор «а».
С помощью информации, хранящейся в дескрипторе «а» осуществляет поиск в каталоге «а» файла с именем «b» и получает номер его индексного дескриптора.
Выбирает индексный дескриптор файла «b».
Обращается к файлу «b».
Как видно из примера, самый обычный доступ к файлу требует проведения очень большой работы.
Рис. 4.3. Прослеживание цепочки полного имени
