최소한의 sleep 주는 방법에 대한 문의 ??????

air74의 이미지

안녕하세요.

최소한의 작은 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 을 주는 방법은 ????

그럼 여러 고수님들의 조언 부탁 드립니다.

byul의 이미지

sleep(0)을 하면 되지 않을까요? ^^?

girneter의 이미지

그럴 때는 sleep 을 쓰는게 아니라
세마포어를 사용하는 겁니다

세마포어 쓰는 법에 대해서는 다른 분이~

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

mithrandir의 이미지

usleep(3) 도 있지요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

pynoos의 이미지

sleep(0) 은 많은 구현에서 schedule 을 다른 process 쪽으로 넘기는 용도로 사용됩니다.

linux라면, 그 대신 sched_yield 를 사용하는 것이 좋습니다만, 위의 예에서는 checkqueue가 어떤 event를 대기하는 상태로 빠지고 enqueue에서 event를 발생시키는 것으로 하는 것이 좋습니다. linux 를 사용하신다면, pthread_cond_init 를 이용하여 condition variable을 만들어 사용하면 됩니다.

philnet의 이미지

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 이 해소됨.)

도움이 되었기를...

IsExist의 이미지

전 주로 select 을 씁니다.

timeout은 보통 1/10 초로 주고요.

struct timeval timeout;
...

while (1) {
   ...
   timeout.tv_sec = 0;
   timeout.tv_usec = 100000;
   select (NULL, NULL, NULL, &timeout);
   ...
}

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

kihlle의 이미지

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

댓글 달기

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