논리적 주소와 물리적 주소
<aside>
💡 NOTE
-
메모리 : 주소를 통해 접근하는 저장장치이다.
-
논리적 주소
- 프로그램 실행을 위해 메모리에 적재되면 그 프로세스를 위해 생성되는 독자적 주소 공간
- 각 프로세스마다 할당되며 0부터 시작한다.
- cpu가 보는 주소를 의미한다.
- 논리적 주소와 물리적 주소에 있는 instruction안의 코드는 변경x
- cpu는 메모리 접근 시에 주소 변환을 통해 메모리에 접근한다.
-
물리적 주소
- 실제로 저장되는 위치
- 낮은 주소영역에는 운영체제, 높은 주소영역에는 사용자 프로세스가 저장
- 하나로 관리되며 0부터 관리
-
프로세스가 실행되려면 물리적 메모리에 저장되어야하며, cpu가 기계어 명령을 수행하기 위해 논리적 주소를 통해 메모리를 참조하게되면 해당 놀리적 주소가 어느 위치에 매핑되는지 확인해야한다.
→ 주소 바인딩
주소 바인딩
- 프로세스의 논리적 주소를 물리적 메모리 주소로 연결해주는 작업
- Symbolic Address - Logical Address(프로그램의 독자적 주소) - Physical Address(메모리로 수행)
- Symbolic Address : 프로그래머가 숫자 주소로 프로그래밍하지 않고, 바라보는 주소이다.
- 변수 저장 : 메모리 몇번지에 저장하는지 명령하지 않는다.
- 함수 호출 : 메모리 몇번지로 점프하는지 명령하지 않는다.
- 숫자로 된 주소를 사용하지 않고 symbol로 된 주소(함수 및 변수 명)으로 사용한다.
- 컴파일 과정에서 Logical Address로 변환된다.
- 주소 바인딩과정에서 Physical Address로 변환된다.
시점이 그럼 언제 주소 바인딩이 되는 것인가??
주소 바인딩의 종류 3가지

- Complie time binding : 프로세스가 메모리에 적재될 위치를 컴파일러가 알 수 있는 경우. 위치가 변하지 않으며 프로그램 전체가 메모리에 올라가야한다.
- 컴파일 할때 물리적 메모리 주소를 결정한다.
- 논리적 주소가 물리적 주소
- 절대 코드를 생성하는 방식
- 컴파일 할때 결정하기에 비효율적이어서 현재는 사용되지 않는다.
- 프로그램이 올라간 물리적 메모리 위치를 변경하려면 재컴파일이 필요하다.
- Load time binding : 메모리 적재 위치를 컴파일 시점에 모르면, 대체 가능한 상대 주소를 생성. load time에 시작 주소를 반영해 사용자 코드 상의 주소를 재설정한다. 이것도 프로그램 전체가 메모리에 올라가야한다.
- 프로그램이 실행이 시작될 때 물리적 메모리 주소 결정
- Loader 책임하 물리적 메모리 주소를 부여하며 프로그램 종료전까지 고정
- 컴파일러가 재배치 가능 코드를 생성한 경우 가능한 주소 바인딩 방식이다.
- runtime binding : 수행 시간까지 연기, 프로세스가 수행 도중 다른 메모리 위치로 이동할 수 있으며 이는 하드웨어의 도움이 필요
- mmu지원 필요
- 지금의 컴퓨터 시스템
- 프로그램이 실행한 후에도 그 프로그램이 위치한 물리적 메모리 상의 주소가 변경될 수 있는 바인딩 방식이다.
- cpu가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 위치를 찾아, 주소 매핑 테이블을 이용해 바인딩을 점검한다.
</aside>
MMU(메모리 관리 유닛)
<aside>
✍️ NOTE
-
논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치이다.

