티스토리 뷰
💜
process in memory
( 해당 메모리 address에 접근할 수 있는 핸들 같은 것을 포인터로 표현하자면 )
code에 대한 포인터 => PC (프로그램 카운터)
stack에 대한 포인터 => SP (스택 포인터 = 현재 콜스택(실행 컨텍스트) 어디인지 가리킴)
data에 대한 포인터 => 변수명
heap에 대한 포인터 => C의 '포인터' (malloc, linked list) , Java에서 인스턴스 이름 같은 것 (=> 이 heap에 대한 포인터는 stack 영역에 저장됨)
*참고로
c의 static 키워드 붙은 것 => data 영역에 저장됨 (전역 변수 효과)
java의 static 키워드 붙은 것 => heap 영역에 저장됨 (클래스 멤버 효과)
From the memory perspective, static variables are stored in the heap memory.
💜
thread in memory
위 메모리 영역 중 스레드는 다른 건 다 공유하고 stack 메모리랑 TCB (tid, pc, sp, cpu 코어에서 내려올 때 register value, pcb 포인터) 만 따로 가짐!
최소한 이러한 정보들은 따로 가지고 있어야 각자 독자적으로 실행가능.
*TCB 구성 정보
tid, SP, PC, 상태 (running, ready, waiting, start, done), 레지스터 value, PCB에 대한 포인터 (이 스레드의 프로세스의 pcb)
이 스레드에 대한 모든 메타 정보를 담고 있다고 보면 됨.
전역변수는 thread safe하지 않음 => data 영역에 저장되는데 이 영역은 모든 스레드가 share 하니까
지역변수는 thread safe하다 => primitive value들은 애초에 그냥 stack 영역에 저장되고, 객체 같은 heap에 저장되는 reference value들도 heap 영역의 각기 다른 메모리 주소에 생성된 다음에 이 객체들에 대한 포인터는 각자 stack에 저장하니까 잘 설계된 언어라면 thread safe 해야함.
os가 실제 스레드로 인식해서 코어에 올릴 수 있는 data structure랑 유저레벨 스레드를 어떻게 맵핑 하느냐에 따라 1:1, 1:n, n:m 모델로 부르는 것 같음..🤔
'시리즈 > Concurrency' 카테고리의 다른 글
yield에 관한 고찰 (0) | 2022.01.23 |
---|---|
[문서정리] Implementing threads (0) | 2022.01.23 |
IPC, 프로세스간 통신 그리고 gRPC (0) | 2021.12.05 |
서버는 여러개의 request를 어떻게 감당할까? (0) | 2021.11.29 |
EDA 메세징 시스템 - 큐 vs 로그 (0) | 2021.11.04 |