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
是表示式,依據指定程式碼風格撰寫,以最精簡的形式Welcome message and DL Server - Daniel Bristot de Oliveira
Jul 2, 2025RCU (Read-Copy Update) 是一種資料同步機制,在 Linux 核心扮演重要作用。RCU 適用於頻繁的讀取 (即多個 reader)、但資料寫入 (即少量的 updater/writer) 卻不頻繁的情境,例如檔案系統,經常需要搜尋特定目錄,但對目錄的修改卻相對少,這就是 RCU 理想應用場景。
Jul 2, 2025許多文件、程式碼和技術討論會看到 lock-free 和 lockless 字眼,例如 DPDK Programmer’s Guide 就在一份文件中存在上述二個術語。二者的差異是什麼呢?
Jul 2, 2025無論是作業系統核心、C 語言函式庫內部、程式開發框架,到應用程式,都不難見到 linked list 的身影,包含多種針對效能和安全議題所做的 linked list 變形,又還要考慮到應用程式的泛用性 (generic programming),是很好的進階題材。
Jul 2, 2025or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up