티스토리 뷰

반응형
다중 프로그래밍을 실현하기 위해 메모리에 여러 개의 프로세스들이 동시에 올라와 있어야한다.
그러나, 실제 프로그램의 크기가 컴퓨터에서 사용하는 메모리의 크기보다 크다면 어떻게 될까 ?

 

생각의 전환

프로그램을 실행하는데 얼마나 많은 메모리가 필요한가 ?
                               ↓
프로그램을 실행하는데 필요한 최소메모리는 얼마인가 ?
( 프로그램에서 메모리 접근은 순차적이고 지역화되어있어서 훨씬 적은 메모리로도 충분하다. )

 

가상메모리란 ?

프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법이다.

이렇게 함으로써 프로그램이 물리메모리의 크기보다 커져도 된다.

 

물리메모리로부터 사용자 관점의 논리메모리를 분리시켜 메인 메모리를 균일한 크기의 저장공간으로 구성된 엄청나게 큰 배열로 추상화 시켜준다. 따라서 프로그래머는 프로그램을 작성할 때 항상 자기의 프로그램이 전체 메모리를 사용하고 있는 것처럼 느끼며 프로그램을 작성하게 된다.

 

 

 

대강 이런형태로 메모리가 구성되며, 프로그램마다 이런 메모리구조를 하나씩 가진다고 생각하면된다. 여기서 Stack과 Heap 사이에 공백이 존재하는데 이 주소공간을 성긴주소공간이라고 한다.

 

이 주소공간은 Stack, Heap 영역의 확장, 혹은 동적 라이브러리를 링크해야할 경우에 사용된다.

 


- 자주 발생하지 않는 오류처리 코드

- 프로그램내에서 거의 사용되지 않는 옵션이나 기능에 대한 코드

이런 놈들을 항상 메모리에 올려야할까 ...?

 

장점

  • 프로그램은 더 이상 메모리크기에 제약을 받지않는다.
  • 사용자들은 매우 큰 가상 주소공간을 가정하고 프로그래밍 할 수 있다. ( 더욱 프로그래밍이 Ez )
  • 각 프로그램이 더 작은 메모리를 사용하므로 더 많은 양의 프로그램을 동시에 실행이 가능하다.
    응답시간은 그대로 유지하고 이용률 & 처리율이 증가한다.

 

또한 가상메모리는 페이지 공유를 통해 파일이나 메모리가 둘 이상의 Process에 의해 공유되는 것을 가능하게 만들어 준다. 예를 들면 System Library가 여러 Process에 공유되는 경우fork() 호출시 속도향상을 위해 일단 공유하고 수정시 해당 Page를 복사하는 방법을 예를 들 수 있다.

 

System Library를 여러 Process에서 공유하는 경우 실제로 System Library는 물리메모리에 단 한 곳에 위치하지만, 여러 Process에서 해당 System Library 영역을 자기의 영역이라고 생각하게 된다.

이후 공유는 자연스러운 것이고, 이 영역은 대부분 Read Only 권한을 가지고 할당된다.

 

 

MMU에 의해서 물리메모리에 사상된다. 이때 Segmentation & Paging 기법이 사용된다.

 


Demand Paging

 - 필요한 페이지만 메모리에 적재하는 기법. ( 나머지는 예비 Disk에.. Swap과 유사하다. )

    ( 한번도 물리 메모리에 적재되지 않는 데이터가 존재할 수 있다는 것이다. )

 

   대부분의 가상메모리는 Demand Paging 방식으로 구현된다.

   Segmentation 기법으로 구현된 시스템도 몇 있으나 대부분 Paged Segmentation 기법.

 

   Swap과 비슷해 일부 Page만 Swap하는 경우를 게으른 스왑퍼라고도 부르지만 이는

   기술적으로 잘못된 것이고 우리는 Pager라는 용어를 사용하자. (스왑퍼는 전체 프로세스를 통째로 !!)

 

 

어느 페이지가 Disk에 위치하고, 어느 페이지가 메모리에 위치하는지 구분할 필요가 있다. (H/W지원)

Page Table에 유효/무효 Bit를 사용해 구분할 수 있다. ( 1이면 메모리, 0이면 디스크와 같이 구분 )

                  최초 프로세스가 메모리에 올라올때 유효/무효 Bit는 추측에 의해서 설정된다.

 

 

Page-Fault Trap

Paget-Fault Trap의 경우 메모리에 없는 Page에 접근했을 때 발생하는 것이다!! 즉 참조하려는 Page의 유효/무효 Bit가 무효비트로 Set 되어있을 경우 해당 Trap을 발생시켜 Disk로부터 해당 Page를 Memory에 적재할 수 있도록 하는 것이다.

 

