논리적 주소를 물리적 메모리 주소로 연결시켜 주는 작업
앞서 프로그램이 메모리에 적재되면 해당 프로세스의 독자적인 주소공간이 생긴다.
그 주소공간을 논리적 주소(logical address) 라고 한다. (혹은 가장 주소)
물리적 메모리의 낮은 주소영역에는 운영체제가, 높은 주소영역에는 사용자프로세스가 올라간다.
논리적 주소를 물리적 주소로 연결시켜주는 작업을 주소 바인딩 이라고 한다.
주소바인딩 방식은 물리적 메모리가 결정되는 시기에 따라 3가지로 구분된다.
1) 컴파일 타임 바인딩 -> 비효율적
2) 로드 타임 바인딩 -> 실행이 시작될 때
3) 실행시간 바인딩(run time binding)
프로그램이 실행을 시작한 후에도 그 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식
cpu가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지, 바인딩을 점검해야한다.
주소 변환용 HW 지원이 필요 => MMU
MMU는 논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치이다.
해당 프로세스가 접근 할 수 있는 물리적 메모리의 시작 주소
현재 프로세스의 논리적 주소의 최댓값 == 프로세스의 크기
만약 한계 레지스터보다 논리적 주소가 크다면 자신의 주소공간을 넘어서는 메모리를 참조하려고 하는 것이므로 트랩(sw interrupt)를 발생시킨다.
한계 레지스터보다 논리적 주소가 크지않다면 논리적 주소에 기준 레지스터 값을 더하여 물리적 주소를 구한다.
먼저) 로딩이란 메모리에 올리는 것을 의미한다.
먼저) 연결이란 목적파일(작성한 소스코드를 컴파일하여 생성된 파일)과 라이브러리(이미 컴파일된 파일) 들을 묶어 하나의 실행파일을 생성하는 과정을 말한다.
목적파일과 라이브러리 파일의 연결을 프로그램의 실행 시점까지 지연시키는 기법
목적파일 -> 작성한 코드를 컴파일하여 생성된 파일
일단 연결(linking)이란?
목적파일과 이미 컴파일된 라이브러리 파일들을 묶어 하나의 실행파일을 만드는 과정
이와 반대되는 개념에는 정적연결이 있다.
정적연결은 프로그래머의 코드 + 라이브러리의 코드 = 실행파일 이므로
동일한 라이브러리를 각 프로세스가 개별적으로 메모리에 적재하므로 물리적 메모리가 낭비된다.
동적 연결은 라이브러리가 실행시점에 연결되어 실행파일에는 라이브러리 코드가 포함되지않는다.
프로그램이 실행되면서 라이브러리 함수를 호출할때가 되어서야 라이브러리에 대한 연결이 이루어진다. 연결을 위해 스텁(stub)이라는 작은 코드를 둔다.
하나의 프로세스조차 메모리에 한번에 올릴 수 없을 때, 프로세스의 주소공간을 분할해 당장 필요한 일부분을 메모리에 올려 실행하고 끝나면 나머지를 올려 실행하는 기법
메모리에 올라온 프로세스의 주소공간 전체를 디스크의 스왑영역에 일시적으로 내려놓는 것
조금만 쫓겨나는 것이 아니라 주소공간 전체를 쫓아낸다.
작업의 방향에 따라 스왑 인, 스왑 아웃이 있다.
중기 스케쥴러가 어떤 프로세스를 스왑아웃 시킬지 정한다.
스와핑에 소요되는 시간은 실제 데이터를 읽고 쓰는 전송 시간(transfer time)이 대부분을 차지한다. [양이 너무 많아서]
프로세스가 종료되어 디스크로 내쫓는 것이 아니라, 특정한 이유로 수행 중인 프로세스의 주소공간을 일시적으로 메모리에서 디스크로 내려놓는 것을 의미한다!!