서버 모델 구상중에...

kukuman의 이미지

서버 프로그램 구상중입니다...

기본적으로 prefork로 복수개의 process를 생성하여
process들이 listen -> accept를 합니다...

socket은 non-blocking으로 setting하고
select를 사용하여 fd들을 check합니다...

request를 다 읽어들이면,
여기서 thread를 생성하여
1) request들에 대한 파싱
2) 특정 서버로 다시 접속
3) 접속한 서버로부터 응답을 받음
4) 응답을 처음의 client(socket)으로 전송
thread 소멸...

이와 같은 구성을 하려고 합니다...

여기서 thread의 생성, 소멸이 빈번할 것 같아서 thread pool을 사용할까
하고 생각하고 있는데,,, 제 생각이 맞는 것인가요??

제가 thread를 이용한 프로그램을 처음 해보는지라 :oops:
여러가지로 머리가 복잡하군요...

참, 특정 서버로의 접속도 빈번할 것 같아서 그 서버로의 connection pool을
사용하려고 합니다...

mach의 이미지

좋습니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

kukuman의 이미지

감사합니다~ :o

Be at a right place at a right time...

pynoos의 이미지

Thread pool 이 들어가면 가장 주의할 것이, 지난 Transaction의 결과가 깨끗이 정리되어, 다음 Transaction에 영향을 주지 않아야합니다.
메모리 할당/해제, 파일 디스크립터 등등... 쓰레드가 소멸되어도 프로세스 어딘가에는 잡혀있기 때문에 주의해야하죠.

그리고, connection pool 에서는, 다중화에 대한 rouing만 잘 해결하면, 기본적으로 깔끔한 설계입니다.
자칫 다른 녀석이 요청한 것을 결과로 받는 일이 생기면, 곤란하죠.

그리고 되도록, 요청과 응답은 한번에 다 되도록하는 것이 좋습니다. 두번의 요청과 두번의 응답을 하나의 트랜잭션으로 취급하면 그때부터 state machine이 복잡해집니다.

kukuman의 이미지

답변 감사드립니다~ :o

근데 ,,,

Quote:
그리고, connection pool 에서는, 다중화에 대한 rouing만 잘 해결하면, 기본적으로 깔끔한 설계입니다.
자칫 다른 녀석이 요청한 것을 결과로 받는 일이 생기면, 곤란하죠.

조금 더 자세히 설명해 주실 수 있는지요?? ^^;;

Be at a right place at a right time...

pynoos의 이미지

만약 하나의 connection이 한 쓰레드의 한 클라인트 요청에 전담하게 되면, 별 문제 없어 보이지만, connection이 유지 된체 여러 thread가 계속 요청하게 되면, 그 결과를 누가 가져가야할지 난감한 경우가 생기게 됩니다.

공유하는 connection에서 요청한 녀석이 그 응답을 제대로 가져가야하는 메커니즘이 있어야한 다는 것이지요.

대개는 자체 제작 프로토콜의 경우, 패킷 식별자와 그것이 소유된 쓰레드 혹은 큐 ID 에 대한 mapping table을 가져가거나, 쓰레드 ID, Que ID를 바로 패킷에 실어 보내 되돌아 올때 바로 제자리를 찾아 가도록하는 방법을 사용할 수 있을 것입니다.

twopairs의 이미지

음.. 프로세스를 x개 prefork하고 그 프로세스 내에서 쓰레드를 x개 precreate하면.. 왠만하면 다 커버 할 수 있지 않을까요...

mutex lock의 존재유무와 (없으면 멀티 쓰레드..)
mutex lock과 mutex unlock사이의 시간간격에 따라.. (무시해도 될만한 시간이면 멀티 쓰레드)
그냥 멀티 쓰레든냐.. 혹은 멀티 프로세스 + 멀티 쓰레드냐가 갈리겠네요.

아 맞다.. 예전에 linux에서 쓰레드를 돌렸는데.. 웬걸 프로세스가 떡하니 뜨더군요.. 그때 잠깐 여기저기 뒤져서 왜 그런지만 알아내고 끝냈는데.....

