i/o multiplexing & thread 에서..

sunbee의 이미지

nonblocking 소켓입니다.
main thread에서 io_thread를 하나 생성하고,
io_thread에서 work_thread를 여러개 생성하였습니다.

io_thread는 select() 하고 데이타를 recv() 합니다.
그리고나서 놀고있는 work_thread를 찾아 recv한 데이타를 넘깁니다.

/* work thread */
struct {
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int ready;
    int sfd;                              /* 이벤트 발생한 소켓 */
    int status;                         /* 1 is running, 0 is sleep */
    char buff[MSG_BUFFER];
}WK_thread[MAXNTHREADS];

위와 같이 work_thread는 work_thread당 buffer를 두기 위해 배열로 만들었습니다.

근데!!! 문제점은
io_read_thread 에서 select()를 잘 못합니다..(?) 무슨 말인고 하니.. 여러개의 client가 접속을 해도 하나의 client 소켓 event만 return 합니다. i/o multiplexing을 못한단 말이죠...

뭐가 문젠지 잘 모르겠습니당.. 왜 이런거죠~?

대충의 코드 구조입니다.

io_thread

        /*
        ** i/o multiplexing
        */
        select(....);

        /* packet read */
        if((ret_val = read_packetC(event_fd)) < 0) {
            /* disconnect work */
            .....
        }

        /* 휴면 스레드를 찾는다. */
        for(free_tid = 0; free_tid < MAXNTHREADS; free_tid++) {
            if(WK_thread[free_tid].status == 0) {
                memcpy(WK_thread[free_tid].buff, (user_buff +5), readed_len);

                packet_len = 0;
                readed_len = 0;
                memset(user_buff,  '\0', MSG_BUFFER);
                break;
            }
        }

        /*
        ** work thread를 깨운다.
        */
        pthread_mutex_lock(&(WK_thread[free_tid].mutex)); 
       
        /*
        ** event가 발생된 socket을 세팅한다.
        */
        WK_thread[free_tid].sfd = event_fd;

        if(WK_thread[free_tid].ready == 0) {
            pthread_cond_signal(&(WK_thread[free_tid].cond));
        }
        WK_thread[free_tid].ready = 1;


        /* thread full ~~~~~ */
        if(RD_WK_thread_count >= MAXNTHREADS) {
                ;
        }

        pthread_mutex_unlock(&(WK_thread[free_tid].mutex));
익명 사용자의 이미지

select()를 호출하여 리턴값이 0이상이면, 현재 접속되어 있는 소켓들에 대해 루프를 돌면서 FD_ISSET()을 이용해 읽기, 쓰기, 예외처리 등의 작업을 해 줘야 하는데 그 부분이 안보이네요?

익명 사용자의 이미지

혹시 이런문제가 아니신지?
옛날에 저도 고생한 부분인데..
select 한후에 fdset은 select 전의 fdset과 달라집니다.
따라서 계속적으로 while로 select를 한다면 먼저 fdset값을
저장해 놓구 select 를 한후에 다시 fdset값을 채워야 합니다.

이 문제가 아니라면 죄송.. ..

sunbee의 이미지

답변 감사드립니다.

Quote:

select()를 호출하여 리턴값이 0이상이면, 현재 접속되어 있는 소켓들에 대해 루프를 돌면서 FD_ISSET()을 이용해 읽기, 쓰기, 예외처리 등의 작업을 해 줘야 하는데 그 부분이 안보이네요?

이부분은 모듈화 시켜놓았구요.. i/o multiplexing에는 전혀 문제가 없습니당...

위부분은 대략적인 코딩구조입니당...
사실 select()로 개발한게 아니라 /dev/poll 을 이용하였거던요...이해하기 쉽게 그냥 select()라고 말씀드린겁니다...
OS 는 솔라리스입니당...

IsExist의 이미지

pseudo 코드로 봐서는 한번에 한개의 recv만 처리하네요.
recv할 개 2개의 fd가 발생할 경우 2개를 차례로 io_thread가
read_packetC 해야 할거 같네요. 그리고 그걸 놀고 있는 WK_thread
한테 복사해 줘야 겠죠. (만약 read_packetC가 2개를 다 한다면
밑에 for 루프에서 memcpy 를 두번 하던지). 혹 io_thread가 두개
이상은 아니겠죠??

recv를 io_thread 하고 다시 각 일을 맡길 thread 한태 memcpy
로 복사하니 메모리 복사가 두번 생깁니다. 이거 불필요 한겁니다.
복사할 내용이 작다면 영향을 미미 하겠지만요.

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

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

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

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

댓글 달기

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