Cтраница 2
Если известно, что мьютексы удерживаются, как правило, в течение 50 мкс, а переключение с одного потока на другой занимает 1 мс, а также 1 мс требует обратное, переключение, то более эффективное решение состоит в простом ожидании освобождения мьютекса в цикле. С другой стороны, если средний мьютекс удерживается на 10 мс, то два переключения контекста являются вполне оправданными. Проблема в том, что длительность нахождения процессов в критических областях может варьироваться в широких пределах, поэтому выбор верного решения непрост. [16]
Если известно, что мьютексы удерживаются, как правило, в течение 50 мкс, а переключение с одного потока на другой занимает 1 мс, а также 1 мс требует обратное переключение, то более эффективное решение состоит в простом ожидании освобождения мьютекса в цикле. С другой стороны, если средний мьютекс удерживается на 10 мс, то два переключения контекста являются вполне оправданными. Проблема в том, что длительность нахождения процессов в критических областях может варьироваться в широких пределах, поэтому выбор верного решения непрост. [17]
В последнем случае для обеспечения синхронизации требуется использование блокировок. Когда блокировка недоступна, центральный процессор может ждать ее освобождения в цикле опроса или выполнить переключение контекста. Возможно применение различных алгоритмов планирования, включая разделение времени, разделение памяти и бригадное планирование. [18]
В последнем случае для обеспечения синхронизации требуется использование блокировок. Когда блокировка недоступна, центральный процессор может ждать ее освобождения в цикле опроса или выполнить переключение контекста. Возможно применение различных алгоритмов планирования, включая разделение времени, разделение памяти и бригадное планирование. [19]
При создании новой системы разработчики должны сначала очень тщательно выбрать уровни и определить функциональность каждого уровня. Нижний уровень всегда должен пытаться скрыть самые неприятные особенности аппаратуры, как это делает уровень HAL на рис. 11.2. Вероятно, следующий уровень должен обрабатывать прерывания, заниматься переключением контекста и работать с блоком управления памятью MMU, так что выше этого уровня код оказывается в основном машинно-независимым. На еще более высоких уровнях все зависит от вкусов и предпочтений разработчиков. [20]
Программа планирования потоков также располагается в ядре. Когда наступает пора проверить, не готов ли к работе новый поток, например, после того, как истечет выделенный потоку квант времени или по завершении процедуры обработки прерываний ввода-вывода, ядро выбирает поток и выполняет переключение контекста, необходимое, чтобы запустить этот поток. [21]
Переключение контекста ( context switch) некоторого потока происходит, когда центральный процессор переключается на этот поток или отключается от него. Данный показатель следит за тем, сколько раз в секунду это происходит. Одним из важных преимуществ многопоточной обработки является то, что она уменьшает число переключений контекстов, расходующих большое количество ресурсов системы. [22]
Напоследок следует сказать пару слов о кванте. В системе Windows 2000 Professional длительность кванта по умолчанию равна 20 мс; на однопроцессорных серверах его значение равно 120 мс; на многопроцессорных системах используются различные другие варианты в зависимости от частоты процессора. Более короткий квант улучшает работу интерактивных процессов, тогда как более длинный квант снижает количество переключений контекста и тем самым увеличивает производительность. Именно в этом смысл правой колонки табл. 11.2. Значения по умолчанию при желании могут быть увеличены в 2, 4 или 6 раз. Кстати, величина кванта была выбрана более десяти лет назад и не менялась с тех пор, хотя компьютеры за это время стали быстрее более чем на порядок. Вероятно, эти числа можно было бы без ущерба уменьшить в 5 или 10 раз и, возможно, получить при этом лучшее время отклика для интерактивных потоков в сильно загруженной системе. [23]
Метод грубой силы в данном случае заключается в том, чтобы оставить таблицу в том виде, в каком она есть, никак не упорядочивая элементы, и производить поиск в ней линейно от начала к концу. Если число элементов в таблице невелико ( например, не более 100), выигрыш от сортировки таблицы или применения хэширования будет невелик, но программа станет гораздо сложнее и, следовательно, вероятность содержания в ней ошибок резко возрастет. Разумеется, для функций, находящихся в критических участках системы, например в процедуре, занимающейся переключением контекста, следует предпринять все меры для их ускорения, возможно даже писать их ( Боже упаси. Но большая часть системы не находится в критическом участке. Так, ко многим системным вызовам редко обращаются. [24]
Наличие единой структуры данных планирования, используемой всеми центральными процессорами, обеспечивает процессорам режим разделения времени подобно тому, как это выполняется на однопроцессорной системе. Кроме того, такая организация позволяет автоматически балансировать нагрузку, то есть она исключает ситуацию, при которой один центральный процессор простаивает, в то время как другие процессоры перегружены. Два недостатка такой схемы представляют собой потенциальный рост конкуренции за структуру данных планирования по мере увеличения числа центральных процессоров и обычные накладные расходы на выполнение переключения контекста, когда процесс блокируется, ожидая выполнения операции ввода-вывода. [25]
Как видно из результатов одного и того же прогона, имеют место разбросы сложности двух типов. Другой тип - это приращения порядка 107 процессорных циклов, причем эти выбросы наблюдаются на различных шагах прогона фрагмента при одних и тех же исходных данных; в табл. 4.1 - это шаги г 18, г 5 и г, г 11 в прогонах 1, 3 и 4 соответственно. Причина заключается в переключении контекстов операционной системы на другие ( в данном случае внутренние) задачи, никак не связанные с исследуемой программой. В частности, это может быть обработка аппаратного прерывания таймера. Разбросы первого типа также носят случайный характер и, очевидно, обусловлены влиянием архитектуры процессора: использованием кэш-регистров, конвейеризацией и сцепкой команд, а в целом - высоким уровнем внутреннего параллелизма процессора. [26]
![]() |
Печать строки при помощи ввода-вывода, управляемого прерываниями. программа, выполняемая при обращении к системному вызову ( а. процедура обработки прерываний ( б. [27] |
Рассмотрим теперь случай принтера, не буферизирующего символы, а печатающего их сразу по прибытии. Если принтер может печатать, скажем, 100 символов в секунду, то на печать каждого символа уходит 10 мс. Это значит, что после записи каждого символа в регистр данных принтера центральный процессор должен ждать в цикле целых 10 мс, пока ему не позволят записать в регистр следующий символ. Этого времени более чем достаточно для переключения контекста и запуска другого процесса на 10 мс, которые в противном случае просто будут потеряны. Предоставить центральному процессору возможность делать что-нибудь в то время, когда принтер переходит в состояние готовности, можно при помощи прерываний. Когда выполняется системный вызов печати строки, как мы уже показывали, буфер копируется в пространство ядра и первый символ строки копируется на принтер, как только принтер выставит бит готовности. После этого центральный процессор вызывает планировщик, который запускает какой-либо другой процесс. Процесс, попросивший распечатать строку, оказывается заблокирован на весь период печати строки. [28]
Во-вторых, при переключении от одной программы к другой регистры управления памятью должны меняться. На рис. 1.9, б требуется перезагрузка только четырех регистров, что не является серьезной проблемой, но в реальных диспетчерах памяти должно перезагружаться, явно или динамически, намного большее количество регистров. В любом случае подобная операция занимает некоторое время. Мораль этой истории такова: переключение от одной программы к другой, называемое переключением контекста, очень дорого. [29]
Во-вторых, при переключении от одной программы к другой регистры управления памятью должны меняться. На рис. 1.9, требуется перезагрузка только четырех регистров, что не является серьезной проблемой, но в реальных диспетчерах памяти должно перезагружаться, явно или динамически, намного большее количество регистров. В любом случае подобная операция занимает некоторое время. Мораль этой истории такова: переключение от одной программы к другой, называемое переключением контекста, очень дорого. [30]