contributed by <beieve7028
>
預期目標
函数式程序设计为什么至关重要 - BYVoid當中提到函數程式設計的優點:
這對於平行程式設計來說就很有誘惑,可以不用顧慮race condition的問題,在適合的任何地方壓榨硬體的效能。
從學習的教材看到有使用glib,才發覺這個函式庫有點強大,趕緊玩看看。
結果出現一個 error:
configure: error: *** Working zlib library and headers not found ***
從這裡看到解法於是安裝了:
zlib-1.2.8
然後又一個新問題:
configure: error: *** Could not find libmount
到這邊還無法順利解決believe7028
這隻地鼠要努力的把書燒掉,過去直覺上會採用平行計算,但是現在可以使用並行的技巧:
可以看到上面每個地鼠各有分工,有的是拿書、有的運書、有的是中繼站、也有最後負責燒書的,這種分工跟平行計算不同,平行計算是同時各個獨立的計算各別完成,而這種並行的計算則是需要溝通,像go language有所謂的通道。在作業系統當中也可以見到類似的概念,譬如IO裝置與儲存裝置與CPU之間的配合,就是一種分工,當程式計算完成後,資料可能會從暫存器->cache->main memory->disk一層一層的傳遞。這種計算的方式避免的平行計算的一些問題,例如race condition。再從上面這圖來說,他也可以平行(分成上下)。
我在使用Visual Studio Code以debug 模式追蹤時,看到使用了mmap,從說明可以了解這是一種將檔案物件直接對應到虛擬記憶體的技巧,具有能以指標操作且存取不因寫入緩衝存在而提昇速度,以下是函式界面的說明:
而由此可以知道
函數說明:munmap()用來取消參數start 所指的映射記憶體起始地址,參數length 則是欲取消的記憶體大小。當行程結束或利用exec 相關函數來執行其他程式時,映射記憶體會自動解除,但關閉對應的文件描述詞時不會解除映射。
而對於並行的使用pthread_setconcurrency
,參考了這篇的說明
裡面有特別指出設定的值不保證會執行對應的並行度。
這裡則說明了thread pool要注意的缺點。
不是什麼情況都適合使用thread,而這篇更生動的形容thread pool的機制:
這裡則以簡單的程式碼說明thread pool的如何以Lock-Free實作,主要的原理是以具有 atomic 特性的計算操作來達成。
這同學當中有特別去比對資料而發現bug的存在,因此先以他的成果進行修改。
再來則以這他所整理重構的要點對程式碼修改