Вивчаємо Linux, 101 Пріоритети виконання процесу - Linux Unix - Програмні продукти

З цієї статті ви дізнаєтеся про основні прийоми управління пріоритетами виконання процесів у Linux. Ви навчитеся:

  • Розуміти, що таке пріоритети процесів.
  • Призначати пріоритети процесів.
  • Змінювати пріоритети процесів.

Щоб отримати найбільшу користь з наших статей, необхідно мати базові знання про Linux і мати працездатний комп'ютер з Linux, на якому можна буде виконувати всі команди, що зустрічаються. Іноді різні версії програм виводять результати по-різному, тому вміст листингів та малюнків може відрізнятись від того, що ви побачите на вашому комп'ютері. Усі приклади цієї статті було виконано в операційній системі Ubuntu 9.10 (Karmic Koala). В основі цієї статті лежить концепція, описана в попередній статті цієї серії "Вивчаємо Linux, 101: створення, відстеження та знищення процесів".

У Linux, як і у всіх сучасних операційних системах, одночасно може виконуватися кілька процесів. Це досягається шляхом поділу процесорних та інших ресурсів між процесами. Якщо якийсь процес використовує ресурси центрального процесора на 100%, всі інші процеси можуть перестати відповідати на запити.

Якщо ви запустите команду top , то за умовчанням вона відобразить процеси, відсортовані за ступенем використання ресурсів ЦП у спадному порядку, як показано в лістингу 1. У попередній статті цієї серії "Вивчаємо Linux, 101: створення, відстеження та знищення процесів" ми створили сценарій простий цифровий годинник, який виводив на екран час з інтервалом в 30 секунд, а в решту часу нічого не робив. Якби у нас був запущений такий процес, то, ймовірно, він не вплинув би на виведення команди top , оскількиБільшість він не використовує ресурси центрального процесора.

Коли кількість наявних у вашому розпорядженні процесорів обмежена, необхідно вирішити, як розподілити наявні ресурси між декількома процесами, що конкурують. Зазвичай це завдання вирішується так: вибирається якийсь один процес, який виконується протягом короткого відрізка часу (інша його назва - квант часу, тобто кількість процесорного часу, що виділяється додатком) або доти, доки він не переходить у стан очікування будь-якої події, наприклад, завершення операції введення/виводу. Щоб важливі процеси завжди мали необхідні їм процесорні ресурси, які можуть бути зайнятими іншими ресурсомісткими додатками, вибір проводиться на базі розподілу машинного часу. Стовпець NI у лістингу 1 показує розподіл машинного часу (пріоритет, або т.з. niceness) для кожного процесу. Як правило, значення niceness варіюється від -20 до 19; -20 означає найвищий пріоритет, а 19 – найменший пріоритет.

Крім команди top визначення значень пріоритету (niceness) можна використовувати команду ps . Ви можете налаштувати висновок одним із способів, описаних у статті "Вивчаємо Linux, 101: створення, відстеження та знищення процесів", або просто використовувати опцію -l для виведення докладного списку. Висновок команди ps -l представлений у лістингу 2. Як і у випадку з командою top значення пріоритету відображається в стовпці NI.

З лістингів 1 і 2 видно, що значенням пріоритету за умовчанням (принаймні для процесів, запущених звичайними користувачами) є 0. Ви можете подивитися значення пріоритету для командного інтерпретатора та системи, запустивши команду nice без параметрів, як показано у лістингу 3.

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

Ми створимо невеликий сценарій, який споживає процесорні ресурси і ще приймає як два вхідні параметри лічильник і мітку, виводить мітку, поточні дату та час на екран, зменшує лічильник від заданого значення до 0 і, нарешті, знову виводить мітку та дату. Сценарій, представлений у лістингу 4, не містить перевірок на помилки і не дуже надійний, проте він дозволяє отримати наочний приклад.

Якщо ви запустите цей сценарій на вашому комп'ютері, то повинні побачити висновок, схожий на висновок у лістингу 5. Залежно від швидкодії комп'ютера ви можете збільшити значення лічильника, щоб помітити різницю в часі виконання. Цей сценарій споживає багато ресурсів процесора, у чому скоро переконаємося. Якщо ви використовуєте інтерпретатор, відмінний від bash, і сценарій не працює у вашій системі, то використовуйте другий спосіб запуску, показаний нижче. Якщо ви працюєте не на своєму комп'ютері, перш ніж запустити цей сценарій, переконайтеся, що на ньому можна запускати ресурсомісткі завдання.

