이 포스팅은 Operating Systems: Three Easy Pieces, Remzi H. Arpaci-Dusseau & Andrea C. Arpaci-Dusseau을 읽고 개인 학습용으로 정리한 글입니다.
대부분의 경우 프로그램은 HW에서 직접 실행
그러나, 프로세스가 시스템 콜을 호출하거나, 타이머 인터럽트가 발생할 때 등의 특정 순간에는 운영체제가 개입
하드웨어-기반 주소 변환(hardware-based address translation)
제한적 직접 실행 방식에 부가적으로 사용되는 기능
명령어 반입, 탑재, 저장 등의 가상 주소를 정보가 실제 존재하는 물리 주소로 변환
-> 프로그램의 모든 메모리 참조를 실제 메모리 위치로 재지정하기 위해 HW가 주소 변환
정확한 변환이 일어날 수 있도록 HW를 셋업하기 위해 운영체제가 관여해야
-> 운영체제는 메모리의 빈 공간과 사용 중인 공간을 항상 알고 있어야
사용자 주소 공간은 물리 메모리에 연속적으로 배치되어야 한다고 가정
주소 공간의 크기가 너무 크지 않다고 가정
(주소 공간은 물리 메모리 크기보다 작다)
각 주소 공간의 크기는 같다고 가정
프로그램 관점에서 주소 공간은 주고 0부터 최대 16KB까지이다.
프로그램이 생성하는 모든 메모리 참조는 이 범위 내에 있어야
메모리 가상화를 위해 운영체제는 프로세스를 물리 메모리 주소 0이 아닌 다른 곳에 재배치하고 싶다
이 프로세스의 주소 공간이 메모리에 배치되었을 때 가능한 물리 메모리 배치의 예.
베이스와 바운드(base and bound) / 동적 재배치(dynamic relocation)
각 CPU마다 두 개의 HW 레지스터가 필요하다
-> 베이스 (base) 레지스터
-> 바운드(bound) 레지스터 / 한계(limit) 레지스터
바운드 레지스터는 보호를 지원하기 위해 존재한다.
-> 프로세서는 먼저 메모리 참조가 합법적인가를 확인하기 위해 가상 주소가 바운드 안에 있는지 확인한다
방식 1: 바운드 레지스터에 주소 공간의 크기 저장
-> HW는 가상 주소에 베이스 레지스터를 더하기 전에 바운드 레지스터와 비교
방식 2: 바운드 레지스터에 주소 공간의 마지막 물리 주소를 저장
-> HW는 먼저 가상 주소에 베이스 레지스터를 더하고 그 결과가 바운드 안에 있는지 검사
두 가지 CPU 모드 필요
-> 특정한 순간에 CPU는 모드를 전환한다
운영체제는 특권 모드(커널 모드)에서 실행
-> 컴퓨터 전체에 대한 접근 권한을 가짐
응용 프로그램은 사용자 모드에서 실행
-> 할 수 있는 일에 제한이 있다
프로세서 상태 워드(process status word) 레지스터의 한 비트가 CPU의 현재 실행 모드를 나타낸다
CPU는 사용자 프로그램이 바운드를 벗어난 주소로 불법적인 메모리 접근을 시도하려는 상황에서 예외를 발생시킬 수 있어야 함
-> 이 경우 CPU는 예외를 발생시킴 & 운영체제의 “바운드 벗어남” 예외 핸들러를 실행시켜야
CPU는 사용자 프로그램이 특권이 필요한 베이스와 바운드 레지스터 값의 변경을 시도하면 예외를 발생기킬 수 있어야 함
-> 이 경우 CPU는 예외를 발생시킴 & “사용자 모드에서의 특권 연산 발생” 핸들러를 실행시켜야
프로세스가 생성될 때 운영체제는 주소 공간이 저장될 메모리 공간을 찾아 조치를 취해야 한다
각 주소 공간은 물리 메모리의 크기보다 작고, 크기가 일정하다는 가정 하에서 쉽게 처리 가능
운영체제는 물리 메모리를 슬롯의 배열로 보고 각 슬롯의 사용 여부를 관리
새로운 프로세스가 생성되면 운영체제는 새로운 주소 공간 할당에 필요한 영역을 찾기 위해 자료구조(흔히 빈 공간 리스트(free list))를 검색
-> 검색을 통해 선택된 공간을 사용 중이라고 표시
프로세스가 종료할 때, 즉 정상적으로 종료될 때 또는 잘못된 행동을 하여 강제적으로 죽게 될 때 프로세스가 사용하던 메모리를 회수하여 다른 프로세스나 운영체제가 사용할 수 있게 해야 한다
프로세스가 종료되면, 운영체제는 종료한 프로세스의 메모리를 다시 빈 공간 리스트에 넣고 연관된 자료구조를 모두 정리한다
운영체제는 문맥 교환이 일어날 때에도 몇 가지 추가 조치를 취해야 한다
-> 운영체제는 프로세스 전환 시 베이스와 바운드 쌍을 저장하고 복원해야 한다
운영체제가 실행 중인 프로세스를 중단시키기로 결정하면, 운영체제는 메모리에 존재하는 프로세스별 자료구조(프로세스 구조체(process structure) 또는 프로세스 제어 블록(process control block)) 안에 베이스와 바운드 레지스터의 값을 저장해야
운영체제는 실행 중인 프로세스를 다시 시작할 때/처음 실행시킬 때, 이 프로세스에 맞는 값으로 CPU의 베이스와 바운드 레지스터를 설정해야
프로세스가 중단되면 (즉, 실행 상태가 아닐 때) 운영체제가 메모리의 현 위치에서 다른 위치로 주소 공간을 비교적 쉽게 옮길 수 있다.
메모리 변환은 운영체제의 개입 없이 HW가 처리하는 것에 주목
제한적 직접 실행의 기본적인 접근 방식을 따르고 있다
-> 대부분의 경우, 운영체제는 HW를 적절하게 설정하고 프로세스가 CPU에서 직접 실행할 수 있게 함
-> 타임 인터럽트 발생 / 프로세스가 잘못된 행동을 했을 때에만 운영체제가 개입한다
재배치된 프로세스에서 스택과 힙 사이의 공간이 단순히 낭비되고 있다
이러한 할당된 내부 공간이 사용되지 않아 발생하는 낭비
= 내부 단편화(internal fragmentation)
비록 더 많은 프로세스를 탑재할 수 있는 충분한 물리 메모리가 있더라도, 고정 크기의 슬롯에 주소 공간을 배치해야 하기 때문에 내부 단편화가 발생한다