摘要:Task Schedulers
第一、task scheduler可以確保task被執行。
第二、(無論是Task Parallel Library與PLINQ)預設的task scheduler是ThreadPool。
第三、ThreadPool透過work-stealing實現load-balancing、透過thread injection/retirement提高效能。
第四、ThreadPool透過Task Type的資訊支援fine-grained parallelism(short-lived units of work)。
第五、當一個應用程式呼叫QueueUserWorkItem或UnsafeQueueUserWorkItem時,被呼叫的工作項目會被置放在一個global FIFO(first-in, first-out) work queue,然後被下一個可用的thread取出。
第六、ConcurrentQueue<T> class透過實作lock-free algorithm,提高ThreadPool的效能。
第七、(並非由其他task衍生的)Top-level tasks被置放在global queue。
第八、(由top-level tasks衍生的)nested tasks與child tasks則是被置放在local LIFO(last-in, first-out) queue。
第九、local queue會被指定給負責執行parent task(可能是top-level tasks或者nested tasks與child task)的thread。
第十、當thread準備開始處理新的工作項目,將會優先搜尋local queue。
第十一、local queue採用LIFO的原因在於保有cache locality與減少競爭(reduce contention)。
參考資料來源:
[1]Task Schedulers
http://msdn.microsoft.com/en-us/library/dd997402(v=vs.110).aspx
補充資料來源:
[1]Work-Stealing in .NET 4.0
http://blogs.msdn.com/b/jennifer/archive/2009/06/26/work-stealing-in-net-4-0.aspx
[2]Building a custom thread pool (series, part 2): a work stealing queue
http://joeduffyblog.com/2008/08/11/building-a-custom-thread-pool-series-part-2-a-work-stealing-queue/
[3]Feedback requested: TaskManager shutdown, Fair scheduling
http://blogs.msdn.com/b/pfxteam/archive/2008/08/01/8800195.aspx
[4]New and Improved CLR 4 Thread Pool Engine
http://www.danielmoth.com/Blog/New-And-Improved-CLR-4-Thread-Pool-Engine.aspx
[5]thread injection
待補充正式資料來源
[6]Parallel computing
http://en.wikipedia.org/wiki/Parallel_computing#Fine-grained.2C_coarse-grained.2C_and_embarrassing_parallelism
[7]DATA LOCALITY & ITS OPTIMIZATION TECHNIQUES
http://courses.washington.edu/css448/zander/Presentf12/rajaram.pptx