책/운영체제

운영체제 Ch09_'Main Memory-1'

RyoTTa 2021. 1. 11. 20:02
반응형

Chapter 9, Main Memory

 

9.1 배경(Background)

 메인 메모리는 현대 컴퓨터 시스템의 운영에 중심적인 역할을 한다. 메모리는 각각 주소가 할당된 일련의 바이트들로 구성된다. CPU는 PC가 지시하는 대로 메오리로부터 다음 수행할 명령어를 가져오는데 그 명령어들은 필요한 경우 추가적인 데이터를 더 가져올 수 있으며 반대로 데이터를 메모리로 내보낼 수도 있다.

Von Neumann architecture

9.1.1 기본 하드웨어(Basic HW)

 메인 메모리와 각 레지스터들은 CPU가 직접 접근할 수 있는 유일한 범용 저장장치이다.

 각 CPU 코어에 내장된 레지스터들은 일반적으로 CPU 클럭(Clock)의 1사이클내에 접근이 가능하다. 그러나 메모리 버스를 통해 전송되는 메인 메모리의 경우 CPU 클록의 많은 사이클이 소모되며. 이경우 CPU가 필요한 데이터가 없어서 명령어를 수행하지 못하고 지연되는(stall)현상이 발생하게 된다. 이는 캐시를 사용해 접근 속도를 향상시킬 수 있다.

 

 메모리의 올바른 동작을 보장하기위해 한가지 방법이 있다. 각각의 프로세스가 독립된 메모리 공간을 가지도록 보장해야 한다. 즉 개별적인 메모리공간을 분리하기 위해서 특정 프로세스만 접근할 수 있는 합법적인(Legal) 메모리 주소 영역을 설정하고, 프로세스가 합법공간만 접근하도록 하는 것이 필요하다. 

 기준 레지스터(Base)와 상한(Limit)을 설정해 해당 구역 내의 메모리 공간을 프로세스에게 합법적인 메모리 주소 영역으로 할당하는 것이 한가지 방법이다.

기준과 상한 레지스터가 주소 공간을 정의
기준, 상한 레지스터 하드웨어를 통한 주소 보호

 사용자 모드에서 수행되는 프로그램이 운영체제의 메모리 공간이나 다른 사용자 프로그램의 메모리 공간에 접근하면 운영체제는 치명적인 오류로 간주하고 트랩(Trap)을 발생시킨다.

 커널 모드에서 수행되는 운영체제는 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 어떠한 제약도 받지 않는다.

 

9.1.2 주소의 할당(Address Biding)

 프로그램의 Lifecycle

  1. 프로그램은 디스크에 바이너리 실행파일로 저장

  2. 실행을 위해 메모리로 가져오기 기다리는 프로그램이 Input Queue를 형성

  3. Input Queue에서 프로그램 하나를 선택

  4. 메모리에서 로드, 실행 중에 명령 및 데이터에 액세스

  5. 종료시 메모리 할당 해제

 

 최신 운영체제들은 프로세스가 물리적 주소의 어떠한 부분을 할당 받을 수 있도록 한다. 즉 원시 프로그램에서 주소는 숫자가 아닌 (변수 count와 같이) 심볼 형태로 표현한다. 컴파일러는 이 심볼 주소를 재배치 가능 주소(예를 들어 "이 모듈의 첫 번째 바이트로 부터 열네 번째 바이트주소")로 바인딩 시키고, 다음에 링커(linker), 로더(loader)가 재배치 가능 주소를 절대 주소로 바인딩 시킨다.

 

 메모리 주소 공간에서 명령어와 데이터의 바인딩은 시점에 따라 아래와 같이 구분된다.

 1. 컴파일 시간(compile time) : 만일 프로스세가 메모리 내에 들어갈 위치를 컴파일 시간에 미리 알 수 있으면 컴파일러는 절대 코드(absolute code)를 생성할 수 있다. 그러나 만일 이 위치가 변경되어야 한다면 이 코드는 다시 컴파일 되어야 한다.

 2. 적재 시간(load time) : 만일 프로세스가 메모리 내 어디로 올라오게 될지를 컴파일 시점에 알지 못하면 컴파일러는 일단 이진 코드를 재배치 가능 코드(relocatable code)로 생성해야 한다. 이경우 심볼과 실제 번지수와의 바인딩은 프로그램이 메인 메모리로 실제로 적재되는 시간에 이루어 진다. 이 코드는 시작 주소가 변경되면 사용자 코드를 다시 적재하기만 하면 된다.

 3. 실행 시간(Execution time) : 만약 프로세스가 실행하는 중간에 메모리 내의 한 세그먼트로 부터 다른 세그먼트로 옮겨 질 수 있다면 우리는 바인딩이 실행시간 까지 허용되었다고 이야기 한다. 이러한 것을 지원하기위해서는 특별한 하드웨이거 필요하다.

