Як працюють пріоритети для менеджера завдань і коли я повинен / не повинен це встановлювати?


30

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

Я виявив в Google, що пріоритети насправді не пов'язані зі швидкістю обробки, це правда? Чому б тоді не? якщо процес має найвищий пріоритет, чи не повинен він проходити швидше ??


4
Коротка відповідь: When should I set [priorities in Task Manager]? Майже ніколи.
Ден Хендерсон

2
Ще одна важлива річ, яку потрібно розуміти, це те, що виконання пріоритетів зменшує загальну кількість роботи, яку система може виконати. Ось чому звичайні настільні операційні системи не є операційними системами в режимі реального часу. І чим більше ви змушуєте їх вести себе як операційні системи в режимі реального часу, тим вони менш ефективні. Наприклад, перерви видувають схованки. Роботи з нижчим пріоритетом ще мають бути завершені і все ще конкурують за введення-виведення. Робити менш ефективно, меншими шматками, нікому не вигідно.
Девід Шварц

Не намагайтеся думати про свій комп’ютер. Ти не виграєш. Він знає, як обробити свої нитки набагато краще, ніж ви.
b1nary.atr0phy

Відповіді:


52

Припустимо, у вас є картка "перейти до голови лінії" для продуктового магазину. Ви заходите в магазин, заповнюєте свій кошик, заходите до кас, і знаєте, що в черзі немає нікого. Чи допомагає ваша картка швидше перевіритись? Ні.

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

Щоб насправді говорити про це, нам потрібно згадати теми. Процеси не «запускаються» в Windows. Нитки, які є частинами процесів, - це те, що виконується. (Хоча якщо процес має лише один потік, то розрізнення зовні нечітке.)

(До речі: маркетингова термінологія, за якою у процесора є, наприклад, "чотири ядра та вісім потоків", вводить в оману. Процесори мають ядра, але процесори не мають "потоків". Нитки - це частина процесів. Ядро CPU без увімкненої гіперпереборки можна запускати один потік; з увімкненою гіперпереборкою ядро може запускати два потоки. Але процесори не мають "потоків".)

Кожна нитка завжди знаходиться в одному з кількох станів планування. Найбільш часто спостерігаються стани: Очікування (* nix називає це "заблоковано"; в обох ОС це означає, що чекає вводу / виводу або подібного, не використовує часу процесора і не хоче жодного); Готовий (хоче використовувати час процесора, але зараз це не доступно); і Біг . Тільки запущені потоки споживають час процесора; тобто, якщо у процесу немає запущених потоків, видно буде використовувати нульовий% процесорного часу в таких інструментах, як диспетчер завдань.

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

Більшість потоків у більшості систем проводять більшу частину свого часу у стані очікування. (Ось чому ваш непрацюючий процес повинен отримувати понад 95% часу процесора, коли ваша система нічого не робить.) Виняток становлять "робочі" теми таких речей, як відео чи 3d-рендерінг, ігри тощо. Дуже мало потоків дійсно можна використовувати 100% процесора, тому що вони, як правило, повинні працювати над деякими вхідними даними, які вони звідкись повинні читати, і вони, як правило, створюють вихідні дані, які повинні бути кудись записані. І вони можуть посилатися на багато різних даних у пам'яті з плином часу, що може означати, що їм доведеться чекати усунення несправностей жорсткої сторінки.

Але теми, які роблять щось на кшталт відео-рендерінгу або рендеринга 3D-зображень, цілком можуть витратити майже весь свій час на "обчислення" в процесорі, і дуже мало чекають вводу-виводу. Такі потоки часто називають "обчисленими", що означає, що їхня загальна продуктивність насамперед обмежена швидкістю процесора.

Параметр, який ви робите в диспетчері завдань, фактично встановлює "базовий пріоритет" для всіх потоків у процесі. Фактичний або "поточний" пріоритет потоку може бути вищим (але ніколи не нижчим за базовий). Детальніше про це за мить. Рішення щодо планування ("хто отримує запуск та на якому процесорі") завжди виконуються за допомогою поточного пріоритету потоку. Пріоритет має значення лише для готових та запущених потоків (або кажучи інакше, пріоритет не має значення для потоків "Очікування").

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

Якщо два потоки хочуть використовувати процесор, і вони мають однаковий пріоритет, то вони плануються через те, що називається "розрізання часу", і з часом кожен отримує приблизно 50% часу процесора. Тоді якщо вони мають різні пріоритети, то нитка з вищим пріоритетом отримує 100%, а нижча - нічого не отримує .

(На практиці він не отримає нічого, тому що буде відчувати періодичний "пріоритет уникнення голоду", який може давати йому кілька десятків мсек кожні 4 або 5 секунд або близько того. Але це насправді не є винятком з "більш високого пріоритету виграє ", оскільки це робиться шляхом коригування пріоритету голодної нитки.)

Якщо у вас є більше одного ядра процесора, речі стають цікавішими, а пріоритети взагалі мають менший ефект. Припустимо, у вас є дві нитки, які потрібно запустити. І припустимо, у вас є два або більше процесорних ядра, які не виконують нічого іншого, рівного або більшого пріоритету, ніж ці потоки. Тоді ваші дві нитки отримають 100% ядра, незалежно від їхніх пріоритетів .

(Двоє людей з’являються у супермаркеті, і дві шашки безкоштовні. Один із клієнтів має картку «піти до голови лінії». Неважливо.)

tl; dr версія (поки що): пріоритети полягають не в тому, "хто отримує частку часу процесора", а в тому, "хто першим запускається".

