리스너 프로세스와 작업 프로세스간에 소켓 넘겨주기

익명 사용자의 이미지

안녕하세요...?

음.. 궁금한 것이 있는데,
tmax나 fasttp같은 미들웨어 솔류션을 보면,
소켓을 리슨 받는 프로세스와 실제로 작업을 하는 프로세스가
분리 되어 있는데,

제가 알고 있는 계념으로는 포크가 아니면 다른 프로세스가
소유한 fd를 넘겨 받을 방법이 없는거 같은데,
( 리슨너 프로세스를 포크해서 소켓을 복제 받는 것이 아니라,
이미 실행중인 작업을 담당하는 프로세스에게 소켓을
넘겨 주고 싶습니다.)

어떻게 이루어 지는지 궁금하네요..

아시는 분 있으면 힌트좀 주세요;;

익명 사용자의 이미지

다중 프로세스로 프로그램을 짰을경우는 잘 모르겠지만...

일반적으로 다중 프로세스보단 Thread를 이용해서 서로 분
리하지 않나요? 예를들어 listen하는 Thread 따로 Accept하
는 Thread 따로 이렇게요...그래서 실질적으로는 Accept하는
Thread가 처리를 다 하고요..

음... 저도 잘 모르는 초보라. ㅡ,.ㅡ;

익명 사용자의 이미지

제가 구상하는 모델은 쓰레드도 사용을 합니다.

즉.. 리스너가 받아서..
뒷단에 있는 프로세스가 작업을 넘겨 받는데,
이녀석이.. 쓰레드 풀을 가지고 있어서 작업의 효율을 높이는
거죠...
그러다가 작업량이 많아 지면,,
프로세스를 하나더 생성할려구요
(쓰레드의 숫자를 늘리는 방법도 있지만,,
프로세스를 늘릴려고 하는 경우는 혹시 프로세스가
종료되더라도 그쪽 클라이언트만 서비스 중지가 나도록
하려구요... )

그럴려면 프로세스간에 소켓을 주고 받아야 하는데,
이 부분이 에매하더라구요..

익명 사용자의 이미지

소켓 핸들도 하나의 파일지시자 입니다.
즉, 그값을 넘겨주거나 넘겨받을 수 있다는 소리지요.
뭐 간단하게 배열같은 곳에 넣어놓아도되고 다른 프로세서에 넘겨줘도
파일 지시자의 값만 변경되지 않는다면 큰상관을 없을겁니다.
(순전히 제생각입니다... ^^; 하지만 그렇게 될거라고 믿습니다. ^^;)

익명 사용자의 이미지

소켓을 만들거나 파일을 만들때 넘겨 받는 fd는
프로세스내에서면 유효한 값이 아닌가요?

가령 a 프로세스의 3번 fd와 b프로세의 fd값이 3번이라면
이것은 서로 다른 fd가 아닌가요?

fd를 가지고 시스템 내에서 그 fd가 생성된 곳의
주소를 알아서 복사를 하면 될것 같은데,
잘안되네요... 일딴,
inode로 접근을 해볼려고 하는 중입니다.

익명 사용자의 이미지

다른 프로세스로 파일 디스크립터(소켓 포함)를 넘겨주실려면
sendmsg함수와 recvmsg함수를 이용할수 있습니다..

송신 프로세스에서는 msghdr 구조체에 필요한 정보를 넣은다음 sendmsg를
호출하고 수신 프로세스에서는 recvmsg함수로 msghdr구조체의 값을 받은 다음
사용하시면 됩니다..

그럼.

익명 사용자의 이미지

음... 말씀하신 내용으로 봐선 적어도 저보단 훨씬 플밍 경험이 풍부
하신것 같군요. 괜히 잘 모르는 초보가 나선것 같은 느낌이... ^^
잘 몰라서 틀린 내용이 있더라도 너그러이 봐주시길..... ^^

