2009-01-14 31 views
1

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

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

回答

1

非阻塞呼叫将不会导致上下文切换,它的定义很明确。但是,上下文切换可能会立即发生。

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

1

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

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

1

另外,这个调用需要下到内核,这已经意味着花了一些时间。正如其他人所指出的那样:上下文切换可随时发生。你可以做一些技巧(比如使用稍微更高的优先级等),但事实是,使用非实时操作系统,你对分配的时间片,完成某些操作所需的时间等没有任何保证。