Різниця між повільними системними дзвінками та швидкими системними дзвінками


13

Яка різниця між повільними системними дзвінками та швидкими системними дзвінками? Я дізнався, що повільний системний виклик може блокуватися, якщо процес ловить якісь сигнали, оскільки спіймані сигнали можуть розбудити заблокований системний виклик, але я не можу точно зрозуміти цей механізм. Будь-які приклади будуть вдячні.

Відповіді:


20

Насправді є три градації в системних викликах.

  1. Деякі системні дзвінки повертаються негайно. "Негайно" означає, що єдине, що їм потрібно, - це трохи часу на процесор. Не існує жорсткого обмеження, скільки часу вони можуть тривати (за винятком систем реального часу ), але ці дзвінки повертаються, як тільки вони заплановані досить довго.
    Ці дзвінки зазвичай називають неблокуючими . Прикладами неблокірующіх викликів є виклики , які просто читають трохи стану системи, або зробити проста зміна в стані системи, такі як getpid, gettimeofday, getuidабо setuid. Деякі системні дзвінки можуть блокувати або не блокувати залежно від обставин; наприклад, readніколи не блокується, якщо файл - це труба або інший тип, який підтримує неблокуючі зчитування і встановлений O_NONBLOCKпрапор .
  2. Кілька системних дзвінків можуть зайняти деякий час, але не назавжди. Типовим прикладом є sleep.
  3. Деякі системні дзвінки не повернуться, поки не відбудеться якась зовнішня подія. Кажуть, що ці дзвінки блокуються . Наприклад, readвиклик блоку дескриптора файлів блокує, і так wait.

Відмінність між швидкими та «повільними» системними викликами близька до неблокуючих та блокуючих, але цього разу з точки зору реалізації ядра. Швидкий системний виклик - це те, що, як відомо, може завершити без блокування чи очікування. Коли ядро ​​стикається з швидкою системою виклику, воно знає, що може негайно виконати syscall і зберегти запланований той же процес. (У деяких операційних системах з непередбачуваною багатозадачністю швидкі систематичні виклики можуть бути неперешкодними; це не так у звичайних системах Unix.) необхідно підготуватися до призупинення процесу виклику та запуску іншого завдання.

Деякі випадки - трохи сіра зона. Наприклад, читання диска ( readзі звичайного файлу) зазвичай вважається незаблокувальним, оскільки його не чекає черговий процес; він чекає лише диска, на який, як правило, потрібно лише небагато часу, щоб відповісти, але не візьметься назавжди (так це випадок 2 вище). Але з точки зору ядра, процес дочекається завершення драйвера диска, тому це, безумовно, повільний системний виклик.


дякую чудово! але якщо файл - це труба, читання файлу не блокується? дивіться, що www2.hawaii.edu/~esb/2007spring.ics612/apr10.html
KayKay

він позначає "повільне читання / запис (наприклад, на трубі чи терміналі)"
KayKay

@KayKay: Для труби ви можете мати обидва, залежно від стану O_NONBLOCKпрапора. Якщо прапор встановлений, системне виклик може завершитись, не чекаючи нічого іншого, тому він не блокує, і ядро ​​може сприймати його як швидкий системний виклик.
Жил "ТАК - перестань бути злим"

ви маєте на увазі, це залежить від прапора O_NONBLOCK!
KayKay

3

Повільний системний виклик - це щось на зразок зчитування TCP-сокета () - якщо у вас немає O_ASYNC (або будь-якого іншого), він може чекати назавжди.

Швидкий системний виклик - це щось на зразок gettimeofday () або getpid (), обидва вони повертають інформацію до процесу, який ядро ​​одразу доступне.

Читання диска потрапляє до категорії повільних системних дзвінків. Якщо процес читає () на справжньому файлі диска, дескрипторі файлу, ядро, можливо, доведеться читати в одному або декількох блоках дисків, щоб задовольнити прочитане. Залежно від структури дискової файлової системи, що лежить в основі, це може означати зчитування диска-inode для отримання номера блоку диска "непрямого блоку", зчитування непрямого блоку для отримання блоку даних, а потім зчитування самого блоку даних . Досить забирає багато часу, принаймні, з точки зору циклу процесора на доступ до диска, ймовірно, сьогодні гірше, ніж це було в «Добрі старі дні».

Я цього не бачив у віках, але "нижня половина" старого коду драйвера пристрою диска Unix блокувала б сигнали / переривання, щоб було легше підтримувати цілісність файлової системи на диску. Іноді помилковий драйвер або несправний диск ніколи не доставлятиме блок дисків, про який вимагав процес, і процес спав назавжди. Навіть вбивство -9 нічого не зробило.

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