쓰레드 내부 시스템 콜에의한 블록/ 타이머 쓰레드

iamsjkim의 이미지

(질문1)다음과 같이 코딩할 경우 a로부터 패킷입력이 없으면 Rx, Tx 쓰레드 둘다 블로킹되어버리는지 궁금합니다.

process : select() 
          if( FD_ISSET(a,..)) -> Rx , Tx thread creation

Rx thread : recv(a,..)
Tx thread : send(a,..)

(Linux에서 gcc로 컴파일합니다..-.-)

(질문2)
다음과 같은 timer 쓰레드를 생성시키고 싶은데 어떻게 해야할지 난감합니다.
(무지의 소산으로 "programming with POSIX thread"책을 찾아봐도 잘 모르겠습니다..T.T)

timer thread creation >
기능 :  thread 생성부터 t ms가 지나면 time_out_flga = 1로 세팅한다.
alsong의 이미지

1.

Quote:
process : select()
if( FD_ISSET(a,..)) -> Rx , Tx thread creation

Rx thread : recv(a,..)
Tx thread : send(a,..)


thread로 만들었다면 select의 블럭과는 관계가 없을거 같군요.

2.타이머함수는 없는걸로 알고 있고요.
usleep이나 pthread_cond_timedwait나 아님 select를 이용하여 만들 수 있을 거예요.

process의 select와 합쳐서 만든다면

Quote:
process : select()

select의 인자의 마지막에 struct timeval *timeout에 값을 설정하여
별도의 thread없이 사용 할 수 있습니다.
while(1) {
   aa = select();
   if(aa == 타임아웃이면) {
       time_out_flga = 1;
   }
}

세부적인 사용법은 man을 보고 사용하세요.
가장 단순한 형태의 타이머로...
void* timer(void* arg)
{
    while(1) {
    struct timespec abstime;
    aa = pthread_cond_timedwait(&abstime);
     if(aa == 타임아웃이면) 
      time_out_flga = 1;
    }
}
아래내용은 맨페이지(man pthread_cond_timedwait)에 있는 샘플(타이머샘플 아닙니다. ^^;).
Quote:
struct timeval now;
struct timespec timeout;
int retcode;

pthread_mutex_lock(&mut);
gettimeofday(&now);
timeout.tv_sec = now.tv_sec + 5;
timeout.tv_nsec = now.tv_usec * 1000;
retcode = 0;
while (x <= y && retcode != ETIMEDOUT) {
retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
}
if (retcode == ETIMEDOUT) {
/* timeout occurred */
} else {
/* operate on x and y */
}
pthread_mutex_unlock(&mut);

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

iamsjkim의 이미지

제가 첫번째 질문을 약간 잘못해서요.. 다시 질문드리겠습니다.(에궁~T.T)

일단 a로부터 패킷입력이 되어 select가 반응하면
Rx, Tx 쓰레드가 생성되는데 a의 첫번째 패킷을 Rx 쓰레드가 recv()로 받을테고
그 후에 Rx쓰레드가 또 recv(a,..)를 호출한다고 가정하면 a로부터의 패킷이 더이상 들어오지 않을 경우 Rx, Tx 쓰레드 둘다 블록되는지요..?

process : select()
if( FD_ISSET(a,..)) -> Rx , Tx thread creation

Rx thread : recv(a,..) .. recv(a,..)
Tx thread : send(a,..)

alsong의 이미지

RX의경우 블럭모드라면 블럭됩니다.

TX는 블럭 안 됩니다.
(데이터을 보낼때 블럭됩니다. 보낼 데이터가 없으므로 블럭 될 이유가 없습니다.)
TX와 RX는 무관합니다.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

iamsjkim의 이미지

정말 감사드립니다.

제가 block여부에 관해 의문을 갖게 된 이유가, "programming with POSIX thread"라는 책(사실 번역판을 구입했지만..-_-;;)에서, "유저레벨 쓰레드의 경우 한 쓰레드에서, recv(), read()등의 시스템 콜에 의해 블록될 경우 동일한 프로세스의 다른 모든 쓰레드도 모두 블록된다.."고 써있었기때문입니다.
제가 코딩하는 쓰레드가 대체 유저레벨인지 커널레벨인지 이중레벨인지 몰라서요..ㅠ.ㅠ(무지한 죄로..)

그렇다면.. Rx 쓰레드는 패킷이 들어올때까지 블록되고 Tx의 경우 패킷을 전송시 블록되었다가 모두 전송한 뒤엔 Tx쓰레드는 블록상태가 해제되는것으로 이해하면 되겠군요^^(Rx, Tx 쓰레드 들이 서로에게 영향을 주지 않고..)

정말 정말 감사드립니다.
눈앞에 가득 끼었던 안개가 좀 엷어진 기분입니다^^*

alsong의 이미지

음 그 경우는 블럭 될수도 있습니다.
스레드도 여러 종류가 있는걸로 아는데.
하나의 프로세서로 쓰레드를 구성했을때
커널입장에서는 하나의 프로세서로 보기 때문에 블럭이 걸립니다.
그렇게 깊은 뜻으로 말씀하셨군요.
이건 RX/TX의 문제가 아니고 스레드의 방식에 따라서 발생하는 문제입니다.

참고로 Pthread의 경우 커널쓰레드군요.
http://linas.org/linux/threads-faq.html#ThreadsDefinition

Quote:
This FAQ is more than a two years out-of-date. POSIX-threads are now a standard part of all modern Linux distributions. The new glibc version 2 (linux libc version 6.0) is fully re-entrant and supports threads in a fully compliant manner. The default Linux thread implementation is with kernel-space threads, not user-space threads; these threads will schedule properly on an SMP architecture.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

stoneshim의 이미지

Quote:
제가 코딩하는 쓰레드가 대체 유저레벨인지 커널레벨인지 이중레벨인지 몰라서요

OS 와 그 버전에 따라 다를 수 있습니다.
다음 스레드를 참고하세요.

http://bbs.kldp.org/viewtopic.php?t=21072&highlight=user-level

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

alsong의 이미지

아하 몰랐던걸 알았네요.....
위에 '리눅스상에 pthread는' 으로 고쳐야 겠군요.ㅎㅎ

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

iamsjkim의 이미지

OS와 그 버전에 따라 다를 수 있지만, 기본적으로는 리눅스 상에서의 pthread는 커널 레벨인 것으로 이해하면 되는것인지요..-.-

저의 경우 Wow 리눅스 7.3 Paran R2를 깔아서 사용중이고
Kernel 2.4.18
KDE 3.0.1
XFree86 4.2.0
glibc 2.2.5
gcc 2.95
라고 나와있습니다..

그렇다면.. 저의 경우 pthread_create를 사용하여 Rx 쓰레드를 생성, 그 내부에서 recv() 시스템 콜로 블록되더라도 pthread_create로 생성된 Tx 쓰레드는 영향을 받지 않겠군요..

(너무 초짜라 일일이 확인을.. T.T)

상세하고 친절한 답변 정말 감사드립니다..
(__)~꾸벅

댓글 달기

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