사용자 프로그램의 단계별 처리 과정

 

9.1.3 논리 대 물리 주소 공간(Logical vs Physical Address Space)

 논리 주소(Logical Address) : CPU가 생성하는 주소

 물리 주소(Physical Address) : 메모리가 취급하게 되는 주소

 

 컴파일 또는 적재 시에 주소를 바인딩하면 논리 주소와 물리 주소가 같다. 그러나 실행 시간 바인딩 기법에서는 논리, 물리 주소가 다르다. 이러한 논리 주소를 가상 주소(Virtual Address)라고 한다.

 

 논리 주소 공간 : 프로그램에 의해 생성된 모든 논리 주소 집합

 물리 주소 공간 : 이 논리 주소와 일치하는 모든 물리 주소 집합

 

 프로그램의 실행 중에는 이와 같이 가상 주소를 물리 주소로 바꾸어줘야 하는데 이 변환(Mapping) 작업은 하드웨어 장치인 메모리 관리 장치(Memory Management Unit, MMU)에 의해 실행된다.

MMU

 

 여기에서는 기준 레지스터 기법을 일반화 시킨 아주 단순한 MMU 를 설명한다.

재배치 레지스터를 이용한 동적 재배치

 기준 레지스터를 재배치 레지스터라고 부른다. 즉 재배치 레지스터 속에 들어있는 값은 주소가 메모리로 보내질 때 마다 그 모든 주소에 더해진다. 사용자 프로그램은 켤코 실제적인 물리 주소에 접근하지 않는다는 것을 주의해야 한다. 사용자 프로그램은 논리 주소를 사용하고, 메모리 하드웨어는 논리 주소를 실제 주소로 바꾼것을 사용한다.

 

9.1.4 동적 적재(Dynamic Loading)

 지금까지의 프로그램들은 실행하기 위해 전체 프로그램이 메모리에 적재되어야 했다. 이 경우 프로세스 크기는 메모리의 크기보다 커서는 안된다. 메모리 공간의 더 효율적 이용을 위해서는 동적 적재(Dynamic Loading)를 해야한다.

 

 각 루틴든 실제 호출되기 전까지는 메모리에 적재되지 않고 재배치 가능한 상태로 디스크에서 대기하고 있다. 먼저 main 프로그램이 메모리에 올라와 실행된다. 다른 루틴을 호출하게 되면 루틴이 메모리에 적재됐는지 조사하고, 적재되어 있지 않다면, 재배치 가능 연결 적재기(relocatable linking loader)가 실행되 요구된 루틴을 메모리로 가져오고, 이런 변화를 테이블에 기록해준다. 이후 CPU 제어는 중단되었던 루틴으로 보내진다.

 

9.1.5 동적 연결(Dynamic Linking)

 동적 적재는 로딩이(loading)이 실행 시까지 미루어졌었지만 동적 연결에서는 연결(linking)이 실행 시기까지 미루어 지는 것이다. 이는 주료 표준 C언어 라이브러리와 같은 시스템 라이브러리에 사용된다. 이러한 기능이 없다면 시스템의 각 프로그램은 실행 가능 이미지에 해당 언어 라이브러리의 사본을 포함해야한다. 

 

 Static Linking : 로더에 의해 바이너리 프로그램 이미지로 결합된 시스템 라이브러리

 Dynamic Linking : linking이 실행시간까지 연기된다.

 

 라이브러리 루틴이 참조되는 바이너리 코드에 작은 코드조각(stub)이 포함된다.

 stub은 메모리 상주 라이브러리 루틴을 찾는 방법을 알고있다.

 stub은 루틴의 주소로 자신을 대체한다.

Dynmaic Linking

 

반응형