티스토리 뷰

💜

process in memory

( 해당 메모리 address에 접근할 수 있는 핸들 같은 것을 포인터로 표현하자면 )

code에 대한 포인터 => PC (프로그램 카운터)

stack에 대한 포인터 => SP (스택 포인터 = 현재 콜스택(실행 컨텍스트) 어디인지 가리킴)

data에 대한 포인터 => 변수명

heap에 대한 포인터 => C의 '포인터' (malloc, linked list) , Java에서 인스턴스 이름 같은 것 (=> 이 heap에 대한 포인터는 stack 영역에 저장됨)

java stack & heap memory

 

*참고로

c의 static 키워드 붙은 것 => data 영역에 저장됨 (전역 변수 효과)

java의 static 키워드 붙은 것 => heap 영역에 저장됨 (클래스 멤버 효과)

java static - 출처 baeldung

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 모델로 부르는 것 같음..🤔

댓글
공지사항
최근에 올라온 글