운영 시스템 스택 및 힙의 차이

운영 시스템 스택 및 힙의 차이

 

(하지 메모리로 전송)의 실행 프로그램을 기억하는 경우 지역 코드 데이터 (BSS) 세 부분 및 초기화 데이터 영역으로 분할된다.
1) 지역 코드 : CPU의 기계 명령어 실행. 일반 코드 영역은 때문에 코드에 의해 단지 메모리에, 자주 실행되는 프로그램 (다른 실행 프로그램을 호출 할 수 있습니다) 공유 할 수 있습니다. 또한, 한 코드 영역은 일반적으로 읽기 전용의 프로그램 명령 이유로 실수로 수정을 방지 할 수 있습니다. 또한 지역 변수에 대한 지역 코드 관련 정보가 계획되어있다.

2) 글로벌 초기화 데이터 영역 / 정적 데이터 영역 명시 적 프로그램에 포함 전역 변수, 정적 변수 및 전역 지역 정적 변수) 및 일정한 데이터를 포함하는 정적 변수 (초기화.

이러한 기능은 임의의 (글로벌 데이터)에서 선언되지 않는다 :
INT MAXCOUNT = 99,
초기 값은 데이터 영역에 저장되어있는 변수가 초기화 MAXCOUNT있다.

아니면 즉 :
정적 mincount = 100;
문 함수 체외 경우 이는 정적 데이터를 선언 가리 글로벌 정적 변수, 정적 경우 지역 변수를 나타내는 기능 체. 함수 이름 앞에 고정 결합하는 경우뿐만 아니라, 이러한 기능은 현재 파일을 호출 할 수 있음을 의미한다.

3) 초기화되지 않은 데이터 영역 (BBS)는 초기화되지 않은 증착 변수 전역. 커널 프로그램 실행이 시작되기 전에 BSS 데이터 영역은 NULL 포인터를 초기화하거나, 0 (NULL)이다. 임의의 함수가 아닌, 예를 들어 선언 :
긴 합 [1000]
가변 합계가 초기화되지 않은 데이터 영역에 저장된다.

도 다음과 같은 제어가 실행 가능한 코드는도 구성 및 런타임의 구성, 하나는 C 컴파일러를 실행하는 동안 더하여 메모리 영역을 점유 할 때 저장되는 데이터 영역, 초기화 데이터 영역, 스택 영역 및 힙 초기화 코드가 포함되어있다 지역 :

1) 코드 분야 : 반복되는 경우 명령 코드 영역은 한 번만, 순차적 지침은 각 프로세스를 프로그래밍 프로세스를 수행하기 위해, 당신은, 당신이 달성하기 위해 스택을 사용할 필요가 재귀 경우, 점프 명령을 사용해야합니다.
명령 코드 영역은 연산 코드 및 조작되는 객체 (또는 객체 참조 어드레스)를 포함한다. 즉시 데이터 (즉, 특정 수치 예 5와 같은)는 코드에 직접 포함되는 경우, 그 로컬 데이터를 스택 영역에 할당 된 공간 및 데이터 주소를 참조하는 경우, 만약 코드 BSS 영역과 데이터 영역 같은 데이터 주소를 참조한다.
(2) 글로벌 초기화 데이터 영역 / 정적 데이터 영역 : 번만 초기화.
(3) 초기화되지 않은 데이터 영역 (BSS)는 : 런타임 값을 변경.
(4) 스택 영역 (스택) 컴파일러에 의해 할당 자동 저장 기능 파라미터, 로컬 변수 등을 발표했다. 스택 데이터 구조와 유사하게 동작한다. 함수가 호출 될 때마다, 함수는 주소와 전화 등 특정 레지스터의 내용으로, 스택 영역에 저장에 대한 정보를 반환합니다. 이어서 호출 된 함수는 재귀 함수 C 구현 불리는 방법의 자동 및 임시 변수 스택 영역에 공간을 할당한다. 각 실행 변수 재귀 함수 호출은 새로운 스택 프레임이 스택 변수의 새로운 인스턴스가 혼란 함수 스택 내부의 다른 인스턴스되지 않도록하는 것이 사용된다.
(5)의 힙 (더미) 동적 메모리 할당을 위해 사용된다. 스택 BSS 영역과 메모리의 스택 영역 사이에 위치. 프로그래머가 해제하지 않는 경우 프로그래머 일반 할당과 해제는,이 OS에 의해 프로그램의 마지막에 복구 할 수 있습니다.

