세마포어 관련...
글쓴이: alkaize / 작성시간: 화, 2008/05/20 - 12:45오후
다수의 프로세스가 하나의 메모리를 공유하고 있습니다.
한번에 하나만 접근 가능하게 하기 위해 세마포어를 만들고
최초에 한 프로세스가 open을 하면서 나머지 프로세스들이 다 semtim 상태(ps에서 이렇게 나오던데 정확히 어떤 뜻인지?)wait되었습니다. 그런데 첫번째 프로세스가 할일을 다 끝내고 세마포어를 close 하면 다른 하나의 프로세스만 깨어나야 하는것이 아닌가요? 잠들었던 모든 프로세스가 다 일어나서 제각기 자기 일들을 합니다.
정리하자면
1다수의 프로세스가 하나의 자원을 사용하게끔 하고 싶은데 방법은?
2세마포어를 여러개(같은 키값으로 크기를 늘렸을때) 어떤 형태로 카운트 되는지?
질문이 좀 이상하네요.. 세마포어 크기 1짜리를 n개 만드는것이랑 크기가 n인것을 하나 만들었을때의 상태가 어떻게 되는지 머릿속에 안그려지네요.
Forums:
세마포어는 공유
세마포어는 공유 자원에 접근 할 수 있는 프로세스의 갯수를 제한합니다. 한번에 하나씩만 접근하도록 하려면 접근 할 때 할당된 모든 세마포어를 써서 다른 프로세스가 쓸 수 있는 세마포어가 없도록하면 됩니다.
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/IPC/semaphores
링크에 있는 설명과 샘플을 보시면 이해가 가실 겁니다. semop()로 접근 할 때 open, close를 하게 되는데 각 구조체에 -1과 1 값을 이용해서 세마포어 수를 줄이거나 늘리는 것을 보실 수 있습니다. 이점을 유념해서 보시면 됩니다.

의도하신 바는 mutex로
의도하신 바는 mutex로 하셔야 될것같은 느낌이 듭니다.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
wchan에 대해서
ps 결과에 wchan이라는 컬럼은
waiting channel이라고 합니다.
구체적으로 프로세스가 슬리핑하고 있는 커널함수명이라고 하네요.
즉.. 이 커널 함수를 실행하다가 wait상태가 된 거라고 보면 되겠네요.
/proc/kallsyms에서 semtim으로 grep걸어 보시면 풀네임이 나올 거 같네요.
다른 예로... 자식 프로세스의 종료를 기다리고 있다면 wchan은 wait일 겁니다
(wait커널함수에서 걸려있을 겁니다.)
단 하나의 쓰레드만 실행하게 만드신다면 mutex추천입니다.
참고로 세마포어에서 카운터를 1로 정의하시면 mutex용도로 사용가능합니다.
간단하게 fcntl를 사용해서도 mutex용도로 사용가능하구요.
세마포어는 쓰레드들(또는 프로세스들)간에... 미세하게 실행 순서를 조절할 때 활용됩니다.
활용예1>쓰레드1이 여기까지 실행하고 쓰레드2가 저기까지 실행하고...
활용예2>쓰레드1 어느지점까지 실행하고 멈추고 , 쓰레드2,쓰레드3 동시 실행한 담에
다시 쓰레드1 시작...
하나만 실행되고 나머지는 기다리게 하는 것에도 쓸 수 있지만..
이 경우에는 fcntl를 사용하는 편이 간단할 듯 하네요.
그리고 표현중에 open과 close가 무엇을 의미하는지 잘 모르겠네요.
close했는데 모든 프로세스가 풀려났다... ++;
답변 감사드립니다. 제 소스에 문제가 있었네요.. ^^
..
댓글 달기