- •1 Операционная система. Определение. Назначение. Функции ос.
- •2 История ос. Развитие операционных систем.
- •3 Классификация операционных систем.
- •4 Специальные регистры центрального процессора (счетчик команд, указатель стека, rsw)
- •5 Конвейерная и скалярная конструкция процессора
- •6 Устройство памяти. Виды памяти.
- •7 Базовый и предельный регистры. Диспетчер памяти.
- •8 Драйвера устройств ввода-вывода. Способы установки драйверов.
- •9 Три способа организации ввода-вывода.
- •10 Шины и их назначение.
- •11 Процесс. Характеристики процесса. Понятия, связанные с процессом (таблица процессов, оболочка и т.Д.)
- •12 Взаимоблокировки. Определение. Примеры.
- •13 Файловые системы. Определение. Понятия, связанные с файловыми системами.
- •14 Код защиты файлов в unix.
- •15 Оболочка. Определение. Командный интерпретатор unix.
- •16 Системные вызовы. Назначение, схема работы системного вызова.
- •17 Основные системные вызовы posix.
- •18 Системные вызовы для управления процессами. Работа, примеры.
- •19 Системные вызовы для управления файлами. Работа. Примеры.
- •20 Системные вызовы для управления каталогами. Работа. Примеры.
- •21 Системные вызовы в unix и windows сравнение.
- •22 Структура ос. Монолитные ос.
- •23 Многоуровневые ос.
- •24 Виртуальные машины.
- •25 Экзоядро. Модель клиент-сервер.
- •26 Многозадачность. Создание и завершение процесса.
- •27 Состояния процессов.
- •28 Последовательность обработки прерываний нижним уровнем ос.
- •29 Поток. Определение. Отличие потока от процесса. Примеры применения потоков.
- •30 Реализация потоков в пространстве пользователя и в ядре. Схема и отличия.
- •31 Всплывающие потоки. Проблемы при переводе программы из однопоточной в многопоточную.
- •32 Межпроцессорное взаимодействие. Состояние состязания. Примеры. 4 условия для эффективной совместной работы процессов.
- •33 Методы решения проблем межпроцессорного взаимодействия с активным ожиданием. Запрещение прерываний, переменные блокировки, строгое чередование.
- •34 Алгоритм Петерсона и команда tsl.
- •35 Примитивы межпроцессорного взаимодействия. Проблема производителя и потребителя.
- •36 Семафоры. Решение проблемы производителя и потребителя с помощью семафоров.
- •37 Мьютексы и мониторы.
- •38 Передача сообщений и барьеры.
- •40 Планирование. Назначение. Поведение процессов. Категории алгоритмов планирования.
- •41 Планирование в системах пакетной обработки: «Первым пришел – первым обслужен», «Кратчайшая задача – первая».
- •42 Алгоритмы планирования: Наименьшее оставшееся время выполнения, трехуровневое планирование.
- •43 Циклическое планирование и приоритетное планирование.
- •44 Алгоритмы планирования: «Самый короткий процесс – следующий», Гарантированное планирование, Лотерейное планирование.
- •45 Справедливое планирование и планирование в системах реального времени.
- •46 Выгружаемые и невыгружаемые ресурсы. Условия взаимоблокировки.
- •47 Моделирование взаимоблокировок.
- •48 Четыре стратегии избегания взаимоблокировок. Страусовый алгоритм.
- •49 Обнаружение взаимоблокировки при наличии одного ресурса каждого типа.
- •51 Выходы из взаимоблокировки. Траектории ресурсов.
- •52 Безопасные и небезопасные состояния. Алгоритм банкира. Предотвращение взаимоблокировок.
17 Основные системные вызовы posix.
Управление процессом
pid = fork() Создает дочерний процесс, идентичный родительскому
pid = waitpid(pid, &statloc, options) Ожидает завершения дочернего процесса
s = execve(name, argv, environp) Заменяет образ памяти процесса
exit(status) Завершает выполнение процесса и возвращает статус
Управление файлами
fd = open(file, how, ...) Открывает файл для чтения, записи или для того и другого
s = close(fd) Закрывает открытый файл
n = read(fd, buffer, nbytes) Читает данные из файла в буфер
n = write(fd, buffer, nbytes) Записывает данные из буфера в файл
position = lseek(fd, offset, whence) Перемещает указатель файла
s = stat(name, &buf) Получает информацию о состоянии файла
Управление каталогами и файловой системой
s = mkdir(name, mode) Создает новый каталог
s = rmdir(name) Удаляет пустой каталог
s = Iink(name1, name2) Создает новый элемент с именем name2, указывающий
на пате 1
s = unlink(name) Удаляет элемент каталога
s = mount(special, name, flag) Подключает файловую систему
s = umount(special) Отключает файловую систему
18 Системные вызовы для управления процессами. Работа, примеры.
Начнем рассмотрение системного вызова fork ("разветвление). Вызов fork является единственным существующим в POSIX способом создания нового процесса. Он создает точную копию исходного процесса, включая все дескрипторы файлов, регистры и т. п. После выполнения вызова fork исходный процесс и его копия (родительский и дочерний процессы) выполняются независимо друг от друга. На момент разветвления все их соответствующие переменные имеют одинаковые значения, но поскольку родительские данные копируются в дочерний процесс, последующие изменения в одном из них не влияют на изменения в другом. (Текст программы, не подвергающийся изменениям, является общим как для родительского, так и для дочернего процесса.) Системный вызов fork возвращает нулевое значение для дочернего процесса и равное идентификатору дочернего процесса или PID — для родительского. Используя возвращенное значение PID, два процесса могут определить, какой из них родительский, а какой — дочерний. В большинстве случаев после вызова fork дочернему процессу необходимо выполнить программный код, отличный от родительского. Рассмотрим пример работы системной оболочки. Она считывает команду с терминала, создает дочерний процесс, ожидает, пока дочерний процесс выполнит команду, а затем считывает другую команду, если дочерний процесс завершается. Для ожидания завершения дочернего процесса родительский процесс выполняет системный вызов waitpid, который просто ждет, пока дочерний процесс не закончит свою работу (причем здесь
имеется в виду любой дочерний процесс, если их несколько). Системный вызов waitpid может ожидать завершения конкретного дочернего процесса или любого из запущенных дочерних процессов, если первый параметр имеет значение -1. Когда работа waitpid завершается, по адресу, указанному во втором параметре — statloc, заносится информация о статусе завершения дочернего процесса (нормальное или аварийное завершение и выходное значение). В третьем параметре определяются различные необязательные настройки.
Теперь рассмотрим, как вызов fork используется оболочкой. После набора команды оболочка создает дочерний процесс, который должен выполнить команду пользователя. Он делает это, используя системный вызов execve, который полностью заменяет образ памяти процесса файлом, указанным в первом параметре.