언젠가 제가 온라인 겜서버를 개발하겠다고 RedHat Linux 7.1 , FreeBSD
4.2 , Solaris 8을 PC마다 다 깔아놓고... 똑같은 프로그램을 돌린적이
있습니다.. (물론 각 PC는 P3 800 DUAL, 18G HDD 에 램 1G입니다.)

저같은 경우엔 Multi Process기반,Single Process기반에 Multi Thread로 두가
지를 위의 세가지 OS에서 테스트해보았습니다.. (물론 제가 짠 플밍이기때문
에 전혀(ㅡㅡ;) 최적화는 안되었습니다.. ㅡㅡ;)

의외로 결과가 거의 대동소이하더군요..

그런데 특이하게도 Linux와 FreeBSD,Solaris가 서로 Thread와 Process를 다루
는 것이 많이 다르다라는 것을 느낄수 있었습니다.같은 프로그램이더라도
Linux의 경우엔 Thread수와 비례(정확하게는 아님.. +2?)하게 Process수가 증
가하였고... FreeBSD와 Solaris는 Thread의 개념에 맞게 한개의 Process에 여
러개의 Thread가 만들지더군요.... 또한 Linux의 경우엔 해당 Machine이
Single Processor의 경우엔 Thread 수와 무관하게 또한 Mutex Lock을 걸어주
지 않아도 각 Thread는 서로 거의 간섭을 받지 않고 돌아가고,Dual Processor
인 경우엔 반드시 Mutex Lock을 걸어주어야만 제대로 작동을 하더군요.. 하지
만 ...FreeBSD,Solaris의 경우엔 Linux와는 달리 Single,Dual Processor와 무
관하게 Thread의 개념에 맞게 거의 모든 Thread들이 거의 동시에 실행이 되는
것을 볼수 있었습니다..

이밖의 여러가지 결과를 보면서 제가 느낀것은....

프로그램 개발에 있어서. Single Process기반이냐,Multi Process기반이냐,
Single Thread기반이냐,Multi Thread기반이냐 하는것보다 "어떤 OS를 얼마나
알고, 어떤 기반이던 그 기반에서 얼마나 프로그래밍을 많이 해보았느냐"라는
것이 성능을 좌우한다라는 것입니다....

실제로 저의 경우에도 하나의 OS에서 Process와 Thread가 프로그래밍적으로
어떻게 구현이 되는지를 아는것이 쉽지 않았습니다.......물론 지금도 잘 모르
지만요. ㅡㅡ;

주저리..주저리.. 여러가지 말들을 늘어놓으것 같아서 죄송한데요.. ㅡㅡ

일단 제 생각으론 프로그래밍에 앞서 어떤 OS에서 어떤 프로그램을 개발할거냐
에 따라서 개발 방향을 먼저 정해야 한다고 생각합니다. 보통의 경우엔 Single
Process기반의 프로그래밍이 대부분이지만 서버프로그래밍을 하다보면 그렇지
않은 경우도 많고... 또한 OS에따라 Multi Process할 것인지 Multi Thread로
할것인지를 결정해야 할 경우도 있으니까요..(대체적으로 성능을 기준으로 결
정하니까요.. )

그런데 말씀하신대로라면 Multi Process기반에 Multi Thread로 돌아가는 프로
그램을 개발하시는 것 같은데....그런경우라면....프로그래밍에 상당히 경험이
있지 않고서는 어렵지 않을까요? (저의 경우에 비교해서요.. ㅡㅡ; 헐...난
언제쯤 초보 신세를 면할까.. T.T;)

개발하시는 프로그램이 어떤것인지는 잘 모르지만..저라면 좀더 단순화된 모델
로 결과를 이끌어 낼수 있도록 노력할것 같군요...

익명 사용자의 이미지

별말씀을요..
저도 시작한지 얼마 안되는 프로그래머 입니다.

그래서 원리나 구현상의 여러가지가 궁금한 것이 많아서,
책도 찾아 보고 하던중에 kldp에 개발자 qa게시판이 생겨서
기분이 아주 좋네요..

