[커널 18차] 3주차

2021.06.12 22:39

V4bel 조회 수:103

2021/06/12 스터디 3차

 

1) 입장하신 분들은 오후 3:00 시작전까지 참가자명을 한글 실명으로 변경.

2) 출첵을 위해 구글 문서의 다음 참석 항목에 성함을 기록.

    jake.dothome.co.kr 에 링크가 있습니다.

3) 접속 후 3시 정각에 웹캠 on.

참석

  • 44명 참석(문영일, 정동훈, 최영민, 김원우, 조기석, 권효만, 안이수, 이재훈, 김성준, 김정임, 안유빈, 조만재, 김성원, 이민욱, 류호은, 김각래, 김태완, 최서정,송준영, 김준영, 조현철, 문연수, 민호기,서민혁, 박진현, 김경인,  한동수, 정주희, 박시현,박노은,정은식, 이일영, 강혁,유원상, 황바른 , 안성원 , 이정아, 이정재, 최준근, 이형래, 김현우, 임채훈, 한윤재, 박청수

진도 및 내용,

서기: 김현우, 김성원

공유: 이민욱

 

  • 문영일 제외 79명: 강혁+, 권경환, 권대엽, 권효만+, 금승원+, 김각래+, 김경인+, 김동훈, 김민경+, 김성원+, 김성준+, 김승현+, 김원우+, 김은영, 김정임+, 김준영+, 김지태, 김태완, 김택우+, 김한구, 김현우+, 김형종, 류호은, 문연수+, 문호찬, 문희찬+, 민호기+, 박노은+, 박상호, 박소연, 박시현, 박청수, 박현진, 봉하승, 서민혁, 송기원, 송준영+,  신보현, 안성원+, 안유빈, 안이수, 원민수, 위대한, 유민호, 유원상, 유재홍, 유준환, 이민욱, 이윤성, 이일영, 이재욱, 이재훈+, 이정민, 이정아, 이정재+, 이주형, 이준후, 이한솔, 이형래, 이훈종, 임채훈, 정동훈, 정은식, 정주희, 조기석, 조만재, 조안나, 조현철, 지영근, 차민희, 천승환, 최서정, 최연욱, 최영민+, 최준근+, 한동수, 한윤재, 황바른, 황성민+, 황성연,

  • 100p

 

fork, vfork, pthread 차이점

                             fork        vfork         pthread

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

가상 공간(VM) 공유 여부:       -(CoW)         O              O

자식 커널 스택 생성(kernel)       O           O              O

자식 유저 스택 생성(glib*)        O           X              O

부모 유저 스택 공유               X           O              X

커널 스택 공유                   X           X              X

호출 시 부모 실행 멈춤            X          

                               

vfork와 exec관련 정리

궁금증: vfork를 하면 parent와 child가 stack을 공유하는데 child에서 exec을 하면 기존 parent의 stack이 망가지지 않을까?

 

  • exec은 stack을 새롭게 할당하고 old stack은 deallocate한다. (여기서부터는 소설이지만) reference count 말씀하신 분의 내용을 함께 생각해보면, parent에서 old stack의 reference count를 1만큼 가지고 있으므로 vfork하고 exec을 한 경우 old stack은 deallocate가 안되는 거 같다.

 

  • 따라서 vfork를 하고 child에서 exec을 하면 parent는 실행을 다시 시작하고 child는 새롭게 스택을 할당받아 거기서 실행을 시작한다. 뭐가 먼저 실행될지는 스케줄러 판단에 따라 다르다.

 

(from man page)

returns from the function in which vfork() was called, or calls any other function before successfully calling _exit(2) or one of the exec(3) family of functions.

 

참고


 

ARM64 cpu_context (arch/arm64/include/asm/processor.h)

 

struct cpu_context {

    unsigned long x19;

    unsigned long x20;

    unsigned long x21;

    unsigned long x22;

    unsigned long x23;

    unsigned long x24;

    unsigned long x25;

    unsigned long x26;

    unsigned long x27;

    unsigned long x28;

    unsigned long fp; 

    unsigned long sp; 

    unsigned long pc; 

};

 

FJzjJjqJykMHJPTaJygJCtJ0A8pTx3fF0GgIeYwX


 

ARM32 cpu_context_save (arch/arm/include/asm/thread_info.h)

 

struct cpu_context_save {                                                                       

    __u32   r4;                                                                                 

    __u32   r5;                                                                                 

    __u32   r6;                                                                                 

    __u32   r7;                                                                                 

    __u32   r8;                                                                                 

    __u32   r9;                                                                                 

    __u32   sl;                                                                                 

    __u32   fp;                                                                                 

    __u32   sp;                                                                                 

    __u32   pc;                                                                                 

    __u32   extra[2];       /* Xscale 'acc' register, etc */                                    

};  


 


 

인터럽트 context switch의 경우에는 모든 pt_regs 구조체를 통해 모든 레지스터를 저장 및 복구하는 것에 비해 프로세스 context switch의 경우에는 일부 레지스터만 백업/복구합니다. ^^

 

  • 스레드에서의 시그널 처리

프로세스에서는 시그널 핸들러를 등록하여 시그널 진입 시 후크되어 처리할 수 있는 것에 비해,

스레드별로 개별 시그널을 받으려면 다음과 같은 작업이 뒤따릅니다.

1) 부모 프로세스에서 pthread_sigmask()를 통해 스레드별로 공유 시그널들의 처리 여부를 변경할 수 있고,

2) 스레드 내에 별도의 sigwait()을 통해 시그널을 받아 처리합니다.

 

관련 API

int pthread_sigmask(int how, const sigset_t *restrict set,

                    sigset_t *restrict oset);

 

int sigwait(const sigset_t *restrict set, int *restrict signop);

 

int pthread_kill(pthread_t thread, int signo);

 

int tkill(pid_t tid, int sig);





 

chrt -d -T <runtime> -D <dealine> -P <period> -p 0 <PID>

sched

 

$ chrt --deadline --sched-runtime 300000000 --sched-period 1000000000 0 ./load100 &


 

Csr_fgKqaAumRexrkdIo5u54FhM3--c-CFd4qIac

AMP vs SMP vs HMP

AMP : Asymmetric Multi-processing   (다른 종류의 cpu)

zg_N_lsjCUvooTBFKZ0c2K9da8rGfo6D86IGGJJW

SMP : Symmetric Multi-processing (같은 종류의 cpu)

vlMb5aawWim30JE7Cu0EhKDi1xsTG5cCpLbvsrQJ

HMP : Heterogeneous Multi-Processing (combination of AMP & SMP)
 

jTJPGcwCAzeW6v3qU5Vb0kDMH_X7h8RNJImb1Vse


 

SoC : System-on-a-chip

NUMA

memoryless node


 

https://community.amd.com/t5/general-discussions/new-utility-can-double-amd-threadripper-2990wx-performance/td-p/392882

 

4YqObBIL02g2DCl3qgde1sBqMgmDwx_LaAMtS0PD

NUMA 관련

https://rockball.tistory.com/entry/Numa%EC%9D%98-%EC%9D%B4%ED%95%B4

https://wogh8732.tistory.com/399

https://jihooyim1.gitbooks.io/linuxbasic/content/contents/06.html

https://namu.wiki/w/NUMA

 

Zone

http://jake.dothome.co.kr/zone-types/


 

커널 매핑 코드

start_kernel() -> setup_arch() -> paging_init() -> map_kernel()


 

커널용 리니어 매핑 코드

start_kernel() -> setup_arch() -> paging_init() -> map_mem()

XE Login