Closed MyunghoonOh closed 5 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은 사용자 또는 프로세스별로 제한을 설정합니다.
[x] 질문 1 context switch를 할때, CPU register, virtual address 등의 정보를 저장 후 복원 할 텐데, x86과 ARM architecture간의 차이는 무엇이 있을까요?
[x] 질문 2 RTOS에서 deadline 내에 무조건 끝나는 것을 목표로 하는데, 이것을 어떤 방식으로 보장하는지? 또한, 꼭 끝내야하는 Process가 2개 이상이 있는 경우가 rtos에서 발생하는지? 발생한다면 이럴 때는 어떻게 처리를 하는지?
[x] 질문 3 Normally the kernel is in user mode in which it may access only its own data and cannot therefore interfere with other applications in the system — it usually doesn’t even notice that there are other programs besides itself. "일반적으로 커널은 자신의 데이터만 접근할 수 있고 시스템의 다른 app에게 간섭할 수 없는 유저모드에 있다." 라고 나와 있는데, 이 의미가 무엇인지 잘 모르겠다.
[x] 질문 4 system call이 interrupt에 의해 잠시 보류되는 상황에는 어떤것이 있나요?
[x] 질문 5 TASK_INTERRUPTIBLE 상태로 전환되는 경우에는 어떤 것이 있나요?
[x] 질문 6 손주형의 질문 1과 동일한 궁금증
global ID는 유일한 값을 갖는데 이는 namespace를 구분하기 위한 ID로 보면 되는 것인지?
특정 process에게 signal을 보낼때 Global ID, Local ID를 모두 고려해야 하는지?(함수 호출을 예로 들어서 설명해 주시면 감사할듯 합니다.)
[x] 질문 1 p36 왜 커널에서는 hard real-time procesing을 지원하지않는지.. 지원을 하지 않는 이유가 있을텐데 왜 할수있게 수정된 커널버전을 만든건지, real-time작업을 외부에서 처리한다는데 그 외부가 뭔지 잘 모르겠습니다!
[x] 질문 2 p45 The numeric values differ between architectures because Linux tries to establish binary compatibility with the specific native Unix systems. 아키텍쳐마다 수치가 다르다고 하는데 이유와 여기서 말하는 아키텍쳐가 무엇인지 잘 모르겠습니다!
[x] 질문3 자식이 먼저 죽으면 부모에게 죽는원인이런거 다 전달해주고 떠나는데 부모 task 가 자식 task 보다 먼저 죽게되면은 어떻게되나요 그리고 부모task 가 자식 task죽은거에대해 정보를 받는데 이걸 알아서 어디다 사용하나용..?
[x] 질문4 p62 If process A forks several times therefore generating several child processes B1, B2, . . . , Bn, the relationship between the Bi processes is known as a siblings relationship.
여기서 Bn들끼리는 형제라고 하는데 이 형제들은 무슨 관계를 갖나용??
pid 번호는 int 비트맵으로 관리되는 것인지 --> 비트맵은 여러개의 페이지로 구성됩니다. 각 페이지에 생성되는 비트맵의 크기는 Bitmap_size per page = 페이지의 크기(4096byte) 8(1byte는 8bit) 입니다. 할당되는 pid는 pid = 4096 이전 할당에 사용했던 페이지의 갯수 + offset(이번 할당에 사용되는 페이지 데이터에서 최초로 bit가 0이 나오는 값) 입니다.
int범위를 초과하는 pid가 필요하게 되면 어떻게 될까요? --> 커널 소스에서
PID는 4백만이 한계이며, 0 ~ 4,294,967,295까지 표현할 수 있는 int범위안에 표현이 가능합니다.
[ x] 질문 2. Namespaces are currently still marked as experimental in the standard kernel, and development to make all parts of the kernel fully namespace-aware are still going on 네임 스페이스는 현재 표준 커널에서 여전히 실험용으로 표시되어 있으며 커널의 모든 부분을 완전히 네임 스페이스 인식으로 만드는 개발이 계속 진행 중입니다. 그렇다면 현재 커널버전에서 네임스페이스는 어떻게 변화 되어있나요?
[x] 질문 3. The unshare system call dissociates parts of a process from the parent, and this also includes namespaces 공유되지 않는 시스템 호출은 프로세스의 일부를 상위 프로세스와 분리하고 네임 스페이스도 포함합니다. 여기서 말하는 공유되지 않는 시스템 호출이 어떤건지 잘몰라 이 부분이 이해가 안갑니다. 알려주시면 감사하겠습니다.
[x] 질문 4. include/linux/init_task.h 277 #define INIT_CPU_TIMERS(cpu_timers) \ 278 { \ 279 LIST_HEAD_INIT(cpu_timers[0]), \ 280 LIST_HEAD_INIT(cpu_timers[1]), \ 281 LIST_HEAD_INIT(cpu_timers[2]), \ 282 } 코드보는중 문법적으로 궁금증이 생긴 질문입니다. #define init_cpu_timers 에서 왜 3개나 쓰는지 궁급합니다??
-->POSIX CPU TIMER에서 테스크는 3가지 타입의 CPU_TIMER를 가지고 있습니다. /include/linux/posix-timers.h에서 각 타입에 대해서 아래와 같이 인덱싱을 하고 있습니다.
따라서 task_struct의 struct list_head cpu_timers[3]은 3개의 타입을 인덱싱으로 접근하기 위해서 정의되었습니다.
[x] 질문 1. Generally, the actions needed to handle interrupts have nothing to do with the process executing when the interrupt occurred. "일반적으로 인터럽트를 처리하는 데 필요한 작업은 인터럽트가 발생할 때 실행되는 프로세스와 아무 관련이 없습니다." 이런 설명이었고 그 아래에 부가적인 설명에는 block device가 RAM에 데이터를 전송할 때 실행중인 모든 프로세스에 해당될 수 있다는 설명이 있었고, 네트워크 패키지도 현재 실행중인 프로세스랑 관계가 없을수 있다고 나와있었습니다. 그렇다면 interrupts는 무슨 정보를 가질 수 있기에 모든 프로세스에게 전달이 되지만 그 interrupts에 해당하는 프로세스에 정보를 전달할 수 있나요?
[x] 질문 2. namespace는 init PID의 경우 따로 생성해서 관리하게 되는데 그럼 스케줄링도 아예 namespace별로 따로 하게 되는것인가요? 그렇게 되면 namespace별로 우선 순위는 어떤식으로 되나요? 아니면 스케줄링은 한번에 진행 되게 되는 것인가요?
[x] 질문 3. 2-5 그림을 보게 되면 task_struct에 pid가 구조체 pid에 연결되게 되는데 pid 구조체에는 namespace의 level로 연결되어있고 pid 구조체 값 자체는 1, 2, 3번의 pid들이 존재하는데 pid 구조체에는 3개의 pid들이 들어갈 공간이 없는거 같습니다. pid_type 구조체에 있는 3개의 pid들이 들어가 있다고 되어있는데 해당 pid들은 어디 변수에 들어가 있나요? 그리고 해쉬값과 namespace가 pid 구조체에서 관리하게 되는데 그렇게 되면 namespace별로 따로 관리하는게 아니라 pid끼리 연결되어있는건가요?
우선 아직 공부 중이라, 먼저 정리된 질문부터 올리겠습니다.
[x] 질문 1. 36페이지에서 switch 관련되어 설명할 때, CPU Type에 매우 의존적이고, cpu architecture마다 다르게 갖고 있기 때문에 C언어 만으로 구현되기 어렵고 architecture의 assembler의 도움을 받아야한다는게 무슨 말인지 궁금합니다.
[x] 질문 2. Process Life Cycle 2.2 단원에서 Zombie 상태에 대해서 설명이 되어있는데, 우선 Zombie 상태로 들어가는 것 중, 첫 번째인 다른 process나 user에 의해서 강제 종료되어지는 경우는 알겠지만, 두 번째인 child가 종료되는 시점에서 parent process가 이미 wait4 시스템 콜을 실행하여 child의 종료상태를 parent가 받는 경우가 무슨 얘기인지 자세히 알고 싶습니다.
[x] 질문 3. Linux Process 관리 구조에서 kernel mode 및 user mode의 차이점에 대해 자세히 알고 싶습니다.
추가적으로 나오는 질문을 밑에 더 달겠습니다.
11월 20일 스터디 때 @irian38317 위 질문에 대한 답변 부탁드립니다.
답변 완료했습니다.
스터디 자료 : Professional Linux Kernel Architecture 시간 : 11/13 PM 8:30 분(매주) 장소 : 미디어센터 508 호
발표팀
1. Ch02 스터디및 발표자료 작성
전체 적인 그림 및 구조 설명 일정
2. Ch02 에 나오는 아래 소스 코드들에 대하여 Ch02 관련 내용 분석 및 주석 작성
- include/linux/
- kernel/
- init/
- arch/x86/kernel/
- arch/x86/include/asm/
- fs/
발표팀 이외 팀
1. Ch02 에 대하여 팀당 질문 총 6개(개인당 3개)를 만들어 하루전까지 해당 issue 에 comment 로 제출\