Разблокирование соединения с сокетом вызывает переключение контекста? - PullRequest
1 голос
/ 14 января 2009

Я использую winsock и вызываю connect на неблокирующем сокете. Иногда я вижу некоторую задержку (до 200 мс), прежде чем функция возвращается, когда процессор перегружен другими процессами. Из того, что я знаю, connect на неблокирующем сокете должен немедленно вернуться, но, возможно, connect вызывает переключение контекста, и, поскольку ЦП работает усердно, требуется некоторое время, прежде чем мой поток снова получит время ЦП и выйдет из функции. ,

Я знаю (или, по крайней мере, достаточно уверен), что connect на блокирующем сокете вызывает переключение контекста, но connect на неблокирующем сокете вызывает его?

Ответы [ 3 ]

1 голос
/ 15 января 2009

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

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

1 голос
/ 15 января 2009

Кроме того, этот вызов должен передаваться ядру, что уже означает некоторое время, потраченное. И как уже отмечали другие: переключение контекста может произойти в любое время. Вы можете сделать некоторые трюки (например, использовать немного более высокий приоритет и т. Д.), Но факт заключается в том, что при использовании ОС не в реальном времени у вас нет никаких гарантий относительно выделенных временных интервалов, времени, которое требуется для выполнения определенных операций и т. Д.

1 голос
/ 15 января 2009

Неблокирующий вызов не будет вызывать переключение контекста по определению. Однако переключение контекста потенциально может произойти немедленно.

Я не уверен, что вы имеете в виду здесь. «Из того, что я знаю, соединение на неблокирующем сокете должно немедленно вернуться». С одной стороны, да, последующие строки кода будут выполняться независимо от того, завершится ли соединение, поэтому в этом смысле оно будет немедленно возвращено. Если вы имеете в виду, что он вернется немедленно, потому что переключение контекста никогда не произойдет, прежде чем он вернется, вы ошиблись.

...