최소한의 sleep 주는 방법에 대한 문의 ??????
글쓴이: air74 / 작성시간: 목, 2005/01/13 - 9:36오후
안녕하세요.
최소한의 작은 sleep 방법에 대하여 문의 드립니다. 아래의 코드에서 sleep 을 안 주었더니 제대로 동작을 안 하네요. ^^;;;
thread_function(){ msg = recvfrom( .... ); /* socket 에서 메세지 수신 */ enqueue(msg); /* 수신한 메세지를 큐에 넣음 */ } main(){ thread_create( ... thread_function ...); /*thread 생성 */ while (1){ checkqueue(); /* 큐에 메세지가 있는지 확인 */ /* 이부분에 sleep 을 안 주었더니 동작이 이상 합니다. ???*/ /* 그래서 이부분에 줄 수 있는 최소한의 sleep 을 주는 방법이 무엇인지 ?? */ } }
위의 코드의 대략적인 동작은 다음과 같습니다.
1. main() 에서 1 thread 를 생성 하고 이 생성된 thread 는 recvfrom 을 하며 메세지를 recv 하게 되면 큐에다 넣는다.
2. main() 함수에서 while(1) 을 돌면서 큐를 검사 하고 큐에 내용이 있으면 큐를 처리한다.
이런 경우에 줄 수 있는 최소한의 sleep 을 주어도 잘 동작 하겠죠??? 그렇다면 최소한의 sleep 을 주는 방법은 ????
그럼 여러 고수님들의 조언 부탁 드립니다.
Forums:
sleep(0)
sleep(0)을 하면 되지 않을까요? ^^?
세마포어
그럴 때는 sleep 을 쓰는게 아니라
세마포어를 사용하는 겁니다
세마포어 쓰는 법에 대해서는 다른 분이~
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
usleep(3) 도 있지요.
usleep(3) 도 있지요.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
sleep(0) 은 많은 구현에서 schedule 을 다른 process
sleep(0) 은 많은 구현에서 schedule 을 다른 process 쪽으로 넘기는 용도로 사용됩니다.
linux라면, 그 대신 sched_yield 를 사용하는 것이 좋습니다만, 위의 예에서는 checkqueue가 어떤 event를 대기하는 상태로 빠지고 enqueue에서 event를 발생시키는 것으로 하는 것이 좋습니다. linux 를 사용하신다면, pthread_cond_init 를 이용하여 condition variable을 만들어 사용하면 됩니다.
---
http://coolengineer.com
sleep(0) ok, 그렇지만 세마포가 더 나을 듯...
sleep(0) 을 사용하는 것이 가장 손 쉽겠습니다만, nanosleep 함수를 사용해서 좀더 정교한 sleep 을 줄 수 있겠습니다.
하지만, sleep 을 쓴다는 것 자체가 polling 을 하는 것이므로 효율면에서는 떨어지겠지요.
girneter 님께서 말씀하신 대로 이렇게 두 개 이상의 thread 들의 실행상의 동기를 맞출 때 세마포를 쓰면 좋습니다.
말씀하신 예제의 경우,
1. sem_t 타입의 전역 변수 선언
2. main() 함수에서 thread_create 이전에 sem_init() 으로 초기화
3. while() rutine 의 checkqueue() 앞에서 sem_lock() 으로 단계 1 의 변수를 lock (다른 thread 에서 해당 변수가 unlock 될 때까지 block 됨.)
4. thread_function() 의 enqueue() 뒤에 sem_unlock() 으로 단계 1의 변수를 unlock. (-> 이로 인해 단계 3의 block 이 해소됨.)
도움이 되었기를...
전 주로 select 을 씁니다.timeout은 보통 1/10
전 주로 select 을 씁니다.
timeout은 보통 1/10 초로 주고요.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
일단, 그런식으로 하시지마시구여... ㅡ.ㅡ;;
nanosleep는 가장 시해상도가 높고 멀티쓰레딩에서 가장 안전함이 보장되는 sleep입니다. 리눅스가 아니라면, 다른 슬립보다 항상 나노슬립을 사용하시기를 추천합니다. 리눅스에서는 librt subsystem쪽이 불안해서인지 2.4대 이하의 커널에서 불안정합니다. (오해의 소지가 있을까봐 덧붙이면 2.6에선 괜찮다는 얘기가 아니라, 해보질않아서 모르겠습니다 :-( )
사실 이 얘기를 하려는게 아니라 ㅡ.ㅡ;;
nanosleep()이나 sched_yield()가 리눅스에서 제대로 동작하더라도 프로세서 점유율 문제는 피할수없습니다. (while{}안에서 nanosleep으로 쉬어가면서 동작하는 무대뽀 폴링을 말합니다.) 특히 리눅스뿐 아니라 다른 유닉스에 호환가능한 코드로 만드실거라면, top에서 보여주는 cpu점유율을 믿으면 안됩니다. (다른 플랫폼에서는 상당한 cpu점유율을 보일수 있습니다.) 물론 점유율을 낮출정도로 인터벌을 길게줘도 될 정도로 한가한 프로그램이면 상관없겠지요..
이른바 두 쓰레드가 한쪽이 데이타를 주고 다른한쪽이 처리하는 식으로 협력하여 동작하는 Producer-Consumer model에 대해서는 책이나 구글로 검색해보심이 좋을듯 합니다. 일반적인 모범답안은 조건변수를 사용하는것입니다.
최근에 이러한 모델에 대한 질문이 올라와서 답변을 단 적이 있습니다.
http://bbs.kldp.org/viewtopic.php?t=50029
homeless
댓글 달기