- •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 Безопасные и небезопасные состояния. Алгоритм банкира. Предотвращение взаимоблокировок.
14 Код защиты файлов в unix.
15 Оболочка. Определение. Командный интерпретатор unix.
Командный интерпретатор Unix называется оболочкой. He являясь частью операционной системы, оболочка нашла широкое применение как средство доступа ко многим ее функциям и служит хорошим примером использования системных вызовов. Когда не применяется графический пользовательский интерфейс, она также является основным интерфейсом между пользователем, сидящим за своим терминалом, и операционной системой. Существует множество оболочек, включая sh, csh, ksh и bash. Все они поддерживают рассматриваемые далее функции, происходящие из исходной оболочки (sh). Оболочка запускается после входа в систему любого пользователя. В качестве стандартного устройства ввода и вывода оболочка использует терминал. Свою работу она начинает с вывода приглашения — знака доллара, сообщающего пользователю, что оболочка ожидает приема команды. Например, если теперь пользователь наберет на клавиатуре date оболочка создаст дочерний процесс и запустит дочернюю программу date. Пока выполняется дочерний процесс, оболочка ожидает его завершения. После завершения дочернего процесса оболочка снова выведет приглашение и попытается прочитать следующую введенную строку. Пользователь может указать, что стандартный вывод необходимо перенаправить в файл, например, date >file Точно так же может быть перенаправлен и стандартный ввод sort <filel >file2 Эта команда вызывает программу сортировки — sort, входные данные для которой берутся из файла filel, а выходные данные отправляются в файл file2. Выходные данные одной программы могут быть использованы в качестве входных для другой программы путем их соединения с помощью канала. Например, следующая команда cat filel file2 file3 | sort >/dev/lp вызывает программу cat для объединения трех файлов и отправки выходных данных программе sort, чтобы она расставила все строки в алфавитном порядке. Выходные данные программы sort перенаправляются в файл /dev/lp, которым обычно обозначается принтер. Если пользователь после команды введет знак &, оболочка не станет ожидать ее завершения, а сразу же выведет приглашение. Следовательно, команда cat filel file2 file3 | sort >/dev/lp & приступит к сортировке как к фоновому заданию, позволяя пользователю во время сортировки продолжить обычную работу. В наши дни на многих персональных компьютерах используется графический пользовательский интерфейс. По сути, графический пользовательский интерфейс — это просто программа (или совокупность программ), работающая поверх операционной системы наподобие оболочки.
16 Системные вызовы. Назначение, схема работы системного вызова.
Ос выполняет 2 основные функции - предоставляет абстракции пользовательским программам и управляет ресурсами компьютера. Взаимодействие программ и ОС в основном касается первой функции интерфейса между пользовательской программой и ОС строится в основном на абстракциях, которые представляют собой системные вызовы. Имеющиеся интерфейс системные вызовы варьируются в зависимости от используемой ОС. Операционные системные вызовы UNIX, а также UNIXо-образные системы определены стандартом POSIX. У большинства других ОС имеются системные вызовы, выполняющие аналогичные функции, имеющие некоторые отличия в деталях. Поскольку фактический механизм осуществления системного вызова существенно зависит от конкретной машины и зачастую должен быть реализован на ассемблере, разработаны библиотеки процедур, позволяющие осуществить системные вызовы из программ на языке высокого уровня.
Для того чтобы прояснить механизм системных вызовов, рассмотрим
системный вызов чтения — read. Как уже упоминалось выше, он имеет три параметра: первый служит для задания файла, второй указывает на буфер, а третий задает количество байтов, которое нужно прочитать. Как практически все системные вызовы, он осуществляется из программы на языке С с помощью вызова библиотечной процедуры, имя которой совпадает с именем системного вызова: read. Вызов из программы на С может иметь следующий вид:
count = read(fd, buffer, nbytes);
Системный вызов (и библиотечная процедура) возвращает количество фактически считанных байтов, которое сохраняется в переменной count. Обычно это значение совпадает со значением параметра nbytes, но может быть и меньше, если, например, в процессе чтения будет достигнут конец файла. Если системный вызов не может быть выполнен из-за неправильных параметров или из-за ошибки диска, значение переменной count устанавливается в -1, а номер ошибки помещается в глобальную переменную errno. Программам обязательно нужно проверять результаты системного вызова, чтобы отслеживать возникновение ошибки. Выполнение системного вызова состоит из нескольких шагов. Для прояснения ситуации вернемся к упоминавшемуся выше примеру вызова read. Сначала, при подготовке вызова библиотечной процедуры read, которая фактически и осуществляет системный вызов read, вызывающая программа помещает параметры в стек шагами 1-3. Компиляторы С и C++ помещают параметры в стек в обратном порядке, следуя исторически сложившейся традиции (чтобы на вершине стека оказался первый параметр функции printf — строка формата вывода данных). Первый и третий
параметры передаются по значению, а второй параметр передается по ссылке, поскольку это адрес буфера (о чем свидетельствует знак &), а не его содержимое. Затем осуществляется фактический вызов библиотечной процедуры (шаг 4). Эта команда представляет собой обычную команду вызова процедуры и используется для вызова любых процедур. Библиотечная процедура, возможно написанная на ассемблере, обычно помещает номер системного вызова туда, где его ожидает операционная система, например в регистр (шаг 5). Затем она выполняет команду TRAP для переключения из пользовательского режима в режим ядра, и выполнение продолжается с фиксированного адреса, находящегося внутри ядра операционной системы (шаг 6). Фактически команда TRAP очень похожа на команду вызова процедуры, в том смысле, что следующая за ней команда берется из удаленного места, а адрес возврата сохраняется в стеке для последующего использования. Тем не менее у команды TRAP и команды вызова процедуры есть два основных отличия. Во-первых, побочный эффект, заключающийся в переключении в режим ядра. Команда вызова процедуры не меняет используемый режим. А во-вторых, команда TRAP не может получить относительный или абсолютный адрес местонахождения процедуры, поскольку она не может осуществить переход на произвольный адрес. Начавшая работу после команды TRAP часть ядра проверяет номер системного вызова, а затем передает управление нужному обработчику. Обычно передача управления осуществляется посредство указателей на обработчики системных вызовов, которая индексирована по номерам этих вызовов (шаг 7). После этого вступает в действие обработчик конкретного системного вызова (шаг 8). Как только обработчик закончит работу, управление может быть возвращено библиотечной процедуре, находящейся в пользовательской области памяти, той самой команде, которая следует за командой TRAP (шаг 9). В свою очередь эта процедура вернет управление пользовательской программе по обычной схеме возврата из процедуры (шаг 10). Чтобы завершить работу с процедурой read, пользовательская программа должна очистить стек, точно так же, как она это делает после любого вызова процедуры (шаг 11). Полагая, что в нашем примере стек растет вниз (как это чаще всего и бывает), пользовательская программа в скомпилированном виде должна содержать команды увеличения указателя стека ровно настолько, чтобы были удалены параметры, помещенные в стек перед вызовом процедуры read. Теперь программа может продолжить свою работу. При рассмотрении шага 9 было специально отмечено, что «управление может быть возвращено библиотечной процедуре, находящейся в пользовательской области памяти». Системный вызов может заблокировать вызывающую программу, препятствуя продолжению ее работы. Например, вызывающая программа должна быть заблокирована при попытке чтения с клавиатуры, когда на ней еще ничего не набрано. В этом случае операционная система ищет другой процесс, который может быть запущен. Позже, когда станут доступны требуемые входные данные, система вспомнит о заблокированном процессе и будут выполнены шаги с 9-го по 11-й.