菜鳥初步學習,不對的地方請大神指教,參考《C#並行編程高級教程.pdf》
背景
當今計算機至少都有一顆雙核的微處理器,帶有四核、八核的計算機非常常見,在單個處理器上具有多個內核的時代正在來臨,現代微處理器提供了新型的多核架構,因此軟件設計和編碼能夠充分發揮這些架構的功能是非常重要的事情,也要與時俱進。
多核微處理器
多核微處理器有很多種不同的復雜微架構,意在提供更強的並行執行能力,提升吞吐量,減少潛在的性能瓶頸,縮減電源消耗,並減少發熱量,因此,現代很多的微處理器可以根據工作負載提升或降低每個內核的時鐘頻率,甚至可以將不在使用中的內核進入睡眠狀態,等需要這些內核的時候,操作系統又會喚醒它們。
多核處理器帶有一個以上的物理內核,每個物理內核都可能會提供多個硬件線程,也稱之為邏輯內核或者邏輯處理器。
Windows中每個運行的程序都是一個進程(process),每個進程都會創建並運行一個或者多個線程,也被稱為軟件線程(software thread),在一個進程當中只要有一個線程,這個線程我們稱之為主線程(main thread)。
操作系統的調度器在所有要運行的進程和線程之間公平的分享可用的處理資源,給每一個軟件線程分配處理時間,當Windows調度器運行在多核微處理器上時,調度器必須從物理內核支持的硬件線程中分配時間給一個需要運行指令的軟件線程。
Windows將每一個硬件線程識別為一個可調度的邏輯處理器,每一個邏輯處理器可以運行軟件線程代碼,運行多個軟件線程的進程可以充分發揮硬件線程和物理內核的優勢,並行地運行指令。Windows會給每一個可用的硬件線程分配一塊塊的處理時間,並通過這種方式運行上百個千個軟件線程。
基於任務的並行化設計規則
1.將每個問題分為很多子問題,不需要考慮子問題任務的執行順序(能夠以並行方式處理的數據,能夠以某種復雜的並行化處理的數據流等)
2.考慮不用問題連接起來的必要性,需要避免任務與任務之間的依賴性。
3.減少任務與任務之間的臨界區。
並行任務的利與弊
1.並行任務的運行和管理都是需要開銷的,在程序中需要執行的任務越多,並行的效果越好。
2.並行任務中對於共享的資源或數據越多,對並行任務的執行性能損耗越大,如果每個任務的資源都是獨立存在的,性能會好很多。
多線程
多線程是指從軟件或者硬件上實現多個線程並發執行的技術,具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多於一個線程,進而提升處理能力。
多線程與並行計算區別 參考http://blog.csdn.net/delacroix_xu/article/details/5928121
本質上沒有區別,多線程的作用不只是並行計算,還有其他的作用(如降低阻塞,在單核時代,多線程的這個消除阻塞的作用我們稱之為“並發”,這和並行本質上是不同的 )
並行計算還可以通過其他的手段來獲得,多線程只是其中一種方式(如多進程)
寫的有點亂,大家稍微講究著看下,主要是windows調度器,多核微處理器,硬件線程,軟件線程之間的關系 以及 並行任務開發的良好的約束,不對的地方希望大家指正
左移運算符(<<)
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a << 2 將a的二進制位左移2位,右補0,
左移1位後a = a * 2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
右移運算符(>>)
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
操作數每右移一位,相當於該數除以2。
例如:a = a >> 2 將a的二進制位右移2位,
左補0 or 補1 得看被移數是正還是負。
左移運算符(<<)
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a << 2 將a的二進制位左移2位,右補0,
左移1位後a = a * 2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
右移運算符(>>)
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
操作數每右移一位,相當於該數除以2。
例如:a = a >> 2 將a的二進制位右移2位,
左補0 or 補1 得看被移數是正還是負。