Що таке "канал очікування" процесу?


36

На вкладці "Процеси системного монітора GNOME" стовпчик "Канал очікування". На сьогоднішній день найпоширеніші значення, які я бачу тут, - це опитування_схедуле_час , але я бачу й інші значення: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram та unix_stream_data_wait .

То що означає цей стовпчик "Канал очікування"? І можливо, що означають деякі з цих значень у ньому?

Знімок екрана

Відповіді:


42

Канал очікування - це місце в ядрі, де зараз чекає завдання. Завдання має чекати ресурсу, який може бути даними або часом обробки. До цих двох належать мережеві розетки, обладнання, файли тощо; оскільки більшість з них - це лише файли в Unix-подібних системах.

  • 0: Процес не чекає

  • poll_schedule_timeout

    poll()- це системний виклик 1, який використовується для обробки вводу / виводу. Це схоже на select(). 2

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

    Канал очікування poll_schedule_timeoutвказує на те, що на введення / вивід чекає завдання, або обладнання, наприклад клавіатури та миші, звукові пристрої або навіть мережеві розетки.

    1. Функція в ядрі
    2. Вони визначені в <linux/poll.h>. pollбула реалізацією, вперше поміченою у System V, selectє еквівалентом BSD UNIX.
  • futex_wait_queue_me:

    Щоб пояснити це, ми повинні подивитися на Замки. Блокування - це збережений стан у системі, який вказує на те, що завдання працює з ресурсом. Наприклад, може бути лише одне завдання, яке читає файл. Це завдання заблокує файл, будь-яке інше завдання 1, яке намагається прочитати файл, знало б, що він заблокований, і чекати, коли замок відійде, перш ніж він матиме доступ до нього. Те саме відбувається з процесорним часом.

    Сучасна версія Linux (у більшості архітектур) використовує блокування Futex (швидкий mutex простору користувачів) у ядрі. Mutex, взаємне виключення, посилається на думку про те, що до загального ресурсу можна отримати доступ лише одним завданням у будь-який час. Для цього встановлюються прапори в системі.

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

    Якщо ви можете прочитати це, ви зобов’язані виправити хоча б одну помилку у цій відповіді: P

    Блокування Futex можна розглядати як число в просторі користувачів, яке може збільшуватися або зменшуватися завданням (у випадках, коли ресурс можна отримати за допомогою декількох завдань, це число може стати більше одиниці). Це число, показане на схемі 4 .

    Ці завдання вписуються в чергу очікування , просту чергу завдань, яким потрібно виконати певну роботу, коли час обробки буде доступний, завдання виконують свою роботу і видаляються з черги.

    futex_wait_queue_meзадає завдання. Потім він чекає сигналу, тайм-ауту або пробудження. Завдання, які перебувають на цьому каналі очікування , чекають не в черзі очікування, вони чекають, коли їх запустить.


    1. Завданням може бути або Процес 3, або Нитка 2
    2. Нитка - це підрозділ Процесу. Багато потоків можуть працювати паралельно
    3. Процес - це повномасштабна програма, вона складається з однієї або декількох ниток, хоча програма може також складатися з декількох процесів.
    4. Пам'ятайте, це все ще дуже високий рівень речей, це не враховує деталі реалізації
  • __skb_recv_datagram

    Зачекайте деяких даних у заблокованій мережевій розетці.

  • sk_wait_data

    Дочекайтеся деяких даних у мережевій розетці.

  • do_exit

    Це остання частина виходу з процесу. do_exit()викликає schedule()наступний, щоб запланувати інший процес. Коли do_exit()викликається, процес є a ZOMBIE.

  • do_wait

    Процес додається до черги очікування планувальників.

  • pipe_wait, unix_stream_data_wait

    Процес чекає даних з підпроцесу. Це відбувається, наприклад, коли ви запускаєте такий тип коду:

    echo | sleep 10 && echo hallo              # pipe
    

    або

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

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

Це ще не все, але я не спостерігав інших. Залиште коментар, якщо я щось пропустив.


Я натрапив на сон_on_page_killable?
Еммануель М. Сміт

Найбільш вірогідною причиною сну_on_page_killable є те, що процес намагається завантажити сторінку, яка не є в пам'яті, тому вона спричиняє помилку на сторінці, і процес повинен бути увімкнений до сну до завантаження сторінки. Якщо підсистема вводу / виводу перевантажена (можливо, тому що ви робите багато вводу-виводу), це може з’являтися часто.
цуна

про що signal? Я наткнувся на це. Процес загинув? зомбі? або те, що? що буде з процесом?
itsnotmyrealname

11

Значення каналу очікування - це назва функції ядра, в якій процес блокується в даний час.

Назва зазвичай пов’язана із системним викликом, який матиме сторінку вручну.

  • futex_wait_queue_me пов'язаний з futex . Він відноситься до типу блокування mutex (швидке взаємне виключення користувачів), яке використовується для планування роботи багатьох процесів на одному процесорі. Стан вказує на те, що ваш процес ввімкнено для отримання блокування. 2
  • do_wait пов'язаний з очікуванням .
  • тощо.

Якщо ви дійсно хочете більш детальної інформації, ви можете перевірити джерело ядра .

Якщо ви введете cat /proc/some_pid/stackтермінал, ви отримаєте такий вихід:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

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

Він стосується асинхронного вводу / виводу та опитування .

Джерело (джерела): 1. канал очікування (WCHAN) та сигнал тривоги? - 2. Відповідь AskUbuntu



Здається, ви помітили, що я повторно використав вашу відповідь, щоб покращити цю ;-) Яку атрибуцію ви б хотіли мати?
Максим Р.

2
Вашого коментаря більш ніж достатньо, щоб мене залишилося щасливим :) Якщо ви хочете дізнатися про те, як працює атрибуція, є приємна публікація блогу ТА на цю тему. Не хвилюйтесь над цим, хоча, я хочу, щоб люди якнайшвидше використовували мою роботу.
Стефано Палацо

1
Ну, я просто писав запитання на цю тему на мета. (вже читав допис у блозі)
Максим Р.

Це тут . І я думаю, що ваша відповідь в якийсь момент закінчиться моєю ^^
Максим Р.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.