운영체제(8) - Memory Management Strategies(2)
‘운영체제’를 공부하여 정리한 내용입니다.
4. Paging
기본 방법
- 각 프로세스마다 페이지 테이블이 존재한다.
- 페이지 테이블이 작던 시절은 특수 레지스터에서 이 테이블 페이지를 담당했다.
- 현재는 페이지 테이블이 너무 커서, 메인 메모리에 페이지 테이블을 올리고, 특수 레지스터는 이 페이지 테이블의 위치를 참조하도록 한다.(PTBR: Page table Base Register)
-
페이지를 위해 정할 비트 개수가 있다.
- page number에 어느정도 bit를 할당할 것인지.
- 한 프로세스가 가질 수 있는 최대 페이지의 개수가 결정 된다.
- 10bit를 할당하게 되면 2^22개가 최대 개수다.
-
page offset에 어느정도 bit를 할당할 것인지.
- 시스템이 가지는 페이지 단위의 partion의 크기를 알 수 있다.
- (32 - 22)bit = 22 bit를 할당하게 되면, 2^10가 한 페이지당 크기가 된다.
- page number에 어느정도 bit를 할당할 것인지.
하드웨어 지원: TLB
- 페이지 테이블을 매번 참조하게 되면 메인메모리를 계속 봐야해서 그 자체에 오버헤드가 너무 크다.
- 캐시와 비슷한 특수한 하드웨어 캐시 사용.
- TLB: Translation Look-aside Buffers라고 부른다.
- 자주 사용하는 페이지 번호는 이 하드웨어 캐시에 저장하여 사용한다.
- ASID를 두어 프로세스의 정보 파악하여, 현재 찾은 페이지 번호가 이 프로세스의 것이 맞는지도 확인할 수 있다.
- 보안을 위한 작업이기도하지만, 이 캐시가 Context Switch와 별도로 움직일 수 있도록 해준다.
Protection
- Page 자체가 수정이 가능한 Page인지, 아니면 읽기 전용인지를 설정할 수 있다. (Protection bits)
- 사용가능 한 Page인지를 나타내는 (Valid/invalid) 비트가 있다.
- 페이지 테이블의 크기는 정해져 있으나, 프로세스가 이 페이지 테이블을 전부 사용하지 않을 수 있다.(일반적으로)
- 이 때는 사용하지 않는 부분의 Entry가 invalid 하게 두고 OS가 파악하고 있어야 적절하지 않은 접근을 막을 수 있다.
Shared pages
- 이전에도 계속 논의했듯이 프로세스끼리는 공유하는 데이터 혹은 라이브러리가 있을 수 있다.
- 페이지는 이 개념을 잘 서포트할 수 있는데 공유페이지 공간을 두어 ㅇ각 페이지 테이블이 이를 참조하여 사용하도록 하는 것이다.
- 간단한 개념이다.
5. Structure of the Page Table
Hierarchical Paging
- 필요성
- 페이지 테이블 자체가 너무 커져서, 이를 쪼개고 싶다는 생각에서 나온 구조이다.
- 너무 남용하면 접근이 너무 느려지기에 신중하게 고려해야 한다.
- C에서 다중포인터를 너무 많이 사용했을 때 점근이 매우 느려지는 것과 똑같은 이치다.
-
개념
- 페이지 번호가 두 영역으로 나뉜다.
- Outer Page number (outer Page table과 관련)
- Page number (Page table과 관련 - 실제 메모리 page number를 알게된다)
- 페이지 번호가 두 영역으로 나뉜다.
- (추후 업데이트)
Hashed Page Table
- Virtual Address를 두는 방식이다.
- 관련한 Hash function이 존재한다.
- Process가 접근하려는 주소의 Page number를 Hash function에 넣고 결과를 얻는다.
- Hash function 결과에 따라, Hash Table에 접근한다.
- 접근한 장소에서 시작되는 linked list를 따라가서 진짜 찾고자 하는 주소가 있는 곳을 찾는다.
- 각 linked list는 Page number, 실제 메모리 page number 페어의 정보를 가지고있다.
- 이를 찾으면, 기록된 실제 메모리 Page number를 가져와서 메모리에 접근한다.
Inverted Page table
- (추후 업데이트)
6. Segmentation
접근
- User가 생각하는 메모리 구조와, 실제 매핑되는 물리 메모리의 구조 차이가 크다.
- User는 실제로 프로세스가 매핑되는 메모리를 생각할 때, 코드 부분, 데이터 부분, 스텍, 힙, 그리고 라이브러리 부분 등으로 역할과 관련지어 Segment해서 생각한다.
- 이 때 이 각각의 역할들의 위치나 순서는 User의 고려 대상이 아니다.
- Segmentation 기법은 이 사용자의 관점을 그대로 지원하여, 프로세스를 위와 같이 역할로 나누어 메모리 공간을 할당하는 방식이다.
- 이 때, 당연히 각 역할에 따른 Segment의 크기는 가변적이다.
- 위에서 page의 크기는 일정했던 것과 차이가 있다.
실제 사용
- User가 신경쓰는 Logical Address의 경우는 Segment의 이름과 offset으로 이루어지게된다.
- Loader를 통해 프로세스가 메인메모리에 오를 때는 이 Segment들이 번호를 갖게 되고 이를 사용하게 된다. (각 Segment에 번호를 시스템이 할당한다.)
- 요소
- Logical Address
- Segment number
- Segment off-set
- Segment table
- Segment number로 테이블에 접근하면 다음과 같은 정보가 있다.
- Limit: Segment off-set은 이 Limit을 넘어가면 안된다.
- Base: Segment가 실제 물리주소에서 시작되는 위치를 의미하며, off-set이 Limit 안에 존재하면 그 off-set에 base를 더해서 실제 Physical Address를 구한다.
- Segment number로 테이블에 접근하면 다음과 같은 정보가 있다.
- Logical Address
Page와의 응용
- 다음과 같은 순서를 거쳐서 주소를 구하기도 한다.
- CPU에서는 Logical Address를 Segment Table을 이용해서 Segment 1차원 Linear Address로 바꾼다.
- Linear Address가 구해지면 이 것 자체가 Page를 사용하는 주소로 파악하고, 여기서 page number와 offset으로 나누어 Page table로 실제 Physical address를 구한다.
- 구해진 Physical Address로 실제 메인 메모리에 접근한다.
Leave a Comment