프로세스가 crash되었을때 뮤텍스가 자동적으로 해제되나요?
글쓴이: bejoy4him / 작성시간: 수, 2004/06/30 - 5:50오후
몇가지 의문점이 있어 질문을 올립니다.
1. 프로세스가 crash되었을때 뮤텍스가 자동적으로 해제되는지 궁금합니다.
먼저실행된 프로세스가 뮤텍스를 잠그고 실행되다가 버그로 인해 크래시 되었을경우 이를 감시하던 프로세스가 새로운 실행 프로세스를 기동시켰을경우 뮤텍스를 잠그려고 시도하는 경우 입니다.
이때 앞서서 프로세스가 크래시 되었을경우 OS에서 자동적으로 뮤텍스를 해제하는 루틴을 밟게 되는 건가요? 그렇지 않다면, 뮤텍스를 일부러 지우지 않는한 원하는 프로세스는 뮤텍스 lock에 걸려 영원히 블럭이 되어있을것 같은데..
어떻게 되는지 궁금합니다.
2. 두번째 질문입니다. 부모프로세스가 자식 프로세스를 생성하였을경우 자식 프로세스가 죽었을경우 인터럽트 시그널이 부모프로세스에게 전달되는 것으로 알고있습니다. 그런데 만약 생성된 자식 프로세스가 setpgrp(),fork()를 이용하여 데몬으로 살아나면 부모프로세스에게는 인터럽트 시그널이 가지 않는 것 아닌지 궁금합니다.
만약 그렇다면 부모프로세스에게 인터럽트를 날릴수 있는 방법은 전혀 없는것인지도 궁금하네요....
간단한 답변이라도 부탁 드립니다.
수고하세요..~~~
새로운걸 만들려고 하다보니... 평소에 별로 심각하게 생각하지 않던 여러부분에서 막히네요.....
Forums:
흠.. 자문 자답....
에구.. 왜 답글이 올라오지 않지???
생각해보니 첫번째 질문은 얼토당토 않은 질문이더군요...
뮤텍스라는 것은 하나의 프로세스안에서 쓰레드끼리 동기화를 맞추기 위한 것이지 프로세스간에 공유하는 것은 아닌데... 계속적으로 shared memory니 queue같은 IPC에 신경을쓰고 있다보니 뮤텍스를 IPC의 일종이라고 착각을 했던 제 실수였습니다. 에구. IPC가 아니니 프로세스가 종료될때 뮤텍스는 당연히 해제되는 거죠....
두번째 질문은........ 무슨 방법이 없나요??
솔라리스나 Win32의 뮤텍스는 다른 프로세스와 같이 동기화하는데 뮤텍스
솔라리스나 Win32의 뮤텍스는 다른 프로세스와 같이 동기화하는데 뮤텍스를 사용할 수 있다고 알고 있습니다.
UNP V2 7.7절 마지막에 "Process Termination While Holding a Lock" 글에 이부분에 대해서 약간 언급되어 있습니다. 한번 참고해보시구요. 여기 게시판에도 글이 하나 있었던 것 같은데... 쓰레드끼리에서도 비슷한 문제가 있을 수 있다는 내용인 것 같았는데요... (늙으면... 기억력이...)
두번째 질문은 제가 아둔한 탓에 "생성된 자식 프로세스가 setpgrp(),fork()를 이용하여 데몬으로 살아나면" 이라는 것을 잘 이해하지 못하겠습니다. 자세한 설명 부탁드립니다.
아.. 그런것인가요?
윈도에서 뮤텍스를 가지고 프로세스가 중복실행되는것을 방지하는것을보고 나서 유닉스에서도 당연히 되겠지라고 생각을 하다가... 프로세스 간에 동작하는 것이니... 당연히 뮤텍스는 IPC의 일종...이라고 착각을 했었거든요..
그런데, 솔라리스에서도 뮤텍스를 이용하여 프로세스 동기화가 가능하군요... ^^;; 아뭏튼 알려주신 내용을 가지고 찾아 봐야 겠습니다.
그리고 두번째 이야기는....
A프로세스가 데몬으로 동작하고 있을때, 데몬으로 실행되는 프로세스 B를 fork()시켜서 실행시키는 경우를 말하는 것입니다.
그때 B가 죽으면 시그널이 A프로세스로 날아가느냐 하는 것이죠....
프로세스 그룹마져도 다른데 시그널이 날라갈것 같지가 않아서요...
데몬프로세스를 만들때 fork(),setsid()를 이용하여 프로세스 그룹과 tty 세션(맞나?)의 리더로 만들어서 하는경우가 대부분인것 같던데....
기존에 있는 소스는 fork(),setpgrp()를 이용하여 프로세스 그룹의 리더로만 만들어서 데몬으로 작동하도록 되어있습니다. setsid를 사용하지 않아도 실행시킨이후에 터미널을 닫거나 해도 프로세스가 종료되진 않더군요....
setsid와 setpgrp를 사용한것들의 차이점이 어떤게 있는거죠?
^^ 질문이 많아 죄송합니다....
데몬에 부모라는 것이 소용이 있나요? 데몬의 부모는 모두 init 으로
데몬에 부모라는 것이 소용이 있나요? 데몬의 부모는 모두 init 으로 알고 있습니다. 데몬끼리는 서로 상관없는 프로세스라고 생각하고 다른 방법으로 알려줘야 하지 않을까요?
1번에 대해.Win32 에서는(별로 원하는 답변은 아닐지 모르겠지만.
1번에 대해.
Win32 에서는(별로 원하는 답변은 아닐지 모르겠지만.^^; ) Thread가 Mutex를 Lock한 상태에서 죽으면, 해당 Mutext는 Abandoned 됩니다. 그래서, Thread가 죽는 순간 다른 Thread가 Waitforsingleobject하는 중이었다면, WAIT_ABANDONED 를 내뱉으며 빠져나오죠. 하나의 Thread나 Process의 crack으로 인해 다른 Thread나 Process가 피해를 받지 않기 위해서 이렇게 설계 해놓은 것 같습니다.^^
원하시는 답변은 아닐듯 하지만, 참고 하시라고 적어봅니다.^^;;
첫번째 질문은 답이 나온 듯하고..두번째 질문은 질문에 모순이 있
첫번째 질문은 답이 나온 듯하고..
두번째 질문은 질문에 모순이 있는듯 합니다..
세션.. 데몬.. 등의 개념을 좀 더 잡으시는게... :oops:
bugii님 그리고 dyks님..답변 감사합니다.덕분에 많
bugii님 그리고 dyks님..
답변 감사합니다.
덕분에 많은것을 알아가네요......
프로세스와 쓰레드에 대해서 더욱 많은것을 물어보고 싶지만...
업무하시는데 방해가 될것같아... 질문은 이쯤에서 접고, 공부를 해봐야겠네요...
잡담입니다.bug + iii 라는 것이 참 혼동되는가보군요.. 많
잡담입니다.
bug + iii 라는 것이 참 혼동되는가보군요.. 많은 분들이 i 3개가 아니라 2개로 표현하시네요... 아이디가 별로 안좋은 모양입니다.
그리고, 업무에 방해는... KLDP 만으로도 충분히 받고 있으니까요. 너무 괘념치 마세요... 많은 분들이 답변하기 위해서 대기하고 있는 줄이 저기 안보이십니까?
setsid()로 새로운 세션을 열어서 controlling termin
setsid()로 새로운 세션을 열어서 controlling terminal을 가지고 있지 않아야
데몬이 되는 걸로 알고 있었는데... 검색을 해보니 이런 글이 있네요.
지금도 맞는 말인지는 모르겠습니다... ;
http://user.chollian.net/~refreshman/tech_doc/os/Unix_deamon_program.txt
댓글 달기