정적 저장 영역 (BSS, 데이터 세그먼트, 코드 세그먼트), 힙, 스택 ----------------- (C 언어에 포함됨)

 

 프로세스 (실행 된 프로그램)는 일정량의 메모리를 차지하며, 디스크에서로드 된 프로그램 코드를 저장하거나 사용자 입력에서 데이터를 저장하는 데 사용됩니다. 그러나 프로세스가 이러한 메모리를 관리하는 방식은 메모리의 용도에 따라 달라지며, 일부 메모리는 미리 정적으로 할당되고 회수되는 반면, 일부는 필요에 따라 동적으로 할당되고 회수됩니다. 일반적인 프로세스의 경우 5 개의 서로 다른 데이터 세그먼트가 포함됩니다.

Linux 프로세스의 5 개 세그먼트

프로세스에 해당하는 메모리 공간에 포함 된 5 가지 데이터 영역이 수행하는 작업을 간단히 요약 해 보겠습니다.

BSS 세그먼트 : BSS 세그먼트 (bss 세그먼트)는 일반적으로 프로그램 에서 초기화되지 않은 전역 변수 를 저장하는 데 사용되는 메모리 영역을 나타냅니다 . BSS는 Symbol로 시작되는 English Block의 약어입니다. BSS 세그먼트는 정적 메모리 할당에 속합니다.

데이터 세그먼트 (데이터) : 데이터 세그먼트는 일반적으로 프로그램 에서 초기화 된 전역 변수 를 저장하는 데 사용되는 메모리 영역을 나타냅니다 . 데이터 세그먼트는 정적 메모리 할당에 속합니다.

코드 세그먼트 : 코드 세그먼트 / 텍스트 세그먼트는 일반적으로 프로그램 실행 코드저장 하는 데 사용되는 메모리 영역을 나타냅니다 . 이 영역의 크기는 프로그램이 실행되기 전에 결정되며 메모리 영역은 일반적으로 읽기 전용입니다. 일부 아키텍처에서는 코드 세그먼트를 쓸 수 있으므로 프로그램을 수정할 수 있습니다. 코드 세그먼트에는 문자열 상수와 같은 일부 읽기 전용 상수 변수가있을 수도 있습니다.

( ) : 힙은 프로세스가 실행되는 동안 동적으로 할당 된 메모리 세그먼트 저장 하는 데 사용됩니다 . 크기는 고정되어 있지 않으며 동적으로 확장 또는 축소 할 수 있습니다. 프로세스가 메모리를 할당하기 위해 malloc 및 기타 함수를 호출하면 새로 할당 된 메모리가 힙에 동적으로 추가됩니다 (힙이 확장 됨). 메모리를 해제하기 위해 여유 및 기타 함수를 사용하면 해제 된 메모리가 힙 (힙)에서 제거됩니다. 감소) 프로그래머가 해제하지 않으면 메모리 누수가 발생하고 시스템이 불안정 해집니다. 프로세스가 종료되면 OS가 Windows 시스템을 해제하고 전체 시스템이 종료 된 경우에만 Linux가 OS를 해제합니다. down (Linux 메모리 관리 참조).

Stack ( stack ) : Stack이라고도하는 Stack 은 프로그램저장 하기 위해 사용자가 임시로 생성 한 로컬 변수 입니다. 즉, 함수 괄호 "{}"에 정의 된 변수입니다 (하지만 다음에서 선언 한 변수는 포함하지 않음). 데이터 세그먼트 스토어 변수의 정적, 정적 의미). 또한 함수가 호출되면 해당 매개 변수 도 호출을 시작한 프로세스의 스택으로 푸시되고 호출이 종료 된 후 함수의 반환 값 도 스택에 다시 저장됩니다. 스택의 선입 선출 기능으로 인해 스택은 호출 장면을 저장 / 복원하는 데 특히 편리합니다. 이러한 의미에서 스택은 임시 데이터를 저장하고 교환하기위한 메모리 영역으로 생각할 수 있습니다.

운영 체제에서 할당하고 메모리 응용 프로그램 및 복구는 OS에서 관리합니다.

추신:

초기화되지 않은 전역 변수는 자리 표시 자로 구현 된 .bss 섹션에 존재하고, 초기화 된 전역 변수는 .data 섹션에 저장되고, 함수의 자동 변수는 스택에 할당 된 공간입니다. .bss는 .exe 파일의 공간을 차지하지 않으며 그 내용은 운영 체제에 의해 초기화 (삭제)됩니다. 반면 .data는 점유되어야하며 그 내용은 프로그램에 의해 초기화 되므로 위와 같은 상황이 발생합니다.

