포크는 프로세스의 메모리 레이아웃에 어떤 영향을 미치나요?

포크는 프로세스의 메모리 레이아웃에 어떤 영향을 미치나요?

다음 그림은 프로세스의 메모리 레이아웃을 보여줍니다.

:

누군가 forks()와 새로운 사람이 할당되면 task_struct프로세스의 주소는 어떻게 되나요 ? 즉, 프로세스가 있다고 가정하면 아래 다이어그램이 유지됩니다. 이제 포크를 만든다고 가정해 보겠습니다. 무슨 일이야?

답변1

분기 후에는 동일한 프로그램의 복사본이 두 개 생성됩니다. 커널은 모든 것을 복사할 수 있습니다.주소 공간또는쓰기 중 복사. 후자의 경우 텍스트와 데이터 부분은 항상 두 프로세스에서 공유될 수 있으며, 하위 프로세스가 스택을 수정해야 하는 경우 스택이 복사됩니다.

답변2

프로세스가 분기되면 Linux는 매우 적은 양의 복사를 수행하고 쓰기 중 복사 방식을 사용합니다. 이 쓰기 중 복사는 두 프로세스(상위 및 하위)가 모두 읽고 있는 경우 정확히 동일한 메모리 블록에서 읽음을 의미합니다. 그 중 하나가 해당 메모리에 쓰면 메모리가 복사되고 더 이상 공유되지 않습니다.

이제 프로그램은 이런 일이 일어나고 있는지 전혀 모릅니다. 이는 커널이 각 프로세스에 대해 페이지 테이블을 유지 관리하기 때문입니다. 프로세스가 "메모리 0xbeef에 액세스하고 싶습니다"라고 말하면 커널은 이를 실제 메모리의 실제 위치에 다시 매핑합니다. 이는 프로그램이 이러한 주소를 변수에 저장하므로 프로그램이 분기될 때 메모리의 데이터가 이동되었는지 여부나 위치를 알 수 없기 때문에 필요합니다(변수에 저장된 모든 주소는 계속 유효해야 합니다).
이것이 스왑이 작동하는 이유입니다. 커널은 데이터를 보관하는 물리적 메모리를 가져와 디스크에 저장할 수 있지만 프로그램은 여전히 ​​주소 0xbeef를 참조하고 커널은 이를 변환합니다.

따라서 커널이 복사하게 되는 절대 최소값은 이 주소 매핑을 수행하는 페이지 테이블과 작업 구조(열린 파일, 프로세스 상태, 보류 중인 신호 등 포함)입니다.

답변3

각 프로세스에는 고유한 주소 공간("가상 메모리"), 주소는 동일하게 유지되지만 변환 테이블에서 다른 메모리 주소를 참조할 수 있습니다(수정 시). 프로세스의 관점에서 보면 사용하고 보는 주소에는 아무런 변화가 없습니다.

답변4

전체 주소 공간이 복제됩니다. 즉, 다이어그램은 포크 이후의 두 가지 프로세스를 묘사합니다. 이러한 프로세스는 각각 다른 방식으로 사물을 변경하기 때문에 서로 다릅니다.

관련 정보