달력

12

« 2024/12 »

  • 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
2011. 10. 17. 23:37

메모리 관리 OS이야기2011. 10. 17. 23:37

struct page{

page_flages_t flags;
atomic_t _count;
atomic_t private;
unsigned long private;
struct address_space *mapping;
pgoff_t index;
struct list_head lru;
void *virtual;



flags 필드는 페이지의 상태를 저장한다. 여기에 저장되는 플래그에는 페이지가 변경되었는지(dirty), 혹은 메모리가 잠겨졌는가(lock) 등을 나타내는 여러가지가 있다. 이러한 플래그는 비트 플래그의 형태로 최소 32가지의 서로 다른 플래그가 동시에 표현될 수 있다. 이 플래그 값들은 <linux/page-flags.h>에 정의돼있다. 

http://lxr.linux.no/linux+v2.6.39.4/include/linux/page-flags.h

_count 필드는 페이지의 사용횟수, 즉 해당 페이지에 대한 참조가 얼마나 되는지를 저장한다. 이 횟수가 0이면 누구도 이 페이지를 사용하지 않는것이며, 따라서 이 페이지를 다른 누군가에게 할당해 줄 수 없게된다. 커널 코드에서는 이 필드를 직접 접근하는 대신 page_count() 함수에 page 구조체를 넘겨주어 그 값을 얻으면 된다. 페이지가 사용되고 있지 않을 떄, 내부적으로 _count 필드는 음의 값을 갖지만, page_count()는 0을 리턴한다.
물론 페이지가 사용중이라면 양의 정수값을 리턴한다. 페이지는 페이지 캐시에 의해 사용되거나(이 경우 mapping 필드는 이 페이지와 연관된 address_space 객체를 가리킨다.), 고유 데이터(private 필드가 가리키는)로, 혹은 프로세스의 페이지 테이블 안에 위치하는 매핑으로 사용된다.

virtual 필드는 페이지의 가상주소이다. 일반적으로 이 값은 단지 가상 메모리에서의 페이지의 주소를 나타냄.
한편 상위 메모리(high memory)라 불리는 메모리는, 커널의 주소 공간으로 영구적으로 매핑되지 않는데, 이러한 메모리를 나타낼 경우 이플드에 NULL를 사용한다. 그리고 이 경우 페이지는 필요할 때마다 동적으로 매핑돼야 한다.

여기서의 핵심은, page구조체가 가상 페이지가 아닌 물리적인 페이지와 연계되어 있다는 사실이다. 즉, 스와핑 등의 동작이 계속일어나므로, 어떤 페이지를 기술하는 page 구조체는 계속 바뀔 수 있다는 것이다. 즉, 이 자료구조를 사용하는 목적은 물리적 메모리의 상태를 기술하는 것이지, 그 안에 포함되어 있는 데이터를 나타내려는 것이 아니다!!

커널은 이 자료구조를 사용하여 시스템 상의 모든 페이지를 관리하며, 따라서 이 자료구조를 통해 어떤 페이지가 사용 가능한지를 알 수 있게 된다. 만약 페이지가 가용하지 않는 경우 커널은 누가 그 페이지를 소유하고 있는가를 알 수 있어야 한다. 페이지를 소유할 가능성이 있는 주체로는 유저공간 프로세스, 동적으로 할당되는 커널 데이터, 정적 커널 코드, 페이지 캐쉬등이 있다. 


 

'OS이야기' 카테고리의 다른 글

페이지 얻기  (0) 2011.10.18
영역(Zone)  (0) 2011.10.18
실행지연  (0) 2011.10.17
타이머  (0) 2011.10.17
현재시각(wall time)  (0) 2011.10.17
:
Posted by НooпeУ


Code Start Code End