-
MMU scheme : cpu가 특정 프로세스의 논리적 주소를 참조할 때, 그 주소값에 relocation register의 값을 더해 물리적 주소값을 얻어낸다.
- relocation register(재배치 레지스터) : 프로세스의 물리적 메모리 시작 주소
- MMU scheme에서는 프로그램의 주소 공간이 물리적 메모리의 한 장소에 연속적으로 적재되기에 물리적 메모리 상의 시작주소만 알면 주소 변환이 쉽다.
- limit register : 프로세스가 자신의 주소 공간을 넘어서 수행중인 프로세스의 논리적 주소의 최댓값, 즉 프로세스 크기를 담는다.
- 프로세스가 자신의 주소공간이 넘는 것을 체크하는 용도
- cpu가 메모리 참조를 요청하면 그 주소가 limit register보다 넘는지 체크해 적다면 논리적 주소값에 relocation register를 더해 물리적 주소를 구하고 접근을 허가받는다.
- 크다면 다른 프로세스의 주소 영역에 접근하므로 트랩을 발생시켜 강제종료한다.
- 유저 프로그램은 logical 주소만 다루기에 물리적 주소를 알필요가 없고 알수 없다.→ 보안적 안전
</aside>
<aside>
✍️ NOTE

- CPU가 논리 주소 346번 달라했을 때, MMU가 처음 저장하고 있던 주소 (14000) 에 논리 주소 (346)를 더해 물리적 주소 (14346) 를 얻게 된다.
limit register - 실행중인 프로세스의 최대 크기를 저장하고 있다. 실행중인 프로세스가 이상한 프로그램이라 3000번지까지밖에 없는데 4000번을 달라하면 , 주소변환하면 다른 프로그램거를 가져오게 되는거라 막아야 한다.

- 그래서 CPU가 논리 주소를 요청할 때 먼저 limit register를 확인하게 된다. 프로그램 크기보다 큰지 작은지
- 벗어난 요청이면 trap되어 넘어가게 된다
Dynamic Loading(동적 로딩)
프로세스 전체를 메모리에 모두 올리는 것이 아니라 실행에 필요한 부분이 실제 불릴때마다 메모리에 적재하는 것 → 여러 프로그램이 메모리에 동시에 올라가서 수행되는 다중 프로그래밍 환경에서 메모리 효율성을 높이기 위해 사용
프로그램 코드 중 상당 부분은 오류 처리 루틴과 같이 특별한 경우에만 사용되는 방어용 코드인데 이러한 코드 전체를 메모리에 올리는 경우 많은 메모리를 차지해 → 메모리 낭비 초래
동적 로딩 기법은 사용되지도 않는 코드가 메모리에 올라가는 것을 방지
운영체제의 특별한 지원 없이 프로그램 자체에서 구현이 가능해 운영체제가 라이브러리를 통해 지원할 수도 있다.
*OS의 페이징 기법과는 다른 것이다.
*현대적인 운영체제에서도 동적 로딩으로 부를수 있다.
프로세스의 주소 공간을 분할 해 실제 필요한 부분만 메모리에 적재하는 방법
Overlays는 하나의 프로세스조차도 메모리에 한꺼번에 올릴수 없던 초창기 시스템에서 사용
당장 필요한 메모리를 올려 실행하고 나머지를 실행이 끝난 뒤에 다시 올려 실행(디스크를 2개 연결해 사용하던 시절)
프로그램 크기가 물리적 메모리 보다 작다면 전체를 올리수도 있다.
메모리에 올라온 프로세스 주소 공간 전체를 backing store로 보내는 것, 프로세스가 종료되어 그 주소공간을 디스크로 보내는 것이 아니라 수행 중인 프로세스의 주소 공간을 일시적으로 메모리에서 디스크로 내려놓는 것을 의미
swap out : 메모리 → 디스크, 일반적으로 중기 스케줄러에 의해 프로세스 선정
- 너무 많은 프로그램이 메모리에 올라오게 되면 프로세스 당 할당되는 메모리의 양이 지나치게 저어져 시스템 전체의 성능이 크게 떨어진다.
</aside>
세그멘테이션 기법
<aside>
💡
</aside>
Segmentation with Paging
<aside>
💡
</aside>