DKU-Embedded-Lab / Linux-Kernel-Study

Linux Kernel Study
6 stars 2 forks source link

Ch02 Process Management and Scheduling_p63 #1

Closed MyunghoonOh closed 5 years ago

MyunghoonOh commented 7 years ago

스터디 자료 : Professional Linux Kernel Architecture 시간 : 11/13 PM 8:30 분(매주) 장소 : 미디어센터 508 호

발표팀

1. Ch02 스터디및 발표자료 작성

전체 적인 그림 및 구조 설명 일정

2. Ch02 에 나오는 아래 소스 코드들에 대하여 Ch02 관련 내용 분석 및 주석 작성

- include/linux/

   sched.h, resource.h, nsproxy.h, init_task.h, utsname.h, user_namespace.h, pid_namespace.h, pid.h, 
   preempt.h

- kernel/

   nsproxy.c, user_namespace.c, pid.c, fork.c, schedule.c, kthread.c, exec.c, sched.c, sched_fair.c, 
   sched_rt.c 

- init/

    version.c

- arch/x86/kernel/

    process_32.c

- arch/x86/include/asm/

    thread_info.h, processor.h

- fs/

    exec.c

발표팀 이외 팀

1. Ch02 에 대하여 팀당 질문 총 6개(개인당 3개)를 만들어 하루전까지 해당 issue 에 comment 로 제출\

SonJuHyung commented 7 years ago

pid_nr_ns 함수의 기능은 어떤 ns가 와도 해당 ns의 struct upid가 선택되어 pid 번호를 반납합니다. level을 비교하는 것은 입력받은 ns가 계층구조에서 pid를 포함하는 상위 ns인지 확인하기 위한 기능입니다. 그리고 &pid->number[ns->level]에서 해당 ns의 pid번호를 가져옵니다. 질문내용(부모 namespace 에서는 자식 namespace 의 pid 를 볼 수 있지만)처럼 struct pid 는 ns level마다 local pid 번호들을 struct upid number[N]으로 가지고 있는것을 활용한 함수입니다. A ns를 매개변수로 넣으면, struct pid의 A ns영역의 pid 번호를 얻습니다. 반대로 B ns를 매개변수로 넣으면, struct pid의 B ns영역에서의 pid 번호를 얻습니다.

EX: A ns가 B ns의 부모일때 (A ns는 level 0 --> A ns에서 local pid 번호는 struct pid->number[0], B ns는 level 1 --> B ns에서 local pid 번호는 struct pid->number[1])

struct pid 뒷부분은 일정부분 struct pid 가 사용 가능하도록 free 한 영역이어서 이러한 접근이 가능한것인가요? --> alloc_pid(), create_pid_namespace() 함수를 보면 미리 numbers배열에 대한 공간을 할당하는 것을 관찰할 수 있습니다.

별도의 메커니즘입니다. cgroup은 프로세스 그룹별로 제한을 설정하고 setrlimit은 사용자 또는 프로세스별로 제한을 설정합니다.

sungmin1989 commented 7 years ago
SeungBu commented 7 years ago

여기서 Bn들끼리는 형제라고 하는데 이 형제들은 무슨 관계를 갖나용??

bestjae commented 7 years ago

pid 번호는 int 비트맵으로 관리되는 것인지 --> 비트맵은 여러개의 페이지로 구성됩니다. 각 페이지에 생성되는 비트맵의 크기는 Bitmap_size per page = 페이지의 크기(4096byte) 8(1byte는 8bit) 입니다. 할당되는 pid는 pid = 4096 이전 할당에 사용했던 페이지의 갯수 + offset(이번 할당에 사용되는 페이지 데이터에서 최초로 bit가 0이 나오는 값) 입니다.

int범위를 초과하는 pid가 필요하게 되면 어떻게 될까요?
 --> 커널 소스에서

define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 4096 : (4096 * 8))로 되어있고,

define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE 8 : (sizeof(long) > 4 ? 4 1024 * 1024 : PID_MAX_DEFAULT))로 되어있습니다.

PID는 4백만이 한계이며, 0 ~ 4,294,967,295까지 표현할 수 있는 int범위안에 표현이 가능합니다.

-->POSIX CPU TIMER에서 테스크는 3가지 타입의 CPU_TIMER를 가지고 있습니다. /include/linux/posix-timers.h에서 각 타입에 대해서 아래와 같이 인덱싱을 하고 있습니다.

define CPUCLOCK_PROF 0 -유저 모드와 시스템 모드에서 수행된 시간

define CPUCLOCK_VIRT 1 -유저 모드에서 수행된 시간

define CPUCLOCK_SCHED 2 -CPU에 스케쥴링 된 시간

따라서 task_struct의 struct list_head cpu_timers[3]은 3개의 타입을 인덱싱으로 접근하기 위해서 정의되었습니다.

kwanghee0124 commented 7 years ago
heyheygo99 commented 7 years ago

우선 아직 공부 중이라, 먼저 정리된 질문부터 올리겠습니다.

추가적으로 나오는 질문을 밑에 더 달겠습니다.

SonJuHyung commented 7 years ago

11월 20일 스터디 때 @irian38317 위 질문에 대한 답변 부탁드립니다.

MyunghoonOh commented 6 years ago

답변 완료했습니다.