Інформація про час в ядрі

Концепція часу для компютера є кілька невизначеною Насправді, для того щоб отримувати інформацію про час і управляти системним часом, ядро ​​повинно взаємодіяти з системним апаратним забезпеченням Апаратне забезпечення надає системний таймер, який використовується ядром для вимірювання часу Системний таймер працює від електронного еталону часу, такого як цифрові електронні годинники або тактовий генератор процесора Інтервал часу системного таймера періодично спливає (ще говорять таймер спрацьовує-hitting, popping) з певною запрограммированнойчастотойЭтачастотаназываетсячастотойімпульсовтаймлра, (tickrate) Коли спрацьовує системний таймер, він генерує переривання, яке ядро ​​обробляє за допомогою спеціального обробника переривання

Так як в ядрі є інформація про запрограмовану частоті проходження імпульсів таймера, ядро ​​може обчислити інтервал часу між двома успішними перериваннями таймера Цей інтервал називається тимчасовою оцінкоюабо імпульсом таймера (tick)і в секундах дорівнює одиниці, поділеній на частоту імпульсів Як буде показано далі, саме таким способом ядро ​​відстежує абсолютний час (wall time) і час роботи системи (uptime) Абсолютна час-це фактичний час дня, яке найбільш важливо для користувацьких додатків Ядро відстежує цей час просто тому, що воно контролює переривання таймера У ядрі є сімейство системних викликів, яке дозволяє користувальницьким додаткам отримувати інформацію про дату і час дня Це необхідно, оскільки багато програми повинні мати інформацію про хід часу Різниця між двома значеннями часу роботи системи – зараз і пізніше – Це простий спосіб вимірювання відносності подій

Переривання таймера дуже важливо для управління роботою всієї операційної системи Велика кількість функцій ядра діють і завершуються відповідно до ходом часу Наступні дії періодично виконуються системним таймером

• Оновлення значення часу роботи системи (uptime)

• Оновлення значення абсолютного часу (time of day)

• Для SMP-систем виконується перевірка балансування черг виконання планувальника, і якщо вони не збалансовані, то їх необхідно збалансувати (як було розказано в главі 4, Планування виконання процесів )

• Перевірка, чи не витратив чи поточний процес свій квант часу, і якщо витратив, то виконаються планування виконання нового процесу (як це було розказано в главі 4)

• Виконання обробників всіх динамічних таймерів, для яких закінчився період часу

• Оновлення статистики з використання процесорного часу та інших ресурсів

Деякі з цих дій виконуються при кожному перериванні таймера, тобто ця робота виконується з частотою системного таймера Інші дії також виконуються періодично, але тільки через кожні п переривань системного таймера Іншими словами, ці функції виконуються з частотою, яка дорівнює деякій частці частоти системного таймера У розділі Оброблювач переривань таймера буде розглянута сама функція обробки переривань системного таймера

Частота імпульсів таймера: HZ

Частота системного таймера (частота імпульсів, tick rate) програмується при завантаженні системи на підставі параметра ядра Нz, який визначений за допомогою директиви препроцесора Значення параметра HZ відрізняється для різних підтримуваних апаратних платформ Насправді, для деяких апаратних платформ значення параметра HZ відрізняється навіть для різних типів машин

Даний параметр ядра визначений у файлі Частота системного таймера дорівнює значенню параметра HZ, період таймера дорівнює 1/HZ Наприклад, у файлі include/asm-i386/paramh для апаратної платформи i386 цей параметр визначений наступним чином

#define HZ 1000 /* internal kernel time frequency */

Тому для апаратної платформи i368 переривання таймера генерується з частотою 1000 Гц, тобто 1000 разів на секунду (кожну тисячну частку секунди або одну мілісекунди) Для більшості інших апаратних платформ значення частоти системного таймера дорівнює 100 Гц У табл 101 наведено повний список всіх підтримуваних апаратних платформ і визначених для них значень частоти системного таймера

При написанні коду ядра не можна вважати, що параметр HZ має певне задане значення У наші дні це вже не така часто зустрічається помилка, оскільки підтримується багато різних апаратних платформ з різними частотами системного таймера Раніше апаратна платформа Alpha була єдиною, для якої частота системного таймера відрізнялася від 100 Гц, і часто можна було зустріти код, в якому жорстко було прописано значення 100 там, де потрібно використовувати параметр HZ Приклади використання параметра HZ в коді ядра будуть приведені нижче

