폰노이만 구조에서 메모리는 유일한 작업 공간이며 모든 프로그램은 메모리에 올라와야 실행할 수 있다. 모든 프로그램은 하드디스크나 SSD같은 보조 저장장치에 보관되어 있다. 프로그램이 실행되어 프로세스가 된다는 것은 저장장치에 있던 프로그램이 메모리로 올라온다는 것이다.

 

메모리 이해하기

메모리의 구조는 1바이트(B) 크기로 나뉜다. 1B로 나뉜 각 영역은 주소(address)로 구분되는데 보통 0번지부터 시작한다.

<메모리 주소>

메모리는 매우 빠른 장치 같지만, CPU입장에서 보면 느린 장치다. CPU 안에 있는 레지스터에 접근하는 속도보다 메모리에 접근하는 속도가 몇 배 이상 느리다. 이러한 속도 차이를 극복하기 위해 CPU 안에 캐시(cache)를 만들어두고 메모리의 일정 부분을 미리 가져와(prefetch) 작업한다. 

<메모리 계층 구조>

메모리 관리의 이중성

메모리 관리는 운영체제를 비롯해 여러 작업을 동시에 처리할 때 메모리를 어떻게 관리하는가에 관한 문제이다. 이처럼 복잡한 메모리 관리는 메모리 관리 시스템(MMS:Memory Management System)이 담당한다. 일괄 처리 시스템에서는 한 번에 한 가지 작업만 처리했기 때문에 메모리 관리가 어렵지 않았다. 그러나 시분할 시스템에서는 운영체제를 포함한 모든 응용 프로그램이 메모리에 올라와 실행되기 때문에 메모리 관리가 복잡하다.

프로세스 입장에서는 메모리를 독차지하려고 하고, 메모리 관리자 입장에서는 관리를 효율적으로 하고 싶어 하는데 이를 메모리 관리의 이중성이라 한다.

 

메모리 관리 작업

메모리 관리 작업은 크게 가져오기(fetch), 배치(placement), 재배치(replacement)로 구분된다.

  • 메모리 가져오기(fetch): 실행할 프로세스와 데이터를 메모리로 가져오는 작업이다.
  • 메모리 배치(placement): 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업이다. 메모리를 같은 크기로 자르는 것페이징(paging)이라 하고, 프로세스의 크기에 맞게 자르는 것세그먼테이션(segmentation)이라고 한다.
  • 메모리 재배치(replacement): 꽉 찬 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업

메모리 주소

메모리에 접근할 때는 주소를 이용한다. 메모리 주소는 물리 주소와 논리 주소로 나뉜다.

32bit CPU와 64bit CPU의 차이

CPU를 나타낼 때의 비트(bit)는 CPU가 한 번에 다룰 수 있는 데이터의 최대 크기를 의미한다. 32bit CPU는 한 번에 다룰 수 있는 데이터의 최대 크기가 32bit, 64bit CPU는 64bit다.

32bit CPU의 경우 메모리 주소를 지정하는 레지스터인 메모리 주소 레지스터(MAR)의 크기가 32bit이므로 표현할 수 있는 메모리 주소의 범위는 0~2^32-1, 총개수는 2^32개다. 이는 약 4GB이며 32bit CPU 컴퓨터는 메모리를 최대 4GB까지 사용할 수 있다. 64bit CPU 컴퓨터는 거의 무한대에 가까운 메모리를 사용할 수 있다.

32bit CPU든 64bit CPU든 컴퓨터에는 메모리가 설치되고 각 메모리에는 주소 공간이 있다. 메모리의 주소 공간을 물리 주소 공간(physical address space)이라고 하는데 이는 하드웨어 입장에서 바라본 주소 공간으로 컴퓨터마다 그 크기가 다르다. 반대로 사용자 입장에서 바라본 주소 공간을 논리 주소 공간(logical address space)이라고 한다.

 

메모리 영역의 구분

메모리 관리를 설명하기 위해 단순 메모리 구조를 살펴보자. 메모리 관리자는 메모리를 운영체제 영역과 사용자 영역으로 나누어 관리한다. 운영체제는 시스템을 관리하는 중요한 역할을 하기 때문에 사용자가 운영체제를 침범하지 못하도록 분리해서 관리한다. 그림에서는 운영체제가 0~359번지를 사용하고 사용자가 360~999번지를 사용한다. 사용자 프로세스는

운영체제를 피해서 메모리에 적재되는데, 운영체제 영역을 399번지까지 사용한다면 사용자 프로세스가 400번지부터 적재되어야한다. 

<단순 메모리 구조>

사용자 영역이 운영체제 영역으로 침범하는 것을 막으려면 하드웨어의 도움이 필요한데, 이는 CPU 내에 있는 경계 레지스터가 담당한다. 경계 레지스터운영체제 영역과 사용자 영역 경계 지점의 주소를 가진다. 메모리 관리자는 사용자가 작업을 용청할 때마다 경계 레지스터의 값을 벗어나는지 검사하고, 만약 경계 레지스터를 벗어나는 작업을 요청하는 프로세스가 있으면 그 프로세스를 종료한다.

<운영체제와 경계 레지스터>

논리 주소와 물리 주소의 변환

문자형 변수 alp를 선언하고 해당 변수에 대문자 A를 저장하는 경우를 살펴보자. 다음 코드가 실행되면 메모리의 어딘가에 문자 A가 저장된다. 그 주소를 40번지라 하자.

char alp = 'A'; 

실행을 위해 프로세스가 메모리에 올라오면 이 메모리는 빈 공간에 배치된다. 40번지는 물리 메모리의 주소 400번지가 된다고 하자. 여기서 400번지는 물리주소이다. 물리주소는 메모리의 입장에서 바라본 주소다. 즉, 메모리 주소 레지스터가 사용하는 주소로, 컴퓨터에 꽂힌 램 메모리의 실제 주소를 말한다. 40번지는 논리 주소이며, 이는 시작점을 0으로 놓았을 때 40번지의 위치에 있는 주소를 말한다. 논리 주소는 사용자 프로세스 입장에서 바라본 주소다. 기억할 것은 프로그램이 실행될 때마다 물리 주소는 매번 바뀐다는 점이다. 논리 주소 공간은 항상 0번지부터 시작하며 컴퓨터가 허용하는 최대의 주소 크기를 가진다. 논리 주소로 이루어진 프로세스를 실행하면 이를 물리 주소로 변환하는 작업이 필요하다. 이 작업은 메모리 관리 유닛(MMU: Memory Management Unit)이 담당한다. 메모리 관리 유닛은 CPU 안에 존재하며 프로세스가 논리 주소에 접근할 때마다 이를 물리 주소로 변환하는 작업을 한다.

<논리 주소를 물리 주소로 변환하는 과정>

위의 그림에서 재배치 레지스터는 주소 변환의 기본이 되는 주소 값을 가진 레지스터로, 메모리에서 사용자 영역의 시작 주소 값이 저장된다.

'Programming > 운영체제' 카테고리의 다른 글

[운영체제]교착상태  (2) 2023.06.06

+ Recent posts