세마포어 관련...

alkaize의 이미지

다수의 프로세스가 하나의 메모리를 공유하고 있습니다.
한번에 하나만 접근 가능하게 하기 위해 세마포어를 만들고
최초에 한 프로세스가 open을 하면서 나머지 프로세스들이 다 semtim 상태(ps에서 이렇게 나오던데 정확히 어떤 뜻인지?)wait되었습니다. 그런데 첫번째 프로세스가 할일을 다 끝내고 세마포어를 close 하면 다른 하나의 프로세스만 깨어나야 하는것이 아닌가요? 잠들었던 모든 프로세스가 다 일어나서 제각기 자기 일들을 합니다.

정리하자면
1다수의 프로세스가 하나의 자원을 사용하게끔 하고 싶은데 방법은?
2세마포어를 여러개(같은 키값으로 크기를 늘렸을때) 어떤 형태로 카운트 되는지?
질문이 좀 이상하네요.. 세마포어 크기 1짜리를 n개 만드는것이랑 크기가 n인것을 하나 만들었을때의 상태가 어떻게 되는지 머릿속에 안그려지네요.

irondog의 이미지

세마포어는 공유 자원에 접근 할 수 있는 프로세스의 갯수를 제한합니다. 한번에 하나씩만 접근하도록 하려면 접근 할 때 할당된 모든 세마포어를 써서 다른 프로세스가 쓸 수 있는 세마포어가 없도록하면 됩니다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/IPC/semaphores

링크에 있는 설명과 샘플을 보시면 이해가 가실 겁니다. semop()로 접근 할 때 open, close를 하게 되는데 각 구조체에 -1과 1 값을 이용해서 세마포어 수를 줄이거나 늘리는 것을 보실 수 있습니다. 이점을 유념해서 보시면 됩니다.

M.W.Park의 이미지

의도하신 바는 mutex로 하셔야 될것같은 느낌이 듭니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

rhheo의 이미지

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했는데 모든 프로세스가 풀려났다... ++;

alkaize의 이미지

..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.