Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

ФС UNIX V7

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

Каталоги содержат по одной записи для каждого файла, размер записи при этом фиксирован и составляет 16 байт (14 байт на имя файла, а 2 – на номер i-узла файла).

Описание файла (размер, временные штампы создания, доступа, изменения, идентификаторы владельца и группы и т. д.) и номера дисковых блоков хранятся в i-узле. Если файл имеет большой размер, то для хранения номеров его блоков используется косвенная адресация, т. е. номера блоков файла хранятся в отдельном блоке на диске, а в i-узле файла фиксируется ссылка на этот блок.

Лекция 9. Операционная система UNIX

ОС UNIX не является конкретной ОС, а обозначает целое семейство систем, обладающих достаточным количеством как сходств, так и различий, но отслеживающих свое происхождение к общему предку. Среди стандартных систем UNIX наибольшее развитие получили две различные и в чем-то несовместимые версии 4.3BSD и System V Release 3 (SVR3), поэтому в дальнейшем особенности каждой из версий (при их наличии) будут обозначаться отдельно. В настоящее время значительной популярностью пользуется свободно распространяемая ОС Linux.

При изучении архитектуры UNIX мы будем рассматривать особенности выполнения задач ОС в том же порядке, как это было описано в предыдущих лекциях:

НЕ нашли? Не то? Что вы ищете?

· структура ОС и процесс загрузки;

· организация процессов и потоков, работа планировщика;

· управление памятью;

· ввод-вывод в ОС;

· организация ФС.

Интерфейсы UNIX

ИВС на основе ОС UNIX можно рассматривать в виде пирамиды (рис. 9.1).

Рис. 9.1. Структура ИВС на основе ОС UNIX

ОС работает на «голой» аппаратуре, и ее функция заключается в управлении АО и предоставлении всем программам интерфейса системных вызовов.

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

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

Таким образом, можно говорить о трех интерфейсах UNIX: системных вызовов, библиотечных функций и пользовательском интерфейсе, образованном набором стандартных программ.

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

При работе программы типа оболочки получают доступ к трем стандартным потокам: потоку ввода, потоку вывода и потоку ошибок. По умолчанию всем трем потокам соответствует терминал (клавиатура для ввода и экран для вывода). Тем не менее стандартный ввод и вывод можно перенаправить с использованием символов < (перенаправление ввода) и > (перенаправление вывода). С помощью перенаправления можно создавать фильтры – программы, считывающие данные со стандартного ввода, выполняющие определенную обработку этих данных и записывающие результат в поток стандартного вывода.

Ряд программ в UNIX может быть также объединен в конвейер с помощью символа канала |, при этом поток вывода программы, записанной до черты, является потоком ввода программы, записанной после нее.

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

Структура ядра UNIX

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

Большинство UNIX-систем структурированы как ОС на основе многоуровневого ядра, хотя существуют и некоторые разновидности на основе микроядра (например Mach).

Нижний уровень ядра состоит из драйверов устройств и низкоуровневой процедуры диспетчеризации процессов, написанной на ассемблере отдельно от процедуры планирования. Драйверы устройств делятся на два класса: символьных устройств и блочных устройств.

Символьные устройства используются либо напрямую (данные от них поступают в виде потока байтов без обработки), либо в обработанном виде.

Сетевое ПО часто бывает модульным, с поддержкой множества различных устройств и протоколов. Уровень выше сетевых драйверов осуществляет перенаправление пакетов между устройствами и протоколами. Над уровнем перенаправления находится стек протоколов, обязательно включая IP и TCP/IP. Над сетевыми протоколами располагается интерфейс сокетов, необходимый для программирования сетевых приложений.

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

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

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

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

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

Загрузка UNIX

При загрузке ОС UNIX последовательно выполняются следующие этапы:

1) 512-байтовая программа, находящаяся в MBR диска, загружает автономную программу boot;

2) boot копирует саму себя в фиксированный адрес памяти в старших адресах, освобождая нижнее пространство для ОС;

