Відмінності між версіями «Богданов Володимир Ігорович»

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук
 
(не показані 2 проміжні версії цього учасника)
Рядок 5: Рядок 5:
  
  
'''Сучасні підходи до реалізації планування
+
'''''Сучасні підходи до реалізації планування''''' <br>
'''
+
Зазначені недоліки починали істотно впливати на роботи системи, коли вона функціонувала за умов граничного навантаження. У звичайних умовах традиційне планування в Linux працювало досить ефективно.
 
+
 
+
Зазначені недоліки починали істотно впливати на роботи системи, коли вона фуекціонувала за умов граничного навантаження. У звичайних умовах традиційне планування в Linux працювало досить ефективно.
+
  
 
Робота над виправленням недоліків тривала. Як наслідок, у ядро версії 2.6 була інтегрована нова реалізація алгоритму планування. Розглянемо коротко, як вона допомагає розв’язувати названі раніше проблеми.
 
Робота над виправленням недоліків тривала. Як наслідок, у ядро версії 2.6 була інтегрована нова реалізація алгоритму планування. Розглянемо коротко, як вона допомагає розв’язувати названі раніше проблеми.
  
Насамперед, цей алгоритм підтримує окремі черги готових процесів для кожного процесора, забезпечуючи ефективну роботу за умов багатопроцерності.
+
Насамперед, цей алгоритм підтримує окремі черги готових процесів для кожного процесора, забезпечуючи ефективну роботу за умов багатопроцесорності.
  
Ще одна проблема, яку має розв’язати новий алгоритм, пов’язана з необхідністю розраховувати у старому алгоритмі динамічний пріоритет для всіх готових процесів під час кожного виклику процедури планування. Рішення приймають таке: кожна черга гторових процесів – це масив черг готових процесів, де елементи упорядковані за динамічним пріоритетом. У результаті під час вибору процесу для виконання достатньо продивитись чергу з найвищим пріоритетом до першого процесу, який можна запустити. Ця процедура не залежить від кількості готових процесів у системі.
+
Ще одна проблема, яку має розв’язати новий алгоритм, пов’язана з необхідністю розраховувати у старому алгоритмі динамічний пріоритет для всіх готових процесів під час кожного виклику процедури планування. Рішення приймають таке: кожна черга готових процесів – це масив черг готових процесів, де елементи упорядковані за динамічним пріоритетом. У результаті під час вибору процесу для виконання достатньо продивитись чергу з найвищим пріоритетом до першого процесу, який можна запустити. Ця процедура не залежить від кількості готових процесів у системі.
  
Є два масиви черг готових процесів – масив черг активних процесів і масив черг процесів з вичерпаним квантом. Після того, як процес вичерпав свій квант, його переносять із першого масиву в доугий. Коли в масиві активних черг не залишається жодного процесу, обидва масиви міняються місйями, і послідовність кроків повторюється із самого початку. У підсумку з вичерпанням квантів процесами підвищується ймовірність запуску тих процесів, які до цього часу ще не одержували керування.
+
Є два масиви черг готових процесів – масив черг активних процесів і масив черг процесів з вичерпаним квантом. Після того, як процес вичерпав свій квант, його переносять із першого масиву в другий. Коли в масиві активних черг не залишається жодного процесу, обидва масиви міняються місіями, і послідовність кроків повторюється із самого початку. У підсумку з вичерпанням квантів процесами підвищується ймовірність запуску тих процесів, які до цього часу ще не одержували керування.<br>
  
 
+
'''''Програмний інтерфейс планування'''''<br>
'''Програмний інтерфейс планування'''
+
  
 
Розглянемо системні виклики Linux, за допомогою яких можна працювати із базовим пріоритетом процесів (величиною nice) і цим впливати на їхнє планування.
 
Розглянемо системні виклики Linux, за допомогою яких можна працювати із базовим пріоритетом процесів (величиною nice) і цим впливати на їхнє планування.
  
 
Для зміни базового пріоритету процесу використовують виклик
 
Для зміни базового пріоритету процесу використовують виклик
setpriority():
+
  setpriority():   ''#''include   int setpriority(int which, int who,int priority);
 
+
#include
+
 
+
int setpriority(int which, int who,int priority);
+
  
 
Зокрема, параметр which може набувати значення PRIO_PROCESS або PRIO_USER, відповідно показуючи, що параметр who буде інтерпретований як ідентифікатор процесу чи ідентифікатор користувача. У першому випадку задають пріоритет для конкретного процесу (або для поточного процесу, якщо who дорівнює нулю), у другому – для всіх процесів цього користувача.
 
Зокрема, параметр which може набувати значення PRIO_PROCESS або PRIO_USER, відповідно показуючи, що параметр who буде інтерпретований як ідентифікатор процесу чи ідентифікатор користувача. У першому випадку задають пріоритет для конкретного процесу (або для поточного процесу, якщо who дорівнює нулю), у другому – для всіх процесів цього користувача.
Рядок 35: Рядок 27:
 
Параметр priority задає новий пріоритет. Пріоритет може варіюватися в межах від –20 до 20, менші значення свідчать про вищий пріоритет. Значенням за замовчуванням є 0. Негативні значення priority можуть задавати лише користувачі з правами адміністратора.
 
