CPU는 레지스터, 캐쉬, 메인 메모리에만 접근이 가능하다.
따라서 프로그램을 실행하기 위해선 메인 메모리에 프로그램을 적재해야한다.
메인 메모리의 데이터를 읽어서 조작하는 과정은 CPU에 있는 레지스터를 동작하는 것보다 느린데, CPU가 메인 메모리에서 데이터를 읽어오기를 기다리는 것을 stall이라고 한다.
따라서 이런 대기 시간을 줄이기 위해서 캐쉬에 일부 내용을 저장함으로써 속도 문제를 어느정도 해결한다.
프로세스가 실행될 때 실행 중인 프로세스는 메모리의 보호를 위해 os와 서로 다른 프로세스에 접근이 불가능해야 한다.
→ base와 limit registers 페어를 정의함으로써 프로세스 범위 만큼만 접근 가능하게 한다.
→ base ≤ x < base + limit
[주소 할당]
프로그램은 이진 실행 파일 형태로 디스크에 저장되어 있기 때문에 실행하려면 프로그램을 메모리에 적재하여야 한다. 그렇다면 어떤 메모리 위치에 프로그램을 적재해야 할까?
1 ) 0000번지부터 시작되게 한다.
→ 많은 문제들이 생길 수 있다.
2 ) 컴파일러가 재배치 가능 주소(시작 위치로부터 얼만큼 떨어져 있는지)로 바인딩하면, 링커가 재배치 가능 주소를 절대 주소로 바인딩시킨다.
[바인딩 종류]
1 ) 컴파일 시간 바인딩 : 컴파일 시간에 프로세스가 들어갈 메모리 위치를 미리 알 수 있으면 절대 코드 생성 가능.
2 ) 적재 시간 바인딩 : 컴파일 시점에 메모리 적재 위치를 모른다면 재배치 가능 코드로 만든 후 나중에 메인 메모리에 적재 될 때 진짜 메모리 주소로 다시 바인딩 된다.
3 ) 실행 시간 바인딩
[논리 및 물리 주소 공간]
1 ) 논리 주소 : CPU에 의해 생성됨.
2 ) 물리적 주소 : 메모리 단위에 의해 보여지는 주소(실제 주소)
컴파일 시간에는 논리 주소와 물리적 주소가 같지만 load-time에는 가상 주소를 물리 주소로 바꾸어줘야 한다.
이러한 작업은 메모리 관리 장치에 의해 실행된다.
CPU → MMU → 물리 메모리
[동적 적재]
위와 같은 구조는 프로세스 전체가 미리 메모리에 올라와 있어야 한다.
→ 이 때, 프로세스의 크기가 메모리의 크기보다 커서는 안 된다.
→ 메모리의 공간을 효율적으로 사용하기 위해 동적 적재를 사용한다.
동적 적재에서 각 프로세스들은 실제 호출되기 전까지 메모리에 올라오지 않고 재배치 가능한 상태로 디스크에 대기하고 있는다.
→ 간혹 발생하면서도 실행할 코드가 많은 오류 처리 루틴과 같은 경우에서 아주 유용하다.