스택은 스레드를 기준으로 보면 좋다. 스레드는 자신만의 스택 메모리를 가지게 된다. 만약, 1mb가 기본 스택 사이즈라면, 프로세스의 스택 메모리 사이즈의 총합은 1mb x 스레드 갯수가 된다. 스레드는 트릭한 방법을 쓰지 않는한 다른 스레드의 스택을 알 수 없다.
힙은 프로세스를 기준으로 보면 좋다. 프로세스는 디폴트 힙을 가지며, os가 제공 해주는 힙생성 api를 이용하여 여러 힙을 가질 수 있다. 모든 스레드는 힙에 접근할 수 있다. 프로세스는 다른 프로세스의 힙에 접근할 수 없다. os가 제공해주는 ipc를 지원해주는 api에 의하여 제한적으로 커뮤니케이션만 가능하다.
스택이 비교적 빠른 이유는 캐시 히트가 잘되기 때문이다. 캐시 히트가 잘 되는 이유는, 스택은 기본적으로 ebp, esp와 같은 레지스터를 사용하기 때문이다. 스택이 깊어지거나 얕아질때마다 두 레지스터를 건드리게 되고 캐시의 템퍼럴, 스페이셜 로컬리티에 의하여 관련된 캐시라인들이 읽어져오기 때문이다. 동시에 스택은 대체로 작은 사이즈를 유지하려 하기에 로컬리티에 유리한점이 있다.
생각나는대로 적어봄... 틀린거나 다른의견 있으면 환영
힙은 프로세스를 기준으로 보면 좋다. 프로세스는 디폴트 힙을 가지며, os가 제공 해주는 힙생성 api를 이용하여 여러 힙을 가질 수 있다. 모든 스레드는 힙에 접근할 수 있다. 프로세스는 다른 프로세스의 힙에 접근할 수 없다. os가 제공해주는 ipc를 지원해주는 api에 의하여 제한적으로 커뮤니케이션만 가능하다.
스택이 비교적 빠른 이유는 캐시 히트가 잘되기 때문이다. 캐시 히트가 잘 되는 이유는, 스택은 기본적으로 ebp, esp와 같은 레지스터를 사용하기 때문이다. 스택이 깊어지거나 얕아질때마다 두 레지스터를 건드리게 되고 캐시의 템퍼럴, 스페이셜 로컬리티에 의하여 관련된 캐시라인들이 읽어져오기 때문이다. 동시에 스택은 대체로 작은 사이즈를 유지하려 하기에 로컬리티에 유리한점이 있다.
생각나는대로 적어봄... 틀린거나 다른의견 있으면 환영
스레드마다 스택이 독립적이면 스레드끼리 데이터를 어떻게 주고받아?
스레드끼리 데이터를 주고 받을 일이 별로 없고, 있으면 힙 메모리를 통해서 작은 크기(보통은 포인터)로 주고받지
근데 나 pthread로 스택 메모리에 저장된 구조체로 정보 주고 받았는데 스택이 안돼? - dc App
선언된 거까지는 공유하는 거지? - dc App
전역변수였겠지 그건 데이타영역
메인 안에 선언했는데 - dc App
부모에 있는건 상관이 없는거지? - dc App
Pthread를 이용해서 스레드를생성할때, 지역변수를 인자로 넘길 수 있긴한데, 만약 해당 지역변수가 무효화되면, 해당 콜스택이 사라져서 더이상 지역변수가 유효하지 않으면 문제가 되겠지.
부모가 같은 쓰레든끼리는 부모 주소공간을 같이씀 단지 쓰레드별로 콜스택 영역이 구분되고 스택포인터가 다른거야.
메인에 있으면 프로세스가 종료할때까지 유지되니까 문제는 안되는데, 메인에서 다시 다른 함수를 호출하고 그 함수에서 pthread를 생성해서 지역변수를 인자로 넘기면 주의가 필요함
ㅇㅋㅇㅋ 내가 글을 잘 이해 못해서 이런 말을 남겼음 - dc App
정보추
그러면 멀티쓰레드가없는 멀티프로세싱은 스택, 힙을 구분하지 않아도 되는건가?
스레드가 하나인 프로세스를 여러개 돌리는건가? 그래도 구별안할 이유는 모르겟당
스택힙은 프로세스 내부에서 신경쓸 문제이고 멀티프로세스 단으로 위쪽으로 올라가면 공유메모리나 ipc 이런거 신경써줘야지 뭐 ……….
틀린거 없는듯 ……….
오오 좋다 ㅊㅊ
덧붙이면 스택은 ebp esp만 바꿔서 그냥 쓰면 되는데 힙은 힙구조상 해제할때 시간복잡도도 더 크고 heap fragmentation 문제도 생길수있음
좋은 글이긴 한데 너무 하드웨어 의존적인 설명이야. ARM이나 RISC-V에서 같은 구조를 가진다고 말할 수 없고 또 E가 붙는 스택과 베이스 포인터는 32비트 모드용이라서 최신 하드웨어적인 설명은 아니라고 생각함.
오.... 좋은 지적 감사. 해당 부분은 내가 잘 모르는 부분이라, 나도 한 번 봐야할듯
x64에선 rbp rsp라고만 적으면 됨ㅋㅋ
하드웨어 내용 뺴도 설명이 됨 개인적으로는 어차피 한글로 쓸거면 템포랄 스페이셜 보다 그냥 시간적 공간적 지역성이 더 나은 듯
받아라 공유메모리 빔!!!