linux2022
目的: 檢驗學員對 並行和多執行緒程式設計 的認知
作答表單:
1
考慮到一個 lock-free 的軟體計時器實作,測試程式如下:
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include "lf_timer.h"
#define EX_HASHSTR(s) #s
#define EX_STR(s) EX_HASHSTR(s)
#define EXPECT(exp) \
do { \
if (!(exp)) \
fprintf(stderr, "FAILURE @ %s:%u; %s\n", __FILE__, __LINE__, \
EX_STR(exp)), \
abort(); \
} while (0)
static void callback(lf_timer_t tim, lf_tick_t tmo, void *arg)
{
lf_tick_t tck = lf_timer_tick_get();
printf("Timer %d expiration %#" PRIx64 " now %#" PRIx64 "\n", tim, tmo,
tck);
*(lf_tick_t *) arg = tck;
}
int main(void)
{
lf_tick_t exp_a = LF_TIMER_TICK_INVALID;
lf_timer_t tim_a = lf_timer_alloc(callback, &exp_a);
EXPECT(tim_a != LF_TIMER_NULL);
EXPECT(lf_timer_set(tim_a, 1));
EXPECT(!lf_timer_set(tim_a, 1));
lf_timer_tick_set(0);
lf_timer_expire();
EXPECT(exp_a == LF_TIMER_TICK_INVALID);
lf_timer_tick_set(1);
lf_timer_expire();
EXPECT(exp_a == 1);
EXPECT(lf_timer_set(tim_a, 2));
EXPECT(lf_timer_reset(tim_a, 3));
lf_timer_tick_set(2);
lf_timer_expire();
EXPECT(exp_a == 1);
EXPECT(lf_timer_cancel(tim_a));
lf_timer_tick_set(3);
lf_timer_expire();
EXPECT(exp_a == 1);
EXPECT(!lf_timer_reset(tim_a, UINT64_C(0xFFFFFFFFFFFFFFFE)));
EXPECT(lf_timer_set(tim_a, UINT64_C(0xFFFFFFFFFFFFFFFE)));
EXPECT(lf_timer_reset(tim_a, UINT64_C(0xFFFFFFFFFFFFFFFE)));
lf_timer_expire();
EXPECT(exp_a == 1);
lf_timer_tick_set(UINT64_C(0xFFFFFFFFFFFFFFFE));
lf_timer_expire();
EXPECT(exp_a == UINT64_C(0xFFFFFFFFFFFFFFFE));
lf_timer_free(tim_a);
printf("timer tests complete\n");
return 0;
}
預期執行輸出:
Timer 0 expiration 0x1 now 0x1
Timer 0 expiration 0xfffffffffffffffe now 0xfffffffffffffffe
timer tests complete
程式碼可參見 lf_timer,使用 C11 搭配 GNU extension。
請補完程式碼,使其運作符合預期。作答規範:
COND
為表示式FF1
和 FF2
為表示式延伸問題:
2
考慮到支援多個生產者—多個消費者的 bounded buffer lockfree 實作: gist (部分程式碼隱蔽)
程式碼使用 C11 Atomics 和 Threads 撰寫,預期執行輸出:
Test: Spsc: null_pointers : PASS
Test: Spsc: create : PASS
Test: Spsc: empty : PASS
Test: Spsc: full : PASS
Test: Spsc: sums10000 : PASS
Test: Mpsc: null_pointers : PASS
Test: Mpsc: create : PASS
Test: Mpsc: empty : PASS
Test: Mpsc: full : PASS
Test: Mpsc: sums10000 : PASS
Test: Spmc: null_pointers : PASS
Test: Spmc: create : PASS
Test: Spmc: empty : PASS
Test: Spmc: full : PASS
Test: Spmc: sums10000 : PASS
Test: Mpmc: null_pointers : PASS
Test: Mpmc: create : PASS
Test: Mpmc: empty : PASS
Test: Mpmc: full : PASS
Test: Mpmc: sums10000 : PASS
請補完程式碼,使其執行符合預期。作答規範:
MMM
是表示式,依據指定程式碼風格撰寫,以最精簡的形式資料整理: jserv
Jun 5, 2025指令集是 CPU 指令所組成的集合,可極縮至一指令 (OISC) 並達成圖靈完備,已用於同態加密晶片、可堆疊 FPGA 多核處理器,及經微碼擴充到 RISC-V 且通過形式化驗證的實作。NISC 與 ZISC 分別靠編譯器靜態排程與硬體向量比對取代指令解碼,換得低功耗與高吞吐;近期研究亦將單指令 FLEQ 硬編碼於迴圈 Transformer,顯示深度模型可直接充任通用運算主體。極簡控制邏輯正成為雲端隱私運算與專用加速器的技術選項。
Jun 5, 2025本文探討 spinlock 本身的效能和可擴展能力 (scalability) 議題
Jun 4, 2025本講座則是專注於作業系統領域,同時,"Microkernel" 也不全然指其 "micro" 微小之意,而且是探討相對於傳統 Monolithic kernel 的 Microkernel
Jun 3, 2025or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up