-
메모리구조컴퓨터상식/운영체제(OS) 2022. 3. 4. 03:21
1. 메모리 구조
프로그램이 실행되면 운영체제(OS)는 메모리(RAM)에 이 프로그램을 위한 공간을 할당
- 공간은 다음과 같이 총 4가지(Code, Data, Heap, Stack)으로 나뉜다
1-1. 코드(Code) 영역
기계어는 컴퓨터가 읽을 수 있는 가장 밑단의 언어로 0과 1로만 이루어진 언어를 의미
1-2. 데이터(Data) 영역
Swift 예제
name과 age는 전역 변수로, country는 static 상수로, 데이터 영역에 할당됨
1-3. 힙(Heap) 영역
위 정의에서 malloc, calloc으로 힙에 메모리(전역변수, static변수)를 할당한다고 했는데, 스위프트에선 위 함수들을 통해 직접 할당할 일이 없지만 자동으로 힙에 할당하고 있었음
--> 클래스 인스턴스(Class Instance), 클로저 같은 참조 타입의 값 들은 모두 힙에 자동 할당 됨
힙을 사용하고 나면 반드시 "메모리 해제"를 해줘야 하지만, ARC를 통해 힙에 할당된 메모리가 더이상 쓸모 없어지면 (참조되지 않으면) 자동으로 해제
* 힙 구조의 장단점
장점 ▪ 메모리 크기에 대한 제한 없음
▪ 본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 할 수 있음단점 ▪ 할당작업, 해제 작업으로 인한 속도 저하
▪ 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
▪ 힙 경합(두 개 이상 쓰레드가 동시에 접근하려 할 때 Lock이 걸림)으로 인한 속도 저하
▪ 메모리를 직접 관리해야 함(해제해주지 않을 시 메모리 누수 발생)1-4. 스택(Stack) 영역
스택은 프로그램이 자동으로 사용하는 임시 메모리 영역을 의미
함수를 호출했을때
OS는 내부적으로 함수 안에 선언된 파라미터, 지역변수 등을 스택에 할당
--> add 함수가 종료되는 시점에 스택에 저장된 메모리는 모두 알아서 반환
* stack 장단점
장점 ▪ CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 매우 빠름
▪ 메모리를 직접 해제를 해주지 않아도 됨단점 ▪ 메모리 크기에 대한 제한 있음
▪ 지역 변수만 액세스 가능스택은 메모리 크기에 대한 제한이 있기 때문에 메모리를 무한히 할당할 수 없는 것이 가장 큰 단점
2. 힙 vs 스택
2-1. 언제 힙을 쓰고, 언제 스택을 쓰나요?
(인스턴스, 클로저 등 자동으로 힙에 할당되는 것 외에 직접 할당할 경우!)
스택은 메모리가 한정되어 있기 때문에 너무 큰 메모리는 할당 불가
-> 데이터의 크기를 모르거나, 스택에 저장하기엔 큰 데이터의 경우엔 힙에 할당 하고 그 외엔 스택에 할당
스택에 너무 많은 메모리를 할당하면 stack overflow가 발생
2-2. 힙과 스택의 메모리 관계
힙과 스택을 나누어서 설명 했지만, 힙과 스택은 같은 메모리 영역을 공유
같은 메모리 공간이지만
힙 영역은 낮은 메모리 주소부터 할당 받는 것이고, 스택 영역은 높은 메모리 주소부터 할당 받는다
따라서 힙 또한 자신의 영역 외로 확장하려다 보면, 힙 오버 플로우라는 것이 발생
'컴퓨터상식 > 운영체제(OS)' 카테고리의 다른 글
동기/비동기 (0) 2022.03.31 모바일에서의 메인쓰레드, 프로세스 (0) 2022.03.31 메모리관리(2/3) - strong, weak (0) 2022.03.04 메모리관리(1/3) - ARC (0) 2022.03.04 [쓰레드의 모든것] 프로세스, 쓰레드, 단일/멀티 쓰레드, 동기/비동기 프로그래밍, 코어 간략 정리 (0) 2022.01.13