달력

2

« 2025/2 »

  • 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

'OS이야기'에 해당되는 글 86

  1. 2011.10.20 kmem_pages(kmem_cache_t *cachep, int flags, int nodeid)
struct page *page;
void *addr;
int i;

flags |= cachep->gfpflags;

if(likely(nodeid == -1))
{
   addr = (void *) __get_free_pages(flags, cachep->fgporder);
   if(!addr)
          retrun NULL;
   page = virt_to_page (addr);

else
{
page = alloc_pages_node(nodeid, flags, cachep->gfporder);
if(!page)
  return NULL;
addr = page_address(page);



i = ( 1 << cachep->gfporder);
if(cachep->flags & SLAB_RECLAIM_ACCOUNT)
   atomic_add(i , &slab_reclaim_pages);
add_page_state(nr_slab, i);
while(i--)
{
SetpageSlab(page);
page++;


return addr; 

이 함수는 캐시를 저장하기에 충분히 큰 메모리를 할당하기 위해 __get_free_pages() 함수를 사용한다. 이 함수의 첫번째 매개변수는 페이즈를 필요로 하는 특정한 캐시를 가리키낟. 두번째 매개변수는 __get_free_pages()로 넘겨질 플래그이다.

이코드가 예상보다 복잡해보인다면 그것은 할당자를 NUMA와 호환되게 하기 위한 부분이 포함되어 있기 떄문이다. 만약 nodeid가 -1이면 할당자는 할당을 요청한 바로 그 메모리 노드에서 메모리를 할당한다. 이것은 NUMA 시스템에서 보다 나은 성능을 제공하는데, 왜냐하면 노드 밖에 있는 메모리를 접근하기 위해서는 보다 많은 시간이 필요로 하기 때문이다.

static inline void *kmem_pages(kmem_cache_t *cachep, unsigned long flags)
{
 viod *addr;
 flags |= cachep->gtpflags;
 addr = (void *) __get_free_pages(flags, cachep->gfporder);

 return addr;
}

이 메모리는 kmem_freepages()를 통해 해제할 수 있는데, 이 함수는 해당 캐시의 페이지에 대해 free_pages()를 호출한다.
슬랩 레이어의 핵심은 페이지의 할당/해제를 삼가는 것이므로, 슬랩 레이어는 해당 캐시에 partial, empty 슬랩이 없는 경우에만 페이지 할당함수를 호출한다. 또한 해제 함수는 가용한 메모리가 적어지는 경우나 시스템이 직접 메모리를 해제하는 경우, 혹은 캐시가 명시적으로 소멸될 경우에만 호출된다.

한편 슬랩 레이어는 캐시 단위로 운영되는 간단한 인터페이스를 통해 관리되며, 이 인터페이스는 커널 전체에서 사용할 수 있다.
이 인터페이스를 사용하면 캐시와 그 안에 있는 객체를 생성/파괴할 수 있다. 캐시와 슬랩을 관리하는 복잡한 과정은 슬랩 레이어의 내부에서 처리된다. 일단 캐시가 생성되면, 슬랩 레이어는 마치 특정 형식의 객체에 특화된 할당자처럼 동자가하게 된다.


















 

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

슬랩 할당자 사용예제  (0) 2011.10.20
슬랩 할당자 인터페이스  (0) 2011.10.20
슬랩 레이어  (0) 2011.10.19
vmalloc()  (0) 2011.10.19
kfree()  (1) 2011.10.19
:
Posted by НooпeУ


Code Start Code End