調查局三等申論題
115年
[資訊科學組] 作業系統及系統程式
第 二 題
📖 題組:
二、下列 Linux 程式使用 fork()建立子行程,並於父、子行程中分別建立執行緒。請閱讀下列 C 程式碼並回答問題。假設所有系統呼叫皆成功;PID與 Thread ID 的實際數值不固定,輸出順序則依 pthread_join()與 wait()所形成的先後關係判斷。 01 // 省略標頭檔 02 int value = 10; 03 void *worker(void *arg){ 04 int *local = (int *)arg; 05 value = value + (*local); 06 printf("PID=%d, TID=%lu, value=%d\n", 07 getpid(), (unsigned long)pthread_self(), value); 08 return NULL; 09 } 10 int main(void){ 11 int x = 5; 12 pthread_t tid; 13 pid_t pid = fork(); 14 if (pid == 0) { 15 x = 20; 16 value = value + x; 17 pthread_create(&tid, NULL, worker, &x); 18 pthread_join(tid, NULL); 19 printf("C_PID=%d, value=%d, x=%d\n", getpid(), value, x); 20 } else { 21 x = 30; 22 value = value + x; 23 pthread_create(&tid, NULL, worker, &x); 24 pthread_join(tid, NULL); 25 wait(NULL); 26 printf("P_PID=%d, value=%d, x=%d\n", getpid(), value, x); 27 } 28 return 0; 29 } (一)請分析上述程式碼之執行結果,分別說明父行程與子行程中變數 value與 x 的最終值,並列出可能的輸出內容。(10 分) (二)請從作業系統行程與執行緒管理的角度回答下列問題。(15 分) 1. 請說明 fork()執行後,父行程與子行程分別擁有之獨立或共享資源,包含虛擬位址空間、程式碼、全域變數、堆疊、檔案描述符及行程識別碼之關係。 2. 請說明同一行程內的多個執行緒共享及各自獨立擁有之資源,包含程式碼區、資料區、Heap、Stack、暫存器與 Thread ID。 3. 若同一行程中建立多個 worker 執行緒,且這些執行緒可能同時執行value = value + (*local);,請說明可能發生的同步問題,以及如何利用 Mutex 避免該問題。
二、下列 Linux 程式使用 fork()建立子行程,並於父、子行程中分別建立執行緒。請閱讀下列 C 程式碼並回答問題。假設所有系統呼叫皆成功;PID與 Thread ID 的實際數值不固定,輸出順序則依 pthread_join()與 wait()所形成的先後關係判斷。 01 // 省略標頭檔 02 int value = 10; 03 void *worker(void *arg){ 04 int *local = (int *)arg; 05 value = value + (*local); 06 printf("PID=%d, TID=%lu, value=%d\n", 07 getpid(), (unsigned long)pthread_self(), value); 08 return NULL; 09 } 10 int main(void){ 11 int x = 5; 12 pthread_t tid; 13 pid_t pid = fork(); 14 if (pid == 0) { 15 x = 20; 16 value = value + x; 17 pthread_create(&tid, NULL, worker, &x); 18 pthread_join(tid, NULL); 19 printf("C_PID=%d, value=%d, x=%d\n", getpid(), value, x); 20 } else { 21 x = 30; 22 value = value + x; 23 pthread_create(&tid, NULL, worker, &x); 24 pthread_join(tid, NULL); 25 wait(NULL); 26 printf("P_PID=%d, value=%d, x=%d\n", getpid(), value, x); 27 } 28 return 0; 29 } (一)請分析上述程式碼之執行結果,分別說明父行程與子行程中變數 value與 x 的最終值,並列出可能的輸出內容。(10 分) (二)請從作業系統行程與執行緒管理的角度回答下列問題。(15 分) 1. 請說明 fork()執行後,父行程與子行程分別擁有之獨立或共享資源,包含虛擬位址空間、程式碼、全域變數、堆疊、檔案描述符及行程識別碼之關係。 2. 請說明同一行程內的多個執行緒共享及各自獨立擁有之資源,包含程式碼區、資料區、Heap、Stack、暫存器與 Thread ID。 3. 若同一行程中建立多個 worker 執行緒,且這些執行緒可能同時執行value = value + (*local);,請說明可能發生的同步問題,以及如何利用 Mutex 避免該問題。
📝 此題為申論題,共 2 小題
小題 (二)
請從作業系統行程與執行緒管理的角度回答下列問題。(15 分)
1. 請說明 fork()執行後,父行程與子行程分別擁有之獨立或共享資源,包含虛擬位址空間、程式碼、全域變數、堆疊、檔案描述符及行程識別碼之關係。
2. 請說明同一行程內的多個執行緒共享及各自獨立擁有之資源,包含程式碼區、資料區、Heap、Stack、暫存器與 Thread ID。
3. 若同一行程中建立多個 worker 執行緒,且這些執行緒可能同時執行value = value + (*local);,請說明可能發生的同步問題,以及如何利用 Mutex 避免該問題。
1. 請說明 fork()執行後,父行程與子行程分別擁有之獨立或共享資源,包含虛擬位址空間、程式碼、全域變數、堆疊、檔案描述符及行程識別碼之關係。
2. 請說明同一行程內的多個執行緒共享及各自獨立擁有之資源,包含程式碼區、資料區、Heap、Stack、暫存器與 Thread ID。
3. 若同一行程中建立多個 worker 執行緒,且這些執行緒可能同時執行value = value + (*local);,請說明可能發生的同步問題,以及如何利用 Mutex 避免該問題。
思路引導 VIP
這題是作業系統核心概念題。1. fork() 出來的子行程是副本,哪些是複製(獨立)?哪些是共用(共享指標)?2. 執行緒被稱為「輕量級行程」,在同一個 Process 中,為了執行不同任務,哪些資源必須保留自己的狀態(Stack/Register)?哪些是整個 Process 共用(Heap/Data/Code)?3. 當多個 thread 同時修改共用變數時,會發生什麼經典問題(Race Condition)?如何用程式碼邏輯加上 Mutex 鎖來確保 Atomic 操作?
小題 (一)
請分析上述程式碼之執行結果,分別說明父行程與子行程中變數 value與 x 的最終值,並列出可能的輸出內容。(10 分)
思路引導 VIP
這題是經典的 fork 與 pthread 變數追蹤題。首先,fork() 發生時,全域變數 value=10 與區域變數 x=5 會發生什麼事(Copy on write)?接著進入 if/else。子行程 x 改為 20,value 變為 30,接著啟動 thread。在 thread 中 value 會再加多少?父行程 x 改為 30,value 變為 40,接著啟動 thread。thread 中 value 會加多少?最後要特別注意 pthread_join 和 wait() 的位置,這決定了輸出的先後順序。