如果你的系統是有OS的,Cooperative Schedular又能帶來什麼好處呢?
有許多人會覺得有OS的時候,就可以利用OS的各種API來達成延遲、計時的動作。因為我的工作環境是使用Linux,因此也能夠使用thread來做平行處理。但是有時候我只需要一個簡單的計時功能,計時到了就改變一個變數的值而已,這時也要用thread嗎?或許有人會說用OS提供的timer就可以了阿~~但是OS提供的Timer裡面大多都會用到system call來完成timer的工作,更有OS是新開一個thread來做timer的工作。這些有用到system call的API,最好不要太頻繁的使用,每呼叫一次都要做一次排程,每做一次排程就要context switch等一系列的動作。
但如果是使用Cooperative Schedular來做簡單的計時工作,就可以很快速的在user space來做計時的工作。而且因為每個Task都是在同一個thread上的,所以Task之間共用到的資源不需要再考慮到惱人的同步問題。如果大大小小的東西都用Thread來執行,只要是globol的變數都要去注意它是否有被其他thread所使用,否則就會有race condition的情形。而且Task間沒有資源同步問題,也相當於節省了記憶體的開銷(所有Task可以輪流使用同一塊記憶體)。
依據我的經驗來使用Cooperative Schedular的話,我會在一個Task裡面的動作不會block的情況下全部加入Cooperative Schedular裡面。所謂會block的API大約有:recv()、fread()、read()、usleep()、sleep()、sigsuspend()。
有這麼多利,當然也有弊啦~~jitter是Coooperative Schedular最麻煩的情況了。當某個Task花的CPU時間特別久,那就會導致其他的Task也都在等它做完。不過我是認為這種情況是可避免的,程式是自己寫的,一定會知道它停在哪邊。但如果有一種情況,那就是CPU的loading太高了,高到jitter情況發生。那其實也沒辦法,因為CPU loading太高的話,就算是開thread一樣會lag。
沒有留言:
張貼留言