3) boot считывает корневой каталог с загрузочного устройства (для этого она должна понимать формат ОС);

4) boot считывает ядро ОС и передает ему управление;

5) начальная программа ядра написана на ассемблере, она устанавливает указатель стека, определяет тип процессора, количество ОЗУ, запрещает прерывания, разрешает работу диспетчера памяти и вызывает процедуру main для выполнения основной части ОС;

6) main выделяет память под буфер сообщений (в который записываются сообщения о загрузке системы) и структуры данных ядра;

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

8) main загружает драйверы (в зависимости от разновидности ОС они могут быть либо скомпилированными с ядром – 4.4 BSD, либо загружаться динамически – Linux);

9) main создает нулевой процесс и устанавливает его стек. Процесс затем продолжает инициализацию, программируя таймер, монтируя ФС, а также порождает процессы с идентификаторами 1 (init) и 2 (страничный демон);

10) init проверяет флаги и в зависимости от этого запускает ОС либо в однопользовательском, либо в многопользовательском режиме. В первом случае он создает процесс, выполняющий оболочку, и ждет, когда тот завершит работу. Во втором случае init создает процесс, исполняющий сценарии оболочки инициализации системы /etc/rc (/etc/init), который может осуществлять проверку ФС, монтировать дополнительные ФС, запускать демонов и т. п. Затем он считывает файл /etc/ttys, в котором перечисляются терминалы и их свойства. Для каждого терминала он создает копию самого себя, которая затем исполняет программу getty;

11) getty устанавливает для каждой линии скорость линии, после чего выводит приглашение к входу в систему;

12) когда пользователь ввел имя, getty запускает программу /bin/login, которая запрашивает у пользователя пароль, шифрует его, сравнивает с имеющимися в системе в /etc/passwd;

13) если имя верное, то login запускает указанную для пользователя оболочку, иначе ещё раз спрашивает имя пользователя.

Следует заметить, что в современных системах присутствует несколько сценариев оболочки /etc/rcX, каждый из которых используется по умолчанию для своих целей:

· rc0 – действия при остановке системы;

· rc1 – работа в однопользовательском режиме;

· rc2 – многопользовательский режим, без поддержки сетевых файловых систем (если сеть отсутствует, то аналогичен 3-му сценарию);

· rc3 – полный многопользовательский режим;

· rc5 – работа с оконным интерфейсом X Windows;

· rc6 – перезагрузка системы.

Организация процессов и потоков

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

Появление в системе нового процесса возможно единственным способом – с помощью системного вызова fork, при этом создается новый процесс, являющийся точной копией исходного (исходный процесс становится родительским, а новый – дочерним). Единственным отличием между процессами является то, что для родительского процесса fork вернет PID его потомка, а для дочернего – нуль. После завершения работы дочернего процесса его proc-структура не уничтожается. В ней сохраняется информация об использовании ресурсов дочерним процессом, а также о статусе его завершения. Для блокировки в ожидании завершения дочернего процесса применяется библиотечная процедура waitpid.

Завершение процесса (добровольное) осуществляется с помощью системного вызова exit. Если дочерний процесс завершил свою работу, а родительский не ожидает этого события, то он переходит в состояние зомби, т. е. не работая, продолжает занимать место в таблице процессов. Его предком при этом назначается процесс init.

Для взаимодействия друг с другом процессы могут пользоваться каналами (в которых один процесс пишет поток байтов, а второй – читает из него) или сигналами (процесс может посылать сигналы только членам его группы процессов).

Для замены контекста выполнения одного приложения на другое в рамках неизменного процесса предназначен системный вызов exec.

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

Единичной записью таблицы процессов является proc-запись (proc-область), содержащая ряд категорий информации.

1. Параметры планирования: приоритет процесса, потребленное процессорное время, количество времени в режиме ожидания, фактор «любезности».

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

3. Сигналы: маски, указывающие, какие сигналы игнорируются, какие перехватываются, какие временно заблокированы, какие находятся в процессе доставки.

