정말 황당한 스터디...

sunyzero의 이미지

동생이 몇몇 사람들과 운영체제에 대해서 스터디를 한다고 말했는데 얼마전 mutual exclusion 에 대해서 물어봐서 이것저것 갈켜주고나서 관계있는 다음 부분에 semaphore여서 실제 코드를 짜주고 설명을 해주었습니다.

그리고 나서 동생이 스터디 하는 사람들에게 이것을 설명해주었는데 평소에 잘난체를 많이 하는사람이 갑자기 딴지를 걸고 나왔다고 합니다(이 사람은 비전공자라고 하더군요)

내동생: 이러저러 .... 세마포어는 쓴데...
딴지A : 흠... 요샌 세마포어 잘 안써. 그건 옛날 기술이야
내동생: ?? 그런가? 그럼 뭐쓰는데?
딴지A : (의기양양해하면서) 요샌 쓰레드 쓰지 세마포는 한물간 기술이야.
내동생: (이상하게 생각하면서) 그...그런가?

돌아와서 동생은 나에게 묻는다.

내동생: 오빠~ 세마포어랑 쓰레드가 왜 같은 기술이야? 아무리 생각해도 난 이해가 안되거든.
나 : 세마포어는 쓰레드에서 동기화할때도 사용하긴하지... 왜?
내동생: 주절주절... (아까의 사건에 대해서 설명을 한다.)
나 : (어이가 없어서... 웃고 만다) 하~하~하~

참 재밌지 않나요? 선무당이 사람잡는다고... 쓰레드에서 뮤텍스 쓰는게 세마포어보다 빠르다는 것을 어디서 보고는 세마포어대신 쓰레드를 쓴다고 우기는거 같긴한데... 어쨌든 당황스러운 하루였답니다.

서지훈의 이미지

뭐... 자기 생각이야 자유이지만...
남에게 말을 하고 표현을 할 땐...
한번 쯤 더 생각을 하고서 할 필요가 있지 않을까요?
그사람...^^
프로그래밍 기법에 여러가지가 있는데...-_-ㅋ
딱 이러이러하다고 못을 박는건 좀 나쁜 습관이 아닌가 생각이 드네요.
저도 가끔 답변을 해줄 때...
맞는 말인지 틀린 말인지 항상 두번 세번 확인을 하는데...

근데... 뭐... 꼭 어디가나...
지 잘난 맛에 사는 놈은 있기 마련이니깐요...
그냥 그사람은 지대로 살라고...

사람에게 한 번 충고해서 받아들여지면 정말 훌륭한 사람이고....
두번 얘기해서 받아들여지면 보통 사람이고...
세번 충고해서 받아들여지면 어리석은 사람이고...
세번 이상의 충고는 아주 무의미 합니다.
괜히 했다가 미움만 받고, 나쁜 인상만 주게 되니깐...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

girneter의 이미지

세마포어 안 쓰고 쓰레드 쓴다는 말에
저도 웃었습니다.

알지도 못하면서 나서는거...
저도 종종 하지요. :oops:

근데 갑자기 궁금해 지는데
세마포어와 뮤텍스의 차이는 무얼까요?
상태가 0과 1 뿐인 바이너리 세마포어를 뮤텍스라고 부르는걸까요?

그리고 IPC 냐 thread 간 통신이냐는
세마포어와 뮤텍스의 의미에 전혀 상관없는거겠죠?
왜 그러냐면
pthread_mutex 는 thread 간 통신에서 밖에 못 쓰잖아요.
IPC 를 하려면 어쩔 수 없이 SysV IPC 에서 제공하는 세마포어를
사용해야 하는 듯 싶은데.

thread 간 통신에서 pthread_mutex 가 SysV IPC 보다 빠른건
library 라 system call 을 덜 쓰기 때문일까요?

내가 봐도 횡설수설이네....

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

sunyzero의 이미지

pthread의 mutex 기법은 라이브러리에서 제공하는 유저영역이므로 굳이 SysV형식의 IPC처럼 시스템을 거치지 않기때문에 그만큼 빠른것으로 알고 있습니다. 단순하게 생각하면 그 차이가 컨텍스트스위칭에서 더 빠른게 아닐까 생각됩니다.

