세마포어에 관련해서 궁금한게 있어요

neon20의 이미지

세마포어를 두개 사용할 때 구조체 sembuf 를 배열로 2개를 만든다고 알고있습니다. malloc 을 통해서 2*sizeof(struct sembuf) 사이즈 만큼의 공간을 할당하겠죠.

해당 구조체를 다음과 같이 선언 해보겠습니다.

struct sembuf *sops=(struct sembuf*)malloc(2*sizeof(struct sembuf);

그리고 인덱스 0과 1의 배열에 다음과 같이 값을 할당합니다.

sops[0].sem_num = 0;
sops[0].sem_op=0;
sops[0].sem_flg=SEM_UNDO;

sops[1].sem_num = 0;
sops[1].sem_op=1;
sops[1].sem_flg=SEM_UNDO|IPC_NOWAIT;

그리고 이 배열을 semop 함수에서 사용합니다. 다음과 같이요..

semop(semid,sops,2);

제가 궁금한 부분은요
1) semop 함수는 배열에서 주어진 sem_op를 semaphore value에 더해준다고 알고 있습니다. 그런데 위와같이 2개의 작업(즉 0을 더해주거나 1을 더해주게 되는)이 배열로 주어지게 되면 어떤 작업을 수행하게 되나요? 0값이면 1을 더해주고 0값이 아니면 기다리게 되는건가요?

2) 그리고 각 배열에 있는 sem_num은 무엇을 말하는 건가요..ㅜㅜ 아무리 봐도 이해할 수 없습니다. 처음에는 해당되는 배열의 인덱스 값을 가지면 되는것으로 이해했는데....ㅜㅜ
즉 sops[0].sem_num = 0; 그리고 sops[1].sem_num=1;
근데 이건 아닌거 같네요 도대체 sem_num은 어디에 쓰이나요..ㅜㅜ

kdoll의 이미지

System V 세마포어는 세마포어 집합으로 연산이 되며

또한 세마포어자체를 집합으로 가지고 있습니다.

그리고 이놈의 세마포어라는 것이 증가를 할 수 있습니다.
( 간단한 pv세마포어인가요? 이런거랑은 차원이 다르지요.)

세마포어 오퍼레이션을 지정하는 배열이 항상 필요하죠

sembuf구조에 대해서 이야기 하자면

sem_num : 세마포어집합에서의 index를 나타냅니다.
세마포어를 semget으로 얻었을때 얻는 것은 하나짜리 세마포어가 아니라 1개 이상되는 집합 세마포어입니다.
( 이 부분이 System V 세마포어의 특징입니다.
그리고 이 부분때문에 매우 강력한 세마포어가 되어버렸습니다.
않되는 동기화 연산이 극히 드물죠)
즉 이 집합에서의 index가 sem_num에 들어갑니다.
세마포어집합을 생성할때 몇개의 세마포어를 생성하느냐는 semget의 인자로 들어있습니다. man semget

sem_op는 +수 일경우 무조건 증가 - 수일 경우는 해당 수이상 될때까지 대기입니다. 0일때는 0이 될때까지 대기 즉 세마포어 동작을 지정합니다

flag은 특수한 상태처리동작 지정 말그대로 플랙입니다.
- SEM_UNDO : 세마포어를 연산이전으로 원상복귀한다
(프로세스가 세마포어집합을 변경하고 임의대로 죽어버리면 그 세마포어집합을 다르게 변경하고 자 하는 다른 프로세스가 lock이 걸리기 때문입니다)
-IPC_NOWAIT : 락을 하지 않고 바로 리턴한다 리턴값 or errno에 의해 연산 성공적이였는지 구분

님이 작성하신 세마포어 연산 배열을 분석하면

세마포어연산 두개를 지정하신 것입니다.

sops[0] 요놈은 세마포어집합의 0번째 index 세마포어가 0이 될때까지 기다립니다.
즉 (요놈은 SEM_UNDO가 필요없습니다)

sops[1] 요놈은 세마포어집합의 0번째 index 세마포어의 값을 1 증가시킵니다.

재미 있는것은 두개의 연산은 항상 원자적으로 실행됩니다.
둘다 실행이 되거나 않되거나. 입니다.
즉 index0의 세마포어 값이 0이 될때까지 대기하다가 0이
되는순간 1로 교체하고 semop를 빠져나오게 됩니다.

이것은 단순한 동기화를 지원하는 형태의 세마포어 사용법이구요.
나중에 연구를 해보시면 read lock/write lock등의 각종 고난이도 복잡한 락 설계가 가능하다는 것을 아실 수 있을 겁니다.

그리고 세마포어에 대해 가장 잘 설명되어 있는 책은 스티븐슨의 유닉스책이 아닌가 싶습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.