[5] 주소 바인딩과 메모리

김두미·2022년 7월 3일
0

OS

목록 보기
5/9
post-thumbnail

1. 주소 바인딩

논리적 주소를 물리적 메모리 주소로 연결시켜 주는 작업

앞서 프로그램이 메모리에 적재되면 해당 프로세스의 독자적인 주소공간이 생긴다.
그 주소공간을 논리적 주소(logical address) 라고 한다. (혹은 가장 주소)

1-1. 논리적 주소와 물리적 주소

1) 논리적 주소(logical address) (=virtual address)

  • 프로세스마다 독립적으로 가지는 주소공간
  • 각 프로세스마다 0번지부터 시작
  • cpu가 보는 주소

2) 물리적 주소

  • 메모리에 실제 올라가는 위치

물리적 메모리의 낮은 주소영역에는 운영체제가, 높은 주소영역에는 사용자프로세스가 올라간다.



cpu가 기계어 명령을 수행하기 위해 논리적 주소를 통해 메모리를 참조하게되면 해당 논리적 주소가 물리적 메모리의 어느 위치에 매핑되어있는지 확인해야한다.

논리적 주소를 물리적 주소로 연결시켜주는 작업을 주소 바인딩 이라고 한다.




1-2. 주소 바인딩의 구분

주소바인딩 방식은 물리적 메모리가 결정되는 시기에 따라 3가지로 구분된다.
1) 컴파일 타임 바인딩 -> 비효율적
2) 로드 타임 바인딩 -> 실행이 시작될 때
3) 실행시간 바인딩(run time binding)

1) 실행시간 바인딩

프로그램이 실행을 시작한 후에도 그 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식

cpu가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지, 바인딩을 점검해야한다.
주소 변환용 HW 지원이 필요 => MMU

  • MMU(Memory Manage Unit)이라는 하드웨어적인 지원을 이용
    기준 레지스터(relocation register)(=base register)와
    한계 레지스터(limit register)를 포함한다.

MMU는 논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치이다.

2) 기준 레지스터

해당 프로세스가 접근 할 수 있는 물리적 메모리의 시작 주소

3) 한계 레지스터

현재 프로세스의 논리적 주소의 최댓값 == 프로세스의 크기

만약 한계 레지스터보다 논리적 주소가 크다면 자신의 주소공간을 넘어서는 메모리를 참조하려고 하는 것이므로 트랩(sw interrupt)를 발생시킨다.
한계 레지스터보다 논리적 주소가 크지않다면 논리적 주소에 기준 레지스터 값을 더하여 물리적 주소를 구한다.


여기까지가 주소 바인딩의 내용이다. cpu와 사용자 프로그램은 물리적 주소의 내용을 알수없고 알필요도 없다. 논리적 주소와 물리적 주소의 차이와 그 관계를 이해하고 실행시간 바인딩에서 어떻게 주소 변환을 하는지 알아보았다.


2. 메모리 관련 용어

먼저) 로딩이란 메모리에 올리는 것을 의미한다.
먼저) 연결이란 목적파일(작성한 소스코드를 컴파일하여 생성된 파일)과 라이브러리(이미 컴파일된 파일) 들을 묶어 하나의 실행파일을 생성하는 과정을 말한다.


### 2-1. 동적 로딩 > 프로세스의 주소공간 전체를 메모리에 올리는것이 아니라 해당 부분이 호출될 때 그 부분만 메모리에 적재하는 방식
  • 주소공간 전체를 메모리에 올리는 방식보다 같은 크기의 물리적 메모리에서 더 많은 프로그램을 적재할 수 있어서 메모리 이용의 효율성이 향상된다.

2-2. 동적 연결

목적파일과 라이브러리 파일의 연결을 프로그램의 실행 시점까지 지연시키는 기법

목적파일 -> 작성한 코드를 컴파일하여 생성된 파일

일단 연결(linking)이란?

목적파일과 이미 컴파일된 라이브러리 파일들을 묶어 하나의 실행파일을 만드는 과정

이와 반대되는 개념에는 정적연결이 있다.
정적연결은 프로그래머의 코드 + 라이브러리의 코드 = 실행파일 이므로
동일한 라이브러리를 각 프로세스가 개별적으로 메모리에 적재하므로 물리적 메모리가 낭비된다.

동적 연결은 라이브러리가 실행시점에 연결되어 실행파일에는 라이브러리 코드가 포함되지않는다.

프로그램이 실행되면서 라이브러리 함수를 호출할때가 되어서야 라이브러리에 대한 연결이 이루어진다. 연결을 위해 스텁(stub)이라는 작은 코드를 둔다.

  • (여러 프로그램들이 사용하는 라이브러리를 )메모리에 한 번만 적재하므로 메모리 사용의 효율성을 높일 수 있다.

2-3. 중첩(Overlays)

하나의 프로세스조차 메모리에 한번에 올릴 수 없을 때, 프로세스의 주소공간을 분할해 당장 필요한 일부분을 메모리에 올려 실행하고 끝나면 나머지를 올려 실행하는 기법

  • 동적로딩은 다중프로그래밍 환경에서 메모리에 더 많은 프로세스를 동시에 올려놓고 실행하기 위한 용도
  • 중첩은 단일 프로세스만을 메모리에 올려놓는 환경에서 메모리보다 큰 프로세스를 실행할때 어쩔수 없는 선택



2-4. 스와핑

메모리에 올라온 프로세스의 주소공간 전체를 디스크의 스왑영역에 일시적으로 내려놓는 것

조금만 쫓겨나는 것이 아니라 주소공간 전체를 쫓아낸다.
작업의 방향에 따라 스왑 인, 스왑 아웃이 있다.

  • 스왑인 : 디스크에서 메모리로 올리는 작업
  • 스왑 아웃 : 메모리에서 디스크로 내리는 작업

중기 스케쥴러가 어떤 프로세스를 스왑아웃 시킬지 정한다.
스와핑에 소요되는 시간은 실제 데이터를 읽고 쓰는 전송 시간(transfer time)이 대부분을 차지한다. [양이 너무 많아서]

프로세스가 종료되어 디스크로 내쫓는 것이 아니라, 특정한 이유로 수행 중인 프로세스의 주소공간을 일시적으로 메모리에서 디스크로 내려놓는 것을 의미한다!!

profile
개발자를 꿈꾸는 대학생

0개의 댓글