Частота системного таймера достатньо важлива Як буде видно, обробник прерипанія таймера виконує багато роботи Вся інформація про час в ядрі виходить з періодичності системного таймера Весь компроміс полягає тільки в тому, щоб вибрати правильне значення даного параметра виходячи з взаємини між різними факторами

Таблиця 101 Значення частоти системного таймера

Апаратна платформа Частота (в герцах)

alpha arm cris h8300 i386 ia64 m68k

m68knommu mips

mips64

parisc ppc ppc64 s390 sti spare

sparc64 um

v850

x86-64

32 або 10 242

50, 100 або 1000

100 або 1000

24,100 ілі122

Ідеальне значення параметра HZ

Для апаратної платформи i386, починаючи з самих перших версій операційної системи Linux, значення частоти системного таймера дорівнювало 100 Гц Однак під час розробки ядер серії 25 це значення було збільшено до 1000 Гц, що (як завжди буває в подібних ситуаціях) викликало суперечки Так як в системі дуже багато залежить від переривання таймера, то зміна значення частоти системного таймера повинно чинити сильний вплив на систему Звичайно, як у випадку великих, так і у випадку маленьких значень параметра HZ є свої позитивні і негативні сторони

Збільшення значення частоти системного таймера означає, що обробник переривань таймера виконується більш часто Отже, вся робота, яку він робить, також виконується більш часто Це дозволяє отримати наступні переваги

• Переривання таймера має велику роздільну здатність за часом, і отже, всі подію, які виконуються в часі, також мають більшу роздільну здатність

• Збільшується точність виконання подій у часі

2 Емулятор платформ и IA-64 імее т частоту 32 Гц Настояща я машина платформ и IA-64 імее т частоту 1024 Гц

•••

Роздільна здатність збільшується в стільки ж разів, у скільки разів зростає частота імпульсів Наприклад, гранулярность таймерів при частоті імпульсів 100 Гц дорівнює 10 мілісекунд Іншими словами, всі періодичні події виконуються перериванням таймера, яке генерується з граничною точністю за часом, рівний 10 мілісекунд, і велика точность3 не гарантовано При частоті, рівній 1000 Гц, роздільна здатність дорівнює 1 мілісекунді, тобто в 10 разів вище Хоча ядро ​​дозволяє створювати таймери з тимчасовим дозволом, рівним

1 мілісекунді, однак при частоті системного таймера в 100 Гц немає можливості гарантовано отримати часовий інтервал, коротше 10 мілісекунд

Точність вимірювання часу також зростає аналогічним чином Припустимо, що таймери ядра запускаються у випадкові моменти часу, тоді в середньому таймери будуть спрацьовувати з точністю за часом до половини періоду переривання таймера, тому що період часу таймера може закінчитися в будь-який момент, а обробник таймера може виконатися, тільки коли генерується переривання таймера Наприклад, при частоті 100 Гц описані події в середньому будуть виникати з точністю + / 5 мілісекунд від бажаного моменту часу Тому помилка вимірювання в середньому складе 5 мілісекунд При частоті 1000 Гц помилка вимірювання в середньому зменшується до 05 мілісекунд – отримує десятикратне поліпшення

Більш високий дозвіл і велика точність забезпечують наступні переваги

• Таймери ядра виконуються з великою роздільною здатністю і з кращою точністю (це дозволяє отримати багато різних поліпшень, деякі з яких описані далі)

• Системні виклики, такі як pol l () і selec t (), які дозволяють при бажанні використовувати час очікування (timeout) як параметр, виконуються з більшою точністю

• Вимірювання, такі як облік використання ресурсів або вимірювання часу роботи системи, виконуються з більшою точністю

• Витіснення процесів виконується більш правильно

Деякі з найбільш помітних поліпшень продуктивності – це поліпшення точності вимірювання періодів часу очікування при виконанні системних викликів pol l () і selec t () Це поліпшення може бути досить великим Прикладна програма, яка інтенсивно використовує ці системні виклики, може витрачати досить багато часу, чекаючи на переривання таймера, хоча насправді інтервал часу очікування вже закінчився Слід згадати, що середня помилка виміру часу (тобто потенційно даремно витрачений час) дорівнює половині періоду переривання таймера

Ще одна перевага більш високої частоти проходження імпульсів таймера-це більш правильне витіснення процесів, що проявляється у зменшенні затримки за рахунок планування виконання процесів Згадаймо з матеріалу глави 4, що переривання таймера відповідально за зменшення кванта часу ви-

