안녕하세요,

 

커널주중 E조 첫 주 스터디 진행 시 tgid 및 pid개념 정리에 2주간 질문이 남아 안목이 있으신 분들의 의견을 들어보고 싶어 질문드립니다.

 

저희 쪽에서는 당연하게도 2가지 접근이 있었는데, 아래 두가지 방향 중 어느 방향이 맞는 해석일까요?

 

-------------

  • - task_struct의 pid 필드는 우리가 알고 있는 PID(Process ID) 개념

PID를 얻기 위해 사용하는 getpid()는 pid를 가져옴. tgid는 실제 PID와는 다르게 개념상 존재하는 필드로 보임.

내지는 pid는 우리가 아는 PID 개념대로 프로세스는 유니크하게, 쓰레드는 부모의 pid와 같이 정해지며, 쓰레드 id구분을 위해 tid라는게 따로 있음. (-> 이 부분은 저도 task_struct구조를 못 봐서 아직은 잘 모르겠습니다.)

뭐 어쨌거나 tgid=PID가 아님! 다른 개념임!

 

  • - task_struct의 pid 필드는 우리가 알고 있는 PID와 다르며, tgid 필드가 PID 개념

PID를 얻기 위해 사용하는 getpid()는 tgid를 가져오는 함수임. pid필드는 우리가 아는 PID 개념에서 특별히 중요한 개념은 아닌 듯.

 

-------------

 

2주차 당시 제가 이해한 바는 아래와 같았습니다.

  1. - 먼저, 기존에 가지고 있던 PID에 대한 지식은 완전 배제 (아직 PID라는 개념은 Process ID가 아니다)
  2. - task_struct 구조체가 생성될때마다 pid(unique한 key)가 생성됨
  3. - POSIX Standard에서 정한 바, 생성된 task가 프로세스일 경우 {tgid}={pid}, 쓰레드일 경우 {tgid}={부모의 pid}로 정의

따라서 pid는 1부터 생성된다는 가정 하에, Process A->Process B->Thread A' (Process A에서 생성) 순서로 task_struct 생성 시

  1. - Process A (pid=1, 프로세스로 생성되었으므로 tgid=pid=1)
  2. - Process B (pid=2, 프로세스로 생성되었으므로 tgid=pid=2)
  3. - Thread A' (pid=3, 쓰레드로 생성되었으므로 tgid=부모 pid=1)

getpid()는 tgid를 리턴하므로, Process A, Thread A'는 1, Process B는 2를 리턴하게 된다고 이해했습니다.

 

이 과정에 따라 tgid는 POSIX Standard에서 정의하는 PID 개념과 equivalent하여 리눅스 시스템의 실제 PID로 차용하게 된 것 같습니다.

기존 pid는 그냥 task_struct 생성 시 나온 unique한 값이라는 의미밖에 없어 보이는 것 같습니다. 굳이 알려고 한다면 gettid라는 함수나 별도의 시스템콜을 이용하여 get하는 것 같습니다. (정확한 인용을 못한건 양해 부탁드립니다.)

 

------------

 

추가 질문으로

 

  • - 한 프로세스를 한 개의 쓰레드로 봐야하는가, 아니면 한 프로세스는 별도로 한 개의 쓰레드를 가지는가?

스터디 중에는 해석하기 나름이라고 생각했으나 끝나고 개인적으로 다시 생각해 봤을 땐 그냥 프로세스나 쓰레드는 별개의 개념인 것 같았습니다. 제 생각에 프로세스나 쓰레드나 리눅스에서는 task_struct로 각각 독립적으로 표현되고 작업단위로서 스케줄링당하므로 프로세스가 별도로 메인 쓰레드 하나를 가지는 건 아닌 것 같습니다.

 

덧붙여 2주밖에 안 됐지만 엉뚱한 질문에도 잘 참고 넘어가 주시는 팀원분들께 감사드립니다.

 

++덧, 게시글에는 서식이 안 먹네요ㅠ

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22171
518 arm a53 아키텍처는 cache size를 configuration 할 수 없나요? [1] mnth 2023.12.03 243
517 리눅스 스케줄링에서 SCHED_FIFO에 대해 문의드립니다. [1] Neo2013 2023.02.09 790
516 러스트 언어나 리눅스커널+러스트 어떻게 생각하세요? 해볼만 할까요? [2] 김기오 2022.11.28 873
515 __no_granule_support에서의 wfe, wfi 중복 사용 [2] min 2022.10.03 169
514 TLBi operation 질문 [5] 컴퓨터 2022.09.18 391
513 Nested Interrupt on ARM64 [7] 아띨라 2022.07.24 658
512 ARM64 CPU Context Switch [2] 아띨라 2022.07.24 492
511 mmap후 파일 올리기 [3] 읏짜 2022.01.13 805
510 [질문-해결됨] compaction 후 기존 PTE 매핑에 뜬금 스왑 엔트리가 나와요! [12] 이파란 2021.05.17 1911
509 iamroot선배님들의 조언 부탁드립니다 [2] 이파란 2021.04.15 768
508 오드로이드에 관해 akqk13012 2021.03.26 443
507 critical section에 대한 커널 코드 검증 방법 문의 [7] file mnth 2021.01.09 1466
506 인터럽트 발생 관련해서 질문 드리고 싶습니다. [6] 코딩의노예 2020.07.07 938
505 RCU 관련해서 질문 하나 드려봅니다. [2] 코딩의노예 2020.07.03 652
504 멀티스레드 시간측정 질문 file 뇨뇸 2020.05.03 518
503 리눅스 소스 분석 관련 질문 [4] AlanWalker 2020.04.22 736
502 16기 리눅스 커널 스터디 39주차 질문입니다. [6] rnsscman 2020.03.22 719
501 ___reserved_mem_reserve_reg 관련 질문 [4] DEWH 2020.03.09 12812
500 16기 리눅스 커널 스터디 33주차 질문입니다. [5] rnsscman 2020.02.08 355
499 setup_machine_fdt() -> fixmap_remap_fdt() 질문입니다. [2] daeroro 2019.12.24 316
XE Login