--- tags: linux2023 --- # [2023q1](http://wiki.csie.ncku.edu.tw/linux/schedule) 第 15 週測驗題 :::info 目的: 檢驗學員對[並行和多執行緒程式設計](https://hackmd.io/@sysprog/concurrency)和《Demystifying the Linux CPU Scheduler》的認知 ::: ==[作答表單](https://docs.google.com/forms/d/e/1FAIpQLScoEjK-c9nFDcieMA3bKiu86Ktv9gMRUvJ9sA1tVBwrlWlCCw/viewform)== ### 測驗 `1` 考慮我們想要實作一個 lock-free 的 single-producer/single-consumer (SPSC) 並行程式,底層使用 [ring buffer](https://en.wikipedia.org/wiki/Circular_buffer),且避免 [false sharing](https://en.wikipedia.org/wiki/False_sharing)。程式碼可見: [main.c](https://gist.github.com/jserv/03adfccf69ffc756a7504f9caf7058e9) (部分遮蔽) 編譯方式: ```shell gcc -Wall -O2 -I. -o main main.c -lpthread ``` 測試程式的參考輸出: (其中 `4` 指定 4 個處理器核) ```shell $ ./main consumer 1: ---2---- producer 0: ---1---- consumer 2: ---4---- Consumer created... consumer 3: ---6---- Consumer created... Consumer created... producer 7 cycles/op consumer: 21 cycles/op consumer: 21 cycles/op consumer: 21 cycles/op Done! ``` 其中利用到針對多核處理器的 [spinlock: significant optimizations](https://en.wikipedia.org/wiki/Spinlock#Significant_optimizations) 技巧,對照 [cserv](https://github.com/sysprog21/cserv) 專案的 [src/util/spinlock.h](https://github.com/sysprog21/cserv/blob/master/src/util/spinlock.h)。 已知執行過程不會遇到任何 assert 錯誤,請補完程式碼,使其執行符合預期。作答規範: * `AAAA` 和 `BBBB` 皆為表示式,不該有括號 (及 `(` 與 `)`) * 以最精簡的形式作答