[완료]파이썬의 메모리 영역(heap)에 대해서

uddum의 이미지

파이썬으로 멀티쓰레딩을 쓸일이 있어서 프로그램을 만들다가 문득 이런 생각이 들었습니다.

"파이썬에는 동적할당이라는것이 없는데 그러면 파이썬이 메모리에 올라갈때 메모리 영역중 heap영역은 낭비되는걸까?
아니면 어차피 인터프리터이고 변수를 선언할때 메모리가 할당되니까 전부다 동적할당이라고 생각하면 stack영역은 낭비되는걸까?"

그래서 찾아봤습니다.
http://mearie.org/journal/2008/02/inside-python-quiz 이 글의 6번에 보면 전부다 heap영역에 모든 객체를 올린다고 되어있군요.
그렇다면 stack을 제외한 모든 영역을 쓰레드들이 공유하니까 파이썬에서의 쓰레드들은 모두 같은 메모리영역을 가지는게 되는데 뭔가 이상하지 않나요? 직접 해보면 분명히 독립적인 메모리 영역을 가지고 있는거 같은데..

이래저래 검색을 해봤지만 검색의 고수가 아닌지라.. 명확한 답을 찾기가 힘드네요. 저의 궁금증을 풀어주실 답변을 기다리겠습니다.

ptmono의 이미지

"python memory manager"라는 것을 열어보시면 될듯.

http://docs.python.org/c-api/memory.html# 에 보면 다음과 같은 말이 있군요.

Quote:

It is important to understand that the management of the Python heap is performed by the interpreter itself and that the user has no control over it, even if she regularly manipulates object pointers to memory blocks inside that heap. The allocation of heap space for Python objects and other internal buffers is performed on demand by the Python memory manager through the Python/C API functions listed in this document.

ps. 자세히는 몰라요. 그저 참고하시라고...
------------------------------------------
emacs user

------------------------------------------
emacs user

guybrush1의 이미지

파이썬 뿐만이 아니라 다른 모든 언어에서 쓰레드들은 같은 메모리 영역을 공유합니다.

sohn9086의 이미지

그러나, TLS(Thread Local Storage)를 사용하면 각 쓰레드 별로 메모리를 할당할 수 있습니다.

http://en.wikipedia.org/wiki/Thread-local_storage

--------------
save the earth

생산적인 댓글을 달자

jick의 이미지

뭔가 두 분이 서로 약간 다른 얘기를 하시는 것 같아서 노파심에 교통정리하자면,

각 쓰레드 별로 메모리 할당을 위해서 서로 다른 영역을 사용할 수 있습니다.
그러나 모든 쓰레드는 한 프로세스에 속하므로 같은 메모리 맵을 공유합니다. 즉 A 쓰레드에서 접근할 수 있는 변수는 B 쓰레드에서도 접근할 수 있습니다.

심지어 TLS의 경우도 일반적으로는 다른 쓰레드의 TLS에 접근할 수 있습니다. 물론 주소를 알아야 되겠죠. (즉 A 쓰레드에서 생성한 TLS 변수의 주소를 B 쓰레드에 넘겨주면 B 쓰레드가 이 변수를 사용할 수 있습니다.)

정말로 접근을 할 거냐 말거냐, 어떻게 교통정리를 할 거냐는 서로 신사적으로(??) 협의하여 결정합니다. (즉 프로그래머 맘대로, 지금 같은 경우 Python 인터프리터를 짜는 사람이 알아서 결정했겠죠.)

tj의 이미지

TLS도 어드레스 영역은 공유하고 base offset만 다르게 엑세스 해요. 아니면 컨택스트 스위칭을 포함한 비용들이 비싸져요.

sohn9086의 이미지

제가 괜히 TLS 얘기를 꺼내서 혼란을 가져왔나요? ㅎㅎ
물론 TLS를 쓰더라도 동일한 프로세스인 이상 메모리 영역을 공유한다는 점에 대해서는 의심의 여지가 없습니다.
단지 글쓴이께서 마주친 현상의 원인이 TLS 일수도 있지 않을까 해서 드린 말씀입니다.

--------------
save the earth

생산적인 댓글을 달자

uddum의 이미지

제가 약간 헷갈렸던것 같네요. 이제 좀 정리가 되는듯한 ㅎ
다들 답변 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.