- •Операционные Системы.
- •Лекция 1.
- •Лекция 2.
- •Типы файлов:
- •Лекция 3 Файловая система fat:
- •Логика работы ос по поиску файлов в файловой системе fat:
- •Лекция 4
- •Файловая система ntfs:
- •Структура файловой системы ntfs:
- •Логика поиска файлов в файловой системе ntfs:
- •Лекция 5
- •Файловые системы ufs and s5
- •Логика поиска файлов в фс s5
- •Файловая система ext2:
- •Логика поиска в файловой системе ext2
- •Архитектура ос Монолитная архитектура
- •Микро ядерная архитектура
- •Лекция 6
- •Мульти программирование
- •Процессы и потоки
- •Планирование и диспетчеризация потоков
- •Мульти программирование прерываний
- •Лекция 7
- •Синхронизации процессов и потоков
- •Проблемы при синхронизации:
- •Лекция 9
Проблемы при синхронизации:
Гонки
Критическая секция – часть программы результат выполнения которой может не предсказуемо меняться если переменные относящиеся к этой части программы изменяются другими потоками в то время когда выполнение этой части программы ещё не завершено. Она всегда определяется по отношению к определённым критическим данным при не согласованном изменении которых могут возникать проблемные ситуации. В предыдущем примере такие данные являлись записи файла базы данных, во всех потоках работающие с базами данных должна быть определена критическая секция. При этом в разных потоках критическая секция состоит из разных наборов последовательности команд, что бы исключить эффект гонок по отношению к критическим данным необходимо обеспечить что бы в каждый момент времени в критической секции связанной с этими данными находился лишь один поток при этом не важно находиться ли этот поток в активном или приостановленном состоянии этот приём называет взаимоисключением. ОС использует различные способы реализации взаимоисключения для потоков одного процесса и при взаимодействии нескольких потоков.
Блокирующие переменные для синхронизации потоков одного процесса возможно использование глобальных блокирующих переменных. С этими переменными которым все потоки процесса имеют прямой доступ, необходимо работать не обращаясь к системным вызовам ОС. Каждому набору критических данных ставится в соответствии двоичная переменная которой поток присваивает значение ноль когда он входит в критическую секцию и значение 1 когда он ее покидает.
Необходимо определить занята ли переменная или нет if(!free){ d = 0; вып крит ситуации; d = 1} else {return first} – единая не делимая операция т.е. взаимодействуют как единое целое.
Данный фрагмент алгоритма показывает поток использующий для реализации взаимного исключения доступ к критическим данным “D” в блокирующею переменную f(d). Пред входом в критическую секцию поток проверяет не работает ли уже какой ни будь поток с данными D если переменная f(d) == NULL , то данные заняты и цикл повторяется если же f(d) == 1, f(d) = 0 и поток входит в критическую секцию. После того как поток выполнит свою секцию значения f(d) = 1. Блокир переменные могут использоваться не только при доступе к разделённым данным, но и при доступе к разделённым ресурсам любого вида.
При выполнении критической ситуации ни один поток не сможет выполнить не одного действия, прервать поток между операцией проверки и установки блокирующей переменной нельзя.
Для избежания данных ситуаций системы команд многих ПК предусмотрена единая не делимая команда анализа и присвоения значения логической переменной.
Семафоры – обощением блокирующих переменных являются так называние семафоры дийкстры (Dijkstro) – предложил использовать переменные которые могут принимать целые не отрицательные значения, такие переменные получили название семафоров. Для работы с семафорами вводятся два примитива «P» «V» пусть переменная «S» представляет собой семафор тогда действие P(s) and V(s) определяется следующим действием V(s) – увеличение переменной S на единицу единым действием при этом выборка наращивания и запоминания не могут быть прерваны. К переменной S не доступа другим потокам во время выполнения этой операции. P(s) – уменьшение S на единицу если это возможно if(5*0) то уменьшить S области целых не отриц чисел невозможно, то поток P ожидает пока это станет возможным успешная проверка и уменьшение так же является не делимой. Прерывание во время примитивов P and S невозможно. В случае если семафор принимает 0 или 1 то он становиться простой блокирующей переменной которой часто называют двоичным семафором. Операция P заключает в себя потенциальную возможность перехода потока который ее выполняет состояние ожидания в то время как операция V может активизировать другой поток приостановленный операцией P.
Рассмотрим семафоры на примере взаимодействия двух вып потоков один из которых пишет данных в группы другой считывает их из буфера. При этом буфер состоит из N частей так называемый буферный пул, в общем случае поток read и записи могут иметь разные скорости и обращаться к беферному пулу с перемннной интенсивностью. В различные периоды скорость записи может перевышать скорость чтения и наоборот.
Для правильной работы поток записи должен приостанавливаться когда все буферы в пуле и активизироваться при освобождении хотя бы одного буфера. Поток читатель наоборот должен приостанавливаться когда все буферы пусты и активизироваться при пойвлении хотя бы одной записи.
Введём два семафорам
Е – число пустых буферов
Ф – число заполненные
В начале Е = N
Ф = 0;
Тогда работа потоков с общим буферным пулом может быть описана:
Поток писатель должен прежде всего вып операцию P(E)(--) через которую он проверяет имеется ли в пуле незаполненные буферы. Если семафор Е = 0, свободных буферов в данный момент нет, то поток писатель переходит в момент ожидания. Если же значение Е является положительное число то происходит уменьшение числа свободных буферов на единицу, записывает данные в очередной свободный буфер и после этого наращивает число занятых буферов операцией V(Ф) (++), поток читатель действует аналогично с разницей в том что начинает работу с проверки заполненных буферов и наращивает количество свободных буферов. Критическим ресурсом является буферный пул представленный набором идентичных ресурсов, а значит с буферным пулом могут работать сразу несколько потоков (именно столько, сколько содержится буферов в пуле). В данной ситуации использовании двоичного семафора не позволяет организовать доступ к критическому ресурсу более чем одному потоку. Семафор же в свою очередь позволяет решить данную задачу синхронизации более гибко допуская при этом к разделённому пулу ресурсов заданное количество потоков. Таким образом с буферным пулом могут работать максимум N потоков часть из которых могут мыть писателе а другие читателями.
Тупики
Для того что бы разрешить коллизий с разделяемой областью памяти будем считать что запись в буфер и считывание из буфер будут являться критическими секциями. В данном случае можно проиллюстрировать еще одну проблему синхронизации – взаимной блокировки называемой так же дедлоками(Deadblok), тупиками, clinch.
Пример: пусть двум потокам принадлежащим разным процессам выпоняющиеся в режиме мульти програмирования необходимы два ресурса принтер и последовательный порт такая ситуация может возникнуть например во время работы приложения задачей которой является распечатать информацию.
Firt А - запрашивается принтер, а затем порт
Б – запрашивает устройства в обратном порядке.
Предположим что когда ОС назначила принтер к потоку А и установила связанной с этим ресурсом связную переменную поток А был прерван управление получил поток Б который сначала выполняет запрос на получение доступа к порту, а затем при выполнении следующей команды оказался заблокирован так как принтер уже занят потоком А управление снова получил поток А который в соответствии со своей задачей предпринял попытку занять порт и был заблокирован, поскольку порт уже занял поток Б. в таком положении потоки А и Б могут находиться вечно.
Тупиковые ситуации необходимо отделять от очередей. Очередь представляет собой адекватное явлении при использовании совместных ресурсов. Ресурс не доступен в данный момент но через определённое количество времени освободиться. При возникновении тупиков существует потребность потока сразу в нескольких ресурсах, при этом возникает так называемая не разрешимая ситуация.
Бесконечная блокировка
Поток А |
заблокирован А не вып |
переход к А |
так бесконечно |
Поток Б |
переход к Б |
заблокирован Б не вып |
так бесконечно |
Взаимная блокировка
Но при этом выполняется несколько обращений, авто переход управления
Поток А |
А1 блокируется выполнен |
А2 блокирован … выполнен |
… |
|
Поток Б |
переход к Б1 |
блокирован Б1 |
переход к Б2 … |
|
Очереди с разделёнными ресурсами
Если блокируется первый ресурс то управление к А2 если все блокируется то тогда переход к Б.
Голодание пусть существуют 3 потока А, Б, В им необходим один ресурс но при передаче управления происходит п1 передаёт п3 и наоборот, при этом блокировки п2 не происходит, но происходит голодание п2.
Д/з Управление памятью, страничная, динамичная, сегментная и т.п. см. СиАОД
Кеширование способы кеширования.