pidmap_init()
kernel/pid.c
void __init pidmap_init(void) { /* Veryify no one has done anything silly */ BUILD_BUG_ON(PID_MAX_LIMIT >= PIDNS_HASH_ADDING); /* bump default and minimum pid_max based on number of cpus */ pid_max = min(pid_max_max, max_t(int, pid_max, PIDS_PER_CPU_DEFAULT * num_possible_cpus())); pid_max_min = max_t(int, pid_max_min, PIDS_PER_CPU_MIN * num_possible_cpus()); pr_info("pid_max: default: %u minimum: %u\n", pid_max, pid_max_min); init_pid_ns.pidmap[0].page = kzalloc(PAGE_SIZE, GFP_KERNEL); /* Reserve PID 0. We never call free_pidmap(0) */ set_bit(0, init_pid_ns.pidmap[0].page); atomic_dec(&init_pid_ns.pidmap[0].nr_free); init_pid_ns.pid_cachep = KMEM_CACHE(pid, SLAB_HWCACHE_ALIGN | SLAB_PANIC); }
pid를 관리하기 위해 possible cpu 수에 맞추어 pid_max와 pid_max_min을 산출한다. 그 후 첫 번째 pidmap 배열을 할당하고 pid 0번을 사용상태로 설정한다.
- 코드 라인 7~8에서 1024 * possible cpu 수를 곱한 값(최소 32K부터 시작)과 pid_max_max(32bit=32K, 64bit=4M) 값 둘 중 작은 값으로 pid_max를 산출한다.
- rpi2: pid_max=32K
- 코드 라인 9~10에서 8 * possible cpu 수를 곱한 값(최소 301부터 시작)으로 pid_max_min을 대입한다.
- rpi2: pid_max_min=301
- 코드 라인 11에서 pid 관련 정보를 출력한다.
- rpi2: “pid_max: default: 32768 minimum: 301“
- 코드 라인 13에서 init_pid_ns의 pidmap 배열에서 첫 페이지는 무조건 필요하므로 1개 페이지를 할당한다.
- 코드 라인 15~16에서 pid 0번에 해당하는 비트를 설정하고, nr_free 수에서 1을 감소 시킨다.
- 코드 라인 18~19에서 pid 구조체 할당 시 사용할 목적의 kmem 슬랩 캐시를 준비한다.
PID_MAX_DEFAULT 값은 다음과 같다. (기본적으로는 32K 개의 pid 수를 사용한다.)
- small foot print 커널
- 4K
- 32bit 또는 64bit 커널
- 32K
PID_MAX_LIMIT 값을 알아보면 다음과 같다. (64비트 시스템에서 4M개의 pid 수를 사용할 수 있음을 알 수 있다)
- small foot print 커널
- PAGE_SIZE(4K) x 8 = 32K
- 32bit 커널
- 32K
- 64bit 커널
- 4M
include/linux/threads.h
/* * This controls the default maximum pid allocated to a process */ #define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000) /* * A maximum of 4 million PIDs should be enough for a while. * [NOTE: PID/TIDs are limited to 2^29 ~= 500+ million, see futex.h.] */ #define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \ (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT))
컴파일 타임에 pid 관련 전역 변수의 초기값은 다음과 같다.
include/linux/threads.h
int pid_max = PID_MAX_DEFAULT; #define RESERVED_PIDS 300 int pid_max_min = RESERVED_PIDS + 1; int pid_max_max = PID_MAX_LIMIT;
cpu별 pid min 값은 1024개이고 pid max는 32K이다. (32개의 cpu 기준)
include/linux/threads.h
/* * Define a minimum number of pids per cpu. Heuristically based * on original pid max of 32k for 32 cpus. Also, increase the * minimum settable value for pid_max on the running system based * on similar defaults. See kernel/pid.c:pidmap_init() for details. */ #define PIDS_PER_CPU_DEFAULT 1024 #define PIDS_PER_CPU_MIN 8
각 pid 번호의 사용 유무는 1bit를 사용한다. 1개의 페이지로 관리할 수 있는 pid 수는 PAGE_SIZE x 8 bit 이다. 관리할 최대 pid 수가 큰 경우 여러 페이지를 사용할 수 있는데 pidmap을 배열로 만들고 각 배열 인덱스는 1 개의 페이지를 관리한다. 예를 들어 1개 페이지 사이즈가 4K라고 가정할 때, 1개의 페이지 사이즈를 사용하여 pid에 대한 맵을 사용하면 1 PAGE x 8 bit = 32K 만큼의 pid를 관리할 수 있다. 따라서 pidmap 배열에 사용할 엔트리 수는 최대 pid 수(PID_MAX_LIMIT)를 32K 단위로 나누어 올림 처리한 수로 사용한다.
- 4K 페이지, 32bit 시스템에서 최대 32K 개의 pid는 1개 페이지로 처리할 수 있어 pidmap[1]을 사용한다.
- 4K 페이지, 64bit 시스템에서 최대 4M 개의 pid는 128개 페이지로 처리해야 하므로 pidmap[128]이 필요하다.
include/linux/pid_namespace.h
#define BITS_PER_PAGE (PAGE_SIZE * 8) #define BITS_PER_PAGE_MASK (BITS_PER_PAGE-1) #define PIDMAP_ENTRIES ((PID_MAX_LIMIT+BITS_PER_PAGE-1)/BITS_PER_PAGE)
참조
- pid 관리 | 문c
- pidhash_init() | 문c
- pidmap_init() | 문c – 현재글
- alloc_large_system_hash() | 문c