메모리의 구조
- [ CS기초 ]/컴퓨터구조
- 2022. 4. 17.
개요
OS에서 프로세스가 프로그램을 실행시키기 위해서, 메모리에 접근 (load, save)하는데, OS는 프로그램에 크게 코드, 데이터, 힙, 스택의 4부분으로 분할하여 접근토록 한다.
1. Code(Text) area
프로세스가 실행할 코드와 매크로 상수 등의 기계어의 형태로 저장된 공간이다. CPU는 코드영역에 저장된 명령을 가져가서 처리한다. 이 영역은 컴파일 타임에 결정되고 런타임에 수정이 이루어지지 않는다.
2. Data area
전역변수 혹은 정적변수 등의 변수들이 저장된 공간이다. 전역변수나 정적변수는 프로그램의 시작과 함께 할당되며, 프로그램 종료시 소멸한다.
3. Heap area
힙 영역은 프로그래머가 직접 공간을 할당/해제하는 공간이다. 힙 영역은 메모리의 낮은 주소부터 높은 주소까지 데이터를 쌓아나간다. 다른 세 영역과는 다르게 런타임에 크기가 동적으로 결정되며, C의 malloc할당으로 대표되는 동적 메모리 할당이 대표적인 힙영역 사용의 예시이다. 사용 후 메모리 할당 해제를 하지 않으면 문제가 발생할 수 있다.
4. Stack area
스택 영역에는 함수 호출시 생성되는 지역변수와 매개변수 등이 저장되고, 함수 호출이 완료되면 사라진다. 스택의 특성상 main함수부터 호출이 이루어질때마다 스택에 add된다고 생각하면 된다. 스택의 크기는 컴파일 시점에 결정되며, 런타임에 너무 많은 함수의 호출이나(대표적으로 너무 깊은 DFS) 변수의 호출이 이루어지면 overflow가 발생할 수 있다.
런타임 메모리 구성
위와 같은 프로그램이 있다고 하자. main은 fun1을, fun1은 fun2를, fun2는 fun3을 호출한다.
각 ARI(Activation Record Instance)는 호출한 함수의 base address를 가리키는 포인터(Dynamic link), 스택의 맨 아래를 가리키는 포인터(Static link), return address가 들어가는 주소공간이 ARI의 base address부터 존재하고, 그 위에 parameter와 local변수를 위한 공간이 차례로 할당된다. (물론 이러한 ARI구조는 사용하는 언어에 따라서 다를 수 있다. 3-1때 배운 PL이랑 3-2에서 배운 컴파일러에서도 설명이 다름. 그래도 전반적으로 이렇게 생겼다라고 이해하면 될듯)
point 1, 2, 3은 각각 fun1, fun2, fun3이 호출된 상태를 말한다.
함수 f1이 f2를 호출하기 위해서는, f1의 실행상태를 보존하고, 활성화 레코드의 base위치와 리턴할 프로그램의 주소를 전달한다. 그러고 f2을 호출하여 분기가 이루어진다. 그 다음 f2는 local변수를 위한 size를 보고 base에서 size만큼 할당한 후 맨 위에 top을 설정한다. 그 다음에 dynamic link, static link, return addr과 같은 값을 설정한다.
f2가 종료되고 f1으로 리턴값을 전달하기 위해서는 호출한 함수와 서로 약속한 장소(return addr)에 리턴 값을 전달하면 된다. 그리고 base, top포인터 값을 바꾸어준다음 f1으로 분기시키면 된다.
'[ CS기초 ] > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] Virtual Memory (0) | 2021.11.25 |
---|---|
[컴퓨터구조] Cache Memory - Set Associative Cache (0) | 2021.11.21 |
[컴퓨터구조] Cache Memory - Direct Mapped Cache (0) | 2021.11.20 |