5
numa_policy_init init/main.c CONFIG_NUMA 가 가가가가 가가 가가 가가 1. 가가가 가가가 , SPREAD NODE 가가 가가가 가가 2. Interleave node 가 가가 mempolicy 가 가가가 가 task_struct->mempolicy 가 가가가가 node_present_pages() kmem_cache_create() numa_policy 가 shared_policy_node 가 가가 slab 가 가가 node_set HIGHMEM 가가가 가가 가가가 가가가가 가가 가 가가가 가가 (prefered nid) 가 가가가가가가 가가가가가 가 가가가 가가가 16MB 가가가 가가가 가가가가 interleave_nodes 가가가가 가가 가가가가가 1 가 가가가 . 가가 가가 가가가 가가가 16MB 가가 가가가 가가가 가가가 가가 가 가가가가가 가가 가가 (prefered nid) 가 interleave_nodes 가가가가 가가가 do_set_mempolicy MPOL_INTERLEAVE 가가 (struct mempolicy) 가 가가가가 가가 가가가가 가가가 가가 (current->mempolicy) 가가 가가가가 flag 가 PF_MEMPOLICY 가 가가가가 (PF_MEMPOLICY: NON-Default NUMA Memory Policy)

numa_policy_init

  • Upload
    london

  • View
    40

  • Download
    0

Embed Size (px)

DESCRIPTION

CONFIG_NUMA 가 정의되어 있을 경우 수행 1. 메모리 정책과 , SPREAD NODE 관련 슬랩을 생성 2. Interleave node 에 대한 mempolicy 를 만들어 현 task_struct->mempolicy 에 연결해줌. init/main.c. numa_policy_init. numa_policy 와 shared_policy_node 에 대한 slab 을 생성. kmem_cache_create (). - PowerPoint PPT Presentation

Citation preview

Page 1: numa_policy_init

numa_policy_init

init/main.c CONFIG_NUMA 가 정의되어 있을 경우 수행1. 메모리 정책과 , SPREAD NODE 관련 슬랩을 생성2. Interleave node 에 대한 mempolicy 를 만들어 현 task_struct->mempolicy 에 연결해줌

node_present_pages()

kmem_cache_create()numa_policy 와 shared_policy_node 에 대한 slab을 생성

node_setnode_set

HIGHMEM 영역을 갖는 노드를 순회하여 가장 큰 노드의 번호 (prefered nid) 와 총페이지수를 기억해두고 각 노드에 대해서 16MB 이상의 크기를 갖는다면 interleave_nodes 비트맵에 해당 노드번호를 1 로 세팅함 . 만약 모든 노드의 크기가 16MB 보다 작다면 순회한 노드중 가장 큰 페이지수를 갖는 노드 (prefered nid) 를 interleave_nodes 비트맵에 세팅함

do_set_mempolicydo_set_mempolicy

MPOL_INTERLEAVE 정책 (struct mempolicy) 을 생성하여 현재 태스크의 메모리 정책 (current->mempolicy) 으로 지정하고 flag 를 PF_MEMPOLICY 로 설정해둠(PF_MEMPOLICY: NON-Default NUMA Memory Policy)

Page 2: numa_policy_init

late_time_init

init/main.c

Architecture 별로 override 됨

calibrate_delayBoGo mips 값을 관리하여 1 jiffy 동안 얼마나 많은 cpu 사이클이 소요되는지 측정하여 loops_per_jiffy값을 구해냄

Kernel 이 BogoMIPS 값을 결정하기위한 함수BogoMIPS MIPS 는 Millons of Instruction Per Second 의 약자이다 . 계산 능력을 나타내는 지표로 사용된다 . BogoMIPS 는 리누즈 토발즈가 만들어낸 것으로서 , 커널은 부팅시에 현 시스템에서 busy loop 이 얼마나 빠른지에 대해 기록한 값이며 Bogo 는 bogus( 가짜 ) 를 의미한다 . 이렇게 측정된 bogoMIPS 를 가지고 프로세서의 속도를 하며 이것은 전혀 과학적이값은 아니다 .리누즈에 의하면 이 BogoMIPS 값은 다음의 유용성이 있다 .1.디버깅에 유용2.Computer cache 와 turbo button 이 제대로 작동하는지 확인할수 있음 .실제적으로 BogoMIPS 는 cpu 가 1 jiffy 동안 수행하는 empty loop 의 횟수 값이다 .