5 점 데이터를 저장 영역, 주로 다음과 같은 고려 사항에 그래서 :
1) 동작시 프로세스, 코드, 단순히 한 번 프로세스에 따라 순차적으로 수행하지만, 점프 잠재력과 재귀 코드 실행 등을 가지고 방문 배. 쉬운 접근과에 대해 별도의 오픈 스페이스 공간이 절약되므로 데이터는 일반적으로 다중 접속을 필요로한다.
2) 일시적으로 사용되는 데이터와 코드가 필요 다시 런타임 스택 영역, 짧은 라이프 사이클에 위치.
3) 글로벌 데이터 액세스 프로그램 요구 사항의 전체 실행되므로 별도의 스토리지 관리 가능한 동안 정적 데이터.
4) 사용자의 자유로운 힙 영역 할당하여 관리된다.

메모리 할당 절차 C 단순 코드에 의해 수행 될 때의 경우는 아래를 참조. 주석으로 실행시에 위치 데이터.

스택과 힙 차이점

이미 언급 한 바와 같이, 스택은 필요시, 자동 소거 변수 저장 공간이 필요하지 컴파일러에 의해 할당된다. 일반적으로 로컬 변수, 함수 및 기타 매개 변수이다. 함수의 malloc () 메모리 블록 할당 (new 연산자에 C ++ 언어)에 의해 스택은 메모리가 수동으로 프로그래머, 완전한 (삭제 등 C ++)에 의해 제어 해제하면 C 언어에서의 무료 기능입니다.

힙 및 스택의 주요 차이점 :

다른 (1) 관리.
스택 컴파일러 자동 수동 제어 프로그래머없이 관리하고, 메모리 누수하는 경향이 프로그래머에 의해 제어되는 작업 릴리스 힙 공간이 적용됩니다.

(2) 다른 크기 공간적.
스택은 로우 어드레스의 데이터 구조에 확장되어 인접한 메모리 영역이다. 스택 및 스택 주소의 최대 용량이 공간은 애플리케이션 스택의 나머지 공간을 초과하는 소정의 기준 시스템이라고이 수단은, 오버 플로우 메시지가 표시 될 것이다. 따라서, 사용자의 작은 공간은 스택에서 얻어진.

스택은 높은 어드레스 데이터 구조로 확장하는 연속적인 메모리 영역이 아니다. 이 시스템은 사용 가능한 메모리 주소의 연결리스트를 저장하는 데 사용하고,리스트 탐색 방향은 높은 주소로 낮은에서입니다 때문입니다. 따라서, 사용 가능한 공간 힙보다 유연한뿐만 아니라. 스택 요소는 어떤 경우 없을 것이다 1로 하나 어디 팝업 메모리 블록의 스택의 중간에서.

(3) 부스러기의 발생 여부.
무료 자주의 malloc / 측면에서 힙 (새 / 삭제) 불가피하게 (운영 체제의 프로그램 메모리가 종료 한 후 복구를 관리 있지만) 그래서 절차의 효율성을 감소 파편을 많이 일으키는 메모리 공간의 단절로 이어질 것입니다. 스택에 관한 한, 그것은이 문제가되지 않습니다.

다른 (4) 성장 방향.
스택의 성장 방향은 메모리 어드레스가 증가하는 방향으로, 위쪽, 즉이다 적층 성장 방향이 메모리 어드레스를 감소시키는 방향으로, 즉 하향이다.

다른 (5) 유통.
함수의 malloc에 의해 프로그램 스택 () 해제 무료 () 함수에 의해 동적으로 할당 된 응용 프로그램이 있습니까, 스택 할당 및 할당 해제가 컴파일러에 의해 이루어집니다, 동적 할당 스택 () 함수는 alloca 함수에 의해 수행하지만, 동적으로 스택을 할당 과 힙은 자신의 동적 할당이 적용 및 수동 구현하지 않고 컴파일러에 의해 해제하는 것입니다 다릅니다.

다른 (6) 유통 효율.
스택은 특별한 푸시 명령 실행을 가지고, 특수 레지스터 저장 할당 된 주소 스택 : 스택 기계 시스템에 의해 제공되는 데이터 구조, 컴퓨터가 스택에 대한 기본 지원을 제공 할 것입니다. 스택은기구가 충분히 사용할위한 힙 메모리 검색 특정 알고리즘을 수행한다 (데이터 구조가 참조 할 수있는 특정 알고리즘 / 운영 시스템) 메모리 라이브러리 함수를 할당하기 위해, 예를 들면 복잡 C 라이브러리 구비 (아마도 너무 많은 메모리 단편화에) 더 충분한 공간이없는 경우 공간은, 그래서 기회에 할당 된 메모리의 충분한 양이 후 반환, 메모리 공간을 갱신 할 수있는 운영 체제에 대한 필요가있다. 분명히, 힙 훨씬 스택에 비해 효율이 낮 춥니 다.

 

 

원본 : http://blog.chinaunix.net/uid-23215128-id-2521223.html

추천

출처www.cnblogs.com/aker-whale/p/12176229.html