- •4 Курс, 1 семестр
- •Оглавление
- •1 Введение в ос unix
- •1.1 История создания
- •1.2 Базовые концепции
- •1.3 Архитектура unix
- •1.4 Пользователи системы
- •1.5 Пользовательская среда Unix.
- •2 Файловая подсистема
- •2.1 Понятие
- •2.2 Логическая структура файловой системы
- •2.3 Имена файлов в ос unix
- •2.4 Типы файлов
- •2.5 Права доступа к файлам
- •2.6 Физическое размещение файловой системы
- •2.7 Особенности размещения файловой системы sVfs
- •2.8 Особенности размещения файловой системы ffs (ufs)
- •2.9 Монтирование файловых систем
- •2.10 Восстановление файловой системы
- •2.11 Типы файловых систем unix
- •3 Подсистема управления процессами
- •3.1 Понятие процесса
- •3.2 Логическая организация процессов
- •3.3 Жизненный цикл процесса
- •3.4 Реализация процессов
- •3.4.1 Состав процесса
- •3.4.2 Структуры управления процессом
- •3.4.3 Файловая система /proc
- •3.5 Нити (потоки)
- •Причины появления нитей
- •Типы нитей
- •3) Прикладные нити. Существует возможности поддержки нитей полностью на прикладном уровне, при этом ядру об их существовании ничего не известно.
- •3.5 Планирование
- •3.5.1 Задачи планировщика
- •3.5.2 Приоритеты процессов
- •3.5.3 Реализация планировщика
- •3.5.4 Расчет приоритета
- •3.5.5 Особенности планирования в Linux
- •3.6 Взаимодействие между процессами (Interprocess Communication, ipc)
- •3.6.1 Введение
- •3.6.2 Взаимодействие родственных процессов
- •3.6.3 Взаимодействие произвольных процессов
- •Разделяемая память.
- •Передача сообщений.
- •Семафоры.
- •3.6.4 Межпроцессное взаимодействие с помощью файловой системы
- •4 Управление памятью
- •4.1 Понятие виртуальной памяти
- •4.2 Свопинг
- •4.3 Страничное замещение
- •4.4 Стратегия замещения страниц
- •5 Подсистема ввода-вывода
- •5.1 Основные задачи
- •5.2 Типы устройств ввода-вывода в ос
- •5.3 Общая схема
- •5.4 Драйвера
- •5.5 Буферизация
- •5.6 Поддержка операций ввода-вывода
- •6 Unix в сетях
- •6.1 Конфигурация tcp/ip
- •6.2 Основные сетевые утилиты
- •6.3 Основные сетевые интерфейсы
- •6.4 Доступ к сетевым ресурсам
- •6.5 Сетевые службы Unix
3.5.4 Расчет приоритета
Алгоритм планирования состоит из двух уровней.
1. Низкоуровневый алгоритм выбирает следующий процесс из набора процессов в памяти, готовых к работе. (расчет приоритета)
2. Высокоуровневый алгоритм перемещает процессы из памяти на диск и обратно. (переключение контекста)
У каждой версии UNIX низкоуровневый алгоритм слегка различается, но все они имеют много общих черт.
Используется несколько очередей. С каждой очередью связан диапазон непересекающихся значений приоритетов. В очередях находятся только процессы, находящиеся в памяти и готовые к работе.
Действия низкоуровневого планировщика
1. просматривает очереди, начиная с самого высокого приоритета, пока не находит очередь, в которой есть хотя бы один процесс,
2. в найденной очереди запускается первый процесс,
3. процессу разрешается работать в течении некоторого максимального кванта времени (обычно 100 мс) или пока он не заблокируется. Если процесс использует весь свой квант времени, он помещается обратно, в конец очереди, а алгоритм планирование запускается снова.
4. если процесс готов к запуску и имеет наивысший приоритет, планировщик приостановит выполнение текущего процесса (с более низким приоритетом), даже если последний не "выработал" свой временной квант.
Ядро UNIX является непрерываемым. Это означает, что процесс, находящийся в режиме ядра (в результате системного вызова или прерывания) и выполняющий системные инструкции, не может быть прерван системой, а вычислительные ресурсы переданы другому высокоприоритетному процессу. Система может прервать выполнение процесса только при переходе из режима ядра в пользовательский режим.
5. Раз в секунду приоритет каждого процесса пересчитывается по формуле:
Pri = CPU_usage + nice + base
CPU_usage – использование ЦП – среднее значение тиков (прерываний) таймера в секунду, которые процесс работал в течение последних нескольких секунд.
При каждом тика таймера счетчик использования ЦП в таблице процессов увеличивается на 1. Т.о., пока процесс выполняется в режиме задачи, его текущий приоритет линейно уменьшается.
Но для того, чтобы не снизить приоритет процесса окончательно, ядро последовательно уменьшает величину CPU_usage (в разных версиях для этого используются разные формулы, качество алгоритма планирования определяется как раз эффективностью вычисления CPU_usage, вследствие чего лучше учитываются интересы низкоприоритетных процессов).
Nice – поправка приоритета (допустимый диапазон от -20 до 20).
Base – предопределенные отрицательные значения приоритетов для следующих операций.
ожидание дискового ввода-вывода
ожидание дискового буфера
ожидание терминального ввода
ожидание выполнения дочернего процесса
Эти величины определяются таким образом, чтобы перезапущенный процесс наверняка попадал в другую очередь.
В основе этой схемы лежит идея как можно скорее удалить процесс из ядра. Если процесс читает дисковый файл, эффективнее позволить ему немедленно продолжить работу сразу после запроса, так чтобы он мог быстро обратиться к следующему системному вызову. Таким образом, процессы, имеющие положительный приоритет, обслуживаются после того, как будут обслужены все процессы, связанные с вводом-выводом.