1

런타임 주소 바인딩을 사용하면 프로그램에서 물리적 메모리의 프레임을 비 연속적으로 할당 할 수 있다는 것을 알게되었습니다. 또한, herehere으로 기술 된 바와 같이, 논리 어드레스 공간에서 프로그램의 모든 세그먼트는 인접하지만, 모든 세그먼트가 나란히 배치되는 것은 아니다. 텍스트, 데이터, BSS 및 힙 세그먼트는 함께 배치되지만 스택 세그먼트는 배치되지 않습니다. 즉, 논리적 주소 공간에있는 어떤 프레임에도 매핑되지 않은 힙과 스택 세그먼트 (프로그램 중단과 스택 상단 사이) 사이에 페이지가 있으므로 논리적 주소 공간이 비어 있다는 것을 의미합니다 - 런타임 주소 바인딩의 경우 연속적입니다.프로그램의 메모리 레이아웃은 주소 바인딩 기술에 의존합니까?

enter image description here

하지만 컴파일 시간 또는로드 시간이 바인딩의 경우 메모리 레이아웃에 대한 ? 논리 주소 공간이 추상 주소 공간이 아니라 실제 실제 주소 공간이되었으므로 프로그램이 실제 메모리에 어떻게 배치 되었습니까? 더 구체적으로, 스택 세그먼트는 프로그램의 물리적 주소 공간에 어떻게 배치됩니까? 나머지 세그먼트와 함께 배치되거나 런타임 바인딩과 마찬가지로 개별적으로 배치됩니까?

답변

0

질문에 대답하려면 먼저 최신 운영 체제에서 stackheap 할당에 대해 설명해야합니다.

Stack은 계속 메모리 할당입니다. 여기서 cpu는 pushpop 명령을 사용하여 스택의 맨 위에서 데이터를 추가/제거합니다. 나는 당신이 이미 스택 작동 방법을 알고 있다고 가정합니다. 프로세스 스토어 - 반송 주소, 함수 인수스택 오버플로 함수가 호출 될 때마다 더 많은 데이터가 푸시됩니다 (궁극적으로 스택 오버플로가 발생할 수 있으므로 데이터가 계속 팝되지 않습니다 - 무한 재귀?). 스택 크기는 프로그램이 메모리에로드 될 때 고정됩니다. 대부분의 프로그래밍 언어를 사용하면 컴파일하는 동안 스택 크기를 결정할 수 있습니다. 그렇지 않은 경우 기본값을 결정합니다. Linux에서 최대 스택 크기 (하드 제한)는 ulimit으로 제한됩니다. 크기는 ulimit -s으로 확인하고 설정할 수 있습니다.

그러나 힙 공간은 * nix 시스템 (상응합니다, ulimit -v을 사용하여 확인)에 상한이 없으므로 모든 프로그램이 기본/설정된 힙 크기로 시작하고 필요한만큼 증가 할 수 있습니다. 프로세스의 힙 공간은 실제로 두 개의 연결된 목록, freeused 블록입니다. 힙에서 메모리 할당이 필요할 때마다 하나 이상의 여유 블록이 결합되어 더 큰 블록을 형성하고 사용 된 목록에 단일 블록으로 할당됩니다. 해제는 사용 된 목록에서 사용 가능한 목록으로 블록을 제거하는 것을 의미합니다. 블록을 해제 한 후 힙에 외부 조각화가있을 수 있습니다. 이제 무료 블록의 수가 전체 데이터를 포함 할 수없는 경우 프로세스는 OS에서 더 많은 메모리를 요청합니다. 일반적으로 더 새로운 블록은 상위 주소에서 할당됩니다. 따라서 힙 성장에 대한 위쪽 방향 다이어그램을 보여줍니다. 나는 다시 말하지만 - 힙이 더 높은 방향으로 메모리를 연속적으로 할당하지 않는다..

질문에 대한 답변을드립니다.

컴파일 타임 또는로드 타임 주소 바인딩의 경우 스택 및 힙 세그먼트는 프로그램의 실제 주소 공간에 어떻게 배치됩니까?

고정 스택은 컴파일 할 때 일부 힙 메모리와 함께 할당됩니다. 위에서 어떻게 배치했는지 설명했습니다.

에 대해 힙과 스택 사이의 공간이 예약되어 있습니까? 아니면 다른 프로그램에서 OS를 사용할 수 있습니까?

예 예, 프로그램 용으로 예약되어 있습니다. 그러나 프로세스는 힙에 빈 블록을 추가하기 위해 더 많은 메모리를 요청할 수 있습니다. 그것은 자신의 힙을 공유하는 것과는 다릅니다.

참고 : 질문이 광범위하므로 여기에서 다룰 수있는 많은 주제가 있습니다. 그 중 일부는 - 가비지 수집, 블록 선택, 공유 메모리 등입니다. 곧 여기에 참조를 추가 할 것입니다.

참고 : -