2013-03-08 105 views
6

Tôi có mã này và cố gắng tìm hiểu có bao nhiêu quy trình và chủ đề sẽ được tạo ra từ này:Có bao nhiêu quy trình và chủ đề sẽ được tạo?

pid t pid; 
pid = fork(); 
if (pid == 0) { /* child process */ 
fork(); 
thread create(. . .); 
} 
fork(); 

Tôi nghĩ rằng nó tạo ra 2 chủ đề, từ ngã ba bên trong nếu vòng lặp. và 8 quy trình? Nhưng tôi không chắc liệu điều đó có đúng không

+2

Không có vòng lặp. Đó là "nếu". – QuentinUK

+0

lý do tại sao 8 quy trình? một trong các cuộc gọi 'fork' là trong thử nghiệm nếu. – didierc

Trả lời

10

Thực ra, cần có 8 chủ đề và 6 quy trình.

Dưới đây là sơ đồ để làm cho nó rõ ràng:

1) after first fork(): 

    |------------------- child of p0 [p1] 
---|------------------- parent  [p0] 

2) after second fork(): 

     |--------------- child of p1 [p2] 
    |---|---------------    [p1] 
---|-------------------    [p0] 

3) after pthread_create(): 

      ----------- thread 1 of p2 [p2t1] 
     |---/----------- thread 0 of p2 [p2t0] 
     | ----------- thread 1 of p1 [p1t1] 
    |---|---/----------- thread 0 of p1 [p1t0] 
---|-------------------     [p0] 

4) after third fork(): 

     |------------ child of p2 [p5] 
     |  ------    [p2t1] 
     |-|-----/------    [p2t0] 
     | |---------- child of p1 [p4] 
     | | ------    [p1t1] 
    |---|---|---/------    [p1t0] 
    |  |------------ child of p0 [p3] 
---|-----|------------    [p0] 

quan trọng: Hãy nhớ rằng fork(2) nhái cuộc gọi chỉ các chủ đề mà thực hiện nó, do đó quá trình 4 [p4] chỉ có một thread (tương tự áp dụng để quy trình 5 [p5]).

+0

Câu hỏi này được lấy từ (theo như tôi có thể biết) _Operating System Concepts 9th Edition_, nói trên trang 183 rằng nếu "quá trình riêng biệt không gọi exec() sau khi forking, quá trình riêng biệt nên sao chép tất cả các chủ đề." Điều này có nghĩa là sẽ có 10 chủ đề. Điều này có chính xác không? Nó cũng nói rằng "Một số hệ thống UNIX đã chọn có hai phiên bản fork(), một bản sao tất cả các luồng và một bản sao khác chỉ sao chép chuỗi đã gọi ra lệnh fork() hệ thống." – Sammaron

+0

@Sammaron: Xem [trang người đàn ông này] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html). – jxh

7

Một quy trình bổ sung sẽ được tạo mỗi lần fork được gọi.

Trong lần gọi đầu tiên tới fork, quy trình cha mẹ P tạo quy trình con SP1. Sau ngã ba, quá trình cha mẹ gọi lại fork lần nữa (bỏ qua if), tạo quy trình con SP2.

SP1 sau khi gọi số lẻ fork bên trong if, tạo SSP1 tiểu phụ. SP1 sau đó sinh ra một chuỗi. SP1 rời khỏi if. và gọi lại số fork, tạo SSP2 tiểu phụ.

SSP1 sinh ra một chuỗi. SSP1 rời khỏi if và gọi số fork, tạo SSSP tiểu phụ.

Vì vậy, các quy trình được tạo: SP1, SP2, SSP1, SSP2, SSSP = 5 quy trình. Nếu bạn đếm quá trình gốc P, có 6 quy trình.

Chỉ chuỗi chủ đề SP1 và SSP1, do đó, có 2 chuỗi được tạo. Nếu bạn đếm tất cả các chủ đề chính của tất cả các quy trình, có 7 hoặc 8 luồng, tùy thuộc vào việc bạn có đếm quá trình gốc hay không P.

Một minh họa về các quy trình và chuỗi được tạo tương quan với mã.

      P 
pid t pid;    | 
pid = fork();   +------SP1 
if (pid == 0) {   |  | 
fork();     |  +---------------SSP1 
thread create(...);  |  |-SP1's thread |-SSP1's thread 
}      |  |    | 
fork();     +-SP2 +-SSP2   +-SSSP 
         | | | |    | | 
0

không nên là 2 luồng và 6 quy trình?

M 
| ↘ 
M  A 
|  |↘ 
M  A* B* 
|  | | 
| ↘ | ↘ |↘ 
M C A D B E 

khi tôi sử dụng * để biểu thị chuỗi.