CS : 컴퓨터 아키텍쳐와 운영체제

2022. 2. 4. 01:07CS

반응형

<메모리 관리 장치>

 

프로그램에 버그가 있으면 어떤 일이 벌어질까? 버그가 있어서 사용자 프로그램 1이 차지한 메모리를 덮어쓰거나, 심지어 OS의 메모리를 덮어쓴다면 어떤 일이 벌어질까? 누군가 의도적으로 시스템에 실행 중인 다른 사라므이 프로그램을 들여다보거나 변경하는 프로그램을 작성한다면? 각 프로그램을 분리해서 이런 시나리오가 아예 불가능하게 할 수 있도록 오늘날 대부분의 마이크로프로세서에는 메모리 관리 장치(MMU, memory management unit)가 들어있다.

 

MMU가 들어 있는 시스템은 가상주소(virtual address)와 물리주소(physical address)를 구분한다. 

프로그램은 가상 주소를 사용해 작성되고, MMU는 가상 주소를 물리 주소로 변환해 준다.

 

MMU는 가상 메모리 주소를 두 부분으로 나눈다. 주소의 하위(LSB 쪽) 부분은 물리적 주소 범위와 같다. 상위(MSB 쪽) 부분은 페이지 테이블(page table)이라는 RAM 영역을 통해 주소를 변환(translation)한다. 

먼저, 프로세스의 메모리를 page 단위로 자르고, 실제 physical 메모리도 page 단위로 쪼갠다. 이 때 쪼개진 physical memory를 page나 page frame이라고 부른다.

그리고 Virtual address의 프레임을 Physical 메모리의 프레임으로 mapping 하는 방법이다.

 

프로그램이 물리적 메모리에 연관되지 않은 주소에 접근하면 페이지 폴트(page fault) 예외가 발생한다. 이런 동작은 스택 오버플로 등이 일어날 때 유용하게 쓰일 수 있다. 스택 오버플로가 발생하면 스택 범위를 벗어나는 주소에 접근하므로 페이지 폴트가 발생하고, 이 예외가 발생하면 OS는 실행 중인 프로그램을 중단시키는 대신 MMU가 추가 메모리를 할당하게 해서 스택 공간을 늘리고 사용자 프로그램 실행을 계속할 수 있다.

 

<가상 메모리>

운영체제OS는 희소한 하드웨어 자원을 사용하려고 경합하는 프로그램들 사이의 자원 분배를 관리한다. 

OS는 MMU를 사용해 사용자 프로그램에게 가상 메모리(virtual memory)를 제공한다.

페이지 폴트 메커니즘으로 인해 프로그램은 필요한 만큼(가상메모리 주소 범위 내에서) 많은 메모리가 있다고 생각할 수 있게 됐다. 요청받은 메모리가 사용가능한 (물리적) 메모리의 크기보다 크면 어떻게 될까? OS는 현재 필요하지 않은 메모리 페이지를 더 느리지만 더 용량이 큰 대용량 저장장치인 디스크로 옮기다. 이를 스왑 아웃(swap out)이라고 부른다. 

이런 스왑 아웃한 페이지에 프로그램이 접근하면 운영체제는 필요한 메모리 공간을 확보하고 요청받은 페이지를 다시 메모리로 불러들인다. 이렇게 디스크에서 메모리로 페이지를 읽어오는 동작을 스왑 인(swap in)이라고 부른다. 이런 식으로 페이지를 처리하는 것을 요구불 페이징(demand paging)이라고 부른다.

 

<시스템 공간과 사용자 공간>

CPU에는 컴퓨터가 시스템모드에 있는지 사용자모드에 있는지 결정하는 비트가 어떤 레지스터 안에 들어 있다. I/O를 처리하는 명령어 등 일부 명령어는 특권 명령어라서 오직 시스템 모드에서만 실행할 수 있다. 트랩이나 시스템 콜이라고 부르는 특별한 명령어를 통해 사용자 모드에서 실행 중인 프로그램이 시스템 모드 프로그램(즉 운영체제)에게 요청을 보낼 수 있다.

이런 방식에는 몇 가지 장점이 있다. 첫째, 이 방식은 사용자 프로그램으로부터 운영체제를 보호하고, 사용자 프로그램을 다른 사용자 프로그램으로부터 보호한다. 둘째, 사용자 프로그램이 MMU 등의 몇몇 요소에 손을 댈 수 없기 때문에 운영체제가 프로그램에 대한 자원 할당을 전적으로 제어할 수 있다. 하드웨어 예외는 오직 시스템 공간에서만 처리된다.

반응형