3 Тут мається на увазі не ТОЧНОСТІ ь вимірювання, а точність ь в обчислювально м плані Точність виміру н я (в загальнонауковому сенсі) – це статистична міра повторюваність і результату У обчислювальному (Компютерному) сенсі точність – це кількість значущих цифр, якими е використовуються для представлення того чи іншого значення

полнял процесу Коли це значення зменшується до нуля, встановлюється прапор need_resched, і ядро ​​активізує планувальник як тільки зявляється така можливість Тепер розглянемо ситуацію, коли процес в даний момент виконується і у нього залишився квант часу, рівний 2 мілісекунди Це означає, що через 2 мілісекунди планувальник повинен витіснити цей процес і запустити на виконання інший процес На жаль, ця подія не може відбутися до того моменту, поки не буде згенеровано наступне переривання таймера У найгіршому випадку наступне переривання таймера може виникнути через 1/HZ секунд У разі, коли параметр HZ = 100, процес може отримати близько 10 зайвих мілісекунд Звичайно, врешті-решт все буде збалансовано і равнодоступность ресурсів не порушиться, бо всі завдання плануються з однаковими помилками, і проблема полягає не в цьому Проблеми виникають через латентності, яку вносять затримки витіснення процесів Якщо завдання, яке планується на виконання, має виконати які-небудь чутливі до часу дії, як, наприклад, заповнити буфер аудіопристрої, то затримка не припустима Збільшення частоти до 1000 Гц зменшує затримку планувальника в гіршому випадку до 1 мілісекунди, а в середньому – до 05 мілісекунди

Повинна, однак, існувати й зворотна сторона збільшення частоти системного таймера, інакше вона була б з самого початку дорівнює 1000 Гц (або навіть більше) Насправді існує одна велика проблема Більш висока частота викликає більш часті переривання таймера, що означає великі накладні витрати Чим вище частота, тим більше часу процесор повинен витрачати на виконання переривань таймера Це призводить не тільки до того, що іншим завданням відводиться менше процесорного часу, а й до періодичного трешінгу (trashing) кешу процесора (тобто кеш заповнюється даними, які не використовуються процесором) Проблема, повязана з накладними витратами, викликає суперечки Ясно, що перехід від значення HZ = 100 до значення HZ = 1000 в 10 разів збільшує накладні витрати, повязані з перериваннями таймера Однак від якого реального значення накладних витрат слід відштовхуватися Якщо нічого помножити на 10, то вийде теж нічого. Вирішальне угода складається в тому, що принаймні для сучасних систем, значення параметра HZ = 1000 не приводить до неприпустимих накладним витратам Проте для ядер серії 26 існує можливість скомпілювати ядро ​​з іншим значенням параметра HZ4

Чи можлива операційна система без періодичних відміток часу

Може виникнути питання, чи завжди для функціонування операційної системи необхідно використовувати фіксоване переривання таймера Чи можна створити операційну систему, в якій не використовуються періодичні позначки часу Так, можна, але результат буде не дуже привабливим

Ні суворої необхідності у використанні переривання таймера, яке виникає з фіксованою частотою Замість цього ядро ​​може використовувати динамічно програмований таймер для кожного що очікує події Таке рішення відразу ж приведе до додаткових накладних витрат процесорного часу у звязку з обробкою подій таймера, тому найкращим рішенням буде використовувати один таймер і програмувати його так, щоб він спрацьовував тоді, коли має настати найближчим подія

4 У звязку з обмеженням і апаратно ї платформ и і протокол а NTP, значени е змінно ї HZ не може побут ь довільним Дл я платформ и х86 значени я 100, 500 і 1000 працюють добре

Коли обробник таймера спрацює, створюється новий таймер для наступної події і так повторюється постійно При такому підході не потрібно періодичне переривання таймера і немає необхідності в параметрі HZ

Однак при вказаному підході необхідно вирішити дві проблеми Перша проблема – це як у такому випадку реалізувати концепцію періодичних відміток часу, хоча б для того, щоб ядро ​​могло відслідковувати відносні інтервали часу Цю проблему вирішити не складно Друга проблема – це як уникнути накладних витрат, повязаних з управлінням динамічними таймерами, навіть за наявності оптимізації Дану проблему вирішити складніше Накладні витрати і складність реалізації виходять настільки високими, що в операційній системі Linux такий підхід вирішили не використовувати Проте так пробували робити, і результати виходять цікавими Якщо цікаво, то можна пошукати в Інтернет-архівах

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*