execve()를 호출한 후 이전 스택, 힙 및 데이터 세그먼트(초기화 및 초기화되지 않음)는 어떻게 되나요?

execve()를 호출한 후 이전 스택, 힙 및 데이터 세그먼트(초기화 및 초기화되지 않음)는 어떻게 되나요?

execve()의 매뉴얼 페이지는 다음과 같이 말합니다.

execve()는 파일 이름이 가리키는 프로그램을 실행합니다. 이로 인해 호출 프로세스에서 현재 실행 중인 프로그램이 새 프로그램으로 대체됩니다.새로 초기화됨스택, 힙 및 데이터 세그먼트(초기화 및 초기화되지 않음)

호출 프로세스가 vfork()에 의해 생성된 경우exec()는 새 프로그램에 새 주소 공간을 제공한다는 의미이며 상위 주소 공간을 수정하지 않습니다..

호출 프로세스가 더 일반적으로 fork()에 의해 생성되는 경우 이전 "스택, 힙 및 데이터 세그먼트(초기화 및 초기화되지 않음)"는 일반적으로 어떻게 되나요? 그들의 공간이 확보되었나요?

execve()의 동작은 호출 프로세스가 생성되는 방식에 따라 달라지나요?

참조를 보기 전에 나는 execve()가 새 항목을 만드는 대신 이전 "스택, 힙 및 데이터 세그먼트(초기화 및 초기화되지 않음)"를 덮어쓸 것이라고 생각했습니다. 그래서 이 문장을 보고 왜 새로운 공간을 낭비하는지 궁금했습니다.

감사해요.

답변1

execve()의 동작은 호출 프로세스가 생성되는 방식에 따라 달라지나요?

아니요.

참조를 보기 전에 나는 execve()가 새 항목을 만드는 대신 이전 "스택, 힙 및 데이터 세그먼트(초기화 및 초기화되지 않음)"를 덮어쓸 것이라고 생각했습니다.

아니요: execve()는 새 세그먼트를 생성하고 이전 세그먼트를 해제합니다.

그래서 이 문장을 보고 왜 새로운 공간을 낭비하는지 궁금했습니다.

기억하세요, 우리는 가상 메모리에 대해 이야기하고 있습니다!

빈 세그먼트를 생성하면 세그먼트를 추적하기 위해 소량의 물리적 메모리만 할당됩니다. 이 할당 크기는 세그먼트 크기에 관계없이 고정됩니다.

작성된 각 페이지에 대해 물리적 페이지를 할당해야 합니다. 상위 프로세스가 많은 수의 페이지를 작성했을 수 있습니다. 그러나 하위 프로세스가 실행 중에 약간의 스택/힙/데이터만 사용한다면 상위 프로세스의 모든 더티 페이지에 대한 참조를 유지할 이유가 없습니다. 상위 프로세스가 종료되고 하위 프로세스가 계속 실행되면 메모리가 낭비됩니다.

이전 세그먼트 및 페이지에 대한 참조를 제거하는 것이 가장 효과적인 방법입니다. 왜냐하면 만약 그렇다면오직이 메모리를 참조함으로써 물리적 메모리를 해제할 수 있습니다.

관련 정보