解除阻塞连接到套接字会导致上下文切换吗?

时间:2009-01-14 14:28:34

标签: c winapi sockets winsock

我正在使用winsock并在非阻塞套接字上调用connect。当CPU被其他进程占用时,我偶尔会在函数返回之前看到一些延迟(最多200ms)。据我所知,非阻塞套接字上的connect应该立即返回,但是connect可能导致上下文切换,并且由于CPU正在努力工作,我的线程再次获得CPU时间需要一段时间并退出该功能。

我知道(或者至少相当肯定)阻塞套接字上的connect会导致上下文切换,但非阻塞套接字上的connect会导致一个吗?

3 个答案:

答案 0 :(得分:1)

非阻塞调用不会通过它的定义导致上下文切换。但是,可能会立即发生上下文切换。

我不确定你的意思。 “据我所知,非阻塞套接字上的连接应立即返回。”一方面,是的,无论连接是否完成,后续的代码行都将执行,因此在这种意义上它将立即返回。如果你的意思是它将立即返回,因为在它返回之前不会发生任何上下文切换,你就不正确了。

答案 1 :(得分:1)

无论是非阻塞连接,阻塞连接,还是连接之前/之后的任何时间,都可以随时进行上下文切换。只是当连接过程尚未完成时,非阻塞连接可能会返回。

在任何现代操作系统中,在正常程序运行的任何阶段都可以进行上下文切换。永远不能保证某段代码不会中断运行。 (只有那些对系统非常关键的人才能获得这样的特权)

答案 2 :(得分:1)

此外,此调用需要转到内核,这已经意味着花费了一些时间。正如其他人所指出的:上下文切换可以随时发生。你可以做一些技巧(比如使用略高的优先级等),但事实是使用非实时操作系统你不能保证分配的时间片,完成某些操作所需的时间等等。 / p>