서버 accept 시점.

하하의 이미지

서버 모델 중.

다음과 같이 작성할 수 있습니다.

1. listen(listenfd) 
    newfd = accept(listenfd)
    thread_create(func,newfd)
    func(newfd)
          :
      일처리(클라이언트는 thread와 통신한다.)

2. listen(listenfd)
    fork()
    자식: newfd = accept(listenfd)
    자식이 일처리(클라이언트는 자식프로세스와 통신한다.) 

3. litend(listenfd)
    fork()
    자식: thread_create(func)
    func() {
        newfd = accept(listenfd)
        일처리(클라이언트는 thread와 통신한다.)
    }

위 모델을 가만히 보면.

서버는 listen을 통해 3-way handshake을 완료한뒤

위의 3가지 방법을 통해 서로 다른 시점에 accept를 호출하여

클라이언트와 통신할 newfd를 생성하고 있습니다.

그렇다면 이렇게 accept를 다른 시점에서 호출하는 이유가 있을

거 같습니다.

유추해 보면..

서버 메인은 단순 listen 만을 고려하고 나머지 일은 자식 프로세스

든 thread든 그것들에게 일을 맡긴다. 정도로 생각할 수 있을거 같

습니다.

그런데... 위 모델중 3번째 방법 같은 경우 listen -> fork -> thread

-> accept 같은 식으로 client가 서버에 연결하기 까지 꾀 많은 과정을

거처야 합니다. 이러한 방법이 어떤 장점이 있을까요?

또한 1, 2번 모델 같은 경우도 각각의 장.단점에 대해 무엇이 있을까요?

경험으로 통한 각각의 장단점에 대해 설명해 주실 수 있으신가요?

그럼.. 즐거운 하루 되세요... ^_____^;;

케인의 이미지

1번과 2번이 둘 다 많이 사용된다고 할 수 있습니다.

1번은 쓰레드풀은 사용하지 않는 것이고, 2번은 쓰레드풀을 사용하게 되지요.
3번의 경우에는 다소 디자인이 복잡해질 것 같네요. ^^

1) accept 후 쓰레드 생성
이 방법은 쓰레드 생성에 지연시간이 있는 단점이 있습니다.
하지만, 쓰레드가 미리 만들어져 있지 않아도 되지요.
연결이 끝나면 쓰레드는 종료하면 됩니다.
(mysql은 이런 방식이 아닐까 하네요. -- 확실한 건 아닙니다.)

2) 쓰레드를 미리 생성해놓고, 각 쓰레드가 accept
하나의 소켓 fd에 대해서 동시에 여러 쓰레드/프로세스가 accept하고
있어도 무방합니다. 연결이 들어오면 accept중인 쓰레드들 중에서
한 쓰레드가 리턴합니다.
아마 아파치같은 경우는 이렇게 돌아가는 것으로 알고 있습니다.

미리 만들어놓은 쓰레드들이 다 accept해서 통신에 들어가면 추가로
쓰레드를 만들어주어야 새로운 접속을 받을 수 있겠지요.
accept한 쓰레드가 통신을 하다가 연결이 끝나면 다시 accept하면 됩니다.

쓰레드풀은 사실 종료가 문제입니다. accept중인 쓰레드들을 종료해야하는데,
시그널을 받을 때 accept가 중지되어 리턴되는 것으로 알고 있습니다.

pynoos의 이미지

하하 wrote:
서버 모델 중.

다음과 같이 작성할 수 있습니다.

1. listen(listenfd) 
    newfd = accept(listenfd)
    thread_create(func,newfd)
    func(newfd)
          :
      일처리(클라이언트는 thread와 통신한다.)

2. listen(listenfd)
    fork()
    자식: newfd = accept(listenfd)
    자식이 일처리(클라이언트는 자식프로세스와 통신한다.) 

3. litend(listenfd)
    fork()
    자식: thread_create(func)
    func() {
        newfd = accept(listenfd)
        일처리(클라이언트는 thread와 통신한다.)
    }

위 모델을 가만히 보면.

서버는 listen을 통해 3-way handshake을 완료한뒤

위의 3가지 방법을 통해 서로 다른 시점에 accept를 호출하여

클라이언트와 통신할 newfd를 생성하고 있습니다.

그렇다면 이렇게 accept를 다른 시점에서 호출하는 이유가 있을

거 같습니다.

유추해 보면..

서버 메인은 단순 listen 만을 고려하고 나머지 일은 자식 프로세스

든 thread든 그것들에게 일을 맡긴다. 정도로 생각할 수 있을거 같

습니다.

그런데... 위 모델중 3번째 방법 같은 경우 listen -> fork -> thread

-> accept 같은 식으로 client가 서버에 연결하기 까지 꾀 많은 과정을

거처야 합니다. 이러한 방법이 어떤 장점이 있을까요?

또한 1, 2번 모델 같은 경우도 각각의 장.단점에 대해 무엇이 있을까요?

경험으로 통한 각각의 장단점에 대해 설명해 주실 수 있으신가요?

그럼.. 즐거운 하루 되세요... ^_____^;;

1 번은 thread가 도입되는 서버의 전형적인 예제입니다.
2 번은 prefork 방식의 예제입니다.
3 번은 단일 프로세스(1번이나, non-block i/o)로만 처리할 때 생기는 프로세스 하나당 열수 있느 최대 open file 수에 도달 할 경우를 처리하기 위해
prefork와 적당히 섞은 모델입니다. prefork-thread pool 이라고 생각할 수 있습니다.

장단점을 들자면,

1 번의 경우, fork 방식보다 가볍고, 메모리를 공유할 수 있는 잇점이 있기 때문에 가벼운 서버에 애용되고, 2 번의 경우, 빠른 응답을 처리하려고 , fork/thread creation을 미리해두는 경우입니다.

1 번처럼 접속이 하나의 thread 혹은 process의 전담되는 경우, 한가한 client가 많아 질때, scheduling 소모가 많아지는 단점이 있고,
2번은 pre-fork 할 갯수를 조절하는 추가 메커니즘 또는 동시에 두 포트 이상을 listen할 경우 추가적인 server serialization(?)이 필요하며,
3 번은 전술한 바와 같은 용도로 사용되는 것이 대부분입니다.

심심할 때 마다 조금씩 진행하는 프로젝트가 있어서 답장을 해보았습니다.

http://kldp.net/projects/hserver

http://cvs.kldp.net/cgi-bin/cvsweb.cgi?cvsroot=hserver

댓글 달기

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