--- tags: linux2024 --- # [2024q1](http://wiki.csie.ncku.edu.tw/linux/schedule) 第 13 週測驗題 :::info 目的: 檢驗學員對 [Atomics 操作](https://hackmd.io/@sysprog/concurrency-atomics), [Ring buffer](https://hackmd.io/@sysprog/concurrency-ringbuffer), futex, mmap 的認知 ::: ==[作答表單: 測驗 1-2](https://docs.google.com/forms/d/e/1FAIpQLSdemKSCyhqZQ_AsQ54n4N0L8KWZxi0mbwgpZL5Qkm0O_PEnQw/viewform)== (針對 Linux 核心「設計/實作」課程) ### 測驗 `1` spms 是個使用 C11 撰寫的單一發布者多訂閱者 (Pub/Sub模型,參見 [Build a one-to-many Pub/Sub system](https://cloud.google.com/pubsub/docs/building-pubsub-messaging-system)) 環狀緩衝區,適用於共享記憶體。發布者在不知道訂閱者的情況下,將訊息寫入環狀緩衝區,當訂閱者讀取一條訊息時,該訊息不會從環狀緩衝區中移除,其他訂閱者仍然可讀取。若訂閱者的讀取速度不夠快,它將錯過一些訊息。 > [系統設計入門:Pub/Sub Pattern](https://medium.com/jimmy-wang/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-pub-sub-pattern-ec391aca22aa) ![image](https://hackmd.io/_uploads/HyztYPQQ0.png) 測試方式: * 在一個終端機執行: `./test pub` 作為發布者 * 在另一個終端機執行: `./test sub` 作為訂閱者 [原始程式碼](https://gist.github.com/jserv/250d7e601e652cdbfce25304a75092d6) 編譯方式 ```shell $ gcc -Wall -O2 -o test test.c spms.c -lrt -lpthread ``` 參考輸出: ``` Msg: This is a key message Msg: Msg: Thu May 16 18:49:11 2024 Msg: Msg: Thu May 16 18:49:12 2024 Msg: Msg: Thu May 16 18:49:13 2024 Msg: Msg: Thu May 16 18:49:14 2024 Msg: Msg: Thu May 16 18:49:15 2024 Msg: Msg: Thu May 16 18:49:20 2024 Msg: Msg: Thu May 16 18:49:21 2024 Msg: Msg: Thu May 16 18:49:22 2024 ``` 目前的 ring buffer 是 blocking,意味著當緩衝區是空的時候,讀取端會等到有資料為止。 作答規範: * AAAA, BBBB 是 FUTEX 的操作名稱,搭配 [並行程式設計: 實作輕量級的 Mutex Lock](https://hackmd.io/@sysprog/concurrency-mutex) * CCCC, DDDD 是表示式