調查局三等申論題
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() 的位置,這決定了輸出的先後順序。