2009-01-14 27 views
1

我在使用winsock並在非阻塞套接字上調用connect。當CPU被其他進程佔用時,我偶爾會看到一些延遲(最多200毫秒)。據我所知,非阻塞套接字上的connect應立即返回,但可能connect會導致上下文切換,並且由於CPU正在努力工作,需要一段時間才能再次獲取CPU時間並退出該功能。解除阻塞連接到套接字會導致上下文切換嗎?

我知道(或者至少相當肯定)阻塞套接字上的connect會導致上下文切換,但是在非阻塞套接字上會產生一個上下文切換嗎?connect

回答

1

非阻塞呼叫將不會導致上下文切換,它的定義很明確。但是,上下文切換可能會立即發生。

我不確定你在這裏是什麼意思。 「據我所知,非阻塞套接字上的連接應立即返回。」一方面,是的,無論連接是否完成,後續的代碼行都會執行,因此在這種意義上它會立即返回。如果你的意思是它會立即返回,因爲在它返回之前沒有任何上下文切換會發生,你會不正確。

1

無論是非阻塞連接,阻塞連接還是連接前/後的任何時間,上下文切換始終可以隨時進行。只是當連接過程尚未完成時,非阻塞連接可能會返回。

在任何現代操作系統中,上下文切換都可以在正常程序運行的任何階段進行。從來沒有任何保證,某段代碼將不間斷地運行。 (只有那些對系統非常關鍵的人才能獲得這樣的特權)

1

另外,這個調用需要下到內核,這已經意味着花了一些時間。正如其他人所指出的那樣:上下文切換可隨時發生。你可以做一些技巧(比如使用稍微更高的優先級等),但事實是,使用非實時操作系統,你對分配的時間片,完成某些操作所需的時間等沒有任何保證。