이렇게 서로 궁금한 부분을 토론할 수 있다는게
참 즐겁습니다.

님께서 말씀하신 것처럼 os마다 쓰레드를 구현하는데,
차이가 있더군요..
저희 학교 시스템프로그래밍 교수님이 그 차이를
잘 설명해주신 글이 있는데 덧붙여 볼께요..

===============================================================
thread는 구현된 시스템 마다 제각기 다릅니다.
즉, pthread_create()했을때 반드시 커널 내에 동일한 thread가 생성하는
것은 아닙니다. 사용자 프로그램상의 thread 와 커널 내의 스케줄링 대상인
커널 thread가 짝이 되어 수행됩니다. 그런데 이런 짝을 맺어 주는 일은
thread library에서 하는데, 이게 시스템 마다 다르다는 겁니다.
즉, 프로그램에서 10개의 thread를 생성했다해도
실제 커널에는 3-4개만 생성될 수도 있습니다.

왜냐하면 일부는 read, receive등에서 기다리고, 일부는 코드(계산)
실행을 하는 등 모든 thread가 계속 수행되지 않는다는 것이죠.
즉, CPU가 10개 있고, thread도 10개 있고 다른 프로세서들 없이 여러분
thread들만 돌고 있어도 실제로 동시에 실행되는 것은 3-4개라는 것이죠.
나머지는 메시지를 기다리는 대기 상태에 있죠. 그래서 ...

SUN Solaris 2.x 실제 커널 내에 thread가 생성되지만 thread library에서
적절히 자동으로 실제 생성되는 커널 내의 thread 개수를 조절한다.
사용자 thread와 커널 thread간의 mapping은 thread library가 알아서
match시킨다. 위에서 이야기 한바와 같이 10개의 thread를 생성해도
실제 커널 내의 thread는 3-4개만 생성된다. MN mapping
=> 가장 진보된 형태의 thread 구현 방법

Window NT 사용자가 thread를 create할 때마다 커널 내의 thread도
동시에 생성된다. 따라서 항상 11 mapping이 성립된다.
즉, 사용자가 thread와 커널 thread는 동일하다고 생각하면 된다.
이 경우 SUN 것 보다 시스템 자원을 많이 잡아 먹는다.

Linux 커널 내에선 thread라는 것이 없다. 따라서 thread library에서
pthread_create()하면 vfork()와 같이 별도의 process를 생성하여 thread와 유
사한 효과를 발휘하도록 변칙적으로 구현하였다. 원래 vfork()하면 parenet와
child가 동일한 stack을 사용하는 반면,
thread는 서로 다른 stack를 사용한다. 따라서 Linux용 thread는
진정한 의미의 thread는 아니고, C library thread라고 한다.
=> 커널에는 thread라는 개념이 없고 무존건 process만 존재하고
사용자 프로그램내의 thread library에서 실제 커널에 thread가 있는
것처럼 보이도록 흉내를 낸 것.

thread가 나오기 전의 UNIX에선 커널 내에 thread가 없었기 때문에
모두가 이런 방법(C library thread)으로 thread를 구현했다가,
최근에 들어 대부분의 상용 UNIX들은 커널 내에도 thread를 만들어
진정한 의미의 thread가 구현되었다.
SUN Solaris, HP Unix, IBM RS Unix,Windows NT
====================================================================

익명 사용자의 이미지

> Linux의 경우엔 Thread수와 비례(정확하게는 아님.. +2?)하게 Process수가

> 가하였고...

LinuxThreads FAQ중....

D.5 When I'm running a program that creates N threads, top or ps
display N+2 processes that are running my program. What do all these
processes correspond to?

Due to the general "one process per thread" model, there's one process
for the initial thread and N processes for the threads it created using
pthread_create. That leaves one process unaccounted for. That extra
process corresponds to the "thread manager" thread, a thread created
internally by LinuxThreads to handle thread creation and thread
termination. This extra thread is asleep most of the time.

