<<
>>

Оптимизируйте общий случай

Часто бывает полезно различать наиболее частый случай и наименее вероятный случай и обращаться с ними по-разному. Обычно различные случаи обрабатываются разными программами. Важно, чтобы частый случай работал быстро.
От алгоритма для редко встречающегося случая достаточно добиться корректной работы.

В качестве первого примера рассмотрим вхождение в критическую область. В большинстве случаев процессу будет удаваться вход в критическую область, особенно если внутри этой области процессы проводят не много времени. Операционная система Windows 8 использует это преимущество, предоставляя вызов WinAPI EnterCriticalSection, который является атомарной функцией, проверяющей флаг в режиме пользователя (с помощью команды процессора TSL или ее эквивалента). Если тест проходит успешно, процесс просто входит в критическую область, для чего не требуется обращения к ядру. Если же результат проверки отрицательный, библиотечная процедура выполняет на семафоре операцию down, чтобы заблокировать процесс.

Таким образом, если все нормально, обращения к ядру не требуется. В главе 2 мы видели, что фьютексы в Linux также оптимизированы для общего случая отсутствия конкуренции.

В качестве второго примера рассмотрим установку будильника, использующего сигналы UNIX. Если в текущий момент ни один будильник не заведен, то просто создается запись и помещается в очередь таймеров. Однако если будильник уже заведен, его следует найти и удалить из очереди таймера. Так как системный вызов alarm не указывает, установлен ли уже будильник, система должна предполагать худшее, то есть что он уже заведен. Однако в большинстве случаев будильник не будет заведен, и поскольку удаление существующего будильника представляет собой дорогое удовольствие, то следует различать эти два случая.

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

12.5.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Оптимизируйте общий случай:

  1. Общий обзор
  2. 2. Общий и специальные сроки исковой давности
  3. 7.1. Общий взгляд на проблему
  4. 7.1. Общий взгляд на проблему
  5. ПСИХОАНАЛИЗ: ПРИНЦИП ОБЩИЙ
  6. ОБЩИЙ СИНТЕЗ: ЗАПАДНАЯ ПОЛОВИНА
  7. 2. Общий порядок заключения договоров
  8. ОБЩИЙ СИHТЕЗ: ВОСТОЧHАЯ ПОЛОВИHА
  9. 2. Общий вывод из единичных фактов
  10. Роберт находит общий язык с детьми
  11. 1. Общий анализ энергетической системы пациента.
  12. Вот общий итог Трёх Аксиом Справедливости.
  13. § 4. Содержание корпоративных прав: Общий обзор (п. 2229-2234)
  14. 9.19. Лечебно-профилактический массаж по системе До-Ин (общий для всех каналов)
  15. § 11. Содержание товарищеских прав: Общий обзор. Правоотношения по поводу общего имущества (п. 2272-2279)
  16. коян: Восходящий узел - включение в общий поток; Нисходящий узел - исключение из общего потока.