728x90
반응형
메모리 (Memory)
운영체제 (OS) 에서 메모리는 다음과 같이 분류할 수 있습니다.
- 주기억장치 (Main Memory)
- RAM (Random Access Memory)
- ROM (Read-Only Memory)
- 보조기억장치 (Secondary Memory)
- HDD (Hard Disk Drive)
- SSD (Solid State Drive)
지금부터 설명하는 메모리는 RAM 을 지칭합니다.
프로세스의 메모리 구조 (Memory Layout of a Process)
메모리는 프로그램이 실행될 때 프로그램의 명령어와 데이터가 로드 (load) 되는 공간으로, CPU 가 직접 접근하여 해당 명령어와 데이터를 읽고 연산을 수행합니다.
다음은 프로세스가 메모리에 올라갔을 때의 메모리 할당 구조입니다.
- Text Segment
- 실행할 프로그램의 명령어 (코드) 가 저장되는 영역입니다. 프로그램이 실행되면 CPU 는 이 영역에 저장된 명령어를 읽어 실행합니다.
- 읽기 전용이며, 일반적으로 변경되지 않습니다.
- 컴파일 타임에 사용할 메모리 공간을 미리 결정합니다.
- Data Segment
- 초기화된 전역 변수나 static 변수가 저장되는 영역입니다.
- 컴파일 타임에 사용할 메모리 공간을 미리 결정합니다.
- BSS Segment
- 초기화되지 않은 전역 변수나 static 변수가 저장되는 영역입니다.
- 프로그램이 실행되면 0 으로 초기화됩니다.
- 컴파일 타임에 사용할 메모리 공간을 미리 결정합니다.
- Heap
- 동적으로 할당된 메모리가 저장됩니다.
- C 언어에서 malloc 함수로 할당된 메모리, 또는 Python에서 list 나 dict 같은 데이터 구조가 여기에 저장됩니다.
- 런 타임에 실제 메모리 사용량을 할당받습니다
- Stack
- 함수 호출과 관련된 데이터를 저장합니다.
- 지역 변수와 함수 매개변수가 여기에 저장됩니다.
- LIFO (Last In First Out) 방식으로 동작하며, 함수가 호출될 때마다 새로운 데이터가 쌓이고 함수가 끝나면 자동으로 메모리에서 제거됩니다.
- 런 타임에 실제 메모리 사용량을 할당받습니다.
Segment (세그먼트) 는 가상 메모리 공간에서 연속적이고 컴파일 타임에 크기가 결정된 고정된 크기의 메모리 영역을 의미합니다. 따라서 컴파일 타임에 메모리 사용량을 할당받는 Text, Data, BSS 영역은 Segment 라는 표현을 사용하며 런타임에 동적으로 메모리를 할당받는 Heap 과 Stack 영역에는 Segment 라는 표현을 사용하지 않는 것이 일반적입니다.
인터프리터 언어는 전통적인 의미에서 컴파일 타임이 없지만 대부분의 인터프리터 언어는 내부적으로 단계적인 처리 과정 (바이트코드로 변환) 을 거칩니다. Text, Data, BSS 세그먼트가 고전적인 의미에서 똑같이 사용되지는 않더라도, 메모리 할당의 일부는 이미 이 단계에서 결정됩니다. 하지만 전체적으로 인터프리터 언어는 메모리 할당이 런타임에 주로 이루어지기 때문에, 고전적인 세그먼트의 개념이 덜 중요합니다.
멀티 프로세스 환경에서의 메모리 구조
- 각 프로세스가 독립적인 메모리 공간을 가지고 실행합니다.
- 프로세스 간 독립성이 높아 한 프로세스가 죽어도 다른 프로세스에 영향을 주지 않습니다.
- 메모리를 독립적으로 사용하므로 메모리 사용량이 큽니다.
멀티 쓰레드 환경에서의 메모리 구조
- 멀티쓰레드 환경에서는 하나의 프로세스 내에서 여러 개의 쓰레드가 실행되는데 각 쓰레드는 Stack 영역만 따로 갖고 Text, Data, BSS, Heap 영역은 공유합니다.
- Data, BSS, Heap 영역이 공유되기 때문에 여러 쓰레드가 동시에 같은 데이터를 수정할 수 있는데 이를 관리하기 위해 뮤텍스 (Mutex) 나 세마포어 (Semaphore) 와 같은 동기화 기법이 필요합니다.
- 하나의 쓰레드가 잘못된 메모리 접근을 하면 다른 쓰레드에 영향을 줄 수 있습니다.
- 메모리를 공유하기 때문에 메모리 사용이 상대적으로 효율적입니다.
가상 주소
대부분의 현대 시스템에서는 가상 주소를 사용합니다. 가상 메모리 시스템은 메모리 효율성을 높이고, 보안과 안정성을 제공하는 데 중요한 역할을 합니다. 가상 주소는 MMU (Memory Management Unit) 에 의해 물리 주소로 변환되어 실제 메모리에 접근하게 됩니다.
- 가상 주소가 CPU 에 의해 사용됩니다.
- MMU 는 가상 주소를 페이지 번호와 오프셋으로 나눕니다.
- 페이지 테이블을 참조해 해당 가상 페이지 번호에 대응하는 물리 페이지 번호를 찾습니다.
- 물리 페이지 번호와 오프셋을 조합해 최종 물리 주소를 결정하고, CPU 가 해당 메모리 위치에 접근합니다.
728x90
반응형
'CS > OS' 카테고리의 다른 글
프로세스 (Process) vs 쓰레드 (Thread) (2) | 2024.10.10 |
---|---|
표준 스트림 stdin, stdout, stderr (3) | 2024.09.30 |
커널 (Kernel) (3) | 2024.09.24 |
프로그램 vs 프로세스 (1) | 2024.09.23 |
CLI 환경의 이해 (6) | 2024.09.16 |