[몹시 궁금함] fork()시에 메모리를 어떻게 하는지요?
글쓴이: 익명 사용자 / 작성시간: 금, 2002/05/17 - 7:38오후
main()
{
x = malloc(....);
func(x);
free(x); <<--- 여기가 문제입니다..
}
func(x)
{
pid = fork();
if(pid == 0)
{
exec...(x,....); //차일드 루틴 수행;
}
}
다시 메인으로 돌아와서 메모리를 해제하려고 하니. 메모리 주소가 틀려
져 있더군요. 아마도 부모가 한번 메모리를 선언하고, 자식이 역시 또 한
번 메모리를 선언하기 때문이겠죠?
그런데 메모리는 선언한 곳에서 해제하는것이 원칙일텐데..
이런 경우는 메모리 주소가 누군가 바꾸어서, 어떻게 해제해야합니까?
이 자식이 메모리 또 선언하고 주소 바꾸고, exec성공적으로 수행하고..
나 몰라라 도망가서 메모리를 해제할 길이 읍네여..
못된자식이네여..-_-
꼴통같은 자식.. 부모 모르게 딴짓하고 도망이나 가고..
Forums:
Re: [몹시 궁금함] fork()시에 메모리를 어떻게 하는지요?
무슨 애기인지 잘은 이해가 안가지만 메모리 주소가 틀려진게
당연한듯 싶은데요.일단 앞에 애기하신대로 부모와 자식이 서로다른
메모리 공간을 선언했고 또 그 공간은 공유하지 않기때문에 주소가 다르게
나올거 같은데요.fork쓰시지 마시고 clone를 써보시죠.clone함수로는
부모와 자식간의 공간을 서로 공유할수 있습니다.
Re: 아무 문제없습니다
아무 문제없습니다.
문제가 있다면 다른 곳의 문제겠죠.
에러가 어떻게 나는지 다시 말씀해 보세요.
ㅋㅋㅋ
main()에서
x = malloc(); 한 후
printf("%u\n", x);
func(x);
printf("%u\n", x);
free(x);
이렇게 해서 주소를 비교해 보세요.
func() 이후 주소가 바뀌나요?
바뀐다면 func(x) 함수의 문제죠...
Re: [몹시 궁금함] fork()시에 메모리를 어떻게 하는지요?
문제가 되게 만들었네요.
하상근 wrote..
main()
{
x = malloc(....);
func(x);
free(x); <<--- 여기가 문제입니다..
}
func(x) 이순간 x라는 변수는 또다른 지역변수 영역을 할당받게 되죠.
즉 main함수의 malloc 선언한 x와는 이름만 같고 다른 변수란 뜻입니다.
이걸 해결하기 위해서(Call by reference) 포인터가 존재하지요.
{
pid = fork();
if(pid == 0)
{
exec...(x,....); //차일드 루틴 수행;
}
}
이런거는 swap예제에서 많이 나오는데...
기초가 안돼있군요.
c기본 공부부터 다시하시고 posix공부하심이...
Re^2: [몹시 궁금함] fork()시에 메모리를 어떻게 하는지요?
뭘까... ㅋㅋㅋ
Re^2: ????
별달리 문제 될게 없을 것 같은데요..
위에서 x는 포인터가 아닌가요?
다만, func()에서 x에 다른 값을 집어 넣을 경우
문제가 생길 수 있겠지요.
func()를 호출하기 전에, x값을 다른 변수에 복사해서
사용해 보시기 바랍니다.
Re: [몹시 궁금함] 부모의 내용을 그대로 복사 뜹니다.
님께서 올려주신 코드상으로는 문제 될것이 없을듯 하네요
포크하기전에, 이미 malloc을 하셨으니,
이 할당된 메모리는 차이드에도 유효합니다,
부모도 free해주고 child도 free해주어야 겠죠..
뭐... 차일드가 잠깐 실행하고 종료하는 것이라면,
프로세스가 정리될때 자동 정리 될테니 안해주어도 되겠지만요;;
그리고 작성하신 글 중에 메모리 주소가 바뀐다고 했는데,
이상하군요? 안바껴야 정상입니다.
가상메모리를 사용하기 때문에, 물리적인
메모리 주소는 부모와 자식이 다를수 있지만,
포크 직후의 자식과 부모의 가상메모리 내용은 동일합니다.
부모의 메모리를 그대로 복사하기 때문이죠.. 아 틀린게
하나 있군요 fork후에 리턴하는 pid값...
이런 이유로, 대량의 포크가 발생하면
커널이 메모리 복사하느라 바쁘기 때문에,
커널에선 COPY-ON-WRITE 알고리즘을 사용하지요;
먼고 하니, 일딴 부모의 메모리 주소를 참조하고 있다가
실제로 메모리 변경이 일어날때 그넘들을 복사하는 것이죠
Intel 80386 Protected Mode (한글)
http//www.ezdoum.com/stories.php?story=02/05/10/5990080
Overview of P6 address translation
(가상주소를 실제 메모리의 주소로 맵핑하는 과정)
http//www.ezdoum.com/stories.php?story=02/05/06/3601258
Re^2: ???
포인터의 주소를 넘겨주지 않는 한은 저 포인터값이
func()실행 뒤에도 바뀔리는 없지 않나요?
님이야말루 기본부터 다시 하셔야겠네 ㅡ.ㅡa
댓글 달기