cs/운영체제

8강-3. Memory Management 3

Tomato_Coffee 2023. 11. 10. 17:50

  • page table을 2단계만 쓰는 게 아니라 다단계를 쓸 수 있다.
    • 프로그램의 주소공간이 넓기 때문에, 3단계, 4단계 여러 단계 page table을 사용하는 게 가능
      • page table을 위한 공간을 많이 줄일 수 있다.
      • 그러나 한번 주소 변환을 하려면 page table을 여러 번 거쳐야 한다.
      • page table이 물리적인 메모리상에 있기 때문에 메모리에 한번 접근하기 위해서(4단계 테이블 일 때)
        • 주소 변환을 위해서 메모리에 4번 접근해야 한다. - ( 4회 주소 변환 )
        • 그리고 주소 변환을 한 다음에 실제로 원하는 데이터를 접근하기 위해서 또 메모리 접근을 해야 한다. - (실제 데이터 접근)
        • 따라서 메모리 한번 접근을 하려면 총 5번의 메모리 접근이 필요하다.
        • 그러나 대부분의 주소변환은 TLB를 통해서 직접 이루어지기 때문에, 이런 다단계 테이블을 사용하더라도 시간이 지나치게 오래 걸리지 않는다.

  • valid / invalid
    • 6, 7 이 0인 이유
      • 주소 공간이 가질 수 있는 Maximum 사이즈만큼 page entry는 생겨야 한다.
      • 32bit 일 때, page가 최대 1M 개가 있을 수 있다.
      • 메모리 구조에서 상위 부분에 code, data를 구성하는 페이지가 있고, 아주 아래쪽에 stack을 구성하는 page가 있다. 중간에 사용되지 않은 주소영역이 굉장히 많다.
      • 사용되지 않은 주소공간에 대해서도 entry가 만들어져야 한다. (page라는 자료구조 특성상 위에서부터 인덱스를 통해서 자료를 접근해야 하기 때문이다.)
      • 위에서 0이라고 표시는 했지만, 0번 page frame을 의미하는지 이 page에 대한 의미가 없는 건지를 valid/invalid bit을 통해서 표시한다.
    • valid : 사용할 때 사용하는 bit
    • invalid : 사용되지 않을때 사용되는 bit

  • invalid : 1. 프로세스가 그 주소 부분을 사용하지 않거나 2. backing store(swap area)에 있는 경우
  • Protection bit 
    • 어떤 연산에 대한 접근권한을 표시 하기위한 bit
      • code 영역 같은 경우 내용이 바뀌지 않아야 한다.
        • 원래 있는 내용을 cpu에서 읽어서 instruction을 실행하는 용도
        • 중간에 내용이 변경되면 안 된다.
        • code는 read-only로 세팅을 한다.
      • data, stack 영역은 데이터를 중간에 쓰고 업데이트하는 게 가능하다.
        • 이런 영역은 read/write권한을 줘야 한다.

  • page table 자체가 메모리 공간을 많이 차지하게 됨.
    • 공간 오버헤드가 크다.

원래 페이지 테이블을 통한 주소 변환을 역발사으로 뒤집어 놓음

  • 시스템 안에 딱 하나만 존재
    • 각 프로세스마다 존재하는 게 아니라 system wide 하게 page table이 하나만 존재
    • page table의 entry가 process의 page 개수만큼 존재하는 게 아니라, 물리적인 메모리의 page frame 개수만큼 존재한다.
  • page table의 첫 번째 entry에는 첫 번째 page frame에 들어가는 논리적인 주소 번호가 들어있다.
  • 역방향 page table은 들어가는 내용이 반대로 되어있다.
    • 이거는 physical address를 보고 logical address로 바꿀 수 있는 테이블이다.
    • 논리주소에 해당하는 page 번호 p가 물리적 메모리에서 어디에 올라가 있는지 찾으려면, entry를 다 찾아봐야 한다.
    • 그러면 왜 쓸까?
      • 장점 : 공간을 많이 줄일 수 있다.
      • 단점 : 시간 오버헤드가 크다.(순차적 탐색 때문)
    • 어떤 프로세스의 페이지인지 확인하기 위해서 pid(= 현재 cpu를 사용하고 있는 process의 id)를 같이 가지고 있어야 한다.
    • page table에서 찾았으면, 위에서 몇 번째 entry인지 봐서, entry의 위치에 해당하는 번호를 page frame 번호로 넣어준다.(주소 변환 끝)
  • 병렬적으로 동시에 검색할 수 있게(associative register 사용)하면 순차적인 탐색의 시간 오버헤드를 줄일 수 있다.

 


