system함수가 thread-safe한가요??
글쓴이: hatbary / 작성시간: 수, 2004/01/07 - 11:21오후
안녕하세요..
스레드 풀을 만들어 놓고, 각각의 클라이언트들에게 서비스를 제공하는 서버를 만들고 있는데요.
서버는 클라이언트로부터 파일도 전송을 받는데, 이게 압축된 파일이라서 압축된 파일중 특정파일만 골라서 다른 파일과 압축하여 다시 전송해줘야 할 필요가 있거든요..
그래서 zip알고리즘을 구현해서 쓰려구 했는데, 그냥 system함수 써서, 직접 zip명령어를 호출하려구 합니다..(원래 system쓰는거 안조아하지만 실력이 딸려서..ㅠㅠ)
근데, 제가 알기로는 system함수가 fork->exec->sh...머..이런식으로 동작한다고 알고 있는데, 만약 스레드 내에서 이 system함수를 호출한다면 문제가 될 소지가 있지 않을까 라는 생각이 들어서 질문 올립니다..
어떤 용어를 써야 할지 좀 난감해서 그냥 system함수가 thread-safe한가라구 물어본거거든요..
이에 대한 답변을 부탁드립니다..
그럼 답변에 미리 감사 드리면서...
Forums:
11
동작하고 있는 스레드가 열개라고 치고..
fork()를 하면..문제가 발생합니다.
즉, 현재 프로세스에서 10개의 스레드들은 각각 저마다의
메모리를 차지하고 있습니다.
그리고 10개의 스레드중 한 스레드가 fork()를 호출하게 되면요
10개의 스레드를 가지고 있는 부모 프로세스와 동일한 개수의
스레드가 있는 자식 프로세스가 생성됩니다.
그러면 자식 스레드가 10개 동작하는가 하면, 모두 죽은 상태의
스레드입니다. 동작하지도 않는 스레드들이 메모리만 차지하고 있습니다.
(또 락객체 같은 것 땜에 문제가 발생할 수도 있습니다.)
자식 프로세스에서 동작하는 스레드는 부모프로세스에서
fork()를 호출한 스레드뿐입니다.
그리고 이들의 메모리는 2가지 경우에만
자동소멸될수 있고.어떤 함수호출같은걸로 해제할수 없습니다.
자동소멸되는 첫번째 경우는
프로세스가 종료할때 자동소멸됩니다.
두번째 경우는 exec()계열의 함수를 호출할때입니다.
exec()하면 프로세스의 메모리이미지가 모두 사라지고, 새로운 프로그램의
이미지로 바뀌니깐요. 그러니 이땐 죽은 스레드가 차지하는 메모리가
해제됩니다.
system()은 fork()한담에, exec()하는 것이니깐 문제가 안될것 같은
생각이 듭니다.
직접 코딩은 못해보고 이론적인 것입니다만. 될것 같네요
님이 해보시고 답글좀 올려주세요 ^^
문제 없습니다.fork 하면, 현재 thread를 제외한 모든 thr
문제 없습니다.
fork 하면, 현재 thread를 제외한 모든 thread는 닫혀지게 되며,
thread unsafe한 데이터를 내부에 가지고 있지 않으니.. 그다지 문제 없어 보입니다.
signal을 masking 해두었다면 문제가 있을지도 모르겠습니다만, 아래 코드를 보니 __sigprocmask를 사용하여 masking을 잠시 푸는 군요.
glibc-2.2.2/sysdeps/posix/system.c
---
http://coolengineer.com
여러분들의 의견을 듣고 간단하게 코딩했더니 별 문제 없어보이는군요..
여러분들의 의견을 듣고 간단하게 코딩했더니 별 문제 없어보이는군요..
아래는 그냥 후다닥 만든 코드와 결과 입니다.
그런데..잠깐 또 의심가는게 바로 위에 분께서 현재 스레드를 제외한 다른 스레드가 닫힌다구 하셨는데, 스레드 풀을 만들어놓구 pthread_cont_wait()명령을 써서 스레드를 깨우는 방식이면 만들어놓은 스레드가 죽는건가요? 제가 님의 설명을 잘 이해 못하겠네요..지송^^a
암튼 여러분들의 도움을 받으니 그저 고마울 따름임다..^^
아.. 오해가 있을 것 같군요.fork 하고 나면, 자식 프로세스
아.. 오해가 있을 것 같군요.
fork 하고 나면, 자식 프로세스에서는 다른 쓰레드는 모두 닫히고 하나만 남는다는 것이었습니다.
---
http://coolengineer.com
아하~~그렇군요..답변 감사드립니다..^^
아하~~그렇군요..답변 감사드립니다..^^
댓글 달기