TIL - 220122

케이·2022년 1월 22일
0

TIL

목록 보기
5/13
post-thumbnail

스스로 부족한 것을 채우기 위한 학습 기록입니다. 부족함을 알고 채워나가려 노력하고 있습니다. 피드백은 언제나 환영합니다.😺

해당 포스팅은 참고란의 블로그와 동영상의 내용이 많이 참고되어 작성 되었습니다.

가상 메모리

가상 메모리란?

  • 메모리를 관리하는 방법의 하나로 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식.

가상 메모리를 사용하는 이유?

  • 가상 메모리를 이용하면 실제 물리 메모리가 가지고 있는 크기를 논리적으로 확장하여 사용할 수 있다.
  • 프로세스들에게 동일한 메모리 공간을 제공할 수 있다. 가상 메모리를 사용하게 되면 유저는 OS가 제공해주는 가상 메모리 영역만 이용하면 된다. 나머지 관리는 OS내부에서 처리 된다.
  • 메모리 관리에 효율적이다: 가상 메모리를 이용하면 연속적이지 않은 메모리를 논리적으로 연속적인 메모리 형태로 사용 가능하다.

Swapping

  • 프로세스를 일시적으로 메모리에서 내리고 하드 디스크에 있는 swap 공간으로 내쫓는 것이 Swapping.
  • 당장 필요한 것들만 메모리에 올리고 나머지들은 swap 공간에

Paging

  • 한 줄 요약: 당장 필요한 것들만 메모리에 올리고 나머지들은 swap 공간에 두는 것이 paging 기법.
  • 메모리 공간을 일정하게 잘라두고 프로그램도 일정하게 잘라서 올리게 되는데
    이 때, 메모리 공간을 잘라 둔 것이 Frame, 프로그램이 잘린 게 Page.
  • 공동으로 사용하는 페이지를 Shared Page.
  • 가상 메모리는 Page 단위로, 물리 메모리는 Frame 단위로 관리 된다.
  • Page와 Frame은 동일한 크기를 가진다. (32bit 기준으로 4Kb)
  • Page 조회를 위해 Page table 을 사용. 이 때 page도 page table도 메모리에 위치하게 된다.
  • CPU가 page를 가져 오기 위해 page table에 접근하고 이를 바탕으로 Page를 가져 오려면 결국 메모리에 2번 접근 해야 하는데 그러다 보면 속도 저하.
  • 이를 해결하기 위해 TLB(Translation Look-aside Buffers)라는 캐시 메모리를 사용하게 된다. CPU가 논리 주소를 요청했을 때 TLB에 매칭되는 주소가 있으면 메모리에 접근해서 가져옴.

(곁다리) Page & Segment

  • Page는 하드웨어에 의해 정해지는 고정 사이즈.
  • Segment는 method, procedure, function, object, variables, stack 등 프로그램의 논리적 단위로 나누는 방법.

메모리가 일을 처리하는 방법? 관리되는 방법?

  • 컴파일러가 동작하는 과정에서 코드들의 주소를 준다. 이 때 코드의 메서드와 변수들을 심볼릭 주소, 컴파일러가 변환 시킨 숫자주소를 논리 주소라고 한다.

  • 논리 주소를 가상 주소라고도 하고 논리 주소에 숫자를 붙여서 만든 주소를 물리 주소라고 한다.

  • 동작하고 있는 프로세스는 가상 주소만 보며 동작하는데 이때 실제 데이터는 가상 메모리에 있지 않고 물리메모리에 있다.

  • 실제 데이터를 처리하기 위해서는 가상 주소에서 물리 주소로의 변환 과정이 필요한데 이 때 가상 주소를 물리 주소로 변환하는 page table을 사용한다. 또한 MMU(Memory Management Unit)이 가상주소를 물리주소로 변환하는 일을 수행한다.

  • 요약
    1. 현대 메모리는 Paging을 베이스로 한 기법을 채택
    2. 하드 디스크를 Swap area로 활용한다
    3. MMU, TLB 같은 하드웨어의 지원을 받아 page table을 확인핟고 메모리를 참조한다.

Window와 Linux의 차이?

  • Window는 Segmentation + Paging을 사용해 메모리 관리.
  • Linux는 Paging만을 사용해 메모리 관리.
    • 완벽하게 Segmentation을 사용하지 않는 건 아니고 기존 Segmentation + Paging 관리를 MMU가 직접 처리해주는 것인지 SW적으로 OS가 어느 페이지가 code segment인지 data segment인지 관리하고 실제 주소 변환 단계에서는 Paging만을 사용한다고 생각하면 된다.

Linux는 왜 Paging만 사용할까?

  • 이식성을 높이기 위해 Paging을 사용해 메모리 관리를 구현하고 Segment에 해당하는 부분은 OS,S/W가 처리하게 한다.

Linux가 메모리를 관리하는 방법?

  • 물리메모리 + Swap 공간 = 가상 메모리
    -> 결국 Swap 공간에서 Page를 꺼내려면 OS의 도움이 필요함.

  • Page fault: TLB에 없는 페이지를 찾을 때는 OS가 하드디스크가 swap 공간에서 Page를 가져오고 TLB에도 등록한다(valid bit와 같이)

  • 물리 메모리의 frame이 가득차게 되면 기존 frame을 차지한 page 중 하나를 내쫓게 됨. 이를 Page replacement라고 한다.

  • 어떤 page를 replace할지는 OS가 결정. 이 때 Clock Algorithm을 사용하는데 가장 오랫동안 참조되지 않은 페이지는 찾아낼 수 없지만 가장 최근에 참조된 페이지는 피할 수 있다. Reference Bit을 Page table에 추가하고 page table에 dirty bit을 추가함.-> 하드디스크에 변경사항을 반영하고 Page table에 기록하는 것 모두 OS가 함.

  • Thrashing: 메모리만 일을 하고 CPU는 놀고 있을 때 OS가 프로세스를 추가.

  • Thrashing을 해결하기 위해 Working-set Algorithm과 Page Falut Frequency Algorithm(줄여서 PFF)을 사용한다.

  • Working-set Algorithm은 대부분의 프로세스가 일정한 페이지만 집중적으로 참조한다는 것을 참고하여 특정시간동안 참조되는 페이지의 개수를 파악하고 그 페이지 수만큼 프레임이 확보되면 그 때 페이지들을 메모리에 올린다.

  • PFF는 Page Falut 퍼센트에 상한과 하한을 둬서 상한선을 넘으면 지급하는 프레임의 개수를 늘리고 하한을 넘으면 줄인다. 남는 프레임이 없으면 프로세스 단위로 페이지들을 통째로 쫓아낸다.

참고

https://www.youtube.com/watch?v=qxmdX449z1U
https://wogh8732.tistory.com/395

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

0개의 댓글