(간단 Version)

  • Process에 대한 Inner Table을 검사해서 그 메모리 참조가 유효한지 무효한지 판단한다.
  • 만약 무효한 페이지에 대한 참조라면 그 Process는 중단.
    해당 페이지가 디스크에 있다면 메모리로 해당 페이지를 가져와야한다.
  • 자유 Frame(할당 가능한 Frame)을 찾는다.
  • 디스크에 새로이 할당된 프레임으로 해당 Page를 읽어오도록 요청한다.
  • 읽어왔으면 Page Table을 갱신하고, 프로세스가 유지하고 있는 Inner Table을 수정한다.
  • Trap에 의해 중단되었던 명령어를 다시 수행한다.

 

 

(상세 Version)

  • 운영체제에게 Trap을 요청한다.
  • 사용자 Register들과 Process의 상태(PCB)를 저장한다.
  • Interrupt 원인이 Page-Fault인지를 알아낸다.
  • 페이지 참조가 유효한 것인지 확인하고, 디스크에 있는 페이지 위치를 알아낸다.
  • 디스크에 자유 Frame으로의 읽기 요구를 낸다.
    a) 읽기 차례가 돌아오기까지 이 장치의 대기 큐에서 기다린다.
    b) 디스크에서 찾는 시간과 회전 지연 시간 동안 기다린다.
    c) 메모리 내 지정된 프레임으로 데이터 전송을 시작한다.
  • 기다리는 동안 CPU는 다른 사용자에게 할당된다. (CPU 스케줄링)
  • 디스크가 다 읽었다고 Interrupt를 건다.
  • 다른 사용자의 Register들과 Process의 상태를 저장한다.
  • Interrupt가 디스크로부터 왔다는 것을 알아낸다.
  • 새 페이지가 메모리로 올라왔다는 것을 Page Table과 다른 Table들에 기록한다.
  • CPU가 자기 차례로 오기까지 다시 기다린다.
  • CPU 차례가 오면 위에서 저장시켜 두었던 Register들 Process의 상태, 새로운 Page Table
    을 복원시키고 인터럽트 되었던 명령어를 다시 실행시킨다.

 

 

그러나, Page-Fault Trap이 지속적으로 발생한다면 시스템 성능의 저하를 초래할 것이다.

Locality of Reference (참조의 지역성) 때문에 위와같은 상황은 어느정도 완화시킬 수 있다.

  - 프로그램의 어느 한 특정 부분만 한동안 집중적으로 참조한다는 사실.

    1) Spatial Locality : Loop로 인해 수행했던 Instruction 위나 아래의 Instruction을 수행한다.

    2) Temporal Locality : Loop로 인해 수행했던 Instruction이 짧은 시간내에 다시 수행한다.

    3) 프로그램은 90% 이상의 시간을 Loop를 수행하면서 시간을 보낸다.

 

 

첫 번째 명령어가 포함된 페이지를 Demand Paging함으로써 프로세스를 보다 빠르게 시작시킬 수 있다.

쓰기 시 복사 ( Copy-on-write )

 - UNIX기반의 운영체제에서 fork() 시스템 호출을 통해 프로세스를 생성 할 때에는

   페이지 공유와 비슷한 기법으로 첫 요구 페이징조차 생략하는 것이 가능하다.

 

Why ? 대부분 fork() 시스템 호출시 이어서 exec() 시스템 호출을 사용한다.

         이럴경우 부모의 페이지를 복사한게 무용지물이 되어버린다.

 

How ? 프로세스가 복사되고 당분간 부모의 Page를 자식 Process에서 공유해서 사용한다.

         이후 둘 중 하나의 Process가 부모와 자식간에 공유된 Page에 Write작업을 한다면 그 때

         그 공유된 Page를 복사하게된다. 즉, Write작업이 없는 경우 복사하지 않는다.

 

 

쓰기시 복사 처리과정에서 페이지 복사본을 만들 때 빈 페이지를 어떻게 할당 받는지를 살펴보는 것이 중요하다. 많은 운영체제들에서 그러한 요구를 처리하기 위한 빈 페이지 집합(pool)을 유지하고 있다.

 

이 집합에서 Process에 페이지가 할당되는 경우에는 쓰기시 복사를 하는경우와, Stack 혹은 Heap 메모리 공간을 확장해야 할 때가 있다. 운영체제는 보통 zero-fill-on-demand 기법으로 페이지를 할당한다.

( 페이지 할당할때 0으로 초기화해서 준다는 거다 !! )

 

 

Copy-on-Write 기법을 사용하면 권한이 Read-Only인 페이지의 경우 자식 Process와 부모 Process가 공유하는 Shared Memory가 되는 효과를 기대할 수 있다.

위 기법은 Windows XP, Linux, Solaris 등 여러가지 운영체제에서 채택하여 사용되고 있다.

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함