Я не збираюся тут сильно вникати в гіпертодію, за винятком того, що скажу, що Windows обробляє кожен з двох "логічних процесорів" в ядрі майже так само, як і до ядра, якщо HT було вимкнено. тобто вони вважаються "справжніми" процесорами, за винятком цього: Windows дуже намагатиметься не використовувати більше одного LP в ядрі одночасно. тобто ви зазвичай не починаєте бачити обидва LP в використовуваному ядрі, поки у вас більше, ніж кількість ядер, що намагаються запустити всі одночасно. Це тому, що два "логічних процесора" не дають вам нічого подібного до подвійної продуктивності одного негіпертокованого ядра.

Про "базовий пріоритет": Windows відкоригує ("boost" та "decay") поточний пріоритет потоків на основі того, що вони зробили останнім часом. Нитки, які нещодавно завершили операції вводу / виводу, як правило, будуть надрізом або двома над базою; Нитки інтерфейсу користувача (потоки, на яких працює вікно) часто будуть значно вищими; Нитки, пов'язані з процесором, зазвичай знаходяться в їх основі. Метою цього є підтримка чуйності в користувальницькому інтерфейсі програми, а також зберігати запити вводу-виводу на такі речі, як диски.

Програма (процес) також може змінювати базовий пріоритет кожної його нитки в межах, визначених пріоритетом процесу (те, що ви встановили в диспетчері завдань). Але переважна більшість програм не турбує. (Більше з них має.)

Є й інші речі. Через пріоритетне збільшення / занепад та через те, що багатопроцесорні системи (або багатоядерні, або гіпертокові, або обидві) є такими поширеними в наші дні, і тому, що в Windows завжди є робота, яка працює у фоновому режимі (але, сподіваємось, не використовує багато часу процесора), а через ефекти як жорсткої, так і м'якої "спорідненості", складно запустити тестові справи і отримати точні результати, які можна було б передбачити тут. Але це повинно дати вам близьку до правильної картини.

На закінчення ...

Розумно залишати більшість речей на "Нормальному". Якщо ви цього не зробите, ви можете зголосити голоду за те, що ви хотіли б працювати (хоча ви, можливо, не знаєте, що воно існує), як, наприклад, функції промивання кеш-пам'яті диска ОС. Дійсно, багато процесів ОС будуть іншими, ніж звичайними, і їх слід залишати куди б вони не розмістили.

Розумний випадок використання диспетчера завдань для спільної роботи з пріоритетами - якщо у вас є якесь завдання з виправлення процесора (наприклад, відео чи 3D-рендерінг), і це сповільнює використання системи під час роботи. Правильна річ - вірите чи ні, знижуйте її пріоритет на два-два рази. Він із задоволенням використовуватиме всі цикли процесора, що більше нічого не хоче, але не буде перешкоджати інтерактивному використанню системи. Його робота може зайняти трохи більше часу, але її робота буде виконана з мінімальним втручанням у ваше інтерактивне використання інших програм. Якщо вам не подобається цей компроміс, не робіть цього! Але встановіть його як високий пріоритет у спробі "прискорити його швидше", і він може повісити весь ваш інтерфейс, поки він не буде закінчений.

Ніколи нічого не встановлюйте на так званий клас пріоритетності в реальному часі.

(Редагувати - додано цей параграф) Добре, це крайне твердження. ("Жодна універсальна претензія не відповідає дійсності - не виключаючи цієї.") Принаймні, не без дуже ретельного розгляду. Якщо ваша мета - змусити щось запустити швидше, це, ймовірно, не допоможе. Але це може "жорстко заблокувати" вашу систему (вимагає перезавантаження або на більшості сучасних машин потрібен цикл живлення). Або зробіть це настільки безвідповідальним, що може бути жорстким.

nb: Будь-яка програма програвача відеоплеєра повинна вибирати функцію "Планування мультимедійного класу" у Vista та пізніших версіях. Це автоматично дасть йому до 80% центрального процесора, що вважається за відносно короткі проміжки часу. Якщо ви не можете отримати відтворення без глюків, це щось не так.

Детальніше дивіться глави про теми та планування у 6-му виданні Windows Internals Соломона, Русиновича та Іонеску.

Дивіться також мою відповідь тут, щоб отримати інформацію про те, як встановлюються пріоритети процесів і потоків, та значення стовпця "Пріоритет" у Диспетчері завдань.


1
До речі, моя відповідь на наступне пов’язане питання пов'язане: superuser.com/questions/949030/…
Джеймі Ханрахан

1
Також до речі: "Планування", "планувальник" тощо, тут зверніться до підпрограм ядра Windows, які вирішують, які потоки потрібно запустити та на яких процесорах вони мають працювати. Не для "планування завдань", що стосується запуску процесів у певний час або у відповідь на різні тригери.
Джеймі Ханрахан

@JamieHanrahan ок, я перемістив його сюди: superuser.com/questions/1380473/…
Julien__

5

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

Наприклад, ви кодуєте відео і одночасно переглядаєте інше відео. Ймовірно, додаток для кодування використовуватиме 100% обчислювальну потужність на всіх ваших ядрах процесора. Як результат, інші програми можуть заїкатися.

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


"Ймовірно, додаток для кодування використовуватиме 100% обчислювальну потужність для всіх ваших процесорних ядер." Це можливо лише в тому випадку, якщо є принаймні нитки кодування з кількістю ядер .
Джеймі Ханрахан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.