Научете Linux, 101 приоритета за изпълнение на процеси - Linux Unix - Софтуерни продукти

В тази статия ще научите за основните техники за управление на приоритетите за изпълнение на процеси в Linux. Ще се научиш:

  • Разберете какви са приоритетите на процеса.
  • Задайте приоритети на процеса.
  • Променете приоритетите на процеса.

За да извлечете максимума от нашите статии, трябва да имате основни познания за Linux и да имате работеща Linux машина, на която можете да изпълнявате всички команди, които срещнете. Понякога различните версии на програми показват резултатите по различен начин, така че списъците и снимките може да се различават от това, което виждате на вашия компютър. Всички примери в тази статия бяха изпълнени на Ubuntu 9.10 (Karmic Koala). Тази статия се основава на концепцията, описана в предишната статия от тази серия, Изучаване на Linux 101: Създаване, наблюдение и спиране на процеси.

Linux, подобно на всички съвременни операционни системи, позволява множество процеси да работят едновременно. Той прави това чрез споделяне на CPU и други ресурси между процесите. Ако даден процес използва 100% ресурси на процесора, тогава всички други процеси може да спрат да реагират.

Ако изпълните горната команда, по подразбиране тя ще покаже процеси, сортирани по използване на процесора в низходящ ред, както е показано в листинг 1. В предишната статия от тази поредица, Изучаване на Linux 101: Създаване, наблюдение и унищожаване на процеси, създадохме прост скрипт за цифров часовник, който показва времето на интервали от 30 секунди и не прави нищо през останалото време. Ако имахме такъв процес, който работи, тогава той вероятно нямаше да повлияе на изхода на горната команда, тъй катопрез повечето време не използва ресурси на процесора.

Когато броят на процесорите, с които разполагате, е ограничен, трябва да решите как да разпределите наличните ресурси между няколко конкуриращи се процеса. Обикновено тази задача се решава по следния начин: избира се някакъв процес, който се изпълнява за кратък период от време (другото му име е времеви квант, т.е. количеството процесорно време, разпределено за приложението) или докато влезе в състояние на изчакване на някакво събитие, например завършване на I / O операция. За да се гарантира, че важните процеси винаги разполагат с процесорните ресурси, от които се нуждаят, които могат да бъдат заети от други ресурсоемки приложения, изборът се прави въз основа на разпределението на машинното време. Колоната NI в листинг 1 показва разпределението на машинното време (приоритет или така наречената доброта) за всеки процес. Обикновено стойността на изящество варира от -20 до 19; -20 означава най-висок приоритет, а 19 - най-нисък приоритет.

В допълнение към командата top, можете да използвате командата ps, за да определите стойностите на приоритета (качеството). Можете да персонализирате изхода по един от начините, описани в Научете Linux 101: Създаване, наблюдение и спиране на процеси, или просто да използвате опцията -l, за да покажете подробен списък. Резултатът от командата ps -l е показан в списък 2. Както при горната команда, стойността на приоритета се показва в колоната NI.

Списъци 1 и 2 показват, че стойността на приоритета по подразбиране (поне за процеси, стартирани от нормални потребители) е 0. Можете да видите стойността на приоритета за обвивката и системата, като изпълните командата nice без опции, както е показано в списък 3.

Предипреминете към задаване или промяна на приоритети, нека създадем малък скрипт, който консумира значително количество ресурси на процесора; използвайки неговия пример, ще видим как всъщност работят приоритетите.

Ще създадем малък скрипт, който консумира ресурси на процесора и също така приема брояч и етикет като два входа, отпечатва етикета и текущата дата и час на екрана, намалява брояча от дадената стойност до 0 и накрая отпечатва отново етикета и датата. Скриптът в списък 4 не съдържа никаква проверка за грешки и не е много надежден, но предоставя илюстративен пример.

Ако стартирате този скрипт на компютъра си, трябва да видите резултат, подобен на листинг 5. В зависимост от скоростта на компютъра ви можете да увеличите брояча, за да видите разликата във времето за изпълнение. Този скрипт консумира много ресурси на процесора, както ще видим скоро. Ако използвате интерпретатор, различен от bash и скриптът не работи на вашата система, тогава използвайте втория метод, показан по-долу. Ако не работите на собствения си компютър, уверете се, че той може да изпълнява задачи, изискващи ресурси, преди да стартирате този скрипт.

Дотук добре. Нека сега създадем списък с команди, за да изпълним скрипта във фонов режим и след това да използваме горната команда, за да видим колко CPU консумира (за да освежите познанията си за списъците с команди, вижте статията „Изучаване на Linux, 101: Командният ред на Linux“). Списъкът с команди е показан в листинг 6, а резултатът от горната команда е показан в листинг 7.

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

Сега, след като системата ни е заета известно време, нека видим как можем да зададем приоритета за процес. Нека обобщим това, което вече разгледахме.

  • Операционните системи Linux и UNIX® използват система за приоритет от общо 40 нива, започващи от -20 (най-висок приоритет) и завършващи на 19 (най-нисък приоритет).
  • Процесите, стартирани от редовни потребители, обикновено имат приоритет 0.
  • Командата ps може да покаже приоритета на процес (като nice или NI стойност) с опцията -l.
  • Командата nice показва приоритета по подразбиране.

Командата nice може да се използва и за стартиране на процес с различен приоритет. Опцията -n (или --adjustment) с положителна стойност повишава приоритета, а същата опция с отрицателна стойност го понижава. Не забравяйте, че процесът с най-нисък приоритет има най-висока стойност за доброта, така че увеличаването на тази стойност означава, че процесът става по-благоприятен за други процеси. Имайте предвид, че по правило само суперпотребителят (root) може да намали стойността на приоритетите на процеса. С други думи, обикновените потребители могат само да направят процесите по-лесни.

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

И двете задачи са изпълнени едновременно въпреки различните приоритети. Въпросът е, че скриптът използва един процесор, а компютърът ми има двуядрен процесор AMD Athlon™ 7750, който почти не се зарежда, така че всеки от двата процеса се изпълняваше на отделно ядро ​​и в този случай нямаше нужда да се задават приоритети.

Като зададем четири различни приоритета, виждаме ефекта, че всички задачи се изпълняват по ред. Опитайте да експериментирате с различни стойности на приоритет и анализирайте сами резултатите.

Една последна бележка относно стартирането на процеси с nice: Както при командата nohup, не можете да използвате канал или списък с команди като аргумент за nice.

Ако сте стартирали процес и сте разбрали, че той трябва да работи с различен приоритет, тогава има начин да промените приоритета на работещ процес с помощта на командата renice. Листинг 10 показва как да посочите абсолютната стойност (вместо количеството на промяната) на приоритета на един или повече процеси.

Не забравяйте, че за да дадете на процесите по-висок приоритет и да ги направите по-малко приятелски настроени, трябва да имате привилегии на суперпотребител.

За повече информация относно командите nice и renice вижте съответните страници с ръководство.