2011-12-02 6 views
4

그것의 명백한이 주제에 대한 이전 post가 그 때문에 가상의 제안으로 우리는부모와 자식 주소 공간의 혼란

int 
main() 
{ 
    pid_t pid; 
    int y = 3; 
    if ((pid = fork()) <0) 
    return -1;; 

    if(pid == 0) /* child */ 
    { 
    printf(" before: %d %p\n", y, &y); 
    y *= 10; 
    printf("after: %d %p\n", y, &y); 
    } 
    else /* father */ 
    { 
    sleep(1); 
    printf("father: %d %p\n" , y , &y); 

    } 
    return 0; 
} 

인쇄 된 주소가 각각의 printf (대한 동일과 같은 코드 블록을)하고 있음 그러나 내 혼란은 이것이 각각의 부모와 자식이 별도의 물리적 주소 공간을 소유한다는 것을 의미하며, 그렇다면 왜 가상 주소가 다른가 궁극적으로 MMU에 의해 대응하는 물리적 주소 공간에 매핑 될 수 없다는 것을 의미합니다.

답변

1

예, 가상 주소가 충돌 할 수도 있지만 각기 다른 프로세스는 실제 메모리의 일부분을 소유하고 있으며 복사시 복사와 같은 최적화 기술을 종종 수행합니다.

대부분의 최신 구현은 copy-on-write를 사용합니다. 즉, 프로세스 중 하나가 메모리 조각을 수정하려고 시도 할 때까지 두 프로세스 모두 동일한 물리적 메모리를 참조합니다.

특별한 경우에 그것은 y이 두 프로세스에서 동일한 물리적 메모리를 참조해야 함을 의미하므로, 자식이이를 곱하여 수정합니다. 이 시점에서 커널은 y이있는 전체 페이지를 복사하여 두 프로세스가 다른 물리적 메모리를 참조하도록합니다.

+0

자손 프로세스에서 곱셈을 실행할 때까지 자식과 부모가 동일한 물리적 주소를 가리키고 실행이 완료되고 궁극적으로 값이 변경되면 커널이 원래의 실제 주소 공간을 모든 것을 새로운 것으로 복사 할 때까지 실제 주소와 지금은 자식 주소의 가상 주소가 있습니다. 그러나 가상 주소 공간의 유사성은 단지 최적화를위한 것입니까? –

+0

아니요, 필요합니다. 컴파일 된 프로그램은 가상 메모리 주소를 사용하여 변수에 액세스합니다 (물론 거의 모든 것). 이들은 컴파일 타임에 결정됩니다. – Viruzzo

2

그러면 유용한 이유가 없으면 모든 단일 포인터를 조정해야하기 때문입니다. 프로그램은 각 프로세스마다 동일하기 때문에 작업 할 때 동일한 가상 주소를 사용해야합니다. 동적 할당을 사용할 때 물론 가상 주소조차도 다를 수 있습니다.

0

여기서 &y과 함께 인쇄되는 내용은 가상 주소입니다. 그것들은 다를 수 있지만 fork 된 자식 프로세스의 경우 부모 프로세스에서와 동일합니다.

그러나 반대쪽에서 실제 주소는 부모와 자식에 따라 다릅니다. 그렇기 때문에 곱셈 후에도 값은 동일합니다.

관련 문제