看板 C_and_CPP 關於我們 聯絡資訊
請問各位先進 pthread的切換時間點究竟是什麼時候呢?? 我原本期望pthread能像從前唸過的OS觀念一樣, 一個thread執行一段time slice 就換另一個thread執行, 而切換時機由OS schedualer決定. 但經過實驗後我發現 2個現象; 1. 一般而言, 在pthread中一旦某個thread開始執行無窮迴圈, 若沒呼叫sleep() 或pthread_yield()就永不切換到另個thread 2.若一個thread A負責接收socket封包(比如while迴圈中執行recvFrom()), 另一個 thread B負責處理其他工作, 即使thread B執行中而未曾呼叫sleep, 一旦kernel 收到封包, 就會去叫醒thread A(也就是換掉B), 然後執行recvFrom事務 請問以上2點是正確的嗎, 謝謝各位先進指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.61.242.17
tinlans:會實驗出 1. 的結果通常是程式壽命遠低於 time slice。 07/28 01:28
tinlans:因為實務上的 time slice 比想像中的大很多。 07/28 01:28
tinlans:2. 的話大概只能說對七成,剩下三成現階段不解釋也沒差。 07/28 01:29
hn12303158:請問timer slice大概有多長呢? 會超過5分鐘之類的嗎XD 07/28 01:30
hn12303158:請問tin大可以稍微點醒我第二點剩下的3成觀念為何嗎? 07/28 01:31
hn12303158:我真的很想知道 07/28 01:31
tinlans:單位至少是 ms,通常會根據 process 的 nice 值變化。 07/28 01:39
tinlans:目前看過的 5 到 100ms 都有,但是很多人測試的程式根本 07/28 01:40
tinlans:幾十 us 就跑完了,根本等不到它切換。 07/28 01:41
tinlans:對現在的 CPU 來說,ms 其實是很大的一個時間單位。 07/28 01:42
tinlans:2. 的剩下三成主要是很多事情未必真的是 kernel 在處理。 07/28 01:43
tinlans:但是同樣都是在背後有東西在運作,對你程式撰寫上不影響。 07/28 01:44
tinlans:所以現在先忽略沒差,不然實在講不完。 07/28 01:44
hn12303158:痾..但是我的程式其中2個thread都各自是個無窮迴圈 07/28 01:44
hn12303158:一但其中一個進入迴圈, 我就從來沒看過另外一個迴圈 07/28 01:45
hn12303158:印出的字樣了@@" 07/28 01:46
james732:http://nopaste.csie.org/a69b8 07/28 01:52
james732:像我這樣的程式碼 確實可以看到 111111222222 交互印出 07/28 01:53
tinlans:100% 是程式寫錯,可以給大家看一下你怎麼測的。 07/28 01:58
littleshan:用印出東西來測,要注意IO buffer的問題 07/28 15:02