我在使用winsock并在非阻塞套接字上调用connect
。当CPU被其他进程占用时,我偶尔会看到一些延迟(最多200毫秒)。据我所知,非阻塞套接字上的connect
应立即返回,但可能connect
会导致上下文切换,并且由于CPU正在努力工作,需要一段时间才能再次获取CPU时间并退出该功能。解除阻塞连接到套接字会导致上下文切换吗?
我知道(或者至少相当肯定)阻塞套接字上的connect
会导致上下文切换,但是在非阻塞套接字上会产生一个上下文切换吗?connect
?
我在使用winsock并在非阻塞套接字上调用connect
。当CPU被其他进程占用时,我偶尔会看到一些延迟(最多200毫秒)。据我所知,非阻塞套接字上的connect
应立即返回,但可能connect
会导致上下文切换,并且由于CPU正在努力工作,需要一段时间才能再次获取CPU时间并退出该功能。解除阻塞连接到套接字会导致上下文切换吗?
我知道(或者至少相当肯定)阻塞套接字上的connect
会导致上下文切换,但是在非阻塞套接字上会产生一个上下文切换吗?connect
?
非阻塞呼叫将不会导致上下文切换,它的定义很明确。但是,上下文切换可能会立即发生。
我不确定你在这里是什么意思。 “据我所知,非阻塞套接字上的连接应立即返回。”一方面,是的,无论连接是否完成,后续的代码行都会执行,因此在这种意义上它会立即返回。如果你的意思是它会立即返回,因为在它返回之前没有任何上下文切换会发生,你会不正确。
无论是非阻塞连接,阻塞连接还是连接前/后的任何时间,上下文切换始终可以随时进行。只是当连接过程尚未完成时,非阻塞连接可能会返回。
在任何现代操作系统中,上下文切换都可以在正常程序运行的任何阶段进行。从来没有任何保证,某段代码将不间断地运行。 (只有那些对系统非常关键的人才能获得这样的特权)
另外,这个调用需要下到内核,这已经意味着花了一些时间。正如其他人所指出的那样:上下文切换可随时发生。你可以做一些技巧(比如使用稍微更高的优先级等),但事实是,使用非实时操作系统,你对分配的时间片,完成某些操作所需的时间等没有任何保证。