Параметр priority задає новий пріоритет. Пріоритет може варіюватися в межах від –20 до 20, менші значення свідчать про вищий пріоритет. Значенням за замовчуванням є 0. Негативні значення priority можуть задавати лише користувачі з правами адміністратора.
  
Для отримання інформації про поточний базовий пріоритет використовують виклик getpriority():
+
Для отримання інформації про поточний базовий пріоритет використовують виклик <br>
 +
  getpriority(): Int getpriority(int which, int who);
  
Int getpriority(int which, int who);
+
Цей виклик повертає значення пріоритету, параметри '''which''' і '''who''' для нього мають той самий зміст, що й для функції '''setpriority().'''
 
+
Цей виклик повертає значення пріоритету, параметри which і who для нього мають той самий зміст, що й для функції setpriority().
+
  
 
Розглянемо приклад використання цих викликів:
 
Розглянемо приклад використання цих викликів:
  
// задати пріоритет для поточного процесу
+
''// задати пріоритет для поточного процесу''
 
+
setpriority(PRIO_PROCESS,0,10);
+
 
+
// довідатися про поточне значення пріоритету
+
 
+
printf(“поточний пріоритет: %d\n”,getpriority(PRIO_PROCESS,0));
+
 
+
Для відносної зміни базового пріоритету поточного процесу можна також викоритати системний виклик nice():
+
  
#include
+
  setpriority(PRIO_PROCESS,0,10);
  
int nice(int inc); // змінює пріорите поточного процесу на inc.
+
''// довідатися про поточне значення пріоритету''
  
 +
  printf(“поточний пріоритет: %d\n”,getpriority(PRIO_PROCESS,0));
  
Задача планування потоків зводиться до організації виконання кількох потоків на одному процесорі так, аби у користувачів виникало враження, що вони виконуються одночасно. Цілями планування є: мінімізація часу відгуку, максимізація пропускної здатності та справедливість. До основних стратегій планування належать витісняльна та невитісняльна багатозадачність. У сучасних ОС застосовують витісняльну багатозадачність, коли рішення про перемикання контексту потоку приймають у коді ядра системи, а не в коді потоку.
+
Для відносної зміни базового пріоритету поточного процесу можна також викоритати системний виклик
  
Розрізняють довготермінове, сереньотермінове та короткотермінове планування. Найважливіший тут короткотерміновий планувальник, котрий використовують для прийняття рішення про те, який потік запустити на виконання в певний момент. До основних алгоритмів короткотермінового планування належать планування кругове і з пріоритетами.
+
  nice():  ''#''include  int nice(int inc); ''// змінює пріорите поточного процесу на inc.''

Поточна версія на 11:41, 14 січня 2014

Реалізація планування в Linux.

Оригінал статті [1]


Сучасні підходи до реалізації планування
Зазначені недоліки починали істотно впливати на роботи системи, коли вона функціонувала за умов граничного навантаження. У звичайних умовах традиційне планування в Linux працювало досить ефективно.

Робота над виправленням недоліків тривала. Як наслідок, у ядро версії 2.6 була інтегрована нова реалізація алгоритму планування. Розглянемо коротко, як вона допомагає розв’язувати названі раніше проблеми.

Насамперед, цей алгоритм підтримує окремі черги готових процесів для кожного процесора, забезпечуючи ефективну роботу за умов багатопроцесорності.

Ще одна проблема, яку має розв’язати новий алгоритм, пов’язана з необхідністю розраховувати у старому алгоритмі динамічний пріоритет для всіх готових процесів під час кожного виклику процедури планування. Рішення приймають таке: кожна черга готових процесів – це масив черг готових процесів, де елементи упорядковані за динамічним пріоритетом. У результаті під час вибору процесу для виконання достатньо продивитись чергу з найвищим пріоритетом до першого процесу, який можна запустити. Ця процедура не залежить від кількості готових процесів у системі.

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

Програмний інтерфейс планування

Розглянемо системні виклики Linux, за допомогою яких можна працювати із базовим пріоритетом процесів (величиною nice) і цим впливати на їхнє планування.

Для зміни базового пріоритету процесу використовують виклик

  setpriority():   #include   int setpriority(int which, int who,int priority);

Зокрема, параметр which може набувати значення PRIO_PROCESS або PRIO_USER, відповідно показуючи, що параметр who буде інтерпретований як ідентифікатор процесу чи ідентифікатор користувача. У першому випадку задають пріоритет для конкретного процесу (або для поточного процесу, якщо who дорівнює нулю), у другому – для всіх процесів цього користувача.

Параметр priority задає новий пріоритет. Пріоритет може варіюватися в межах від –20 до 20, менші значення свідчать про вищий пріоритет. Значенням за замовчуванням є 0. Негативні значення priority можуть задавати лише користувачі з правами адміністратора.

Для отримання інформації про поточний базовий пріоритет використовують виклик

 getpriority():  Int getpriority(int which, int who);

Цей виклик повертає значення пріоритету, параметри which і who для нього мають той самий зміст, що й для функції setpriority().

Розглянемо приклад використання цих викликів:

// задати пріоритет для поточного процесу

 setpriority(PRIO_PROCESS,0,10);

// довідатися про поточне значення пріоритету

 printf(“поточний пріоритет: %d\n”,getpriority(PRIO_PROCESS,0));

Для відносної зміни базового пріоритету поточного процесу можна також викоритати системний виклик

 nice():   #include   int nice(int inc); // змінює пріорите поточного процесу на inc.