2012-12-21 3 views
2

간단한 질문입니다. 나는 unix/linux/etc의 fork가 실제로 전체 이미지를 복사하지는 않지만 copy-on-write 플래그로 공유 메모리를 private으로 매핑한다는 아이디어에 익숙하다. 이것을 설명하기 위해, 나는 다음과 같은 예제를 시도해 보았다. 나는 큰 malloc'd 영역을 private (copy on write)로 보여줄 것이라고 기대했다. 그러나, 나는 아래 출력을 얻는다. 왜 이런 일이 일어날 지 아무에게도 알려줄 수 있습니까? 내 가정은 내 OS가 예상대로 작동한다는 것입니다 (uname -a : Linux xxxxxx 2.6.32-279.19.1.el6.x86_64 # 1 SMP Tue 12 월 18 일 17:22:54 CST 2012 x86_64 x86_64 x86_64 GNU/Linux)하지만 pmap은 .. 내가 예상대로 작동하지pmap 및 fork : 내 사본은 쓰기 플래그에 어디에 있습니까?

int main(int argc, char *argv[]) { 

    pid_t pid; 
    char syscmd[80]; 
    char *somebuffer=(char*)malloc(999999999l); 
    pid = fork(); 
    if (0 == pid) { /* Child */ 
      sprintf(syscmd, "pmap -x %d", getpid()); 
      system(syscmd); 

    } else { /* parent */ 
      wait(NULL); 
    } 

    return 0; 
} 

출력 :

9822: ./a.out 
Address   Kbytes  RSS Dirty Mode Mapping 
0000000000400000  4  4  0 r-x-- a.out 
0000000000600000  4  4  4 rw--- a.out 
000000357e000000  128  24  0 r-x-- ld-2.12.so 
000000357e21f000  4  4  4 r---- ld-2.12.so 
000000357e220000  4  4  4 rw--- ld-2.12.so 
000000357e221000  4  4  4 rw--- [ anon ] 
000000357e400000 1572  120  0 r-x-- libc-2.12.so 
000000357e589000 2048  0  0 ----- libc-2.12.so 
000000357e789000  16  12  8 r---- libc-2.12.so 
000000357e78d000  4  4  4 rw--- libc-2.12.so 
000000357e78e000  20  16  16 rw--- [ anon ] 
00007f64228ad000 976576  16  16 rw--- [ anon ] 
00007f645e27b000  4  4  4 rw--- [ anon ] 
00007f645e27c000  4  0  0 r-x-- [ anon ] 
00007fff2a1eb000  84  12  12 rw--- [ stack ] 
ffffffffff600000  4  0  0 r-x-- [ anon ] 
---------------- ------ ------ ------ 
total kB   980480  228  76 

::이 큰 지역 (그리고 아마도 다른 사람이) 비공개로 표시되지 않는 이유는 무엇입니까?

감사합니다.

답변

0

나는 pmap 프로그램이이 정보를 인쇄하지 못한다고 생각합니다. 그냥 cat /proc/%d/maps 대신에 이상한 유틸리티를 사용하는 이유는 무엇입니까?

+0

답장을 보내 주셔서 감사합니다. 필자는 proc map이 copy-on-write 정보를 보여주지 못했기 때문에 pmap 프로그램을 시도한 것입니다. 아마도 pmap도이 정보를 표시하지 않습니다. – user1922401

+0

도 마찬가지입니다. 이'pmap' 유틸리티는'/ proc/% d/smaps'의 내용을 포맷하는 것 외에는 아무 것도하지 않는 것 같습니다. –

+0

이것은 옳은 대답 인 것처럼 보입니다.이 대답은 맨페이지에 동의하지 않습니다. 다른 OS 변형에 다른 버전이이 정보에 액세스 할 수 있는지 궁금합니다. – user1922401

0

pmap이 "copy-on-write"를 나타내는 방법을 잘 모르겠지만 커널 외부에서 볼 수 없다는 인상을 받았습니다 (즉, 두 번째 "anon"섹션은 malloc 된 영역입니다).), 그러나 나는 틀릴 수 있었다. 그것은 내가 그것을 찾고있는 곳이며, 올바른 크기에 관한 것입니다. 약간의 측정을 통해 메모리를 두 번 채우고 (소요 시간 측정) 어린이 프로세스에서 동일한 작업을 수행하면 두 번째 시간을 채우는 데 시간이 덜 걸리는 것을 확인할 수 있습니다. 포크 프로세스에서 처음으로 더 오래 걸립니다.

+0

응답 해 주셔서 감사합니다. 나는 당신이 pmap이 그 정보에 접근 할 수 없다는 것이 옳을 것이라 생각하며, 그 영역은 malloc의 것 (malloc이 그것을 제거한다고 언급) 인 것처럼 보인다. 내가 그것을 찾고 있었던 이유는 맨 페이지에 "모드 : 맵에 대한 사용 권한 : 읽기, 쓰기, 실행, 공유, 개인 (복사시 쓰기)"이므로 필드가 있습니다. – user1922401

0

상위 버전의 pmap에는 새로운 옵션`-X '가 있습니다. 이 옵션을 사용하면 pmap이/proc/pid/smaps에 세부 정보를 표시합니다.