RAM과 ROM
- RAM은 자유롭게 읽고 쓸 수 있는 기억장치로, RWM(Read Write Memory)라고 부르기도 한다.
또한 RAM에는 현재 사용 중인 프로그램이나 데이터가 저장되어 있다.
시스템의 전원이 꺼지면 기억된 내용이 모두 사라지는 휘발성 메모리의 특징을 가진다.
일반적으로 주기억장치 또는 메모리라고 불린다. - ROM은 기억된 내용을 읽을 수만 있는 기억장치로서 일반적으로 쓰기가 불가능하다.
또한 시스템의 전원이 꺼져도 기억된 내용이 지워지지 않는 비휘발성 메모리다.
실제로 ROM은 주기억장치로 사용되기보단 주로 변경 가능성이 없는 시스템 소프트웨어를 기억시키는데 이용된다.
(ex. 기본 입출력 시스템, 자가 진단 시스템)
프로그램 실행 순서
프로그램이 실행되는 과정을 도식화하면 다음과 같다.
1. 사용자가 프로그램 실행을 요청하면
2. 프로그램의 정보를 읽어 메모리에 로드(load)되는 과정을 거치고
3. 프로그램이 실행되면 OS는 메모리(RAM)에 공간을 할당해준다.
4. cpu는 기계어 코드를 실행한다.
프로세스
사용자가 프로그램을 실행하면 하드디스크에 있는 실행 이미지가 메모리에 로드된다.
이 말은 기계어로 된 실행파일을 보조기억장치에서 주기억장치로 copy한다는 뜻이다.
이때 메모리에는 프로그램에 대한 인스턴스가 생성된다.
프로그램을 여러번 실행하면 여러 개의 인스턴스가 생긴다.
예를 들어 Chrome 브라우저를 세 번 실행해서 Google, Naver, Daum을 각각 접속했다면 똑같은 프로그램의 인스턴스 3개가 만들어진다.
인스턴스 각각을 식별하기 위해 프로세스라고 부르며, 이 상황에서 프로세스 별로 실행할 기계어 코드는 동일하다.
물론 실행됐을 때 사용자 명령이나 결과는 다르겠지만 cpu는 같은 내용을 연산한다.
컴퓨터의 작업관리자에서 현재 어떤 프로세스들이 실행되고 있는지 확인할 수 있다.
메모리 구조
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공, 할당한다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다.
- Stack 영역
- Heap 영역
- Data 영역 / BSS 영역
- Code 영역
1. Stack 영역
메모리의 Stack 영역은 함수의 호출과 관계되는 지역변수(local variable)와 매개변수(parameter)가 저장되는 영역이다.
Stack 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
이렇게 Stack 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
Stack 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.
이러한 Stack은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.
Stack 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
Stack 영역이 높은 주소에서부터 주소값을 채워 내려오다가 Heap 영역을 침범하는 경우 Stack Overflow가 발생한다.'
2. Heap 영역
메모리의 Heap 영역은 사용자가 직접 관리할 수 있는 (+ 관리해야 하는) 메모리 영역이다.
Heap 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. (위키피디아 메모리 동적 할당 참고)
Heap 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
Heap 영역이 Stack 영역을 침범하는 경우 Heap Overflow가 발생한다.
3. Data 영역 / BSS 영역
메모리의 Data 영역은 프로그램의 전역변수(global variable)와 정적변수(static variable)가 저장되는 영역이다.
RAM의 Data 영역에는 ROM의 Data 영역에서 복사된 초기화된 전역변수와 정적변수가 저장되어 있다.
Data 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
전역변수와 정적변수를 선언할 때 값을 초기화했으면 Data 영역에 생성되고, 초기화하지 않았으면 BSS 영역에 생성된다.
BSS 영역은 프로그램 실행을 시작하기 전에 OS 커널에 의해 0으로 자동 초기화된다.
전역변수와 정적변수를 프로그램 내에서 초기화하지 않아도 0으로 자동 초기화되는 이유가 이 때문이다.
BSS는 Block Started by Symbol의 약자다.
c언어에서 변수를 어떻게 선언하느냐에 따라 저장될 메모리 영역이 결정된다.
저장 영역과 같은 특성을 지정하는 것은 기억 부류 지정자(storage class specifier)를 통해 가능하다.
static, auto, extern 등이 있으며, 흔히 키워드라고 부르기도 한다.
4. Code 영역
메모리의 Code 영역은 실행할 프로그램의 코드가 저장되는 영역으로 Text 영역이라고도 부른다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
'CS > OS & 하드웨어' 카테고리의 다른 글
프로그래밍 언어와 빌드 과정 [Build Process] (0) | 2023.09.23 |
---|---|
아스키코드, 유니코드, UTF-8의 차이 (0) | 2023.09.10 |
Virtual Memory - 가상 메모리 ( 필요한 이유 ) (0) | 2023.08.24 |
Memory Allocation (논리 메모리, 물리 메모리, Dynamic Loading, Paging이 나온 이유 ) (0) | 2023.08.24 |
Swapping 스와핑 ( page in, page out ) (0) | 2023.08.24 |