4. Прочее: состояние процесса, события, которые ожидает процесс, время до истечения интервала будильника, PID процесса и его родителя, идентификаторы пользователя и группы.

Пользовательская область (структура пользователя) состоит из информации, которая требуется только тогда, когда процесс активен и выполняется. Область включает следующие данные:

1. машинные регистры;

2. состояние системного вызова (параметры и результаты);

3. таблицу дескрипторов открытых файлов (содержит ссылки на записи общей таблицы открытых файлов в ядре);

4. учетную информацию (информация об использовании процессорного времени в пользовательском и привилегированном режимах);

5. стек ядра (используется при обработке системных вызовов);

6. таблицу потоков процесса (если в данной реализации ОС потоки поддерживаются на уровне пользовательских библиотек).

Планирование процессов в UNIX

Основой планирования в UNIX-системах являются аппаратные прерывания от таймера, на основании которых происходит выделение процессорного времени процессам, а также вытеснение процесса с процессора. Продолжительность тика таймера обычно составляет 10 мс.

В большинстве систем введено понятие основного тика, который равен n тикам таймера. Ряд задач выполняется только на основном тике (например, перерасчет приоритетов, обработка сигналов тревоги, возобновление работы системных процессов).

Приоритеты процессов могут находиться в диапазоне от 0 до 127 (меньшему значению соответствует более высокий приоритет), из которого значения от 0 до 49 зарезервированы для ядра (табл. 9.1), а область от 50 до 127 выделена прикладным процессам. В отличие от пользовательских приоритетов, приоритеты ядра являются статическими, т. е. не изменяются со временем. Процесс получает приоритет ядра в том случае, если при выполнении системного вызова в ядре он был заблокирован до его завершения, отчего приоритеты ядра называют также приоритетами сна.

Таблица 9.1: Приоритеты ядра

Приоритет

Значение

Описание

PSWP

0

Свопинг

PSWP+1

1

Страничный демон

PSWP+1/2/4

1/2/4

Другие действия по обработке памяти

PINOD

10

Ожидание освобождения inode

PRIBIO

20

Ожидание дискового ввода-вывода

PRIBIO+1

21

Ожидание освобождения буфера

PZERO

25

Базовый приоритет

TTIPRI

28

Ожидание ввода с терминала

TTOPRI

29

Ожидание вывода на терминал

Один раз в секунду планировщик производит перерасчет приоритетов для всех процессов по следующей формуле:

где nice – является фактором «любезности» и может находиться в пределах от 0 до 39, со значением по умолчанию 20. Все значения, превосходящие 20, приводят к понижении приоритета; те, что менее 20, - к его увеличению (повышать приоритет процесса может только суперпользователь).

Активный процесс каждый тик таймера увеличивает на одну единицу значение времени использования процессора (TCPU). На каждый четвертый тик таймера приоритет текущего процесса пересчитывается.

Каждую секунду также происходит уменьшение статистики использования процессора процессами исходя из значения фактора полураспада K: TCPU TCPU ´ K. Для UNIX SVR3 K=0,5, для 4.3 BSD
K= (2´load_average)/(2´load_average + 1), где load_average – среднее количество процессов, находящихся в состоянии готовности к исполнению, за последнюю секунду. Фактор полураспада обеспечивает экспоненциально взвешенное среднее значение использования процессора в течение всего периода функционирования процесса. Формула SVR3, учитывающая простое экспоненциальное среднее, имеет побочный эффект, заключающийся в росте приоритетов при увеличении загрузки системы. Рост происходит из-за того, что на сильно загруженной системе каждый процесс получает меньшее время. При этом величина использования процессора остается низкой, поэтому фактор полураспада со временем еще дополнительно ее сокращает. В результате использование процессора не сильно влияет на приоритеты, и процессы, начавшие работу с более низкими приоритетами, простаивают в ожидании процессора непропорционально. В BSD фактор полураспада зависит от загруженности системы. Если загрузка велика, то и фактор увеличивается. Следовательно, для процессов, получающих процессорное время, снижение приоритетов будет происходить быстро.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8