semaphore_v에 대한 두가지 질문 그리고 의견 여쭙기^^
semaphore_v를 사용할때
semget으로 key를 사용하잖아요?
이건, 전 시스템이 다 인식할 수 있는 키 값이지 않습니까?
즉, 어디서 실행된 어떤 프로세스라도 그 키에 접근을 시도해볼 수 있다는?
그런 얘기인가요?
그렇다면.. A라는 키를 사용하려고 할때
그 키를 혹시라도 예상치 못한 다른 프로세스가 사용한다면..
또는 돌리고 있는 여러 프로세스가
(제가 만든 프로세스가 아닌..여러가지 프로그램이라던가..)
그런 경우 두 프로세스가 충돌이 일어날 수 있잖아요?
그럼 제가 짠 프로그램을 다른 사람이 함부로..
함부로라는 표현은 그렇군요;; 여튼;;
제가 A라는 세마포어값을 이용해 프로그램을 만들었는데
다른사람이 또 A라는 세마포어값을 이용해 프로그램을 만들어서
제 3자가 두가지 프로그램을 사용한다면..
문제가 있을거 같은데
이런 문제는 어떻게 해결이 되는지요?
그리고 세마포어에서
P 함수 즉 사용을 요청하는 함수는..
블럭킹 함수로 알고 있는데
넌블럭킹으로 사용하는 방법이 있나요?
즉, P(A) 해서 A라는 값에 대한 사용을 요청하면..
A가 풀릴때까지, 즉 다른 A를 사용하던 프로세스가 A를 반환할때까지
(A값을 양수로 올릴때까지)
기다리는 것으로 알고 있습니다.
이때 넌블럭킹으로 !사용 불가! 라는 리턴을 받을 수 있는지요?
그리고 마지막 의견은 제가 만들려고 하는건데요
P1이라는 프로그램이 있고
P2라는 프로그램이 있습니다.
P1은 오직 하나만 실행되야 하는 데몬 프로그램이고
P2는 P1을 사용하는 프로그램인데..
여러개의 P2가 P1에 접속 할 수 있습니다.
P2는 P1이 실행중인지 아닌지를 알아보고
P1을 실행시킨 뒤에 접속해야 하는데
여러개의 P2가 동시에 P1을 실행할 수 있기 때문에 문제가 생길 수 있다는
거죠..
여러가지 방법을 생각해봤는데
P1이 실행할때 semaphore를 하나 잡아버리는겁니다.
그리고 혹시나 semaphore가 있다면(여러 P1이 실행되면)
그냥 종료하는거죠
(이 때 넌블럭킹이 필요하다고 생각하거든요..)
아니면..
P2가 P1을 실행할때
세마포어를 잡고 크리티컬 섹션에서 P1이 실행중인지를
다시 검사한 뒤에 P1을실행하는겁니다.
그럼 여러 P1을 실행할 위험이 없다고 생각하는데..
어떤 방법이 좋을까요?
좀.. 질문이 난잡하군요 :oops:
간단히..
1. 충분히 겹칠 가능성이 있습니다. 그러나 확률이 좀 작습니다. 염려가 되신다면 프로그램에서 기본값을 설정해 놓으시고 환경파일, 환경변수, 프로그램 옵션 등으로 변경가능하게 하시면 됩니다. (진짜로 이렇게 합니다.. -_-)
2. 당연히 있습니다. rtfm 해 보세요~
3. 가능합니다. 이런 경우 보통 문제는 grace하게 죽지 못할 때 발생합니다. 떠있는지 세마포를 보거나 lock 파일을 봤을 때는 있는데, 정작 해당 프로세스가 SIGSEGV 등을 맞아서 원 상태로 못 돌려놓고 죽는 경우, 서비스 재시작이 안되죠.
SysV쪽 세마포는 grace 하게 죽지 못하는 경우에도 undo를 할 수 있도록 설정할 수 있습니다. (Posix 쪽은 살펴보지 못했습니다.) 그리고 일반적으로는 lock 파일을 사용해서 위와 같은 일들을 많이 수행합니다. lock 파일에 pid를 적어놓아서 grace하게 죽지 못하는 경우 다른 녀석들이 lock 파일 확인한 후에 process가 실제 있나 확인합니다.
클라이언트가 서버를 다시 띄우는 것은 일반적인 그림은 아닌 듯 하고, supervisor 같은 서버를 감시하는 녀석을 따로 두어서 그 녀석이 서버를 띄워주거나, 서버 자체에 SIG_CHLD 를 잡아서 다시 띄우는 로직을 구현하거나, 이런 걸 기존에 있는 기능을 사용하여 inetd, inittab 에 올려서 사용하기도 합니다.
조금 더 오버하면, 죽었다고 계속 뜰 수 없는 경우도 생길 수 있습니다.
외부 상황이 해결이 안되면 다시 떴다가 곧바로 죽고, 다시 떴다가 곧바로 죽으면서 서비스는 안되면서 시스템자원만 잡아먹는 상황이 발생할 수 있습니다.
이런 경우에는 뜨는 횟수, 또는 죽는 간격, 또는 정해진 시간간격에 최대로 뜰 수 있는 횟수 등등의 조건을 주어서 다시 뜨는 것들을 막아 주는 것이 필요할 수 있습니다.
이런 상황은 프로그램 자체에서는 어떻게 할 수 없고(할 수 있었으면 이런 문제가 안생기죠.. -_-), 외부의 관제시스템을 둔다든지, 다른 쪽에 메일이나 문자메시지를 날린다든지 하는 식으로 되고요.
댓글 달기