bss 세그먼트 (수동으로 초기화되지 않은 데이터)는이 세그먼트의 데이터를위한 공간을 할당하지 않고 데이터를 기록하는 데 필요한 공간의 크기 만 할당합니다.

데이터 (수동으로 초기화 된 데이터) 섹션은 데이터를위한 공간을 할당하고 데이터는 대상 파일에 저장됩니다. 데이터 세그먼트에는 초기화 된 전역 변수와 해당 값이 포함됩니다. BSS 세그먼트의 크기는 실행 파일에서 가져온 다음 링커는 데이터 세그먼트 바로 뒤에 오는이 크기의 메모리 블록을 가져옵니다. 이 메모리 영역이 프로그램의 주소 공간에 들어가면 모두 지워집니다. 이때 데이터 섹션과 BSS 섹션을 포함한 전체 섹션을 일반적으로 데이터 영역이라고합니다.

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------

데이터 세그먼트, 코드 세그먼트, 힙 및 스택에 대한 자세한 설명

원본 : https://blog.csdn.net/weixin_38233274/article/details/80321719

1. 프로그램 파일의 파티션 :
비고 : 포함 된 경우에만 PC 프로그램 파일은 탐색되지 않았습니다. "프로그램 파일의 파티션"이라는 부제는 실제로별로 적절하지 않습니다. 설명하는 방법을 모르겠습니다. 개념의이 부분은 일반적으로 컴파일 된 프로그램의 크기 통계에 나타납니다. 직접 이해하십시오.

관련 개념 : 코드, RO_data, RW_data, ZI_data, RO, RW. MDK, IAR, ARM GCC와 같은 임베디드 프로그램을 컴파일 한 후 통계에 자주 표시됩니다.

일부 기술 기사는 RO를 직접 사용하므로 RO와 RO 데이터의 차이를 구분하는 데주의하십시오.

코드 : 컴파일러에서 생성 된 기계 명령어를 참조하는 코드 도메인입니다.
RO_data : ReadOnly 데이터, 즉 읽기 전용 데이터 필드, 프로그램에서 사용되는 읽기 전용 데이터를 의미하며, C 언어에서 const 키워드로 정의 된 전역 변수와 같은 전역 변수는 일반적인 RO-data입니다.
RW_data : 데이터 필드를 읽고 쓸 수있는 ReadWrite 데이터. "0이 아닌 값"으로 초기화 된 읽기 및 쓰기 가능한 데이터를 나타냅니다. 프로그램이 처음 실행될 때 이러한 데이터는 0이 아닌 초기 값을 가지며 응용 프로그램이 내용을 수정할 수 있도록 RAM 영역. 예를 들어, 전역 변수 또는 정적 변수를 정의 할 때 초기화를 위해 변수에 "0이 아닌 값"을 할당합니다.
ZI_data : ZeroInitialie 데이터, 즉 "0 값"으로 초기화 된 읽기 및 쓰기 가능한 데이터 필드를 나타내는 0 초기화 데이터.이 데이터와 RW_data의 차이점은 프로그램이 처음 일 때 이러한 데이터의 초기 값이 모두 0이라는 것입니다. 실행되고 후속 실행 프로세스는 RW와 유사합니다. 데이터의 특성은 동일하며 RAM 영역에도 상주하므로 응용 프로그램이 내용을 변경할 수 있습니다. 초기화되지 않은 전역 변수와 0으로 초기화 된 전역 변수를 포함합니다.
RO : RO_data 및 코드를 포함한 읽기 전용 영역입니다.

프로그램이 ROM에 저장 될 때 점유 크기는 Code + RO_data + RW_data입니다.
프로그램이 실행되면 RW_data와 ZI_data는 RAM에 있고 RO_data와 코드는 CPU 아키텍처 (51, arm, x86)에 따라 ROM 또는 RAM에 있습니다. 이 중 ZI_data는 BSS 세그먼트, RW_data는 데이터 세그먼트, code는 코드 세그먼트, RO_data는 데이터 세그먼트에 해당한다.

프로그램 프로세스의 파티션 :
BSS 세그먼트 : BSS 세그먼트 (bss 세그먼트)는 일반적으로 프로그램에서 초기화되지 않은 전역 변수를 저장하는 데 사용되는 메모리 영역을 나타냅니다. BSS는 Symbol로 시작되는 English Block의 약어입니다. BSS 세그먼트는 정적 메모리 할당에 속합니다.

