我使用winsock并在非阻塞套接字上调用connect。当CPU被其他进程占用时,我偶尔会在函数返回之前看到一些延迟(高达200ms)。据我所知,非阻塞套接字上的CPU应该立即返回,但connect可能会导致上下文切换,因为CPU正在努力工作,所以在线程再次获得CPU时间并退出函数之前需要一段时间。
我知道(或者至少相当确定)阻塞套接字上的connect会导致上下文切换,但是非阻塞套接字上的connect会导致上下文切换吗?
发布于 2009-01-15 03:16:04
根据其定义,非阻塞调用不会导致上下文切换。但是,上下文切换可能会立即发生。
我不明白你说的是什么意思。据我所知,非阻塞套接字上的连接应该立即返回。一方面,是的,无论连接是否完成,后续的代码行都将执行,因此在这种意义上,它将立即返回。如果你的意思是它会立即返回,因为在它返回之前不会发生上下文切换,那么你就错了。
发布于 2009-01-15 04:23:38
上下文切换在任何时刻都是可能的,无论是非阻塞连接、阻塞连接,还是在连接之前/之后的任何时间。只是当连接过程还没有完成时,非阻塞连接可能会返回。
在任何现代操作系统中,在正常程序运行的任何阶段都可以进行上下文切换。永远不能保证某段代码不会中断运行。(只有那些对系统非常关键的人才会获得这样的特权)
发布于 2009-01-15 10:51:36
此外,这个调用需要深入到内核,这已经意味着需要花费一些时间。正如其他人所指出的:上下文切换可以在任何时候发生。您可以使用一些技巧(如使用稍高的优先级等),但事实是,使用非实时操作系统时,您无法保证分配的时间片、完成某些操作所需的时间等。
https://stackoverflow.com/questions/443128
复制相似问题