Page 3: numa_policy_init

pidmap_init

init/main.c

Struct pid{ ...Struct hlist_head tasks[PIDTYPE_MAX]struct upid numbers[1]; …}

struct pid_link{ struct hlist_node node; struct pid *pid;}

struct task_struct{ .. pid_t pid; pid_t tgid; struct pid_link pids[PIDTYPE_MAX]; struct list_head thread_group; ..}

Struct upid { int nr; struct pid_namespace *ns; struct hlist_node pid_chain;}

struct pid_namespace { .. struct pidmap pidmap[PIDMAP_ENTRIES]; struct task_struct *child_reaper; struct kmem_cache *pid_cachep; unsigned int level; ..}

Struct pidmap { atomic_t nr_free; void *page;}

init_pid_ns namespace 에서 pid 0 이 사용할 페이지를 Pidmap배열의 0 번 index 에서 page 를 할당받고 pid 0 을 사용중으로 표시한 후 pid 구조체의 슬랩캐시 (pid_cachep) 를 생성함

PID namespace PID namespace 는 태스크들의 집합을 만들도록 해준다 . 즉 다른 namespace 의 태스크들이 같은 ID 를 가질수 있다 . 이 특징은 hosts사이의 이주를 위해 필수조건이다 . PID namespace 를 가짐으로써 프로세스는 PID 값을 유지하면서 다른 host 로 이동할 수 있다 . 이특징이 없다면 호스트간 태스크 이주는 빈번히 실패할 것이다 . 같은 ID 를 가지는 프로세스가 존재할 수 있기 때문이다 .

Page 4: numa_policy_init

init/main.c

prio_tree_init

Index_bit_to_maxindex 배열에 PST 의 index_bits에서 저장될 수 있는 heap_index 를 0 부터 1,3,7,15… 2^31-1, 2^32 값으로 세팅함으로써 maximum heap index 를 구하는데 사용할 수 있도록 해줌 .PST(radix priority search tree) 는 Interval 을 저장하는데 쓸모있으며 heap tree 와 radix tree 를 잘 혼합한 형태이다 . 사용되는 예를 보자면 vma 를 file pages 의 closed interval[offset_begin,offset_end] 로 생각해봤을 때 file 에 맵된 모든 vma 를 PST 에 저장함으로써 O(log n + m) 시간에 주어진 interval( 연속적인 파일페이지 ) 을 선택할 수 있다 . log n :PST 트리의 높이 , m : 저장된 interval 의 개수

anon_vma_init anon_vma 구조체의 슬랩캐시 생성

Reverse-mapping virtual memory(“rmap“) rmap 은 swapping 이 요구될때 커널이 메모리를 free 하는 것을 쉽게 만드는 목적이였다 . 이를 위해 reverse pointer chain 에서 각 포인터는 페이지를 참조하는 페이지테이블을 가리킨다 . rmap chain 에 의해 커널은 빠르게 주어진 페이지의 모든 매핑을 찾을수 있고 unmap 이후 page 를 swap out 할수 있다 . anonymous page 를 참조하는 다수의 VMA 를 anon_vma 를 통해 연결시키는데 이것은 page->mapping 포인터가 anon_vma 를 가리킴으로써 커널은 list 를 순회하여 연관된 VMA structure 를 찾을 수 있다 .

page

anon_vma

page->mapping ( if page mapped as anonymous memory, it points to anon_vma_object)

vm_area_struct

vm_area_struct

vm_area_struct

Page 5: numa_policy_init

init/main.c

cred_init LSM(Linux Security Module) 에서 사용될 cache 를 위해 struct cred 구조체로 슬랩캐시를 생성함

LSM(Linux Security Modules) 는 리눅스 커널이 적재가능한 커널모듈로서 구현되어야 하는 다양한 access-control-model 을 허용하기 위해 경량의 다목적 접근 제어 프레임워크로 구현되었다 . 그 중에는 Security-Enhanced Linux(SELinux), Domain and Type Enforcement(DTE), Linux Intrusion Detection System(LIDS) 가 있으며 . LSM 은 향상된 보안 정책을 커널 모듈로 적재가능하다 .