Це дуже залежить від типу запущеної програми. Якщо у вас є програми, які дуже задовольняють тривалість систематичних викликів WRT, ви можете очікувати, що ви побачите велику кількість комутації контексту. Якщо більшість ваших програм простоюють і прокидаються лише тоді, коли в сокеті відбуваються речі, ви можете сподіватися на низькі темпи переключення контексту.
Системні дзвінки
Системні виклики викликають переключення контексту за своєю суттю. Коли процес виконує системний виклик, він, в основному, каже ядру взяти на себе з його поточного моменту часу і пам'яті, щоб виконати те, що процес не має права, і повернутися на те саме місце, коли це буде зроблено.
Коли ми дивимось на визначення syscall write (2) з Linux, це стає дуже зрозумілим:
ІМ’Я
write - записати в дескриптор файлу
СИНОПИС
#включати
ssize_t write (int fd, const void * buf, size_t count);
ОПИС
write () записує до підрахунку байтів із буфера, вказаного в буфі, до файлу
посилається на дескриптор файлу fd. [..]
ПОВЕРНЕННЯ ЦІННОСТІ
Після успіху повертається кількість записаних байтів (нуль вказує
нічого не було написано). При помилці повертається -1, і встановлюється errno
відповідним чином.
[..]
Це, в основному, каже ядру взяти на себе операцію з процесу, перейти до count
байтів, починаючи з адреси пам'яті, на яку вказує *buf
дескриптор файлу fd
поточного процесу, а потім повертається назад до процесу і повідомляє йому, як він пройшов.
Гарний приклад, щоб показати це, - це спеціалізований ігровий сервер для ігор на базі Valve Source, hlds . http://nopaste.narf.at/f1b22dbc9 показує одну секунду ваших системних дзвінків, зроблених одним екземпляром ігрового сервера, на якому не було гравців. Цей процес займає приблизно 3% часу процесора на Xeon X3220 (2,4 ГГц), просто щоб ви відчули, наскільки це дорого.
Багатозадачність
Іншим джерелом комутації контексту можуть бути процеси, які не роблять системні виклики, але їх потрібно відсунути від заданого процесора, щоб звільнити місце для інших процесів.
Хороший спосіб візуалізації цього - cpuburn . cpuburn не робить ніяких системних викликів, він просто повторює власну пам’ять, тому він не повинен викликати будь-яку зміну контексту.
Візьміть машину, що працює в режимі очікування, запустіть vmstat, а потім запустіть BurMMX (або будь-який інший тест із пакета cpuburn) для кожного ядра процесора, який має система. Ви повинні мати повне використання системи до того часу, але навряд чи будь-яке посилене переключення контексту. Потім спробуйте почати ще кілька процесів. Ви побачите, що швидкість переключення контексту збільшується, коли процеси починають конкурувати за ядра CPU. Кількість комутацій залежить від співвідношення процесів / ядер та багатозадачності розділення вашого ядра.
Подальше читання
На linfo.org є приємне опис того, що таке контекстні комутатори та системні виклики . У Вікіпедії є загальна інформація та приємна колекція посилань на системні дзвінки.