2017-09-22 9 views
2

프로세스가 자식을 포크 할 때 자식은 아버지의 변수 을 복사하지 않지만 자식 프로세스가 아버지 변수의 값을 변경하면 새로운 변수가 만들어 지므로이 복사본을 쓰기 위해 호출합니다. 이제 다음 코드를 입력하십시오 :파이썬 복사본 작성, 진짜?

# coding=utf-8 
import os 
value = [] 
res = os.fork() 

if res == 0: 
    value = [324] 
    print 'child id={id} value={value}'.format(id=id(value), value=value) 
else: 
    value = [2] 
    print 'parent id={id} value={value}'.format(id=id(value), value=value) 

당신은 어쩌면이 같은 결과를 실행하는 경우 :

parent id=4321407056 value=[2] 
child id=4321407056 value=[324] 

내 질문은 :

(1) 변수 값의 메모리 주소, 그것은 동일하다 4321407056. 하지만 값을 변경 했으므로 변수에 새 값을 쓰면 메모리 주소가 변경되지 않는 이유는 무엇입니까?

(2) 메모리 주소가 같은 경우 왜 다른 값을 가지며 하나는 [2]이고 다른 하나는 [234]입니까?

+2

https://en.wikipedia.org/wiki/Virtual_memory – user2357112

+0

가상 메모리는 두 프로세스 모두 동일한 주소를 설명하지만 할당 된 후 주소가 변경되지 않은 이유는 무엇입니까? – geckos

답변

1

다른 프로세스입니다. 모든 현대 시스템은 이제 가상 메모리를 사용하기 때문에 응용 프로그램에 표시되는 주소는 실제로 정보가 실제로 저장된 위치와 일치하지 않습니다. 동일한 주소가 다른 응용 프로그램에 대한 것일 수 있습니다 : 힙 어딘가에, 디스크 파일에 매핑되거나, 디스플레이 장치에 매핑되거나, 존재하지 않거나 완전히 다른 것입니다.

프로세스가 fork되면 부모의 논리 메모리 맵이 유지됩니다. 그렇지 않으면 모든 포인터를 업데이트해야합니다. 그러나 맵은 변경 후에 완전히 다른 실제 메모리 영역을 가리 킵니다.