안녕하세요,

 

커널주중 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 575
468 커널에서 page alloc에 관해서 [1] 미다리로23 2017.02.05 120
467 SMP관련 질문입니다. [2] 컴퓨터 2017.04.13 163
466 create_workqueu 와 create_singlethread_workqueue의 차이 ? [1] 박성열2 2017.04.25 59
465 멀티프로세서 리눅스 시스템에서 쓰레드가 동작한 코어 추적에 대해 [3] Dawnwalkre 2017.05.23 139
464 파일시스템에 관한 질문(Htree [6] 사앙조 2017.05.22 295
» [커널주중 E조 스터디 이슈] tgid, pid 개념 [2] 김지성 2017.05.28 195
462 리눅스에서의 우선순위 [2] 사앙조 2017.05.14 333
461 커널 컴파일 [1] ldy209 2017.04.06 163
460 디바이스 드라이버 모듈에서 작성한 함수를 커널에서 사용하는 방법 [1] 개짖는소리 2017.02.06 2713
459 VMA의 flag에 관해서 미다리로23 2017.02.09 89
458 카메라 잘하시는 분 부탁드립니다. 김영일 2017.02.02 155
457 llvm 관련하여 질문드립니다. [4] June 2016.09.29 331
456 linux에서 gpio 초기화에 대한 질문입니다. [2] k40007 2016.10.01 391
455 Android Application 구동에 관한 조언 부탁드립니다. [1] June 2016.09.21 170
454 사운드 관련하여 질문입니다. qtopia 2016.09.22 97
453 커널의 물리적 주소안에 값을 읽고 싶은데 읽어 오지 않습니다 ㅠ 많은 조언 부탁드립니다 [13] 송창인 2010.12.23 11808
452 access_ok 질문 있습니다. qtopia 2016.07.20 153
451 쓰레드 execution time 질문입니다. [3] 쎈쓰쟁2 2016.03.29 522
450 include/asm-generic/topology.h macro 질문드립니다. [2] k40007 2015.09.29 781
XE Login