본 벨로그의 내용 및 이미지는 다음의 강의를 참고해서 작성이 되었으며, 틀린 내용이 있을 수도 있으니 너그럽게 봐주시면 감사하겠습니다:)
비트(bit)는 한번에 다룰 수 있는 데이터의 최대 크기를 의미한다. 32bit CPU가 있다고 하면 당연하게도 이 CPU내부의 레지스터, 각종 버스의 크기의 대역폭도 32 bit이다. 이 32bit CPU의 경우 메모리 주소를 지정하는 레지스터인 MAR의 크기가 32bit이므로 표현할 수 있는 메모리 주소의 범위가 0~2^32-1 총 2^32이며 이를 16진수로 나타내면 00000000~FFFFFFFF이며 총크기는 4GB이다. 따라서 32bit CPU 컴퓨터는 메모리를 최대 4GB까지 사용할 수 있다. 64bit CPU까지 확장하여서 비교해해보면 다음과 같다.
구분 | 32bit CPU | 64bit CPU |
---|---|---|
주소 범위 | 0~2^(32)-1번지 | 0~2^(64)-1번지 |
총크기 | 약 4GB | 약 16,777,216TB |
컴퓨터는 메모리 공간을 관리할때 (위의 그림에서의 정사각형 한칸) 1byte 단위로 관리한다. CPU는 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 메모리 주소 레지스터(MAR)를 사용한다.
메모리 관리의 이중성이란 프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 되도록 관리를 효율적으로 하고 싶어하는 것을 말한다. 메모리 관리 시스템은 이러한 메모리 관리의 이중성을 완만하게 해결학 위해 노력한다.
계층적 메모리 구조를 만든 이유 : 충분히 크지 않은 메모리에서 여러 작업을 동시에 실행해야 하는데, 작업 속도 역시 CPU에 필적해야 작업 효율이 떨어지지 않게 되므로 메모리를 계층적 구조로 만들어 작업 속도를 올리고 가격을 낮추어 계층적 메모리 구조로 만들었다.
메모리는 메모리 관리자에 의해 관뢰되며 크게 가져오기 (fetch), 배치 (replacment), 재배치 (replacement)의 작업을 한다.
기본적으로 사용자 프로세스는 운영체제 영역을 피하여 메모리에 적재된다. 따라서 보다 실제 물리적인 프로세스의 위치가 주소가 아닌 상대적인 주소로 프로세스를 관리하기 시작하기 위해 상대주소라는 개념이 도입되었다. 위의 그림 7-12에서 360번지가 0번지로, 400번지가 40번지로 바뀌는데, 360번지와 400번지는 절대 주소 (MAR이 사용하는 주소로 실제 컴퓨터에 꽃힌 램 메모리의 주소)이고 0번지와 40번지는 상대 주소이다. 상대 주소는 논리 주소라고도 불리며, 가상 메모리와 관련이 있다고 한다.
프로그램의 크기가 실제 메모리보다 클 때, 프로그램을 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 사용하는 것을 메모리 오버레이라고 한다. 위의 그림 예시에서 처럼 아래 한글을 실행하면 모든 모듈들을 전부 램에다 올리고 실행하는 것이 아니라 맞춤법 검사나 그림판과 같은 모듈들을 필요할때마다 램에다 올려놓고 실행하는 방식이 메모리 오버레이 기법이다.
메모리 오버레이를 위해 프로세스를 모듈로 나누어서 메모리에 가져와서 실행을 했다. 그렇다면 나누어진 각 모듈들은 어디서 가져와서 실행할까? 바로 2차 메모리 공간인 SSD이다. 하지만 이 모듈들은 언제 다시 메모리록 가져올 지 모르기 때문에 메모리 관리자에 의해 스왑 영역이라는 공간에 특별 보관된다. 그리고 스왑 영역에서 메모리로 데이터를 가져오는 작업을 스왑 인, 메모리에서 스왑 영역으로 데이터를 내보내는 작업을 스왑 아웃이라고 한다. 스왑 인 & 아웃은 페이지 인 & 아웃 이라고 불리기도 한다.
메모리에 여러 개의 프로세스를 배치하는 방법은 크게 가변 분할 방식과 고정 분할 방식으로 나뉜다.
따라서 현대 운영체제는 기본적으로 고정 분할 방식을 사용하면서 일부분은 가변 분할 방식을 혼합한다고 한다.