2012-03-15 18 views
5

나는 "fork()"에 익숙하다. fork()가 현재 (호출 중) 프로세스의 정확한 복사본을 호출 할 때 어디서나 읽을 수있다. 다음 코드를 실행하면, 두 개의 다른 프로세스가 있어야한다. 두 개의 서로 다른 메모리 위치가 해당 변수 및 함수에 할당됩니다.fork가 사용될 때 메모리가 어떻게 매핑됩니까?

#include<stdio.h> 
int i=10; 
int pid; 
int main(){ 
    if((pid=fork())==0){ 
    i++;//somewhere I read that separate memory space for child is created when write is needed 
    printf("parent address= %p\n",&i);// this should return the address from parent's memory space 
    }else{ 
    i++; 
    i++; 
    printf("child address= %p\n",&i);// this should return the address of child's memory space 
    } 
    wait(0); 
    return(0); 
} 
 
Why The output looks like:: 
child address::804a01c 
parent address::804a01c 

왜 모두 주소는 부모뿐만 아니라 자녀에 대해 동일합니다?

+4

그들은 * 더 좋았습니다 * 같았습니다. 포인터가 두 프로세스 모두에서 동일한 방식으로 메모리를 참조하도록합니다 (두 메모리 덩어리가 구분되는 경우에도 마찬가지입니다). * 가상 메모리 *에 대한 내용을 읽으면 질문에 대한 대답을 얻을 수 있습니다. –

+1

두 복사본이 같은 가상 주소에 저장되어 있더라도 'i'의 * 값 *은 부모와 자식 사이에 다릅니다. – markgz

답변

8

두 개의 서로 다른 메모리 위치가 그들의 변수 및 기능에 할당되어있다.

Nope; Linux는 virtual memory을 구현합니다. 즉, 각 프로세스에는 자체 주소 공간이 있습니다. 결과적으로 fork 이후에 두 프로세스 모두 메모리 내 개체 복사본에 대해 동일한 주소를 보게됩니다.

:

+4

"aside"는 사실 아주 중요합니다. 자식 프로세스가 생성 될 때 실제로 복사되는 것은 없습니다. 이것은 Unix에서 (종종 새로운 프로세스를 생성 할 때마다) fork가 자주 발생한다는 점을 고려할 때 엄청난 성능 손실이 될 것입니다. 정확한 메커니즘은 "페이지 오류"에 의존합니다. 관심이 있다면 그들에 관해 읽을 수 있습니다. –

+0

괜찮 았어, 어떻게 가상의 것이 아닌 var의 실제 주소를 얻을 수 있니? (호기심을 만족시키기 위해 묻는 것) – buch11

+1

@ buch11 : 나는 할 수 없다고 생각하지만 전문가들에게 확인하게 할 것이다. 어쨌든,하지 않아야합니다. 이런 종류의 정보는 커널에 의해서만 알려져 있으며 프로세스 로컬 주소에만 액세스 할 수 있도록 해줍니다. 이를 "보호 된 메모리"라고합니다. 각 프로세스는 자체 메모리에만 액세스 할 수 있습니다. –

2

어드레스 프로세스 로컬 (제쳐두고 VM은 또한 코드가 물리적 메모리에서의 처리 사이에 공유되도록 모든 데이터 만 copied-on-write 될 것이다.). 한 프로세스의 804a01c은 다른 프로세스의 804a01c과 동일하지 않습니다.

2

virtual memory 때문에 두 주소 공간이 각각의 프로세스와 동일하게 보입니다. 저장된 실제 메모리는 다릅니다. 그러나 실제로는 해당 커널 페이지에 의해 구현되는 메모리 최적화가 복잡해지면서 해당 가상 페이지를 동일한 물리적 페이지로 매핑하여 해당 프로세스 중 하나가 페이지가 메모리 페이지에 기록 될 때까지 페이지가 물리적으로 복제됩니다 (그리고 가상 페이지는 프로세스를 위해 다시 매핑됩니다).

다른 많은 복잡한 점도 있습니다. 가장 일반적으로 인식되는 것은 fork()의 반환 값은 프로세스마다 다르지만 일반적으로 메모리가 아니라 레지스터 값의 차이입니다. 그러나 열린 파일 및 일부 다른 자원은 상속받지 못하도록 표시 될 수 있으므로 다른 차이가있을 수 있습니다. — 사소하지만 가끔 유용합니다.