[완료]파이썬의 메모리 영역(heap)에 대해서
글쓴이: uddum / 작성시간: 월, 2010/03/22 - 10:47오후
파이썬으로 멀티쓰레딩을 쓸일이 있어서 프로그램을 만들다가 문득 이런 생각이 들었습니다.
"파이썬에는 동적할당이라는것이 없는데 그러면 파이썬이 메모리에 올라갈때 메모리 영역중 heap영역은 낭비되는걸까?
아니면 어차피 인터프리터이고 변수를 선언할때 메모리가 할당되니까 전부다 동적할당이라고 생각하면 stack영역은 낭비되는걸까?"
그래서 찾아봤습니다.
http://mearie.org/journal/2008/02/inside-python-quiz 이 글의 6번에 보면 전부다 heap영역에 모든 객체를 올린다고 되어있군요.
그렇다면 stack을 제외한 모든 영역을 쓰레드들이 공유하니까 파이썬에서의 쓰레드들은 모두 같은 메모리영역을 가지는게 되는데 뭔가 이상하지 않나요? 직접 해보면 분명히 독립적인 메모리 영역을 가지고 있는거 같은데..
이래저래 검색을 해봤지만 검색의 고수가 아닌지라.. 명확한 답을 찾기가 힘드네요. 저의 궁금증을 풀어주실 답변을 기다리겠습니다.
Forums:
"python memory
"python memory manager"라는 것을 열어보시면 될듯.
http://docs.python.org/c-api/memory.html# 에 보면 다음과 같은 말이 있군요.
ps. 자세히는 몰라요. 그저 참고하시라고...
------------------------------------------
emacs user
------------------------------------------
emacs user
파이썬 뿐만이
파이썬 뿐만이 아니라 다른 모든 언어에서 쓰레드들은 같은 메모리 영역을 공유합니다.
TLS
그러나, TLS(Thread Local Storage)를 사용하면 각 쓰레드 별로 메모리를 할당할 수 있습니다.
http://en.wikipedia.org/wiki/Thread-local_storage
--------------
save the earth
생산적인 댓글을 달자
...
뭔가 두 분이 서로 약간 다른 얘기를 하시는 것 같아서 노파심에 교통정리하자면,
각 쓰레드 별로 메모리 할당을 위해서 서로 다른 영역을 사용할 수 있습니다.
그러나 모든 쓰레드는 한 프로세스에 속하므로 같은 메모리 맵을 공유합니다. 즉 A 쓰레드에서 접근할 수 있는 변수는 B 쓰레드에서도 접근할 수 있습니다.
심지어 TLS의 경우도 일반적으로는 다른 쓰레드의 TLS에 접근할 수 있습니다. 물론 주소를 알아야 되겠죠. (즉 A 쓰레드에서 생성한 TLS 변수의 주소를 B 쓰레드에 넘겨주면 B 쓰레드가 이 변수를 사용할 수 있습니다.)
정말로 접근을 할 거냐 말거냐, 어떻게 교통정리를 할 거냐는 서로 신사적으로(??) 협의하여 결정합니다. (즉 프로그래머 맘대로, 지금 같은 경우 Python 인터프리터를 짜는 사람이 알아서 결정했겠죠.)
TLS도 어드레스
TLS도 어드레스 영역은 공유하고 base offset만 다르게 엑세스 해요. 아니면 컨택스트 스위칭을 포함한 비용들이 비싸져요.
제가 괜히 TLS 얘기를
제가 괜히 TLS 얘기를 꺼내서 혼란을 가져왔나요? ㅎㅎ
물론 TLS를 쓰더라도 동일한 프로세스인 이상 메모리 영역을 공유한다는 점에 대해서는 의심의 여지가 없습니다.
단지 글쓴이께서 마주친 현상의 원인이 TLS 일수도 있지 않을까 해서 드린 말씀입니다.
--------------
save the earth
생산적인 댓글을 달자
답변 감사합니다.
제가 약간 헷갈렸던것 같네요. 이제 좀 정리가 되는듯한 ㅎ
다들 답변 감사드립니다.
댓글 달기