forking 후의 heap과 stack
글쓴이: 서지훈 / 작성시간: 일, 2007/02/04 - 7:21오후
int fork_heap_test( void ) { #if 0 char *ptr1 = (char *) malloc( 0x10 ); #else char *ptr1 = NULL; #endif char array1[0x10] = ""; #if 0 memset( ptr1, 0, 0x10 ); #endif if ( fork() == 0 ) { printf( " ## child process\n" ); ptr1 = (char *) malloc( 0x10 ); memset( ptr1, 0, 0x10 ); memset( ptr1, '0', 0xf ); memset( array1, 'C', 0xf ); printf( " ## ptr1 = [%p][%s]\n", ptr1, ptr1 ); printf( " ## array1 = [%p][%s]\n", array1, array1 ); sleep(3); free( ptr1 ); exit(0); } else { printf( "\n ## parent process\n" ); ptr1 = (char *) malloc( 0x10 ); memset( ptr1, 0, 0x10 ); memset( ptr1, '1', 0xf ); memset( array1, 'P', 0xf ); printf( " ## ptr1 = [%p][%s]\n", ptr1, ptr1 ); printf( " ## array1 = [%p][%s]\n", array1, array1 ); wait(NULL); free( ptr1 ); } return 0; }
위 소스를 수행한 결과가 아래와 같습니다.
## child process ## ptr1 = [0x80499b8][000000000000000] ## array1 = [0xbfffd9a0][CCCCCCCCCCCCCCC] ## parent process ## ptr1 = [0x80499b8][111111111111111] ## array1 = [0xbfffd9a0][PPPPPPPPPPPPPPP]
제가 테스트 하기 전에는 heap도 stack 주소도 어떻게든 갈라 줄거라 믿었는데 아니더군요.
그러나 주소는 같은데 실제 공간은 다르네요.
child에서 ptr1에서 한 작업이 parent에는 영향을 주지 않더군요.
제가 볼땐 다른건 몰라도 malloc()에서 잡은 주소라도 child와 parent가 달라 져야 하는게 아닌지 ?
이것 조차도 같더군요.
분명이 메모리를 잡고 free()도 하지 않았는데.
저의 내공이 부족해서 인지... 이런 기이한 것도 있더군요.
여기에 대해서 좀 더 봐야 할 듯합니다.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
Forums:
0x80499b8 이라는 값이
0x80499b8 이라는 값이 물리적인(?) 메모리 주소가 아니고 프로세스 address space를
가르켜서 그런 것이 아닐까요?
---------------------
protected mode에서 모든
protected mode에서 프로세스는 virtual memory address상에서 작업하지요.
0x80499b8는 linear address이고요.
fork() 자체의
fork() 자체의 기능이
프로세스의 모든 정보를 그대로 복사한 새로운 프로세스를 생성하는거죠.
정보에는 파일디스크립터(소켓포함), 메모리사용현황/관리체계 등이 모두 포함됩니다.
그리고 메모리는 copy-on-write라고 해서 쓰기가 일어나는 시점에 복사가 되죠.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
윗분들 말씀처럼...
보호모드 상태이기 때문에 주소는 동일하지만 실제 물리 주소는 다릅니다. 두 프로세스는 같은 메모리 주소를 지정해도 서로의 메모리 영역을 볼 수 없습니다. 그리고 copy-on-write 때문에 실제 데이터를 기록하기 전에는 같은 주소영역에 매핑되어 있는 상태가 됩니다. (fork 직후에는 두 프로세스 모두 같은 내용을 가지고 있을 것이라고 생각할 수 있습니다)
댓글 달기