2013-10-06 2 views
0

운영 체제에 관한 책을 읽었으며 "추가 시간이 글로벌 변수에 할당 된 공간의 일부가 수명에 할당되도록 공간을 설정해야합니다 스레드가 변수 범위에있는 동안에 만 할당 된 채로 남아 있습니다. "전역 변수가 로컬 변수와 다른 방식으로 메모리에 저장되는 방법

이해할 수없는 것은 프로그램을 메모리에로드 할 때 예약 된 주소가 아닌 경우입니다. 공전? 변수가 범위를 벗어나면 운영 체제가 변수가 있던 주소 공간을 다른 프로그램에서 사용할 수있는 것처럼 보이지 않습니까?

이 책에서는 전역 변수가 메모리에 저장되고 지역 변수가 런타임 스택에 저장된다고 말합니다. 우선 런타임 스택이 메모리에 있으므로 구별되지 않습니다. 런타임 전에 푸시 할 항목 수를 결정할 수 없으므로 운영 체제가 런타임 스택에 할당 할 공간을 어떻게 알 수 있습니까?

답변

0

무시, 현대 운영 체제에 필요한 가상 메모리 및 메모리 관리 솔루션을 제공합니다.

전역 변수가 포함 된 고정/정적 데이터에 필요한 메모리 양은 실행 파일에 포함됩니다. 데이터 세그먼트 (DS) (하드웨어) 레지스터는 이러한 고정 데이터 요소를 추적합니다. DS 금액은 변경되지 않습니다. DS는 인접한 메모리 덩어리를 가리 킵니다. 연속 메모리가 충분하지 않으면 메모리 오류가 충분하지 않아 프로그램이로드되지 않습니다. 당신이 말했듯이,이 메모리는 프로그램 실행 중에 "범위를 벗어나지"않습니다.

로컬 변수는 스택 세그먼트 (SS) 레지스터에 의해 관리되는 메모리의 다른 부분에서 할당됩니다. SS가 관리하는 메모리의 양은 프로그램이 실행되는 동안 커지고 줄어 듭니다. 최대 및 최소 크기는 운영 체제 (OS)에 의해 결정됩니다. (이 크기는 오늘날의 복잡한 OS의 실제 메모리 크기를 기반으로하지 않습니다.)

실행 중 최대 용량을 초과하면 스택 오버플로 오류가 발생합니다.

최소 크기를 사용할 수 없으면 프로그램이 실행되지 않습니다. 따라서 pgm은 최소 금액 이상으로 시작됩니다. 실행 중에 더 많은 SS 메모리가 필요한 경우 OS는 메모리 블록을 늘릴 수 있습니다. 가능하다면 스택 오버플로 오류입니다.

함수가 호출되면 해당 지역 변수가 SS에서 할당됩니다 (DS에 전역 변수가 할당 된 것과 같습니다). 함수가 종료 할 때 (예 : 함수를 호출 한 이후의 코드의 주소)와 같이 SS에 다른 하우스 키핑 항목이 있습니다. 함수가 중첩 된 방식으로 다른 함수를 호출하면 스택이 커지고 커집니다. 각 함수가 실행을 완료하면 호출 함수로 제어가 돌아가고 완료된 함수의 로컬 변수가 해제되고 스택이 축소됩니다.

"힙"메모리는 프로그램 실행 중에 "생성 된"또는 "할당 된 메모리 공간"항목을 보유하는 데 필요한만큼 증가하는 또 다른 메모리 블록입니다 ("malloc"또는 "new"또는 해당하는 것과 같은 일부 동사 사용). 언어로). SS와 마찬가지로 OS는 최소 및 최대 크기를 결정하고 각 Pgm은 최소 분량으로 시작합니다.

오늘날의 최신 CPU, OS, 언어에 내장 된 보호 기능으로 인해 물리적 메모리의 내용이 올바르게 처리되므로 데이터 블록을 실행하거나 코드 블록을 쓰거나 읽을 수 없습니다.

가상 메모리, 여러 프로그램을 실행하고 (메모리 관리) 메모리 블록을 이동하여 범위를 벗어난 힙 항목을 제거하면 다른 계층이 추가되지만 위의 자세한 내용은 여전히 ​​유효합니다.

+0

그래서 짧은 로컬 변수가 스택에 저장되고 전역 변수가 힙에 있거나 반드시 필요한 것은 아닙니다. – Celeritas

관련 문제