간단한 질문입니다. 나는 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
::이 큰 지역 (그리고 아마도 다른 사람이) 비공개로 표시되지 않는 이유는 무엇입니까?
감사합니다.
답장을 보내 주셔서 감사합니다. 필자는 proc map이 copy-on-write 정보를 보여주지 못했기 때문에 pmap 프로그램을 시도한 것입니다. 아마도 pmap도이 정보를 표시하지 않습니다. – user1922401
도 마찬가지입니다. 이'pmap' 유틸리티는'/ proc/% d/smaps'의 내용을 포맷하는 것 외에는 아무 것도하지 않는 것 같습니다. –
이것은 옳은 대답 인 것처럼 보입니다.이 대답은 맨페이지에 동의하지 않습니다. 다른 OS 변형에 다른 버전이이 정보에 액세스 할 수 있는지 궁금합니다. – user1922401