표시만 프로세스로 되는 건가요? 아니면 정말 쓰레드가 프로세스로 구현이 되어서 리눅스에서의 멀티 쓰레드는 성능 효과를 기대할 수 없는 건가요? ㅎㅎㅎ
궁금하네요..

Be Happy

kimsk99의 이미지

리눅스에서는 thread가 vfork라는 일종의 fork(process복제)를 이용해서 구현되어 있습니다.
즉 모든 메모리를 공유하는 process가 thread가 되는 것이지요.
그래서 일반적으로 thread preformance가 Solaris나 NT같은 것에 비해서 많이 떨어집니다.

kukuman의 이미지

Quote:
리눅스에서는 thread가 vfork라는 일종의 fork(process복제)를 이용해서 구현되어 있습니다.
즉 모든 메모리를 공유하는 process가 thread가 되는 것이지요.
그래서 일반적으로 thread preformance가 Solaris나 NT같은 것에 비해서 많이 떨어집니다.

요즘 thread에 대해서 공부하고 있는데,,,
이 곳(kldp)의 예전 질답들에서 많은 도움을 얻고 있습니다~ :)

리눅스에서의 thread라는 것은 일종의 trick :?: 이라고까지 얘기하더군요^^

다음은Joinc에서 여기 저기 찾다가 얻은 내용입니다~

Quote:
K.1: What is the implementation model for LinuxThreads?
LinuxThreads follows the so-called "one-to-one" model: each thread is actually a separate process in the kernel. The kernel scheduler takes care of scheduling the threads, just like it schedules regular processes. The threads are created with the Linux clone() system call, which is a generalization of fork() allowing the new process to share the memory space, file descriptors, and signal handlers of the parent.

Advantages of the "one-to-one" model include:

* minimal overhead on CPU-intensive multiprocessing (with about one thread per processor);
* minimal overhead on I/O operations;
* a simple and robust implementation (the kernel scheduler does most of the hard work for us).

The main disadvantage is more expensive context switches on mutex and condition operations, which must go through the kernel. This is mitigated by the fact that context switches in the Linux kernel are pretty efficient.

출처: http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html

Be at a right place at a right time...

choissi의 이미지

저도 실무에서 쓰레드풀을 사용해서 미들웨어 비슷한 녀석을
만들어서 사용을 하고 있는데요,, 요청/응답 방식과 서버 push 방식이
둘다 고려되어야 할듯 싶네요.

쓰레드 풀이 적용 되었을때, 서버 push 처리하기가 좀 난해하더군요.

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

김성진의 이미지

리눅스 쓰레드 모델로 이야기가 가는듯 하네요.

저도 처음에는 리눅스 쓰레드 모델을 보고 "이런 어거지가 있나?"라는

생각을 했었습니다.

그런데, 최근에 선 개발자와의 인터뷰를 읽고, 개발자의

선견지명(?)에 놀랐습니다.

물론 그 리눅스 쓰레드 개발자는 아무것도 모르고, 그냥 posix를 지원하기 위해

뺑이(?)를 친거지만요.

선 개발자가 말하길 회사 내 제품 개발 방향에서 가장 크게 실수한

몇가지 중에서 한가지가 쓰레드 모델을 N:M으로 잡은거라네요.

물론 이론적으로는 이 모델이 대단히 좋은데,

실제 구현상에서는 너무 복잡해서 오히려 성능과 효율을

떨어뜨린다고 합니다. 최근에 Solaris 9부터는 아예

1:1 모델로 간다고 이야기를 들었습니다.

물론 리눅스 쓰레드의 1:1과는 차이가 있겠지만,

아이러니가 아닐 수 없습니다.

그런 이유인지는 모르지만, IBM에서 야심차게 개발했던

리눅스 쓰레드 패키지 N:M 모델을 지원하던 NGPT 를

취소 시키고, redhat의 NPTL로 돌아선 것도 한가지

이야기 거리가 되었었습니다.

(표면적으로는 동일한 주제에 대한 경쟁적인 프로젝트 진행을
막고, 일관성있는 개발을 하기 위함이라고 밝혔지만...)

좋은 하루 되십시요.

김성진 드림

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

댓글 달기

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