메모리?
메모리는 데이터, 상태, 명령어를 기록하거나 읽기 위한 저장공간으로 RAM, ROM, 플래시 메모리로 구분할 수 있다.
프로그램이 실행되면 해당 프로그램의 코드들이 메모리에 적재되어야 하는데 이 메모리에 적재된 프로그램을 프로세스라 한다.
메모리 계층 구조
레지스터 : CPU 안에 있는 메모리로 속도가 가장 빠르지만 용량이 적음
캐시 : L1, L2 캐시를 말하고 속도가 빠르지만 용량이 작음
주기억장치(RAM) = 메모리 : 속도도 보통 용량도 보통
보조기억장치 : HDD, SDD를 말하며 속도가 낮고, 용량이 큼
캐시
데이터를 미리 복사해 놓는 임시 저장소이지 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리이다.
-> 캐시를 활용해 데이터에 접근하고 처리하는 시간을 줄일 수 있다.
지역성의 원리
캐시의 역할의 효율성을 최대한으로 끌어올리기 위해서는 CPU가 어떤 데이터를 쓸지 예측 할 수 있어야 한다.
이때, 캐시에 CPU가 원하는 데이터가 있을 경우 캐시 적중(cache hit)라고 하고, 없으면 캐시 미스(cache miss)라 한다. 즉 이러한 캐시 적중율(Hit race)를 극대화 하기 위한 지표로 지역성(Locality)를 사용한다.
캐시 히트의 경우 위치도 가깝고 CPU 내부 버스를 기반으로 작동하기 때문에 빠르다.
하지만, 캐시미스가 발생하면 메모리에서 가져오는데, 이는 시스템 버스를 기반으로 작동하기 때문에 느리다!
시간 지역성
-> 최근 사용한 데이터에 다시 접근하려는 특성을 말한다.
메모리의 같은 주소에 여러 차례 읽기 쓰기를 수행할 경우, 작은 크기의 캐시를 사용해도 효율적으로 사용이 가능하다.
공간 지역성
메모리 내에 서로 인접하여 저장되어 있는 데이터를 연속적으로 액세스 될 가능성에 대한 특성이다.
캐시매핑
캐시가 히트되기 위해 매핑하는 방법을 말한다. -> 캐시와 주기억장치 사이에서 정보를 옮기는 것
CPU의 레지스터와 주 메모리 간에 데이터를 주고받을 때를 기반으로 설명한다.
이름 | 설명 |
직접 매핑 | 메모리 1 ~ 100 캐시 1 ~ 10 이 있을 경우, 1 : 1 ~ 10 -> 메모리 1부터 10까지는 캐시의 1에 위치시킨다. 2 : 11 ~ 20 -> 메모리 11부터 20까지는 캐시의 2에 위치시킨다. 의 식으로 매핑이 진행된다. |
연관 매핑 | 순서를 일치시키지 않고 관련 있는 캐시와 메모리를 매핑한다. 충돌이 적지만 모든 블록을 탐색해야 해서 속도가 느리다. 하지만 필요한 데이터 위주로 저장하기 때문에 적중률이 높다. |
집합 연관 매핑 | 직접 매핑과 연관 매핑을 합쳐 놓은 것이다. 메모리 1 ~ 100, 캐시 1 ~ 10 일 때 캐시 1~5에는 1~50의 데이터를 무작위로 저장시킨다. |
메모리 구조와 프로그램 실행
*참고*
컴파일 타임 : 컴파일 과정을 통해 소스코드가 기계어 코드로 변환되어 실행 가능한 프로그램이 되는 과정이다.
컴파일 타임 에러 : syntax error, 파일 참조 오류, 타입체크 오류 등, 이 경우 컴파일러는 컴파일 타임 에러를 발생시키고 문제를 일으킨 소스코드 라인을 지시해준다.
런 타임 : 컴파일 타임 이후 프로그램이 실행되는 때를 말하며, 0 나누기 오류, null참조 오류, 메모리 부족 오류가 대표적인 오류이다.
코드 영역
- 명령어가 들어가는 영역이다.
- 프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간. 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only로 지정된다.
데이터 영역
- 전역 변수와 정적 변수(companion object)가 이 영역에 속한다.
- 프로그램 실행 시 생성 및 종료 시 반환된다.
- 프로그램 시작부터 종료 때까지 메모리가 남아 있게 된다.
힙 영역
- 동적 할당이 이루어지는 곳이다.
- 객체들을 할당하여 사용되며 참조가 없으면 GC의 대상이 된다.
- 런타임시에 결정된다.
- 사용 후 메모리 해제를 하지 않으면 메모리 누수가 발생한다.
스택 영역
- 메서드 내에서 정의하는 기본 자료형인 지역 변수, 매개변수, 리턴 값이 대표적이다.
- LIFO 구조를 갖고(= 스택이기 때문) 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
- 메서드 호출시 생성/ 메서드가 끝나면 메모리에서 해제된다.
- Heap과 Stack 영역은 같은 공간을 공유하는데 Heap이 위쪽 주소부터 할당// Stack은 아래쪽부터 할당되는 식
- 컴파일 시에 크기가 결정된다.
힙(Heap) & 스택(Stack)
힙과 스택 영역은 같은 공간을 공유하는데 이때 힙이 위쪽 주소부터 할당되고 스택은 아래쪽부터 할당이 이루어진다.
힙에 경우 크기가 제한되어 있지 않지만 스택의 경우 크기가 제한되어 있다.
'Basic > 운영체제' 카테고리의 다른 글
[OS] 멀티 쓰레드와 동기화 (0) | 2024.06.19 |
---|---|
[OS] 쓰레드 (0) | 2024.06.13 |
[OS] 프로세스 (0) | 2024.06.12 |
[OS] 커널(Kernel)이란? (1) | 2024.05.27 |
[OS] 운영체제 개요 (0) | 2024.01.10 |