malloc 은 thread safe 한가요 ?
글쓴이: kicom95 / 작성시간: 월, 2006/06/12 - 2:07오후
현재 개발중인 프로그램을 초기에는 쓰레드 없이 했는데...
malloc 과 free 를 좀 많이 사용했거든요....
이 프로그램을 이제 thread 기반으로 개발을 했는데....
malloc 에서 NULL 을 리턴하네요 ( malloc 과 free 를 여러번 수행후에 )
결국 그냥 메모리 풀을 써서 개발을 하려고 합니다...
그런데 그냥 궁금해집니다 thread 환경에서 malloc 은 쓰레드에 안전하지 않은가요 ?
여러 회원님들의 이야기를 듣고 싶습니다.
Forums:
안전합니다
넵.
안전합니다.
리눅스의 man 페이지에서 쓰레드 경고가 별도로 없으면, MT-Safe 라고 생각하셔도 됩니다.
이런 자료도 재미있으셔 할 것 같군요.
A Comparison of Memory Allocators in Multiprocessors [ http://developers.sun.com/solaris/articles/multiproc/multiproc.html ]
manual에 특별한
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
솔라리스의 man page
솔라리스의 man page 경우는 MT-Safe 나 Async. Signal-Safe 등에 관한 여부가 항상 표기 되어 있지만, 리눅스의 경우는 앞서 말씀드린 경우 처럼 특별한 언급이 없으면 MT-Safe & Async. Signal Safe로 알고 있습니다.
그동안 경험상으로 봤을 때도, 꽤 믿을 만한 정보입니다. ^^
혹시 아닌 경우가 있다면, 알려주십시요.
Async Signal Safe하지는
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
좋은 정보 감사.
그렇군요. malloc 를 그동안 async signal safe 라고 생각했었는데, 아니였군요.
signal handler 에서 malloc를 사용한적이 없어서 당황스러운 경험을 한적은 없었지만, 언젠가 한번 크게 당할뻔 했군요 ^^
man signal 에 async signal safe 함수 리스트가 있던데, 혹시 MT-Safe 에 대한 함수 리스트도 있나요?
좋은 정보 감사..
저는 솔라리스를 지금 쓰고 있습니다만....
이 번 질문의 주제를 thread safe 하고 과연 관련이 있을까 하고 고민도 됩니다.,..
무슨 말이냐 하면 malloc 의 자체 기능적인 오류가 제 프로그램에서는 나타나지 않았거든요
malloc 과 free 를 여러번 ( 수십번 반복 ) 했을경우 싱글 쓰레드에서는 별문제가 없었는데...메모리 할당에...
멀티 쓰레드에서는 ( -DREENTRENT 옵션도 줬습니다 ) 수십번 이 동작을 반복하다 보니...
malloc 에서 NULL 을 리턴해서요.... malloc 을 여러번해서 heap 영역의 단편화가 생긴거 같은데...
이게 쓰레드로 동작할때 또 다른 뭔가를 만들어 낸건 아닌가 이런 생각을 가진거지요....
하여튼 이문제는 메모리풀로 해결했습니다...속도도 확보되고 좋은데....
그냥 그 궁금함이라는것이....
좋은 답변 달아주신 모든 분들에게 이글을 빌려 감사 인사를 드립니다.
가자 해외로 ~ .. 돈 벌러.
항상 쓰레드안전만
항상 쓰레드안전만 생각하면서 코딩했는데.. async signal safe는 어떤 경우에 발생 할 수 있나요?
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
어싱크시그널세이프
메모리를 할당하는데 어중간하게... 할당하는 도중에 시그널이 발생했다 칩시다..
시그널 핸들러안에서 메모리를 또 할당하게 되면 핸들러로 진입직전 시도했던 어중간한 할당이
망가지는 결과를 초래한다.. 뭐 그말입니다.
thread-safety는
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/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기