Это очень сильно зависит от типа приложения, которое вы запускаете. Если у вас есть приложения, которые очень хорошо запускают системные вызовы WRT, вы можете ожидать большого количества переключения контекста. Если большинство ваших приложений бездействуют и просыпаются только тогда, когда что-то происходит в сокете, вы можете ожидать низкой скорости переключения контекста.
Системные звонки
Системные вызовы вызывают переключение контекста по своей собственной природе. Когда процесс выполняет системный вызов, он в основном говорит ядру взять на себя управление с его текущего момента времени и памяти для выполнения действий, которые процесс не имеет привилегий, и вернуться к тому же месту, когда оно выполнено.
Когда мы посмотрим на определение системного вызова write (2) из Linux, это становится очень ясным:
НАЗВАНИЕ
write - записать в дескриптор файла
СИНТАКСИС
#включают
запись ssize_t (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, а затем запустите burnMMX (или любой другой тест из пакета cpuburn) для каждого ядра ЦП, имеющегося в системе. К тому времени у вас должно быть полное использование системы, но вряд ли какое-либо усиление переключения контекста. Затем попробуйте запустить еще несколько процессов. Вы увидите, что скорость переключения контекста увеличивается, когда процессы начинают конкурировать за ядра ЦП. Количество переключений зависит от соотношения процессов / ядра и многозадачного разрешения вашего ядра.
дальнейшее чтение
У linfo.org есть хорошая статья о переключениях контекста и системных вызовах . В Википедии есть общая информация и хороший набор ссылок на системные вызовы.