세그먼트 방식은 가상 주소인 논리적 주소를 활용하여 상대적인 위치를 지정하고 offset(시작주소)을 더하여 물리적인 주소로 접근한다. 이를 통해 CPU가 프로세스는 연속된 메모리에 위치하구나하는 착각을 줄 수 있다.
세그먼트 방식은 메모리 보호를 쉽게 할 수 있고 공유에도 이점이 있다.
왜냐하면 단순히 크기 단위로 구분하는 페이징 방식과는 다르게 논리적 내용의 단위로 구분하기 때문이다.
논리적 내용의 단위가 무엇이냐면 예를 들어 데이터 세그먼트에 리터럴이 있을 수가 있고 정적 변수가 있을 수가 있고 어떠한 구조체가 있을 수도 있기 때문에 단순히 크기 단위로 구분하는 것이 아니라 이를 규칙을 정해 구분해주는 것이다.
프로그램 메모리 세그먼트는 컴파일러에 의해 프로그램이 프로세스에 올라갈 때 세그먼트가 크게 4가지로 나뉘게 되는 것이다.
1 .Text Segment(Code Segment)
프로세스가 종료될 때 까지 유지되는 영역이며,코드만 저장하고 있기 때문에 쓰기가 금지되어있다.(Read-Only) 이로 인해 공유가 가능하다는 장점이 있다. 힙(Heap)과 스택(Stack)에 의해 메모리를 침범받지 않도록 이보다 더 낮은 메모리 주소에 위치하고 있다.
2-1.Initialize Data Segment
초기화된 데이터 세그먼트(Initialize Data Segment)는 Data Segment로 칭한다. 초기화된 전역 변수와 Static 정적 변수가 속해있으며 프로그램 가상 공간의 일부이다. 프로그램이 시작할 때 즉 컴파일이 완료된 시점에서 만들어졌다가 프로그램이 종료될 때 파괴된다. 읽기 전용 영역이 있는데 리터럴 값과 상수 값이 들어갈 수 있다. 그렇지 않다면 읽기-쓰기 영역일 것이다. 가상 공간의 일부이기 때문에 특정 메모리 접근 공간으로 사용할 수 있어 런타임 중에 수정이 자유롭다.(이해 불가)
2-2 Uninitialized Data Segment (BSS)
초기화 되지 않은 데이터 세그먼트(Uninitialized Data Segment)는 BSS 세그먼트라고 부른다. 데이터 세그먼트와 같게 전역 변수와 정적 변수를 담고 있으나 프로그램이 시작 될 때 모든 메모리 값을 0으로 초기화 한다. 전역변수와 정적 변수를 초기화 해주지 않아도 0이라는 값을 가지고 있는 이유이다.
데이터 세그먼트와 BSS 세그먼트가 구분되는 이유
BSS 세그먼트는 어느만큼의 메모리를 확보할 지에 대한 정보만 가지고 있는 채 프로그램을 수행하는 과정에서 0으로 초기화 하여 RAM메모리에 불러와진다. 반면에 데이터 세그먼트는 초기에 사용할 메모리 영역을 확보하고 초기값을 가지고 있는 데이터이므로 ROM메모리에 저장되었다가 변수로써 사용되기 위하여 프로그램을 실행하는 과정에서 RAM으로 불러와진다. 따라서 메모리 사용면에서 BSS 세그먼트가 효율적이다.
3. 스택 세그먼트(Stack Segment)
스택 영역은 후입선출 LIFO(Last In First Out)구조를 가진다. 가장 먼저 들어오는 값이 가장 높은 주소에 할당되며 하나의 함수 호출에 스택의 공간이 할당되는 것을 스택 프레임(Stack Frame)이라고 한다. 스택 프레임에는 지역변수와 매개변수 반환 주소값이 들어갈 수 있겠다. 스택 프레임(StackFrame)은 함수가 종료됨과 함께 해제된다. 위 내용을 봤을 때 컴파일 타임에 크기가 결정된다는 말이 이해가 간다.
4.힙 세그먼트(Heap Segment)
힙 영역은 개발자에 의해 동적(Allocation Dynamic)으로 메모리 할당이 수행된다. 힙영역은 스택과 충돌을 방지하기 위해 BSS영역의 끝 주소부터 시작한다. 컴파일 타임에 얼마만큼의 메모리를 할당할 것인지 주어지지 않으므로 런타임에 메모리를 할당하게 된다. malloc,ralloc,realloc함수를 통해 동적으로 할당할 수 있으며 free함수를 통해 메모리를 해제할 수 있다. (C언어에서는 자동으로 메모리를 해제해주지않아 사용하지 않는 메모리가 영원히 메모리에 잡혀있는 메모리 누수(Memory Leak)가 발생할 수 있기 때문에 반드시 해제해주어야 한다.)
출처
https://gusdnd852.tistory.com/16
C언어 메모리 세그먼트
C를 공부하기 전에 C언어의 메모리 구조를 알면 C언어를 이해하는데 큰 도움이 되며, C이외에도 Java 등의 언어도 이러한 구조와 굉장히 비슷하게 설계되어있다. (아주 약간의 차이만 존재한다) 때
gusdnd852.tistory.com
https://blog.naver.com/PostView.nhn?blogId=cjsksk3113&logNo=222270185816
프로그램의 메모리 세그먼트 구조 : Code(text), Data(data, bss) Segment, Stack, Heap
프로그램을 실행하게 되면, CPU 프로세서는 보조기억장치(HDD, SDD)에 있는 프로그램 정보를 읽어...
blog.naver.com
https://velog.io/@dung002/%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8%EB%9E%80
세그먼트란?
세그먼트란 프로세스를 5가지 논리적 기준으로 잘라낸것으로 아래와 같이 나뉘어진다또한 각 세그먼트 마다 부여되는 권한과 위치하는 데이터가 다르다.실행 가능한 기계코드가 위차하는 곳으
velog.io
https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=dolpin1402&logNo=220671477103
Segment란?
메모리 세그먼트란? 메모리 세그먼트 방식(Memory segmentation)은 메모리 보호를 수행하는 가장 일반적인...
blog.naver.com
https://copycode.tistory.com/108
운영체제 20장 - 메모리 관리(7) : 세그멘테이션(Segmentation) -
운영체제 20장 - 세그멘테이션(Segmentation) - 앞선 장들에서 페이징을 배우면서 프로세스를 일정 크기인 페이지 단위로 잘라서 메모리에 적재하는 방법을 알았다. 페이지는 정확하게 일정한 간격
copycode.tistory.com
'기타' 카테고리의 다른 글
[JS] 콜백함수 설명(사용법이 아닌, definition 탐구) (0) | 2024.03.17 |
---|---|
'ssh' is not recognized as an internal or external command, operable program or batch file. 해결법 (0) | 2024.03.05 |
컴파일(Compile)과 런타임(Runtime) (0) | 2022.09.16 |
프로그램을 누가,왜 번역하는가?(프로그래밍 언어의 역사) (0) | 2022.09.08 |