익명 사용자의 이미지

아... recvmsg랑 sendmsg볼때 그냥 쓸일이 없을것 같아서
그냥 대충 보고 넘어간것이 후회되네요..

UNIX network programming vol.1 관련 내용이 있네요...

감사합니다.. ^^;

익명 사용자의 이미지

linux는 실제 thread가 아니라 process가 생성된다고 하셨는데...

님의 말씀대로, process는 부모와 자식이 모두 같은 stack을 사용하지 않습니
까?

그렇다면, linux상에서 순서대로 a, b, c thread를 생성한 후, b thread 를 제
거한다면, a thread 역시 제거되지 않나요?

에구... 정리가 안되는군요.

익명 사용자의 이미지

리눅스에서는 쓰레드를 구현할 때
clone()이라는 시스템 콜을 사용합니다.

fork()는 프로세스를 복사해서, 부모와는 같지면
메모리 상에는 이미 서로 다른 상태이지요...
이에 반해서 clone는 프로세스는 새로 생성이 되지만,
부모의 메모리공간이나, fd, signal handler는 공유되는 거죠..

이런 차이로 fork를 하면,
프로세스간에 자원을 공유를 할려면 IPC관련 시스템
콜을 사용해야 하지만 쓰레드는 clone에 의해서 복제된
것이기 때문에, 이런것이 필요없죠...

이제 스택 이야기를 해보죠...

쓰레드를 만들때 그 쓰레드가 할 일을 함수로
지정을 해줍니다. 그래서 메인 process와는 별게로
쓰레드가 생성되어서 지정된 함수를 실행하는 거죠..
함수가 실행이 되면 그안에서 변수들을 선언되어서
사용되고 할텐데, 이것이 자리 잡는 곳이 스택이죠..

<참고그림> http//210.207.37.202/_data/thread.jpg (오렐리 pthread programming이란 책에서..)

참고 그림에서 처럼 쓰레드는
부모의 프로세스의 스택 영역을 쪼개에서
각각의 스택 영역을 확보하고 실행을 하게 됩니다.
(분리되어 있다는 거죠)

언밀히 이야기 하면 같은 스택영역을
쪼개서 쓴다고 말할수 있지만
vfork와는 분명이 차이가 있습니다.
vfork가 되면,, 자식이 exit를 반환하지 않는 이상
부모는 대기 상태로 있다는 거죠... 즉 논리적으로
스택은 하나이고 이것을 자식과 공유한다는 겁니다..

ps. 휴~~ 설명을 한다고 했는데,
어색하네요...

저도 아직 배우는 중이라서 제 설명중에
오류가 있을 수 있습니다.
배우는 넘이 무슨 글을 달았겠다고 하시는 분도 있겠지만,
이렇게 글을 올리면서 제 생각을 정리하고
또 잘못된 부분을 다른분으로 부터 정정 받을수 있기에 ^^
그럼 좋은 하루 되세요..

익명 사용자의 이미지

소켓 핸들도 하나의 파일지시자 입니다.
즉, 그값을 넘겨주거나 넘겨받을 수 있다는 소리지요.
뭐 간단하게 배열같은 곳에 넣어놓아도되고 다른 프로세서에 넘겨줘도
파일 지시자의 값만 변경되지 않는다면 큰상관을 없을겁니다.
(순전히 제생각입니다... ^^; 하지만 그렇게 될거라고 믿습니다. ^^;)

익명 사용자의 이미지

소켓 핸들도 하나의 파일지시자 입니다.
즉, 그값을 넘겨주거나 넘겨받을 수 있다는 소리지요.
뭐 간단하게 배열같은 곳에 넣어놓아도되고 다른 프로세서에 넘겨줘도
파일 지시자의 값만 변경되지 않는다면 큰상관을 없을겁니다.
(순전히 제생각입니다... ^^; 하지만 그렇게 될거라고 믿습니다. ^^;)

댓글 달기

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