※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.
메모리는 오직 주소값으로만 접근할 수 있습니다.
이 주소는 2가지 관점으로 바라볼 수 있는데, 바로 물리 주소와 논리 / 가상 주소 입니다.
물리 주소 ( physical address ) : 하드웨어 관점
논리 / 가상 주소 ( logical address / virtual address ) : 프로세스 관점
메모리 접근 시 상대 주소를 사용하면 절대 주소로 변환해주어야 함 ( MMU 가 해줌 )
일반적인 프로세스는 메모리 위에 물리 주소의 형태로 올라와야 합니다.
만약 같은 주소로 변수 값이 올라와야 하는 상황이 온다면..
→ 로드가 되지 않거나, 값이 덮어씌워지거나 둘중 하나!
위와 같은 문제점을 해결하기 위해, 논리 / 가상 주소를 도입하게 되었습니다.
이 가상 주소는 실제로 쓰는 값은 아니기에, 이를 물리 주소로 바꿔서 CPU 가 처리합니다.

Address Binding 이란, 프로그램이 메모리 어느 물리적 위치에 Load 되어야 할지 결정하는 과정입니다.
컴파일 타임에 정해질 경우, 상대 주소의 개념이 쓰이지 않습니다.
같은 주소를 쓰는 프로세스가 있다면 메모리에 적재하지 못하거나, 바꿔치기 될 수 있습니다.
메모리에 로드되는 순간 상대 주소를 물리 주소로 바꿔주게 됩니다.
하지만 만약 바꿔야 할 주소가 많다면, 로딩에 부담이 되게 됩니다.
Run-Time Binding : 프로세스가 수행이 시작된 이후에 프로세스가 실행될 때 메모리 주소를 바꿈
매번 주소 계산을 다시 해야하니 시간이 오래걸린다는 단점이 있습니다.
이를 보완하기 위해 MMU ( Memory Management Unit ) 를 도입하게 되었습니다.

MMU는 논리 주소를 물리 주소로 바꾸는 하드웨어 장치입니다.
CPU 가 발생시킨 논리 주소는 MMU 에 의해 물리 주소로 바뀌어 메모리에 도달
오늘날 MMU 는 CPU 안에 내장
MMU 덕분에 여러 프로세스가 하나의 메모리에서 실행됨

메모리 관리자 ( MMU ) 는 사용자 프로세스가 상대 주소를 사용하여 메모리에 접근할 때 마다 상대 주소 값에 Base 레지스터 값을 더하여 절대 주소를 구하는 과정을 진행합니다.
Base 레지스터 : 주소 변환의 기본이 되는 주소값을 가진 레지스터
메모리에서 사용자 영역의 시작 주소값이 저장됨
Limit 레지스터 : 메모리 관리자는 사용자가 작업을 요청할 때 마다 경계 ( 상한 ) 을 벗어나는 작업을 요청하는 프로세스가 있으면 그 프로세스를 종료

CPU 가 읽고 해석하고 발생시키는 주소 → 논리 주소
논리 주소와 물리 주소의 매핑 테이블 존재
MMU 를 거쳐 논리 주소가 물리 주소로 바뀌어 출력
MMU 는 매핑 테이블을 이용하여 주소 변환

각 프로세스는 자신이 모든 메모리 공간을 점유하고 있는 것 처럼 생각합니다.
하지만 실제 할당된 공간은 프로세스가 실제 필요한 공간보다 작을 수 있습니다.
이 문제를 해결하고자 메모리 오버레이 기법이 도입되었습니다.
프로그램의 크기가 실제 메모리 ( 물리 메모리 ) 보다 클 때 전체 프로그램을 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 기법
프로그램이 실행되면 현재 필요한 부분만 메모리에 가져와 실행 → 바꿔가면서 실행 ( Swap )

Swap Area
Swap 하다보니 발생하는 문제점

프로세스가 다른 프로세스의 영역을 침범하면 안되니, CPU 는 사용자 모드에서 생성된 모든 메모리 액세스를 확인하여 해당 사용자의 기본값과 제한값 사이에 있는지 확인해야 합니다.
MMU 의 지원을 받음
Base Register 와 Limit Register 를 사용하여 접근 보호
이 공간을 벗어나는 주소 공간 접근시, 에러 발생

메모리 주소가 누출되는 일은 보안 상 좋지 않습니다.
이를 막기 위해, 주소 공간은 랜덤하게 배치함으로써 메모리 주소가 누출되더라도 의미 없는 일로 만들어버릴 수 있습니다.
실행할 때마다 논리 주소가 바뀜
실행할 때마다 함수의 지역 변수와 동적 할당 받는 메모리의 논리 주소가 바뀜

공감하며 읽었습니다. 좋은 글 감사드립니다.