我在使用winsock並在非阻塞套接字上調用connect
。當CPU被其他進程佔用時,我偶爾會看到一些延遲(最多200毫秒)。據我所知,非阻塞套接字上的connect
應立即返回,但可能connect
會導致上下文切換,並且由於CPU正在努力工作,需要一段時間才能再次獲取CPU時間並退出該功能。解除阻塞連接到套接字會導致上下文切換嗎?
我知道(或者至少相當肯定)阻塞套接字上的connect
會導致上下文切換,但是在非阻塞套接字上會產生一個上下文切換嗎?connect
?
我在使用winsock並在非阻塞套接字上調用connect
。當CPU被其他進程佔用時,我偶爾會看到一些延遲(最多200毫秒)。據我所知,非阻塞套接字上的connect
應立即返回,但可能connect
會導致上下文切換,並且由於CPU正在努力工作,需要一段時間才能再次獲取CPU時間並退出該功能。解除阻塞連接到套接字會導致上下文切換嗎?
我知道(或者至少相當肯定)阻塞套接字上的connect
會導致上下文切換,但是在非阻塞套接字上會產生一個上下文切換嗎?connect
?
非阻塞呼叫將不會導致上下文切換,它的定義很明確。但是,上下文切換可能會立即發生。
我不確定你在這裏是什麼意思。 「據我所知,非阻塞套接字上的連接應立即返回。」一方面,是的,無論連接是否完成,後續的代碼行都會執行,因此在這種意義上它會立即返回。如果你的意思是它會立即返回,因爲在它返回之前沒有任何上下文切換會發生,你會不正確。
無論是非阻塞連接,阻塞連接還是連接前/後的任何時間,上下文切換始終可以隨時進行。只是當連接過程尚未完成時,非阻塞連接可能會返回。
在任何現代操作系統中,上下文切換都可以在正常程序運行的任何階段進行。從來沒有任何保證,某段代碼將不間斷地運行。 (只有那些對系統非常關鍵的人才能獲得這樣的特權)
另外,這個調用需要下到內核,這已經意味着花了一些時間。正如其他人所指出的那樣:上下文切換可隨時發生。你可以做一些技巧(比如使用稍微更高的優先級等),但事實是,使用非實時操作系統,你對分配的時間片,完成某些操作所需的時間等沒有任何保證。