malloc 은 thread safe 한가요 ?

kicom95의 이미지

현재 개발중인 프로그램을 초기에는 쓰레드 없이 했는데...

malloc 과 free 를 좀 많이 사용했거든요....

이 프로그램을 이제 thread 기반으로 개발을 했는데....

malloc 에서 NULL 을 리턴하네요 ( malloc 과 free 를 여러번 수행후에 )

결국 그냥 메모리 풀을 써서 개발을 하려고 합니다...

그런데 그냥 궁금해집니다 thread 환경에서 malloc 은 쓰레드에 안전하지 않은가요 ?

여러 회원님들의 이야기를 듣고 싶습니다.

참고로 :: http://gcc.gnu.org/ml/gcc-help/2000-09/msg00078.html

ssehoony의 이미지

넵.
안전합니다.
리눅스의 man 페이지에서 쓰레드 경고가 별도로 없으면, MT-Safe 라고 생각하셔도 됩니다.

이런 자료도 재미있으셔 할 것 같군요.
A Comparison of Memory Allocators in Multiprocessors [ http://developers.sun.com/solaris/articles/multiproc/multiproc.html ]

ohhara의 이미지

manual에 특별한 언급이 없다면 thread safe하지 않다고 봐야 됩니다. 하지만 manual이 부실해서 잘 설명이 안 되어 있는 경우도 많이 있어서 좀 고생이죠. ^^;
linux는 man page에 설명이 없지만 internet뒤져보니 thread safe하다고 합니다. 하지만 다른 os에서도 그렇다는 보장은 없습니다.

Taeho Oh ( ohhara@postech.edu, ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
PLUS ( Postech Laboratory for Unix Security ) http://www.plus.or.kr

Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com

ssehoony의 이미지

솔라리스의 man page 경우는 MT-Safe 나 Async. Signal-Safe 등에 관한 여부가 항상 표기 되어 있지만, 리눅스의 경우는 앞서 말씀드린 경우 처럼 특별한 언급이 없으면 MT-Safe & Async. Signal Safe로 알고 있습니다.
그동안 경험상으로 봤을 때도, 꽤 믿을 만한 정보입니다. ^^
혹시 아닌 경우가 있다면, 알려주십시요.

ohhara의 이미지

Async Signal Safe하지는 않다고 어디선가 본 듯 해서 한번 찾아봤는데 다음과 같은 글이 있군요.

http://groups.google.com/group/comp.os.linux.development.apps/browse_thread/thread/f220e86245c200e6/956a4908ec328bec?lnk=st&rnum=1&hl=ko#956a4908ec328bec

그다지 오래된 글이 아닌 것으로 미루어 봐서 Linux의 malloc이 Async Signal Safe하다고 말하기는 힘들 듯 합니다.
일단 linux의 malloc은 MT-Safe하지만 Reentrant하지는 않으며 Async Signal Safe하지는 않다고 생각하는 것이 좋을 듯 합니다.

Taeho Oh ( ohhara@postech.edu, ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
PLUS ( Postech Laboratory for Unix Security ) http://www.plus.or.kr

Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com

ssehoony의 이미지

그렇군요. malloc 를 그동안 async signal safe 라고 생각했었는데, 아니였군요.
signal handler 에서 malloc를 사용한적이 없어서 당황스러운 경험을 한적은 없었지만, 언젠가 한번 크게 당할뻔 했군요 ^^

man signal 에 async signal safe 함수 리스트가 있던데, 혹시 MT-Safe 에 대한 함수 리스트도 있나요?

kicom95의 이미지

저는 솔라리스를 지금 쓰고 있습니다만....

이 번 질문의 주제를 thread safe 하고 과연 관련이 있을까 하고 고민도 됩니다.,..

무슨 말이냐 하면 malloc 의 자체 기능적인 오류가 제 프로그램에서는 나타나지 않았거든요

malloc 과 free 를 여러번 ( 수십번 반복 ) 했을경우 싱글 쓰레드에서는 별문제가 없었는데...메모리 할당에...

멀티 쓰레드에서는 ( -DREENTRENT 옵션도 줬습니다 ) 수십번 이 동작을 반복하다 보니...

malloc 에서 NULL 을 리턴해서요.... malloc 을 여러번해서 heap 영역의 단편화가 생긴거 같은데...

이게 쓰레드로 동작할때 또 다른 뭔가를 만들어 낸건 아닌가 이런 생각을 가진거지요....

하여튼 이문제는 메모리풀로 해결했습니다...속도도 확보되고 좋은데....

그냥 그 궁금함이라는것이....

좋은 답변 달아주신 모든 분들에게 이글을 빌려 감사 인사를 드립니다.

가자 해외로 ~ .. 돈 벌러.

superkkt의 이미지

항상 쓰레드안전만 생각하면서 코딩했는데.. async signal safe는 어떤 경우에 발생 할 수 있나요?

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

익명사용자의 이미지

메모리를 할당하는데 어중간하게... 할당하는 도중에 시그널이 발생했다 칩시다..

시그널 핸들러안에서 메모리를 또 할당하게 되면 핸들러로 진입직전 시도했던 어중간한 할당이

망가지는 결과를 초래한다.. 뭐 그말입니다.

cinsk의 이미지

thread-safety는 http://kldp.org/node/64442 참고하세요.
signal safe한 함수 목록은 Single Unix Specification을 참고하세요.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.