
다음 그림은 프로세스의 메모리 레이아웃을 보여줍니다.
:
누군가 forks()
와 새로운 사람이 할당되면 task_struct
프로세스의 주소는 어떻게 되나요 ? 즉, 프로세스가 있다고 가정하면 아래 다이어그램이 유지됩니다. 이제 포크를 만든다고 가정해 보겠습니다. 무슨 일이야?
답변1
답변2
프로세스가 분기되면 Linux는 매우 적은 양의 복사를 수행하고 쓰기 중 복사 방식을 사용합니다. 이 쓰기 중 복사는 두 프로세스(상위 및 하위)가 모두 읽고 있는 경우 정확히 동일한 메모리 블록에서 읽음을 의미합니다. 그 중 하나가 해당 메모리에 쓰면 메모리가 복사되고 더 이상 공유되지 않습니다.
이제 프로그램은 이런 일이 일어나고 있는지 전혀 모릅니다. 이는 커널이 각 프로세스에 대해 페이지 테이블을 유지 관리하기 때문입니다. 프로세스가 "메모리 0xbeef에 액세스하고 싶습니다"라고 말하면 커널은 이를 실제 메모리의 실제 위치에 다시 매핑합니다. 이는 프로그램이 이러한 주소를 변수에 저장하므로 프로그램이 분기될 때 메모리의 데이터가 이동되었는지 여부나 위치를 알 수 없기 때문에 필요합니다(변수에 저장된 모든 주소는 계속 유효해야 합니다).
이것이 스왑이 작동하는 이유입니다. 커널은 데이터를 보관하는 물리적 메모리를 가져와 디스크에 저장할 수 있지만 프로그램은 여전히 주소 0xbeef를 참조하고 커널은 이를 변환합니다.
따라서 커널이 복사하게 되는 절대 최소값은 이 주소 매핑을 수행하는 페이지 테이블과 작업 구조(열린 파일, 프로세스 상태, 보류 중인 신호 등 포함)입니다.
답변3
답변4
전체 주소 공간이 복제됩니다. 즉, 다이어그램은 포크 이후의 두 가지 프로세스를 묘사합니다. 이러한 프로세스는 각각 다른 방식으로 사물을 변경하기 때문에 서로 다릅니다.