# 2024q1 Homework5 (assessment) contributed by < [`kkkkk1109`](https://github.com/kkkkk1109) > ## 閱讀 [因為自動飲料機而延畢的那一年](https://blog.opasschang.com/the-story-of-auto-beverage-machine-1/) 看了這個故事覺得很有感觸,起初對於自動飲料機,想像中的其實很簡單,只要寫個程式,做個模具,一切都會順其自然地完成了。但事實則不然,從 3D 印表機導致的公差錯誤,冰塊分配器的製作和運送,電路的焊接,到最後的第一杯飲料,過程都是複雜及瑣碎的。我覺得對我來說最大的啟發應該就是不懂裝懂這件事。在尚未實作或是實踐之前,都以為這個方法可行、簡單。但事實上,實際執行才會遇到實際會發生的問題。 在思考如何解決冰塊分配器的問題時,老師回答道 > 我相信這個問題絕對不會沒有人碰過,一定有人解決過,所以你不該卡在這裡,因為這件事卡在這裡是相當不值得的。 這句話非常打動我,無論是研究或是計畫中,常常遇到突然出現的問題,但這些事一定有人也有遇過,若台灣沒有,那其他國家可能會有。而真正該花心思的是如何去達成別人沒有達成的事,並且失敗是不可恥的,可恥的是無法接受失敗。 另一方面我也了解到,實際上的工程和理論真的是兩回事,在計畫的過程,也碰到理論如何運用到實際上,軟體如何整合到硬體上,處處都需要考量,我們教授也常講說,**要把自己想成衛星的角度思考**,而不能以一個上帝的角度看待事物。 ## 閱讀 CS:APP ### Concurrency ![image](https://hackmd.io/_uploads/HkJW1kTlA.png) LKMPG, locks, atomics, sched, CS:APP Ch12, false sharing false sharing -多核處理 cache line cache cohenrence ## 期末專題 TODO: https://hackmd.io/@sysprog/concurrency 並紀錄問題 TODO: quiz9/quiz10/quiz12 (or newer) 紀錄 ## Atomic 操作 :::info 為何使用 `alignas` 可以避免false sharing * false sharing * 當其中一個 thread 改變了快取中其中一個變數,而因此當另一個thread 要讀取這個memory 時 會導致cache miss(因為整個cache line 和 記憶體中不一樣) 導致要回去 memory 讀取並變更 cache line,即便所要存取的變數根本沒有變動(只是在同個cache line 上 所以可以利用 alignas 的方式 讓這兩個變數的地址間隔一個 cache line 的大小(64KB = 102464 = 2^16 ) 如此一來,當變更不同的變數時,不會造成持續更新 cache line 的狀況,也就是 false sharing。 ::: * 得到 mutex lock 後卻進入等待,不就造成 lock 卡住了嗎? ```cpp pthread_mutex_t *lock; pthread_cond_t *notFull, *notEmpty; void consumer(char* buf) { for(;;) { pthread_mutex_lock(lock); while(count == 0) pthread_cond_wait(notEmpty, lock); useChar(buf[count-1]); count--; pthread_cond_signal(notFull); pthread_mutex_unlock(lock); } } ``` :::info pthread_cond_wiat 會去查看條件是否成立,若需要等待的話,則會先釋放 lock ,直到條件成立。 ::: 在 [實作輕量級 mutex](https://hackmd.io/@sysprog/concurrency/%2F%40sysprog%2Fconcurrency-mutex) > condvar 不僅是互斥的同步機制,還要一種方式等待其他執行緒進行某些操作。當我們需要在臨界區段 A 中等待臨界區段 B 先完成某些操作時,可用 condvar。 一個 condvar 必須與一個 mutex 配對使用,因此等待 condvar 的過程實際上涉及二次等待: 等待 condvar 的訊號(通常由其他執行緒的發出) 等待所屬的 mutex lock 的釋放 這也意味著等待的執行緒需要兩次等待 (wait) 和兩次喚醒 (wake)。 不過上述的程式碼卻是先獲得 mutex 後,再查看 condvar ,並釋放 mutex lock, 給其他 thread 使用,直到 condvar 成立,但成立後便會馬上獲得 mutex 嗎? 或是要等 其他 mutex 釋放? 那有先後順序嗎?