메모리는 고유한 주소를 가지고 있는 바이트 배열로 구성된 데이터로 구성된다.
CPU는 메모리 주소로 접근하여 저장된 명령어를 가져와 처리함으로써 프로그램을 동작 시킨다.
Logical Address와 Physical Address의 구분
CPU가 프로세스를 수행하기 위해 사용하는 메모리 주소는 실제 물리적 메모리 주소와 다르다.
우리는 이 메모리 주소를 아래와 같이 구분한다.
- Logical Address : CPU가 생성하는 프로세스의 메모리 주소
- Physical Address : 실제 메모리에 할당되는 물리적 주소
먼저, 메모리 주소를 왜 구분하는지 알아보자.
이를 이해하는 것이 앞으로 설명할 개념을 이해하는데 큰 도움이 될 것이다.
1. 물리적 메모리 주소 추적의 어려움
물리적 메모리 주소는 변동될 수 있어, CPU가 이를 직접 추적하려면 매번 메모리에 접근해야 한다.
하지만 논리적 주소와 물리적 주소를 분리하고, 변환 장치를 사용하면 CPU는 변동하는 물리 주소를 신경 쓰지 않아도 된다.
2. 페이징과 가상 메모리
이는 결과론적인 얘기이긴 하지만, 논리 주소를 도입함으로써 페이징과 가상메모리가 가능해졌다.
- 페이징 : 메모리를 작은 단위(페이지)로 나누어 연속되지 않은 공간에도 프로세스를 배치
CPU는 논리적 주소를 사용하므로 조각난 물리적 메모리 주소 정보를 모두 알고 있을 필요 없음 - 가상 메모리 : 전체를 메모리에 올리지 않고, 필요한 부분만 적재
CPU는 논리적 주소만 보기에 아직 할당되지 않은 영역에 대해서도 주소값을 갖고 있고 실제 물리적 메모리 주소에 할당됬는지 여부를 신경쓰지 않아도 됨
Base Register & Limit Register
멀티 프로세스 환경에서 서로 다른 프로세스의 공간을 침범해서는 안된다.
프로세스 영역을 구분하기 위해 사용되는 개념이 Base Register(시작 주소)와 Limit Register(메모리 크기)이다.
프로세스의 시작 주소(Base)와 끝 주소(Base + Limit)를 알기에 각 프로세스의 메모리 영역을 명확히 구분 할 수 있다.
CPU는 실행할 메모리 주소가 base 값보다 큰지, base + limit 값 보다 작은지 비교하여 조건에 만족되면 메모리 접근을 허용한다.
만약 조건에 맞지 않는다면 프로세스를 종료시킨다.
* 기준 : base <= logical address+base < base+limit
Address Binding(주소 바인딩)
주소 바인딩은 프로그램의 논리적 주소(Logical Address)를 실제 물리적 주소(Physical Address)로 변환하는 과정이다.
프로그램이 메모리에 할당되는 과정을 알아보자.
- 컴파일 : 컴파일러가 프로그램 소스 파일을 컴퓨터가 이해할 수 있는 목적 파일(object file)로 변환
- 링킹 : 링커가 프로그램에서 사용하는 외부 라이브러리를 추가하여 실행파일 생성
- 로딩 : 로더가 실행파일을 메모리에 적재
- 실행 시점 : 동적 라이브러리(dll) 호출이 일어나면 주소 바인딩이 일어난다.
외부라이브러리와 동적라이브러리(dll)
외부라이브러리는 프로그램 코드에 직접 추가되어있지 않고 의존설정을 통해 추가된 라이브러리다.
예를 들어 maven을 통해 추가된 라이브러리들이다.
이 라이브러리들은 링커에 의해 코드가 결합된다.
동적라이브러리는 os에 의해 최초 한번 메모리에 할당되면 이후에는 모든 프로세스에서 공유하는 라이브러리이다.
만약 우리가 사용하는 프로그램이나 프로그램에서 사용하는 라이브러리 내부 파일에 .dll 확장자 파일이 있다면
그 파일은 os에 의해 한번 할당되고 다른 프로그램이 똑같은 파일을 사용한다면 해당 프로세스에 또 메모리 자원을 할당하는게 아닌 이미 할당된 자원을 공유하여 사용할 수 있는 라이브러리이다.
dll은 프로세스와 분리되어 별도의 메모리 영역을 할당받아 여러 프로세스에서 접근 가능하다.
이를 shared data 영역이라고 하며 dll은 동시성 문제가 발생되지 않도록 오직 읽기 가능한 자원으로만 이루어져 있다.
다이나믹 링킹과 다이나믹 로딩
링킹은 코드결합의 개념이고 로딩의 메모리 할당의 개념이다.
다이나믹 링킹은 외부 라이브러리의 코드의 결합이 실행시간에 이뤄지는 것이고,
다이나믹 로딩은 위에서 설명한 dll 자원의 메모리 주소가 실행시간에 할당되는 것이다.
1. Compile Time Binding
컴파일 시점에 물리적 메모리 주소를 결정하는 경우이다.
컴파일 시점에 메모리 주소가 고정되므로 동시에 여러 프로세스를 실행하기 어렵다.
메모리에 남은 영역이 있는 경우에만 정상 수행 가능하므로 단일 프로그램 환경에서만 가능하다.
(컴파일러는 메모리에 남은 영역이 있는지 파악 불가하다.)
주로 임베디드 소프트웨어서 사용되는 방식이다.
2. Load Time Binding
메모리에 로드하는 시점에 주소를 할당한다.
컴파일러는 논리적 주소를 사용하여 주소를 바인딩하고 프로그램이 메모리에 할당되면 Relocation Register를 통해 물리적 주소로 바꾼다.
Relocation Register는 이전에 설명한 Base Register의 역할을 한다.
논리적 주소가 100이고 Base Register에 저장된 프로세스의 시작 주소가 5000이라면 실제 물리적 주소는 5100으로 할당할 수 있다.
논리적 주소와 물리적 주소를 분리하였기에 멀티 프로그래밍은 가능하나,
실행 중에 동적으로 메모리 주소를 변경시키는 것은 불가능하기에 페이징이나 가상 메모리 처리는 여전히 불가능하다.
3. Execution Time Binding
실행시점에 논리적 주소를 물리적 주소로 변환 후 접근하여 실행하는 방식이다.
다음 포스팅에 다룰 페이징과 가상 메모리의 동작 방식이다.
MMU(Memory Management Unit)
MMU는 CPU 내에 존재하는 하드웨어로 논리적 주소를 물리적 주소로 변환과 프로세스 보호를 담당한다.
MMU 내에 논리적 주소와 물리적 주소를 매핑하는 자료 구조가 존재하고,
프로세스 보호를 담당하는 Base Register와 Limit Register가 존재한다.
MMU는 relocation register를 통해 논리적 주소에 Base 값을 더하여 이 값이 Base 보다 크거나 같고 Base + Limit 보다 작은지 비교하며 해당 범위 내에 존재한다면 메모리 접근을 허용하고, 해당 범위가 아니라면 프로세스를 종료시킨다.
이는 굉장히 단순한 처리에 대한 설명이며, 실제 페이지와 가상 메모리에 적용되는 개념은 이보다 조금 더 복잡하다.
해당 내용은 페이지와 가상메모리에서 설명하겠다.
++++++(부가개념) CPU의 메모리 주소 관리 체계++++++++++++++++++++++++++++
32비트 CPU는 한번에 처리할 수 있는 데이터의 양이 32비트이다.
32비트 CPU가 사용할 수 있는 최대 메모리 자원은 어느정도일까??
한번에 처리할 수 있는 데이터의 양이 32비트라는건
32비트 내에서 표현 가능한 메모리 주소만 사용 가능하다는 것이다.
1비트를 0과 1로 이루어진 한칸이라고 생각해보자.
한칸에 나올 수 있는 경우의 수는 0과 1으로 2가지이다.
32칸이 존재하므로 2^32=4GB이다.
만약, 64비트 CPU라면 어느 정도 메모리 공간을 사용할 수 있을까??
약 18억 테라바이트이다.
실제로 이만큼 많은 메모리 공간을 필요로 하는 상황이 생길까?
웹개발자인 나는 512GB 메모리 스펙을 사용하는 서버 컴퓨터 환경을 본적 있지만 테라 바이트 단위까지는 본적이 없다.
하지만, 메모리가 18억 테라바이트가 아니더라도 CPU는 18억 테라바이트까지 논리적 주소를 할당할 수 있다.
이를 가능하게 하는 개념이 가상 메모리이다.
사용중인 데이터만 메모리 공간에 할당하고 미사용중인 영역은 디스크로 내리는 작업을 반복하며 수행할 수 있다.
뒤이어 가상메모리에서 더욱 자세하게 설명하겠다.
'OS & Network > OS' 카테고리의 다른 글
동시성 문제[2] - Mutex, Semaphore, Monitor(동기화 도구) (0) | 2024.07.28 |
---|---|
동시성 문제[1] - 동시성 문제의 원인과 해결법 (0) | 2024.07.28 |
프로세스[2] - 멀티 프로세스와 멀티 스레드 (0) | 2024.07.25 |
프로세스[1] - 프로세스란, PCB와 Context Switch (0) | 2024.07.25 |
메모리[2] - 페이징, 가상메모리 (0) | 2024.07.25 |