---
# System prepended metadata

title: 2025q1 Homework5 (assessment)

---

# 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 ? 兩者差別是 ?


