# 2025q1 Homework5 (assessment) contributed by < `mincch` > ## 閱讀〈[因為自動飲料機而延畢的那一年](https://blog.opasschang.com/the-story-of-auto-beverage-machine-1)〉的啟發 在課堂上老師很強調實驗,快速測試並修正程式錯誤。這種快速迭代的能力,在軟體開發中尤為重要。相較之下,作者在開發自動飲料機時,面臨了硬體試錯的高成本與長時間等待。例如,為了測試冰塊分配機構,作者需要等待工廠加工零件,這不僅耗時,還增加了開發的複雜度 。這讓我意識到,軟體開發的快速試錯特性,是我們應該善加利用的優勢。 作者在專案初期,對需求的理解並不充分,導致後續在功能實現上遇到許多困難。這提醒我,在開發前,應該花更多時間與使用者溝通,確保對需求有清晰的認識。在課堂專案中,第一次作業時沒有清楚的閱讀好作業規範,導致連測試都跑不起來,讓我學會了在做任何事情前需要明確的瞭解好需求、規格等等,來明確定義功能,這有助於減少後續的修改成本。 最後是文中作者提到和老師的對話:「你不能現在就放棄,要是現在就放棄的話,你這輩子日後遇到這種等級的困難,就只會想逃避而已。」這句話深深打動了我。在系統軟體開發的過程中,失敗是常態,關鍵在於我們如何面對失敗,從中學習並成長。並且在課堂中學習承受與處理失敗。 ## 問題與討論 閱讀教材 * [並行程式設計: 排程器原理](https://hackmd.io/@sysprog/concurrency-sched) 在教材中有提到 coroutine 於 1958 年由 Melvin Conway 提出,引述 Wikipidia 的描述: > Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed. Coroutines are well-suited for implementing familiar program components such as cooperative tasks, exceptions, event loops, iterators, infinite lists and pipes. Coroutine是允許在允許在執行中 suspend 與 resume ,來實現non-preemptive multitasking , 但是在後面提到coroutine 也可藉由 signal 等相關操作實作 preemptive 。 Coroutine 是 non-preemptive ,為何我們還要透過 signal等機制,把它轉成preemptive?這樣做的用意是什麼?為了解決什麼問題?,又會有哪些trade-off? 在 schedule() 裡面有這段程式碼,功能是從 task array 裡面用倒序的方式找出 counter 最大、也就是剩餘 timeslice 最多的 task: ```clike while (--i) { if (!*--p) continue; if ((*p)->state == TASK_RUNNING && (*p)->counter > c) c = (*p)->counter, next = i; } ``` 這裡是倒序掃描,而且比較運算是 >,代表如果有多個 task 的 counter 相同,會優先選到 index 較高的 task。 為什麼要用倒序來找需要執行的 task ? 並且 `(*p)->counter > c` 如果有相同 counter 的 task 也會因為他的 index 比較大而先選到,那麼 index 小的 task 會不會遇到 starvation 之類的問題? :::danger 務必依循指定的書寫風格:中英文間用一個半形空白字元區隔。 使用精準的詞彙來表示。 ::: 在 [並行程式設計: 排程器原理](https://www.youtube.com/watch?v=Y2uYOsRev7o) 的直播影片中有提到可以透過 setjmp/longjmp 保存/恢復執行上下文,以及 trampoline 是一個跳板函式(跳來跳去),既然我已經有了 setjmp/longjmp 為何還要多設計一個 trampoline ? 兩者差別是 ?