2014-02-12 5 views
0

일부 레코드를 정렬하려면 바이너리 프로세스 트리를 만들어야하지만 생성이 어려워졌습니다. 내가 뭐하는 거지 검사 오류를 포함하지 않은 나는 그가하고있는 유일한 이후 아버지의 코드를 포함하지 않은바이너리 프로세스 트리가 잘못된 결과를 나타냅니다.

void proc_tree(int i, int current_depth, int max_depth, int rec, int offset) 
{ 
    pid_t kid = fork(); 

    if(kid == 0) 
    { 
    printf("[%d,%d]: start: %d, end: %d\n", i, current_depth, rec, offset); 

    if(current_depth < max_depth) 
    { 
     int nodes= pow(2, current_depth); 

     if(i >= nodes) 
     i = 0; 

     proc_tree(2*i+1, current_depth+1, max_depth, rec, offset/2); 
     proc_tree(2*i+1, current_depth+1, max_depth, offset/2, offset); 
    } 
    } 
} 

: 나는 제품 proccesses의 이진 트리를이 재귀 코드를 사용하고 atm은 아이들이 끝나기를 기다리는 것입니다.

내가 얻고 출력은 다음이다 :

[0,0]: start: 0, end: 180 
[1,1]: start: 0, end: 90 
[3,2]: start: 0, end: 45 
[4,2]: start: 46, end: 90 
[2,1]: start: 91, end: 180 
[1,2]: start: 91, end: 90 
[2,2]: start: 91, end: 180 

하면 대부분의 값은 깊이 = 2 제 노드 ([1,2])와 ([2,2 미세하지만시피 ])에 잘못된 값이 있습니다. 우리는 깊이 = 2에서 총 181 개의 레코드를 얻었으므로 4 개의 노드가 있으므로 각 노드는 각각 약 45 개의 레코드를 관리해야합니다. 그래서 [1,2] (180)

내가 어떤 도움을 주시면 감사하겠습니다이

proc_tree(0, 0, 2, 0, 180); 

같은 주에서 함수를 호출하고, 137해야한다 (91), (136) 및 [2,2]을해야합니다. 미리 감사드립니다.

답변

2

fork은 새로운 프로세스를 만들고 각 프로세스에는 고유 한 메모리 복사본이 있다는 것을 알고 있습니다.

또한 OS는 어떤 순서로도 자유롭게 처리 할 수 ​​있습니다.

당신은 재귀를 생각하고 있습니다. 어떤 경우에는 포크가 필요하지 않습니다.

+0

네, 그 포크가 부모의 주소 메모리 사본을 생성한다는 것을 알고 있습니다. 할당을위한 바이너리 프로세스 트리를 생성하라는 요청을 받았는데 제대로 작동하는 방법을 알 수 없었기 때문에 인터넷에서이 솔루션을 찾았습니다.하지만이 방법도 작동하지 않습니다. 그리고 나는 시간 계획, 적어도 기초에 익숙하기 때문에 결과의 순서에 대해 걱정하지 않았습니다. 사실 이것이 제안과의 연결이었습니다. http://stackoverflow.com/a/13038661/2212484 –

+0

깊이 2의 산출물을 주문 했음에도 불구하고 공정은 0,45 - 46,90 - 91,136 - -137을 가져야합니다. , 80. 적어도 그 사건이 있어야합니다, 만약 내가 여기에 아무것도 그리워하지만 그 매개 변수와 함수를 호출 이후 포크 그 함수 안에 호출 된 가치가 인쇄해서는 안된다 (잘 나는 안된다. 그들이 내가 그들을 얻고 있기 때문에 그들이해야한다라고 생각해라, 나는 단지 이유를 해석 할 수 없다). 그리고 나는 엉덩이처럼 들리고 싶지 않았습니다 ... 나는이 일로 어려움을 겪고 있습니다. –

관련 문제