
- •1945 Джон фон нейман
- •3. Назначение
- •4. Классификация ос
- •6 Ядро операционной системы
- •7. Ядро состоит из трех основных подсистем:
- •8 Прцесс загрузки программ
- •9 Стек, куча, Статическая память
- •10 Виртуальная память
- •Функции для управления памятью
- •Приоритеты
- •15. Параллельная обработка
- •16. Проблема тупиков
- •Нарушение условия кругового ожидания
- •19. Классификация внешних устройств
- •Драйверы внешних устройств.
- •Файлы, каталоги и файловые системы.
- •24. Виды атак на ос.
- •Иерархия классов безопасных ос:
Нарушение условия кругового ожидания
Трудно предложить разумную стратегию, чтобы избежать последнего условия из раздела «Условия возникновения тупиков» – циклического ожидания.
Один из способов – упорядочить ресурсы. Например, можно присвоить всем ресурсам уникальные номера и потребовать, чтобы процессы запрашивали ресурсы в порядке их возрастания. Тогда круговое ожидание возникнуть не может. После последнего запроса и освобождения всех ресурсов можно разрешить процессу опять осуществить первый запрос. Очевидно, что практически невозможно найти порядок, который удовлетворит всех.
Другой способ атаки условия кругового ожидания – действовать в соответствии с правилом, согласно которому каждый процесс может иметь только один ресурс в каждый момент времени. Если нужен второй ресурс – освободи первый. Очевидно, что для многих процессов это неприемлемо.
Таким образом, технология предотвращения циклического ожидания, как правило, неэффективна и может без необходимости закрывать доступ к ресурсам.
Mutex (mutual exclusion) – двоичный флажок ({0,1}). Можно захватывать(lock) и освобождать(unlock,release).
Lock – если флажок = 0, то = 1, если был равен 1, то процесс заблокирован.
Unlock – присваивает флажку 0, если есть заблокированные, то какой-нибудь разблокируется.
mutex – объект ядра.
ПРИМЕРЫ:
П1: while (1){ П2: while (1) {
m.lock(); m.lock(){
n++;n++; if (n &1)
cout<<”!!!”;
} m.unlock(); }
ПР2: a.lock(); b.lock();
……..
b.lock(); a.lock();
……..
b.unlock(); a.unlock();
a.unlock(); b.unlock();
=> Всё остановится навсегда – deadlock(смертельные объятья).
Семафоры – обобщение mutex. В основе – счетчик n.
При каждом захвате из счетчика вычетается 1, когда станет 0 – следующий захват заблокирует всех.
Защищает группу однотипных ресурсов, в отличие от мьютекса, который защищает только один ресурс.
Операции те же, но при захвате -1, разблокировать 1. Если n==0 – заблокировать.
Event(Событие) ждут до какого-то события (типа клик).
wait(ждать), raise(известить, что произошло).
Внутри – флажок. Вначале равен 0, wait – блокирует, если 0; если 1, то управление ему.
raise – флажок = 1, то разблокирует ждущего это событие.
Timer по времени.
17. Гармонически взаимодействующие процессы – 1) они никак не взаимодействуют; 2) взаимодействуют в строго определенных точках кода программ.
Механизмы синхронизации параллельных процессов. критические секции может иметь только программа, работающая с разделяемыми структурами данных. И этими критическими секциями как раз и являются места, где программа модифицирует такие структуры или просто обращается к ним. Синхронизация доступа к разделяемым структурам часто приводит к усложнению программы, а стремление сократить участки исключительного доступа - к ошибкам.
Желание устранить эти проблемы привело в свое время Дэйкстру к концепции, известной как гармонически взаимодействующие последовательные процессы. Эта концепция состоит в следующем:
Каждый процесс представляет собой независимый программный модуль, для которого создается иллюзия чисто последовательного исполнения.
Процессы не имеют разделяемых данных.
Все обмены данными, и вообще взаимодействие, происходят в выделенных точках процессов. В этих точках процесс, передающий данные, останавливается и ждет, пока его партнер будет готов эти данные принять. В некоторых реализациях процесс-передатчик может не ожидать приема, а просто складывать данные в системный буфер. Аналогично, процесс, принимающий данные, ожидает, пока ему передадут данные. Иными словами, все передачи данных неразрывно связаны с синхронизацией.
Синхронизация, не сопровождающаяся передачей данных, просто лишена смысла - процессы, не имеющие разделяемых структур данных, совершенно независимы и не имеют ни критических точек, ни нерентерабельных модулей.
Концепция гармонически взаимодействующих процессов очень привлекательна с теоретической точки зрения и позволяет легко писать правильные программы. Однако часто по соображениям производительности оказывается невозможно отказаться от разделяемой памяти.
18. Труба(Pipe) – универсальный инструмент передачи информации между процессами. Создаётся односторонняя, только одна.
Создаются именованные трубы. Другой процесс может открыть трубу.
a | b | c | d
Временный файл (хранилище) – видимый объект в локальной сети, создаваемый при передачи.
Если в трубе есть данные, то работает, если нет, то ждет, т.о. происходит синхронизация по времени.
Средство передачи данных с гарантированной доставкой.
Создавая трубу можно сказать, кто имеет право ей пользоваться.
Создание трубы большая нагрузка на ос в отличие от мьютексов и событий.
Создает кучу временных файлов и приходится ставить все больше флажков внутри ядра.
Почтовый ящик:
Используется, если нужно послать сообщение сразу многим.
Отличие от труб: 1. трубы – файлы, п.я. – область памяти, поэтому ограничен в размерах.
труба – с гарантированной доставкой.
Если ящик полон, то при новом письме выталкиваем самое старое, не гарантирует доставки писем.
«+» один экземпляр письма может быть доступен всем.
Хорош, когда сообщения маленькие и программы часто его проверяют.