ch.9 main memory

imagine·2024년 6월 2일

OS

목록 보기
1/6

Background

프로그램은 메모리의 디스크로부터 가져와지고 실행되기 위해 프로세스에 놓여진다.

프로그램 : 메모리(disk) → 프로세스로 이동

메인 메모리, 레지스터는 CPU가 직접 접근할 수 있는 유일한 저장소이다.

메모리 장치에는 다음과 같은 stream만 표시된다.

  • addresses + read requests
  • address + data and write 요청

레지스터 접근은 하나의 CPU clock(또는 그 이하)내에 접근된다.

메인 메모리는 많은 사이클을 가질 수 있다 → *stall 발생

stall : CPU가 필요한 데이터가 없어서 명령어를 수행하지 못하고 지연되는 현상

cache는 메인 메모리와 CPU 레지스터 사이에 위치한다.

메모리 보호는 올바른 동작(operation)을 보장하기 위해 필요하다.


Basic Hardware

다른 프로세스들로부터 보호하는 기법

  • 각각의 프로세스는 분리된 메모리 공간을 갖는다
  • base 레지스터와 limit 레지스터로 구현 가능하다

위의 그림에서 프로그램은 300040~420940까지의 모든 주소를 접근할 수 있다

위의 그림에서 프로그램은 300040~420940까지의 모든 주소를 접근할 수 있다

  • CPU H/W는 생성된 모든 주소를 비교한다
  • base/limit 레지스터는 privileged instruction(권한있는 명령)에 의해서만 load 된다.

Adress Binding

대부분의 시스템은 사용자 프로세스가 physical memory 내의 어느 부분으로도 올라올 수 있도록 지원하고 있다.

주소 표시

  • Source program : 심볼릭 주소 ex) variable count
  • 컴파일러 : 심볼릭 주소 → 재배치 가능한 주소 (symbolic → relocatable) ex) 모듈 시작으로부터 14 bytes
  • Linkage 편집기 / 로더 : 재배치 가능한 주소 → 절대 주소 (relocatable → absolute) ex) 0x74014

Address binding : 하나의 주소공간을 다른 주소 공간으로 매핑(mapping)


Address binding time
  • 컴파일 시간
    • 만약 프로세스가 메모리 내에 들어갈 위치를 컴파일 시간에 미리 알 수 있으면 컴파일러는 절대 코드(absolute code)를 생성할 수 있다.
    • 시작 위치가 변하면 코드는 다시 컴파일되어야 한다.
  • load 시간
    • 만약 컴파일 시점에 메모리 위치를 알 지 못하면 컴파일러는 재배치 가능한 코드(relocatable code)를 생성해야 한다.
  • 실행 시간
    - 만일 프로세스가 실행하는 동안에 메모리 내의 한 세그먼트로부터 다른 세그먼트로 이동할 수 있다면 바인딩이 실행시간까지 지연된다.
    - address maps를 위한 하드웨어의 지원이 필요하다
    - 대부분의 시스템은 이 방법을 사용한다




1.3 Logical vs. Physical Address Space : 논리적 vs 물리적 주소 공간

Address

  • Logical address : CPU가 생성하는 주소; 가상 주소(virtual address)라고도 함
  • Physical address : 메모리가 취급하게 되는 주소
  • 컴파일 / load 시에 주소를 바인딩하면 logical과 physical 주소가 같다.
  • 실행 중간에 주소를 바인딩하면 다르다. virtual → physical 주소로 바꿔줘야 한다 : MMU 실행 (memory management unit 메모리 관리장치)

Address space

  • Logical address space : 프로그램에 의해 생성된 모든 논리적 주소들의 집합
  • Physical address space : 이 논리적 주소들과 일치하는 모든 물리적 주소들의 집합

Memory-management unit : 실행시간에 가상 주소를 물리적 주소로 변환(mapping)하는 H/W 장치

relocation register를 사용해서 주소를 변환(mapping)하는 간단한 방법

  • relocation register에 있는 값은 주소가 메모리로 보내질 때마다 사용자 프로세스에 의해 생성된 모든 주소에 더해진다.
  • 사용자 프로그램은 논리주소를 다룬다; 실제 물리주소에 접근하지 않는다.


1.4 Dynamic Loading

전체 프로그램 및 데이터가 physical memory에 있어야 하는 경우, 프로세스의 크기는 물리적 메모리의 크기보다 클 수 없다.

각 루틴(function)이 호출되기 전 > 메모리에 올라오지 않고 재배치 가능한 상태로 디스크에서 대기하고 있다.

호출된 경우 > 호출된 루틴이 이미 메모리에 적재(load)됐는지 확인

not load > relocatable linking loader가 루틴을 적재하고 프로그램의 주소 테이블에 기록한다.

그 후 CPU control은 중단되었던 루틴으로 보내진다.

(+) 사용되지 않는 루틴은 load되지 않는다 → 더 나은 메모리 공간 사용률

(+) OS로부터 특별한 지원이 필요없다 (그러나 OS는 라이브러리 루틴을 제공해 줄 수 있다)

1.5 Dynamic Linking

  • Static linking : 로더에 의해 이진 프로그램 이미지로 결합된 시스템 라이브러리 및 프로그램 코드
  • Dynamic linking : 연결이 실행 시기까지 미뤄지는 것
    • stub : 다음을 나타내는 작은 부분의 코드
      • 어떻게 적절한 라이브러리 루틴을 찾을 지
      • 라이브러리가 준비되지 않은 경우 어떻게 라이브러리를 로드할 지
    • 라이브러리 루틴이 Dynamically linked된 후, 해당 루틴이 바로 실행된다
      • stub가 루틴의 주소로 대체되고, 그 루틴을 실행

(+) 라이브러리 코드는 프로세스 간에 공유될 수 있다

(+) 라이브러리 업데이트는 다시 연결할 필요가 없다

동적 연결은 OS의 도움이 필요하다.

(출처)
Operating System Concepts 도서
https://www.booksfree.org/operating-system-concepts-10th-edition-by-abraham-silberschatz-peter-b-galvin-greg-gagne-pdf/

profile
공부하는 기록

0개의 댓글