본문 바로가기
운영체제

메모리관리, 가상메모리, 주소바인딩,

by kcj3054 2021. 10. 24.

logical vs physical address

  • 디스크에서 파일을 실행하면 프로세스별로 가상메모리(logical address)가 잡히고, 주소변환을 통해서 물리적메모리로 올라간다
  • 가상주소와 물리주소(physical address)간의 변환이 필요하다
  • 주소 바인딩 : 주소를 결정하는 것

주소 바인딩

(논리적 )

  • compile time binding
    • 물리적 메모리 주소가 컴파일 시 알려짐
    • 컴파일시 논리적 -> 물리적 주소가 결정이 되는 것이다.
  • load time binding
    • loader의 책임하에 물리적 메모리 주소 부여
    • 메모리 주소가 재배치가 가능하다
  • excution time binding(= run time binding)
    • 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음
    • cpu가 주소를 참조할때마다 binding을 점검 (address mapping table)
    • cpu가 바라보는 주소는 logical address이다
      • 왜 cpu는 물리적 주소를 보는 것이 아니라 논리적주소를 보는 것인가?
      • 컴파일시에 논리적주소가 실행파일에 있다 그리고 물리적주소로 올라가도 안의 내용은 논리적주소로 적혀있다
    • cpu가 바라보는 주소가 논리적 주소라서 매순간 주소르 논리적 주소에서 물리적 주소로 변경하는 것이 필요하다.
  • load time vs run time
    • 로드 타임은 실행시점에 물리적 주소가 결정된다
    • 런타임바인딩은 실행중에 물리적주소가 변환이 될 수 있다 (시작된 이후에도 메모리상 위치를 변경할 수 있다)

Dynamic Relocation

  • cpu가 바라보는 것은 논리적주소이다. 밑의 그림에서 논리적 주소소 346을 요청한다 이후 relocation register를 + 346을 해서 실제 물리적 주소 공간 14346(물리적메모리)을 보면된다.
  • cpu가 346을 달라고 했는데, 시작 위치가 14000이다, 거기서 떨어진 거리 346을 더하면 물리적 공간이 나온다..
  • relocation register는 물리적 메모리의 시작위치를 담고있다
  • limit register는 논리적 주소의 범위이다. (프로그램의 크기를 담고있는 것이다),
    • cpu에서 logical address를 요청했을때 요청된 크기를 보고 limigt register를 초과했을 때는 악의적인 것으로 파악한 후 트랩을 발생시켜서 에러로처리한다.

Dynamic Loading

  • 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질대만 메모리에 load하는 것
  • memory utilization의 향상
    • 왜?
    • 좋은 프로그램은 방어적프로그램이다. 여기서 방어적프로그램에서는 예외처리가 중요한데 그러한 코드들이 미리 다 올라갈 필요가 없다 그래서 필요한 부분들 만 올려 놓기에 메모리 이용률이 좋아진다..

overlays

  • 필요한 부분을 메모리에 올린다..

swapping

  • 만약 가상 메모리에는 존재하지만 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생한다. (왜냐하면 실제 RAM은 크기가 작다, 원본은 디스크에 저장이 되어있다)

  • 메모리의 당장 사용하지 않는 영역을 하드디스크로 옮기고, 하드디스크의 일부분을 마치 메모리처럼 불러와 쓰는 스와핑을 통해 마치 페이지폴트가 발생하지 않는 것처럼 만든다.

  • 스와핑은 프로세스를 일시적으로 메모리에서 backing store로 쫓아낸는 것이다.
  • backing store
    • 디스크, 저장 공간이라고 생각하면된다.
  • swap in/ swap out
    • 우선순위에 따라서 cpu scheduling algorithm, 우선순위가 낮은 것을 스왑 아웃하고, 우선순위가 높은 것을 메모리에 올려놓는다.
    • compile time, load time binding에서는 컴파일 후 메모리 위치가 결정되기에 swap in할때도 원래 위치로 해야한다.
    • excution time binding에서는 빈 메모리 영역 아무곳에나 올릴 수 있다 (물리적 메모리 주소가 변경되기때문에)

