우리가 작성하는 코드 덩어리들을 프로그램이라고 함
이 프로그램을 실행하면 운영체제(Operating System)에서 메모리(RAM)에 프로그램을 위한 공간을 할당해줌
이때 메모리 공간은 코드, 데이터, 힙, 스택 으로 나누어 공간을 할당 할 수 있도록 함
Code 코드영역
- 우리가 작성한 소스코드가 0,1로 이루어진 컴퓨터 밑단위 언어인 기계어 형태로 저장됨
- 실행파일을 구성하는 명령어들이 올라감 (함수, 제어문, 상수 등)
- 컴파일 타입에 의해 결정
- 프로그램을 실행했는데 중간에 코드가 변경된다고 해서 프로그램이 변경 되면 안되어 Read-Only형태로 저장
Data 데이터영역
- 전역변수, static 변수가 저장됨
- 프로그램 시작과 동시에 할당되고 프로그램이 종료되어야 메모리가 해제됨
- 실행도중 변수 값이 변경 될 수 있어 Read-Write 형태로 저장
struct Person{
static let nickname = "개발자유망주"
}
//static 변수로 데이터 영역에 할당
var name: String?
var age: Int?
//전역변수로 데이터 영역에 할당
Heap 힙영역
- 프로그래머가 할당/해제 하는 메모리 영역
- 프로그래머는 malloc으로 힙에 할당, calloc으로 힙에 메모리를 해체 할 수 있음
- 이것을 '동적 할당'이라고 함
- Swift에서는 ARC를 통해 힙에 할당된 메모리가 더이상 쓸모 없어지면 자동으로 해제해줌
- 사용 후에는 반드시 메모리를 해제 해주어야함
- 그렇지 않을시 memory leak이 발생
- Code,Data,Stack 중 유일하게 런타임시 결정됨
- 데이터의 크기가 확실하지 않을 때 사용함
- 클랜스 인스턴스, 클로져 참조타입일 경우 사용
- 메모리 크기에 대한 제한이 없음
- 전역의 범위이기에 모든 함수에서 액세스 가능함
- 할당, 해제 작업으로 속도가 저하됨
- 두개 이상의 쓰레드가 동시에 접근하면 Lock이 걸려 속도가 저하됨
- 메모리를 해제해주지 않으면 메모리 누수가 발생하므로 직접 관리해야 됨
- 스택보다 상대적으로 느림
class Person{
var nickname: String?
var age: Int?
}
var person = Person(nickname: "개발자유망주", age: 28)
Stack 스택영역
- 함수호출시 함수의 지역변수, 매개변수, 리턴 값 등을 저장
- 함수가 종료되면 저장된 메모리도 해제됨
- 컴파일 타임에 결정되기 때문에 무한히 할당 할 수 없음
- 프로그램이 자동으로 사용하는 임시 메모리 영역
- CPU에 의해 관리되고 최적화되어 효율으로 구성하여 속도가 매우 빠름
- 메모리를 직접 해제해주지 않아도 됨
- 메모리 크기에 제한이 있으며 지역변수만 접근이 가능
func sum(_num1: Int, _num2: Int2) -> Int{
let ans = num1 + num2
return ans
}
num1, num2 파라미터, 지역변수 ans는 스택에 할당되고 sum함수가 종료되는 시점에 스택 메모리에서 반환
'CS' 카테고리의 다른 글
RSA 암호화 (0) | 2024.11.05 |
---|---|
IP / TCP / UDP / 패킷 / URL (2) | 2024.09.04 |
DFS (0) | 2023.12.13 |
[CS] 런타임 vs 컴파일타임 (0) | 2023.06.28 |