Файл: Литература по курсу аос (по всем вопросам должен быть представлен краткий рукописный конспект в общей тетради).docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.02.2024

Просмотров: 86

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Выполнение обработки прерываний в контексте и вне контекста процесса.

Чаще всего, процедура обработки прерываний выполняет работу никак не связанную с текущим процессом. Иногда вообще трудно определить, для какого процесса выполняет работу тот или иной модуль ОС, например, планировщик потоков.
Поэтому в общем случае процедуры обработки прерываний не имеют права использовать ресурсы текущего процесса или запрашивать от его имени дополнительные ресурсы.
Они работают с ресурсами, которые выделены им при инициализации соответствующего драйвера или самой ОС, с ресурсами ОС, а не конкретного процесса. Например, память выделяется им из системной области.
Все подобные процедуры работают вне контекста процесса, и делать это их должен заставить системный программист, а не сама ОС, она не может.
Однако бывают такие прерывания, обработка которых всегда выполняется в контексте определенного процесса- это АПС – асинхронные вызовы процедур. (1-й уровень приоритета.) АПС могут пользоваться ресурсами текущего процесса и были введены именно для этого.
Пример АПС – перемещение данных, полученных драйвером устройства ввода вывода из системной области памяти, куда они первоначально попадают в индивидуальную часть адресного пространства нужного процесса. Такие действия постоянно выполняются системой ввода-вывода, собственно для них и были введены подобные прерывания.


  1. Реализация системных вызовов. Использование механизма прерываний для реализации системных вызовов.


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

  • Обеспечивать переключение в защищенный режим

  • Обладать высокой скоростью вызова процедур ОС

  • Обеспечивать единообразное обращение к системным вызовам для всех аппаратных платформ, на которых работает ОС

  • Быть легко расширяемой новыми вызовами

  • Обеспечивать контроль со стороны ОС за корректным использованием вызовов.


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


ОС может выполнять системные вызовы:

- по децентрализованной схеме

- по централизованной схеме (используется в большинстве ОС)
При централизованной обработке системных вызовов в ОС существует ДИСПЕТЧЕР СИСТЕМНЫХ ВЫЗОВОВ.
Перед выполнением прерывания приложение передает ОС:

- номер системного вызова (который будет индексом в таблице прерываний, реализующих системные вызовы)

* через стек

* через РОН

- агрументы для системного вызова

* через РОН

* через стек

* через массив

Потом приложение генерирует прерывание с определенным и единственным номером вектора (INT 2Eh – Windows NT, INT 80h - Линукс).
Диспетчер прерываний – простая программа, которая:

  • Сохраняет содержимое регистров процессора в системный стек

  • Проверяет, адекватный ли номер вызова поступил (не вышел ли за границу таблицы системных вызовов)

  • Передает управление соответствующей процедуре ОС для реализации системного вызова.




А уже процедура ОС извлекает из системного стека аргументы и выполняет заданное действие. Если системный вызов сложный, то она вызывает необходимые модули из подсистемы управления памятью, ввода-вывода и тд.
После завершения работы процедура возвращает управление диспетчеру прерываний, кроме этого передает ему КОД завершения вызова.
Диспетчер восстанавливает регистры процессора, помещает КОД в определенный регистр и выполняет инструкцию возврата из прерывания (восстанавливает непривилегированный режим работы процессора).
Это т.н табличный способ организации системных вызовов, он принят практически во всех ОС, легко расширяем.
ОС может выполнять системные вызовы:

- в синхронном режиме

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


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


  1. Основы синхронизации процессов и потоков. Понятие гонок. Критическая секция кода и исключение гонок. Блокирующие переменные. Понятие семафора и его использование для целей синхронизации. Синхронизация и проблема тупиков. Синхронизирующие объекты в операционных системах.


Основы синхронизации процессов и потоков
С возникновением мультипрограммирования появилась проблема синхронизации. Эта проблема связана с совместным использованием ресурсов компа разными процессами и потоками.
Средства синхронизации называются еще IPC – inter process communication – это средства межпроцессной коммуникации и межпроцессного обмена данными.
Выполнение потока в мультипрограммной среде всегда носит асинхронный характер – никогда нельзя предугадать, когда именно будет выполняться то или иное действие. Все потоки выполняются независимо и асинхронно друг по отношению к другу.
Но в ситуации, когда потокам нужно взаимодействовать между собой или использовать разделяемые ресурсы, потоки нужно синхронизировать.
Для синхронизации программист может использовать:

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

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

- для синхронизации потоков одного процесса

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


Итак:

  1. Работает поток А: сделал А1 и А2, считал инфу в буфер, но в файл пока ничего не сохранил, в файле нет инфы о заказе.

  2. Работает поток Б: сделал Б1 и Б2, в его буфере нет ничего про заказ клиента (инфа о нем хранится в буфере потока А)

  3. Поток А выполнилА3 и записал в файл свою информацию

  4. Поток Б выполнил Б3 записал в файл свою устаревшую информацию, затерев ту, что была записана – инфа о заказе потеряна.



Сложность проблемы заключается в нерегулярности ее возникновения.
Гонки – это ситуация, когда 2 или более потоков обрабатывают разделяемые данные и результат работы зависит от соотношения скоростей потоков (кто успел – обогнал, тот и съел);
Критическая секция кода и исключение гонок
Критическая секция – важное понятие синхронизации.

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

ОС использует разные способы реализации взаимного исключения, некоторые подходят только для потоков одного процесса, другие – для разных потоков.
Самый простой и плохой способ – запрет любых прерываний во время исполнения критической секции. Это плохо, т.к. нельзя доверять управление системой пользовательской программе, она может быть жадная – раз, и если она зависнет, то ляжет вся система.
Блокирующие переменные
Для синхронизации прогер может использовать глобальные блокирующие переменные. К ним имеют доступ все потоки и с ними программист работает, обращаясь к системным вызовам ОС.
Для каждого набора критических данных заводится своя двоичная переменная, которая устанавливается в 0, когда поток входит в КС, и в 1 – когда он ее покидает.

Блокирующие переменные могут быть использованы при работе с любыми разделяемыми ресурсами.
Но нельзя прерывать поток между выполнением проверки состояния переменной и установки ее значения. Для этого можно:

- использовать встроенную в процессор единую команду анализа и присвоения значения логической переменной

- а если такой нет, специальными системными примитивами запрещать в это время все прерывания.
Недостаток такой системы:

Второй поток, который тоже хочет поработать с критической секцией кода, должен