Dynamic Linking

  • cf : 프로그램은 컴파일 -> 링킹 -> 실행파일로 된다.
  • linking을 실행 시간까지 미루는 기법
  • static linking
    • 라이브러리가 프로그램의 실행 파일 코드에 포함됨
    • 동일한 라이브러리를 각각의 프로세스가 메모리에 올려서 메모리 낭비
      • cout을 할때 각각 프로세스에 cout 코드가 올라간다.
  • dynamic linking .. ex) ,dll
    • 라이브러리가 실행시 연결된다
    • 라이브러리가 실팽 파일에 포함되는 것이 아니라 실행시 해당 라이브러리가 불려진다.
    • 라이브러리 호출 부분엥 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 뒀다..
    • cout이 불리는 순간 올라가있는 shared_library를 공유해서 사용한다

물리적 메모리 관리 기법

  • 사용자 프로세스 영역의 할당 방법
    • Contiguous allocation(연속할당)
      • 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록하는 것
    • 불연속할당(Noncontiguous allocation)
      • 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라갈 수 있음 (paging, segmentation, paged segmentation)
  • 연속할당 방식
    • 고정 분할 방식과, 가변 분할 방식이 있는데 고정 분할은 미리 partition을 나눠서 프로그램을 올려 놓는 것이다.
    • 가변 분할은 프로세스가 그냥 메모리에 순차적으로 올라가는 것이다 (올라가기전에 메모리에 파티션을 두지 않고)
- 이러한 메모리가 할당 되어있다가 사라지고 하면 hole(가용 메모리 공간)이 생긴다, 다양한 크기의 hole들이 메모리 여러 곳에 흩어져있다, 메모리 여분은 많은 작게 나눠져있어서 연속할당방식으로는 프로세스를 할당할 수 없게된다

  • 연속할당에서 비어있는 공간을 할당하는 방법
    • first-fit (사이즈가 n이상인 것중에서 최초로 찾아지는 hole에 할당)
    • best -fit (사이즈가 n이상인 가장 작은 hole을 작아서 할당)
    • worst - fit(가장 큰 빈 hole에 할당)

가상 메모리

  • 사용하는 부분만 메모리에 올리고, 나머지는 디스크에 보관

    • 하드디스크까지 메모리의 영역을 확장해서 사용하는 것이 가상메모리이다..
  • 롤을 실행 시키고 싶을때 cpu는 하드디스크에서 롤을 가지고 와서 메모리에 올려야지 실행가능하다 , 그런데 롤을 한번에 메모리에 다 올리는 것이 아니라 사용하는 부분만 메모리에 올리기에 더 효율적일 수 있다..

  • 즉 결국 가상메모리를 사용하는 이유는 모든 프로세스에게 메모리를 할당 해서 사용하기에는 메모리의 크기가 한계가 있어서 사용하는 방법이 가상 메모리이다.

  • ram을 물리주소, 가상메모리로 확장한 하드디스크 주소가 가상주소...

  • cpu가 가상메모리로 요구하면 mmu는 그것을 물리메모리에 접근해서 cpu로 던져준다.

  • 하드디스크는 파일형태로 저장을한다. 가상메모리영역으로 선택 된 곳의 파일들을 스왑파일이라고한다...

  • 둘이상의 프로세스와 가상메모리가 공존할 수 있는 이유는 각각의 프로세스가 스왑파일을 가지고 있기 때문이다. Ram이 프로세스 a를 올리다가 b를 올릴려면 a를 swap out하고 b를 swap in한다...

  • 가상 메모리는 프로세스의 주소 정보가 들어 있는 '페이지 테이블'로 관리된다. 속도향상을 위해 TLB를 사용한다.

cf : 
 TLB : 메모리와 CPU사이에 있는 주소 변환을 위한 메시이다. 페이지 테이블에 있는 리스트를 보관하며, 
CPU가 페이지 테이블까지 가지 않도록 해 속도를 향상시킨다.

출처 : kocw 반효경 교수님 os강의

'운영체제' 카테고리의 다른 글

자네 thread safe 한가?  (0) 2021.12.02
paging  (0) 2021.10.24
세마포어, 뮤텍스  (0) 2021.10.21
프로세스 synchronize  (0) 2021.10.21
프로세스, 스레드, cpu스케쥴러, contextswitch  (0) 2021.10.19