그리고 어차피 m:n (m개의 프로세스에서 n개의 쓰레드를 관리하는 모델) 형식의 모델로 갈려면 둘다 안쓰고는 못배기겠죠? 둘중 누가 좋다 나쁘다 하는 것은 굳이 고집할 필요가 없을거 같습니다. 프로그래머가 가장 빠지기 쉬운 오류가 이런 아집을 발생할 수 있다고 하더군요. 그런 면에서 아집에 안빠지게 노력하는게 더 힘든것 같습니다.

PS) 요샌 SysV 세마포어 외에도 POSIX semaphore도 종종 쓰는 사람이 많더군요.

========================================
* The truth will set you free.

girneter의 이미지

POSIX semaphore 란 뭔가요?
역시 IPC 에 사용할 수 있나요?

웹 상에 참고할 만한 문서 없을까요?

구글님한테 물어봐도 답변을 잘 못찾겠네요...

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

서지훈의 이미지

역시 UNIX IPC / NETWORK / ENVIRONTMENT 는 Stevens 씨 책이 가장 좋아요...
정말 이 안엔 다 들어 있으니...
POSIX SEM 에 관심이 있으시면 UNP Vol.2를 보세요...

참고로 POSIX는 세마포어는 세마포어 인데...
POSIX형식에 맞춘겁니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

crimsoncream의 이미지

posix semaphore는 원래는 process간에도 동작하도록 돼 있는것 같은데 linux는 이 feature를 지원하지 않으므로 linux에서는 ipc semaphore 대신으로 쓰기는 힘듭니다.

man sem_init

같은 조건에서 posix semaphore와 mutex가 속도차이가 있다면 아마도 async-signal safe 문제도 관련이 있지 싶습니다.
이것도 위에 man 페이지 보시면 아래쪽에 별도 항목을 가지고 설명돼 있습니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

girneter의 이미지

역시...

POSIX semaphore 는
linux 에서는 IPC 에 사용할 수가 없군요.

IPC 에서 쓰려면 커널이 지원해야 할 텐데
2.6에서는 지원하려나?

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

unipro의 이미지

Quote:

근데 갑자기 궁금해 지는데
세마포어와 뮤텍스의 차이는 무얼까요?

구현의 방법이 아니라 의미상의 개념을 대충 보자면, semaphore는 공통의 스위치를 두고 그것을 체크함으로써 서로 동기화하는 것이고 mutex는 해당 코드 부분을 독점권을 획득함으로써 동기화하는 것으로 알고 있습니다.

마치 semaphore는 공통의 카드에 사용기록을 체크하고 것과 같은 스위치같은 의미이고, mutex는 사용허가 키를 가져가서 독점하여 사용하고 반환하는 의미인 것입니다.

semaphore로 구현한 것은 mutex로 구현 가능하고 그 반대도 마찮가지입니다. 다만, 사용상의 편의성이 여러개가 동시에 제어권을 가질 경우 semaphore가 편리하고 특정 코드를 잠그로 푸는 경우는 mutex가 사용하기 쉽습니다.(구현상의 편의성이지 성능상에서의 잇점을 모르겠군요.)

내 블로그: http://unipro.tistory.com

송지석의 이미지

음. 그런데요,

결국 세미포어도 뮤텍스로 구현하는 것은 아닌가요?

예전에 uCOS2 소스 보다보니 뮤텍스를 이용해서 세마포어를 만드는 것 같던데..

리눅스 소스를 자세히 살펴보진 않아서 잘 모르겠지만.. 결국 세마포어도 뮤텍스로 변수 하나를 로킹해서 더하고 빼는 게 아닌가 해서 말이죠.

고도리의 이미지

무슨 robbins라는 사람 두명이 지은 Practical UNIX Programming이란
책을 보면 8장이 semaphore이고, 9, 10장이 thread입니다.

거기를 보면 개념의 차이점을 잘 나와 있습니다.

그리고, semaphore를 thread간에는 쓰지 말 것이라는 충고가 나와있습니다.

거기 예제중에 하나가 있는데 semaphore를 쓰는것인데 돌릴때마다 틀린
결과를 내보내 주더군요...그거 이해하다가 대가리 뽀개지는 줄 알았습니다.

그걸 보여주고 절대 thread간 통신에서는 system V semaphore 쓰지 말 것
이란 표현을 했더군요...기억이 가물가물...

하여간 그 책 함 봐보세요....그럼...

서명.....음, 서명이라...

아싸!!! Three Go!