Поки все добре. Давайте тепер створимо список команд для запуску сценарію у фоновому режимі, після чого за допомогою команди top подивимося скільки ресурсів процесора він витрачає (щоб освіжити ваші знання про списки команд, зверніться до статті "Вивчаємо Linux, 101: командний рядок Linux"). Список команд показаний у лістингу 6, а виведення команди top – у лістингу 7.

Не погано. Запустивши сценарій, ми використовуємо ресурси центрального процесора на 100%. Якщо ви хочете завантажити кілька процесорів, ви можете додати до списку командзапуск додаткових екземплярів count1.sh. Якщо таке завдання буде виконуватись тривалий час, то ви (або інші користувачі) помітите, що воно суттєво впливає на швидкість роботи комп'ютера.

Тепер, коли наша система якийсь час навантажена, погляньмо, як можна встановити пріоритет для процесу. Давайте підіб'ємо короткі підсумки вже пройденого матеріалу.

  • В операційних системах Linux і UNIX® використовується система пріоритетів, лише 40 рівнів, починаючи з -20 (найвищий пріоритет) і закінчуючи 19 (нижчий пріоритет).
  • Процеси, запущені звичайними користувачами, мають пріоритет 0.
  • Команда s може показати пріоритет процесу (наприклад, значення nice або NI) за допомогою опції -l .
  • Команда nice показує пріоритет за промовчанням.

Команду nice можна використовувати для запуску процесу з іншим пріоритетом. Опція -n (або --adjustment ) з позитивним значенням підвищує пріоритет, а ця опція з негативним значенням - знижує його. Пам'ятайте, що процес із найменшим пріоритетом має максимальне значення параметра niceness, тому збільшення цього значення означає, що процес стає більш доброзичливим по відношенню до інших процесів. Зауважте, що, як правило, знижувати значення пріоритетів може тільки суперкористувач (root). Іншими словами, звичайні користувачі можуть робити процеси лише більш дружелюбними.

Щоб продемонструвати використання команди nice для встановлення пріоритетів, давайте запустимо два екземпляри сценарію count1.sh у різних підболочках, але одному з них призначимо максимальне значення параметра niceness 19. Через секунду запустимо команду ps -l, щоб переглянути статус процесу, включаючи значення niceness. Зрештою, додамодовільну паузу в інтервалі 30 секунд, щоб переконатися, що послідовність команд завершиться лише після завершення роботи підболочок. Таким чином, ми не побачимо нове запрошення, поки очікуємо на виведення. Результати представлені у лістингу 8.

Обидва завдання завершилися одночасно попри різні пріоритети. Справа в тому, що сценарій використовує ресурси одного процесора, а на моєму комп'ютері встановлений двоядерний процесор AMD Athlon™ 7750, який практично не завантажений, тому кожен із двох процесів виконувався на окремому ядрі, а необхідність встановлення пріоритетів у цьому випадку була відсутня.

Встановивши чотири різні пріоритети, ми бачимо ефект, який полягає в тому, що всі завдання завершилися по порядку. Спробуйте поекспериментувати з різними значеннями пріоритетів та самостійно проаналізувати отримані результати.

І останнє зауваження щодо запуску процесів за допомогою nice: як і у випадку з командою nohup, як аргумент nice не можна використовувати конвеєр або список команд.

Якщо ви запустили процес і зрозуміли, що він повинен виконуватися з іншим пріоритетом, існує спосіб змінити пріоритет працюючого процесу за допомогою команди renice . У лістингу 10 показано, як вказати абсолютне значення (а чи не величину зміни) пріоритету однієї чи кількох процесів.

Пам'ятайте, що для того, щоб призначати процесам вищий пріоритет і робити їх менш доброзичливими, необхідно мати привілеї суперкористувача.

Додаткову інформацію про команди nice та renice ви можете знайти на відповідних man-сторінках.