- •1. Понятие ос, её назначение. Современные ос
- •2. Основные виды классификаций ос.
- •3. Понятие мобильной ос. Ос Unix
- •4. Понятие открытого программного обеспечения. Его преимущества. Программное обеспечение gnu
- •5. Пакетные ос
- •6. Ос разделения времени и многопользовательские ос
- •7. Ос реального времени
- •8. Иерархический принцип построения ос. Простая и расширенная машины
- •10. Цели и задачи мультипрограммирования.
- •9. Виртуальные машины
- •11. Понятие ядра ос
- •12. Понятия процесса и потока
- •13. Планирование процессов как функция ядра операционной системы
- •14. Понятие ресурса. Оперативно перераспределяемые и оперативно неперераспределяемые ресурсы
- •15. Распределение ресурсов и управление ресурсами как функция ос
- •16. Понятие взаимоисключения нескольких процессов и критические участки
- •17. Алгоритмы взаимоисключения Деккера и Петерсона
- •18. Семафоры и мьютексы
- •19. Реализация взаимоисключения на семафорах
- •20. Мониторы ресурсов и реализация взаимоисключения на мониторах
- •21. Реализация взаимоисключения на аппаратном уровне
- •22. Тупики и методы борьбы с ними
- •23. Методы предотвращения тупиков
- •24. Методы обхода тупиков. Алгоритм банкира
- •25. Методы обнаружения тупиков
- •26. Методы восстановления после тупиков
- •27. Методы управления оперативной памятью
- •28. Стратегии поиска подходящего блока оперативной памяти
- •29. Понятие виртуального ресурса
- •30. Виртуальная память. Принцип организации и основной алгоритм функционирования.
- •31. Страничная организация виртуальной памяти
- •32. Сегментная организация виртуальной памяти
- •33. Странично-сегментная организация виртуальной памяти
- •34. Проблема предотвращения «пробуксовки» системы
- •35. Проблема эффективности при планировании процессов в системе
- •36. Стратегии управления планированием процессов в системе
- •37. Трёхуровневое планирование выполнения задач в системе
- •38. Кэширование. Принцип работы кэш-памяти
- •39. Управление вводом-выводом как функция операционной системы
- •40. Назначение каналов ввода-вывода и организация управления ими в операционной системе
- •41. Управление печатью на принтере как функция операционной системы
- •42. Назначение файловых систем
- •43. Поддержка файловой системы как функция операционной системы
- •44. Варианты организации доступа к файлам в операционной системе. Преимущества и недостатки
- •45. Понятие драйвера. Аппаратные и программные драйвера
- •46. Иерархия драйверов в операционной системе
- •47. Проблема эффективности при доступе к вращающимся накопителям информации (например, жёстким дискам)
- •48. Стратегии оптимизации среднего времени доступа к жёсткому диску
- •Алгоритм, Short Seek Time First (sstf)
- •49. Условия эффективного и неэффективного применения стратегий оптимизации среднего времени доступа к жёсткому диску
- •50. Эффективность функционирования операционной системы
- •51. Цели и методы сбора информации об эффективности функционирования операционной системы и эвм
- •52. Оптимизация работы вычислительной системы
- •53. Программы с оверлейной структурой. Цель применения. Принципы построения и функционирования. Преимущества и недостатки.
- •54. Раскручивающиеся загрузчики. Назначение. Принцип многоступенчатой загрузки ос
- •55. Проблема безопасности в операционных системах. Основные вопросы защиты
- •56. Программирование для многопроцессорных структур
- •57. Классификация многопроцессорных структур
- •58. Мультипроцессорные операционные системы
- •59. Сетевые операционные системы
- •60. Распределённые ос
17. Алгоритмы взаимоисключения Деккера и Петерсона
Оба алгоритма относятся к алгоритмам взаимоисключения, построенным по чисто программному принципу, причём ответственность за взаимоисключение в обоих случаях возложена на сами процессы. При этом каждый процесс должен координировать свои действия с другими процессами, пытающимися войти в критические секции.
Оба алгоритма рассчитаны на использование в случае взаимоисключения двух процессов. Для более, чем двух процессов они не применяются.
Основные условия, которым удовлетворяют оба алгоритма:
задача взаимоисключения решается чисто программным способом;
не делается никаких предположений об относительных скоростях выполнения процессов;
- процессы, находящиеся вне своих критических участков, не мо гут мешать другим процессам входить в их собственные критические участки;
- не должно быть бесконечного откладывания момента входа процессов в их критические участки.
Алгоритм Деккера был предложен в середине 1960 годов.
Листинг алгоритма Деккера
boolean flagO, flagl; int turn;
void P0() {
while(true){ flagO=true; while(flagl){ if(turn==l){ flagO=false; while(turn==l)
/* Ничего не делать */; flagO=true; } }
/* Критический участок */;
turn=l; flagO=false;
/* Остальной код */;
} }
void PI() -С
while(true){ flagl=true;
while (flagO)-C if(turn==0){ flagl=false; while(turn==0)
/* Ничего не делать */; f lagl=true; } }
/* Критический участок */;
turn=0; flagl=false;
/* Остальной код */;
} }
void main() {
flagO=false; flagl=false; turn=l;
parbegin(PO,Pl);
}
Алгоритм Деккера решает задачу взаимных исключений, но достаточно сложным путём, корректность которого не так легко доказать. Петерсон предложил в 1981 г. простое и элегантное решение той же проблемы.
Листинг аглоритма Петерсона
boolean flag[2]; int turn;
void P0() {
while(true){ flag[0]=true;
turn=l;
while(flag[1] && turn==l) /* Ничего не делать */;
/* Критический участок */;
flag[0]=false;
/* Остальной код */;
} }
void PI()
■С
while(true){ flag[l]=true; turn=0;
while(flag[0] && turn==0) /* Ничего не делать */;
/* Критический участок */;
flag[l]=false;
/* Остальной код */;
} }
void main() {
flag[0]=false;
flag[l]=false;
parbegin(PO,Pl);
}
18. Семафоры и мьютексы
Семафор — специальная защищенная переменная в ОС. Под защищённостью понимается невозможность для прикладной программы работать с этой переменной непосредственно. Для доступа к семафору программа должна использовать специальные системные вызовы ядра (примитивы):
установить начальное значение семафора S;
P(S) — если S>0, то S:=S — 1, иначе ожидать на S;
V(S) — если один или более процессов ожидают на S, то позволить одному из них продолжить работу, иначе S:=S+1.
Обратите внимание, что вызов примитива P(S) может заблокировать процесс до выполнения примитива V(S) другим процессом.
Все вызовы ядра для управления семафорами атомарны, то есть не могут быть прерваны другими процессами.
Семафоры, управляемые описанными примитивами, называются считающими, так как в принципе могут принимать любые неотрицательные значения. В частности, такие семафоры могут использоваться для управления несколькими однотипными ресурсами в системе.
Семафоры, которые могут принимать только два значения: 0 и 1, — называются мьютексами. Такие семафоры чаще всего применяются для организации процедуры взаимоисключения.
В современных ОС реализуется несколько разных механизмов управления семафорами, модифицирующих базовые алгоритмы, описанные выше.
