ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 17. 내부 단편화와 페이지 테이블
    운영체제/운영체제 정리 2020. 1. 20. 18:14

    내부 단편화란?

     

    예를 들어 한 페이지 사이즈가 4 byte이고 우리가 올릴 프로세스 사이즈가 15 byte라고 해보자.

     

    그러면 4개의 페이지가 필요할 것.

     

    4 // 4 // 4 // 3으로 3번째 페이징은 한 페이지를 다 못 채우고 1바이트가 남게 될 것

     

    즉 마지막 프레임은 다 채울 수 없게 될 것이고 이는 자신도 쓸 수 없고 다른 프로세스도 쓸 수 없는

     

    작은 공간이 생겨질 것이다. 이를 내부 단편화라고 한다.

     

     

    페이징을 써서 외부 단편화를 해결했지만 결과적으로 내부 단편화가 생긴 것

     

    그러나 내부 단편화로 인한 메모리 낭비는 미비하다. 아무리 커봐야 한 페이지 사이즈 - 1바이트 정도 이기

     

    때문이다.

     

    따라서 크게 문제는 될 수 없다.

     

     

     

    페이지 테이블 만들기

    이전 글 참조

    CPU와 메모리 사이에는 페이지 테이블이 있다고 했다. 이 page table인 mmu는 Cpu 안에 넣을

     

    수 있다. 일종의 프레임 넘버를 기억하는 기억장치인 페이지 테이블을 Cpu안에 있는 기억장치인

     

    레지스터로 만들 수 있다. 혹은 메인 메모리 안에 넣을 수도 있다.

     

    1. 페이지 테이블을 Cpu 레지스터로

     

    장점? 

    : Cpu 안에 있기에 주소변환이 빠르다. 원래는 Page table 거쳐서 했지만 Cpu 안에 있기에 address

     

    변환 속도가 굉장히 빠를 것.

     

    단점? Cpu 안에 넣어야 하니 많은 엔트리를 가진 페이지 테이블은 넣을 수 없다.

     

    2. 1. 페이지 테이블을 메인 메모리로

     

    장점 : 메모리는 충분히 크니 엔트리 개수가 아무리 많아도 넣는 게 무리가 없다

     

    단점 : 변환 속도가 느리다. 한번 변환하려면 페이지 테이블을 읽기 위해 메모리를 한번 읽고

     

    그렇게 나온 프레임 번호에 해당되는 주소로 또다시 가야 하니 속도가 느리다.

     

     

    따라서 이 2가지 방법은 가능하지만 현실적으로 적용하긴 어렵고 실질적인 방법으로

     

    캐시 메모리로 만드는 것. 즉 sram으로 만든다. 이를 TLB(Translation Look-aside Buffer)라고 한다. 이 방법은 CPU 레지

     

    스터보다는 많은 용량을 쓸 수 있고 메인 메모리에 넣는 것보다는 빠르다.

     

     

     

     

    정리

     

    프로세스는 연속으로 들어가지 않고 쪼개서 들어간다고 했다. 하나의 프로세스가 메모리에 연속적으로

     

    들어가는 게 아닌 페이지 사이즈로 흩어져서 들어가게 된다. 원래는 흩어져있기에 실행할 수 없지만

     

    cpu와 메모리 사이에 page table을 통해 cpu가 주소를 내면 변환이 일어나게 되고 페이지 테이블을

     

    기준으로 CPU에서 보는 Logical address는 연속적이게 되고 실제 메모리로 가는 Physical address

     

    는 흩어져 있게 되는 것이다.

     

    따라서 CPU가 보기에는 연속해있기 때문에 아무런 문제가 없게 되고

     

    외부 단편화 문제를 해결할 수 있다고 했다.

     

     

     

    외부 단편화는 페이징을 통해 해결했지만 이 과정에서 내부 단편화가 발생한다. 이는 미미한 낭비이므로

     

    그리 신경쓰지 않아도 된다. 그리고 페이지 테이블을 어떻게 만들 건지에 대해서 배웠고 고속의

     

    SRAM을 캐시 처럼 만들어서 쓰인다고 하였다 ( TLB )

     

    https://en.wikipedia.org/wiki/Translation_lookaside_buffer

     

     

     

     

     

     

     

    보호와 공유

     

    보호 ( Protection ) 해킹 방지

     

    - 각 페이지 테이블마다 read write execute용 1비트씩을 추가한다. 1 1 1이라면 페이지 테이블에서 읽은

     

    프레임 넘버에 있는 데이터에 대해서 읽을수 있고 쓸 수도 있고 실행할 수도 있는 것. 권한이 없는데(비트가 0)

     

    읽거나 쓰거나 실행 하려고 CPU가 바꾸려 한다면 페이지 테이블에서 CPU로 인터럽트가 걸리게 된다. CPU는 지금

     

    하던 일을 중지하고 OS에 특정 루틴으로 가서 이런 잘못된 일을 하는 프로세스를 강제 종료하게 된다.

     

    즉 어짜피 CPU가 내는 모든 주소는 페이징을 사용한다면 모두 페이지 테이블을 거치게 된다. 여기에 rwx

     

    비트를 둬서 해당 페이지에 대한 접근 제한을 두는 것이다.

     

    공유 ( Sharing ) 메모리 낭비 방지

    - hwp 프로그램을 3개 띄어 놓았다고 하자. 각 프로그램을 a, b, c라고 하자. 메인 메모리에는 a, b, c도

     

    올라가게 할 수 있겠고 각 a, b, c는 코드 데이터 스택 영역으로 나누어지게 될 것이다. a,b,c는 똑같은

     

    한글 프로그램이라면 코드 영역은 똑같을 것이다. 따라서 같은 프로그램을 쓰는 복수 개의 프로세스가

     

    있다면 code는 공유가 가능하다는 것. 페이징을 사용하는 경우 코드 영역에 해당되는 페이지 테이블이

     

    같은 값을 가리키도록 하는 것이다.

     

    context switching 이 되도 페이지 테이블에서 코드 영역을 가리키는 부분은 바뀌지 않게 된다.

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

    19. 가상 메모리  (0) 2020.01.30
    18. 세그먼테이션 (Segmentation)  (0) 2020.01.27
    16. 외부 단편화와 페이징  (0) 2020.01.10
    15. 메모리 낭비 방지  (0) 2020.01.05
    14. 모니터  (0) 2019.12.31
Designed by Tistory.