Shared code = Re - entrant code (= Pure code)

  • ex) 아래 한글 프로그램을 3개의 프로그램으로 돌린다고 가정
  • 프로그램의 code 부분은 3개의 프로세스가 똑같은 것을 써도 됨.
    • 중간중간에 바뀌는 data 부분만 바뀐다.
  • shared code에 대해서는 1개의 copy만 물리적인 메모리에 올린다.
  • 여러 프로세스가 공유할 수 있는 코드 부분을 같은 물리적인 메모리 프레임으로 맵핑해 주는 기법
  • read - only로 세팅
  • 동일한 logical address를 가져야 한다.
    • ed1, ed2, ed3, data1
    • ed1, ed2, data2, ed3
    • ed1, data3, ed3, ed2
    • 이런 식으로 되면 안 된다.
    • 왜 동일한 logical address를 가져야 하나?
      • 코드 안에는 logical address가 적혀있다.
      • 동일한 위치가 아니면 명령줄이 이상하게 배치되어서 제대로 일처리를 하지 못하기 때문이다.(아래 이미지 참고)

Private code and data

  • 프로세스마다 별도로 가져야 하는 page들은 각각이 다른 frame으로 맵핑되도록 함.

process를 구성하는 주소공간을 의미단위로 쪼갠것.

  • 세그먼테이션에서 주소변환 기법은 페이징 기법과 비슷한 측면이 있다.
  • <segment number, offset> 
  • 각 세그먼트 별로 서로 다른 물리적인 메모리 위치에 올라갈 수 있기 때문에
  • 세그먼트 별로 주소 변환을 해야 한다.=> 세그먼트 테이블
  • Segment table base register = STBR 
    • 세그먼트 테이블의 시작위치
  • Segment table length register = STLR
    • 프로그램이 사용하는 세그먼트의 개수 = entry 의 수

  • cpu가 논리주소를 주게 되면 2 부분으로 나눈다.
    • s : 세그먼트 번호
    • d : 세그먼트에서 떨어진 offset
  • 세그먼트 번호에 해당하는 위치만큼 떨어진 entry에 가면, 이 세그먼트가 물리적인 메모리에 어떤 번지에 올라가 있는지를 가지고 있다.(base)
  • 세그먼테이션 기법은 page기법과 다르게 entry에 2가지 정보를 가지고 있다.
    • base
    • limit
      • 세그먼트의 길이를 나타냄
      • page 기법에서는 page가 동일했다. 그러나 세그먼트 기법에서는 의미 단위로 자르기 때문에 세그먼트의 길이가 균일하지 않을 수 있어서 세그먼트의 길이 정보가 필요하다.
  • 주소 변환을 할 때, 2가지를 체크해야 한다.
    • 1. segment 번호(s) 체크 
      • s < STLR ( Segment table length register )
        • 위 식을 만족 못하면 trap 발생
    • 2. segment 길이(d) 체크
      • d < limit
        • 위 식을 만족 못하면 trap 발생
  • 위에서 체크를 둘다 통과했다면 주소 변환을 시작한다.
    • base( 세그먼트 시작위치 ) + d( offset )
  • 세그먼트도 크기가 균일하지 않기 때문에, 세그먼트가 들어오고 나가는 과정에서 가변분할처럼 hole(사용되지 않는 메모리 공간)이 생긴다. ==> 세그먼테이션의 단점.