Планувальник приймає рішення на основі поточного пріоритету потоку, який може бути вище базового. Є кілька ситуацій, коли має сенс підвищити пріоритет потоку.
Наприклад, після завершення операції введення-виведення збільшують пріоритет потоку, щоб дати йому можливість швидше розпочати виконання і, може бути, знову ініціювати операцію введення-виведення. Таким способом система заохочує інтерактивні потоки і підтримує зайнятість пристроїв введення-виведення. Величина, на яку підвищується пріоритет, не документована і залежить від пристрою (рекомендовані значення для диска і CD - це 1, для мережі - 2, клавіатури і миші - 6 і звукової карти - 8). Надалі протягом кількох квантів часу пріоритет плавно знижується до базового.
Іншими прикладами подібних ситуацій можуть служити: пробудження потоку після стану очікування семафора або іншої події; отримання потоком доступу до віконного введення.
Динамічне підвищення пріоритету вирішує також проблему голодування потоків, довго не отримують доступ до процесора. Виявивши такі потоки, які простоюють протягом приблизно 4 сек. система тимчасово підвищує їх пріоритет до 15 і дає їм два кванта часу. Побічним наслідком застосування цієї технології може бути рішення відомої проблеми інверсії пріоритетів [Таненбаум]. Ця проблема виникає, коли фоновий потік утримує ресурс, блокуючи високопріоритетні потоки, які претендують на цей ресурс. Рішення полягає в штучному підвищенні його пріоритету на деякий час.
Динамічне підвищення пріоритетів покликане оптимізувати загальну пропускну здатність системи, однак від нього виграють далеко не всі програми. Відключення динамічного підвищення пріоритету можна здійснити за допомогою функцій SetProcessPriorityBoost і SetThreadPriorityBoost.
Величина кванта часу
Величина кванта часу має критичне значення для ефективної роботи системи в цілому. Необхідно зберегти інтерактивні якості системи і при цьому уникнути занадто частого перемикання контекстів. Ймовірно оптимальне значення кванта (частка секунди) має забезпечувати обслуговування без перемикання запиту користувача, який займає процесор ненадовго, після чого зазвичай генерує запит на введення-виведення. У цьому випадку витрати на диспетчеризацію зводяться до мінімуму і забезпечуються прийнятні часи відгуків.
Вибір між короткими і довгими значеннями можна зробити за допомогою панелі "властивості" "Мого комп'ютера". Величина кванта задається в параметрі HKLM \ SYSTEM \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation реєстру.
- Що таке відносний пріоритет потоку?
Другою складовою загального пріоритету потоку є відносний пріоритет окремого потоку. Слід підкреслити, що пріоритет класу пов'язаний з процесом, а від відносна пріоритет - з окремими потоками всередині процесу. Потоку можна на значити один з семи можливих відносних пріоритетів: Idle (очікування), Lowest (нижчий), Below Normal (нижче нормального), Normal (нормальний), Above Normal (вище нормального), Highest (вищий) або Time Critical (критичний по часу).
Таблиця 5.2. Відносні пріоритети потоку
- Що таке «динамічний пріоритет» потоку?
У багатьох ОС передбачається можливість зміни пріоритетів протягом життя потоку. Зміна пріоритету може відбуватися з ініціативи самого потоку, коли він звертається з відповідним викликом до операційної системи, або з ініціативи користувача, коли він виконує відповідну команду. Крім того, ОС сама може змінювати пріоритети потоків в залежності від ситуації, що складається в системі. В останньому випадку пріоритети називаються динамічними на відміну від незмінних, фіксованих, пріоритетів.
- Поняття кешування і кеш-пам'яті.
Кеш-пам'ять є швидкодіючий ЗУ, розміщене на одному кристалі з ЦП або зовнішнє по відношенню до ЦП. Кеш служить високошвидкісним буфером між ЦП і щодо повільної основною пам'яттю. Ідея кеш-пам'яті заснована на прогнозуванні найбільш ймовірних звернень ЦП до оперативної пам'яті. В основу такого підходу покладено принцип часової і просторової локальності програми.
Якщо ЦП звернувся до будь-якого об'єкта оперативної пам'яті, з високою часткою ймовірності ЦП незабаром знову звернеться до цього об'єкта. Прикладом цієї ситуації може бути код або дані в циклах. Ця концепція описується принципом тимчасової локальності, відповідно до якого часто використовувані об'єкти оперативної пам'яті повинні бути "ближче" до ЦП (в кеші).
Для узгодження вмісту кеш-пам'яті і оперативної пам'яті використовують три методи запису:
· Наскрізна запис (write through) - одночасно з кеш-пам'яттю оновлюється оперативна пам'ять.
· Буферизованная наскрізна запис (buffered write through) - інформація затримується в кеш-буфері перед записом в оперативну пам'ять і переписується в оперативну пам'ять в ті цикли, коли ЦП до неї не звертається.
· Зворотний запис (write back) - використовується біт зміни в поле тега, і рядок переписується в оперативну пам'ять тільки в тому випадку, якщо біт зміни дорівнює 1.
Як правило, всі методи записи, крім наскрізної, дозволяють для збільшення продуктивності відкладати і групувати операції записи в оперативну пам'ять.
У структурі кеш-пам'яті виділяють два типи блоків даних:
· Пам'ять відображення даних (власне самі дані, дубльовані з оперативної пам'яті);
· Пам'ять тегів (ознаки, що вказують на розташування кешованих даних в оперативній пам'яті).
Простір пам'яті відображення даних в кеші розбивається на рядки - блоки фіксованої довжини (наприклад, 32, 64 або 128 байт). Кожен рядок кеша може містити безперервний вирівняний блок байт з оперативної пам'яті. Який саме блок оперативної пам'яті відображений на даний рядок кеша, визначається тегом рядка і алгоритмом відображення. За алгоритмам відображення оперативної пам'яті в кеш виділяють три типи кеш-пам'яті:
повністю асоціативний кеш;
кеш прямого відображення;
множинний асоціативний кеш.
Одна з основних переваг даного способу відображення - хороша утилізація оперативної пам'яті, тому що немає обмежень на те, який блок може бути відображений на ту чи іншу рядок кеш-пам'яті. До недоліків слід віднести складну апаратну реалізацію цього способу, що вимагає великої кількості схемотехніки (в основному компараторов), що призводить до збільшення часу доступу до такого кешу і збільшення його вартості.
14. Рис. Схема організації кеш-пам'яті в МП Motorola MC68020
Даний алгоритм відображення поєднує переваги як повністю асоціативного кеша (хороша утилізація пам'яті, висока швидкість), так і кеша прямого доступу (простота і дешевизна), лише трохи поступаючись за цими характеристиками вихідним алгоритмам. Саме тому множинний асоціативний кеш найбільш широко поширений (табл. Характеристики підсистеми кеш-пам'яті у ЦП IA-32).
Таблиця. Характеристики підсистеми кеш-пам'яті у ЦП IA-32
Примітки: В Intel-486 використовується єдиний кеш команд і даних першого рівня. В Pentium Pro L1 кеш даних - 8 Кбайт 2-входовий асоціативний, в інших моделях P6 - 16 Кбайт 4-входовий асоціативний. У Pentium 4 замість L1 кеша команд використовується L1 кеш микроопераций (кеш траси).
Для організації кеш-пам'яті можна використовувати Прінстонського архітектуру (змішаний кеш для команд і даних, наприклад, в Intel-486). Це очевидне (і неминуче для фон-Неймановская систем із зовнішнім по відношенню до ЦП кеш-пам'яттю) рішення не завжди буває найефективнішим. Поділ кеш-пам'яті на кеш команд і кеш даних (кеш гарвардської архітектури) дозволяє підвищити ефективність роботи кеша з таких міркувань:
багато сучасних процесори мають конвеєрну архітектуру, при якій блоки конвеєра працюють паралельно. Таким чином, вибірка команди і доступ до даних команди здійснюється на різних етапах конвеєра, а використання роздільної кеш-пам'яті дозволяє виконувати ці операції паралельно.
· Кеш команд може бути реалізований тільки для читання, отже, не вимагає реалізації ніяких алгоритмів зворотного запису, що робить цей кеш простіше, дешевше і швидше.
Саме тому всі останні моделі IA-32, починаючи з Pentium, для організації кеш-пам'яті першого рівня використовують гарвардську архітектуру.
Критерієм ефективної роботи кеша можна вважати зменшення середнього часу доступу до пам'яті в порівнянні з системою без кеш-пам'яті. В такому випадку середній час доступу можна оцінити таким чином:
15. Tср = (Thit x Rhit) + (Tmiss x (1 Rhit))
де Thit - час доступу до кеш-пам'яті в разі потрапляння (включає час на ідентифікацію промаху або попадання), Tmiss - час, необхідний на завантаження блоку з основної пам'яті в рядок кеша в разі кеш-промаху і подальшу доставку запитаних даних в процесор, Rhit - частота влучень.
Очевидно, що чим ближче значення Rhit до 1, тим ближче значення Tср до Thit. Частота попадань визначається в основному архітектурою кеш-пам'яті і її об'ємом. Вплив наявності і відсутності кеш-пам'яті і її обсягу на зростання продуктивності ЦП показано в табл. Розмір і ефективність кеш-пам'яті
Таблиця. Розмір і ефективність кеш-пам'яті
На складність цього механізму істотно впливає
стратегія розміщення, що визначає, в яке місце кеш-пам'яті
слід помістити кожен блок з основної пам'яті.
Залежно від способу розміщення даних основної пам'яті в кеш-пам'яті існує три типи кеш-пам'яті:
· Кеш з прямим відображенням (розміщенням);
· Повністю асоціативний кеш;
· Множинний асоціативний кеш або частково-асоціативний.
Для множини асоціативний тип або частково-асоціативний тип відображення - це один з можливих компромісів, що поєднує переваги прямого і асоціативного способів. Кеш-пам'ять (і тегів і даних) розбивається на деяку кількість модулів. Залежність між модулем і блоками ОП така ж жорстка, як і при прямому відображенні. А ось розміщення блоків по рядках модуля довільне і для пошуку потрібної рядки в межах модуля використовується асоціативний принцип. Цей спосіб відображення найбільш широко поширений в сучасних мікропроцесорах.
- Від чого залежить ефективність роботи кеш-пам'яті.
- Навіщо потрібен TLB (буфер асоціативності трансляції).
найостаннішими. Спрощена схема TLB показана на Рис. 5. Асоціативний буфер трансляції.
Для пошуку сторінок, відсутніх в TLB, диспетчер віртуальної пам'яті використовує таблиці сторінок, що створюються програмно. Концептуально таблиця сторінок представлена на Рис. 3 Концептуальна схема таблиці сторінок.