데이터 세그먼트 : 데이터 세그먼트는 일반적으로 프로그램에서 초기화 된 전역 변수를 저장하는 데 사용되는 메모리 영역을 나타냅니다. 데이터 세그먼트는 정적 메모리 할당에 속합니다.

코드 세그먼트 : 코드 세그먼트 / 텍스트 세그먼트는 일반적으로 프로그램 실행 코드를 저장하는 데 사용되는 메모리 영역을 나타냅니다. 이 영역의 크기는 프로그램이 실행되기 전에 결정되며 메모리 영역은 일반적으로 읽기 전용입니다. 일부 아키텍처에서는 코드 세그먼트를 쓸 수 있으므로 프로그램을 수정할 수 있습니다. 코드 세그먼트에는 문자열 상수와 같은 일부 읽기 전용 상수 변수가있을 수도 있습니다.

: 프로세스가 실행되는 동안 동적으로 할당 된 메모리 세그먼트를 저장하는 데 사용되는 힙 크기는 고정되어 있지 않으며 동적으로 확장 또는 축소 할 수 있습니다. 프로세스가 메모리를 할당하기 위해 malloc 및 기타 함수를 호출하면 새로 할당 된 메모리가 힙에 동적으로 추가됩니다 (힙이 확장 됨). 메모리를 해제하기 위해 여유 및 기타 함수를 사용하면 해제 된 메모리가 힙 (힙)에서 제거됩니다. 감소) 프로그래머가 해제하지 않으면 메모리 누수가 발생하고 시스템이 불안정 해집니다. 프로세스가 종료되면 OS가 Windows 시스템을 해제하고 전체 시스템이 종료 된 경우에만 Linux가 OS를 해제합니다. down (Linux 메모리 관리 참조).

스택 (스택) : 스택은 사용자가 프로그램을 저장하기 위해 임시로 생성 한 로컬 변수 인 스택이라고도합니다. 즉, 함수 괄호 "{}"에 정의 된 변수 (변수는 포함하지 않음) 데이터 세그먼트 스토어 변수에서 정적, 정적 수단으로 선언 됨). 또한 함수가 호출되면 해당 매개 변수도 호출을 시작한 프로세스의 스택으로 푸시되고 호출이 종료 된 후 함수의 반환 값도 스택에 다시 저장됩니다. 스택의 후입 선출 기능으로 인해 스택은 특히 호출 장면을 저장 / 복원하는 데 편리합니다. 이런 의미에서 우리는 스택을 임시 데이터를 저장하고 교환하기위한 메모리 영역으로 간주 할 수 있습니다.

운영 체제에서 할당하고 메모리 응용 프로그램 및 복구는 OS에서 관리합니다.

추신:

초기화되지 않은 전역 변수는 자리 표시 자로 구현 된 .bss 섹션에 존재하고, 초기화 된 전역 변수는 .data 섹션에 저장되고, 함수의 자동 변수는 스택에 할당 된 공간입니다. .bss는 .exe 파일의 공간을 차지하지 않으며 그 내용은 운영 체제에 의해 초기화 (삭제)되고 .data는 점유되어야하며 그 내용은 프로그램에 의해 초기화되므로 위와 같은 상황이 발생합니다.

bss 세그먼트 (수동으로 초기화되지 않은 데이터)는이 세그먼트의 데이터를위한 공간을 할당하지 않고 데이터를 기록하는 데 필요한 공간의 크기 만 할당합니다.

데이터 (수동으로 초기화 된 데이터) 섹션은 데이터를위한 공간을 할당하고 데이터는 대상 파일에 저장됩니다. 데이터 세그먼트에는 초기화 된 전역 변수와 해당 값이 포함됩니다. BSS 세그먼트의 크기는 실행 파일에서 가져온 다음 링커는 데이터 세그먼트 바로 뒤에 오는이 크기의 메모리 블록을 가져옵니다 . 이 메모리 영역이 프로그램의 주소 공간에 들어가면 모두 지워집니다. 이때 데이터 섹션과 BSS 섹션을 포함한 전체 섹션을 일반적으로 데이터 영역이라고합니다.

3. 요약
위 개념의 해당 관계는 다음 표에 나와 있습니다.
참고 : 분홍색 부분의 코드 및 RO_data의 색상은 회색으로 아키텍처에 따라 ROM 또는 RAM에서 발생할 수 있음을 나타냅니다.
여기에 사진 설명 삽입

추천

출처blog.csdn.net/u014426028/article/details/109132433