fork를 사용하지 않고 무한히 많은 클라이언트를

익명 사용자의 이미지

받아 주고 관리를 할수 있을까요?
select라는 넘이 있긴 한데 제한이 있지 않습니까?

혹시 아시는 분 있으면.^^;;
답글을 달아 주시면 감사 하겠습니다

셀렉트를 자알 이용해서 되는게 가장 멋질거 같은데.^^;;

익명 사용자의 이미지

무한히 많은 클라이언트를 처리할려면 일단은 동시에 얼마나 많은 클라이
언트의 접속을 받을수 있느냐, 즉 socket을 동시에 몇개나 열수 있는지가
관건인것 같습니다,

일단은 select로 1024개의 파일디스크립터를 처리할수 없으니 이보다 많은
클라이언트를 처리할려면 poll를 사용해야 할것 같군요..

그럼..

익명 사용자의 이미지

음....

select를 콜백형식으로 사용하면 무지 편리하죠..
아래의 라이브러리 소스를 분석해 보세요..

select나 kqueue를 적당하게 잘 쓸수 있습니당..
http//freshmeat.net/projects/libevent/

익명 사용자의 이미지


network i/o는 멀티플렉싱 처리를 하고,
nt의 iocp처럼 워커 쓰레드 개념으로 하면
굳이 포크를 사용안해도.. 좋은 퍼모먼스가 나올꺼라고
생각되네요..

(메인 프로그램은 열심히 패킷을 만들어서
쓰레드의 작업큐로 던지만 미리 뜬 쓰레드들이..
큐에 있는 데이터와 등록된 콜백함수를 콜해주면
이상적일것 같네요 )

엔티의 iocp는 정말 매력적인 입출력 방법이더라구요 ^^;

익명 사용자의 이미지

음..

제가 대략적으로 libevent라는 라이브러리에 대해서 보았는데..

제가 이해가 아직 안된것인지는 몰라도 약간 상황이 안 맞는듯 합니다..

유재혁님이 물어본것은 동시에 과연 몇개의 파일디스크립터들의 비동기식 이벤
트를 처리하느냐가 관건인데..libevent는 단순히 어떤 특정한 파일 디스크립터
에 핸들러를 등록해주면 자동으로 그것을 실행할수 있겠끔해주는 라이브러리
같습니다..마치 x-window 프로그램을 짤때 각각의 이벤트에 관해서 콜백 함수
를 만들어 주는것과 같은 이치인것 같습니다..

그럼..

익명 사용자의 이미지

재혁님이나 종복님께서.
select를 사용해서 멀티플렉싱을 한다는
의견을 제시 하셔서..
이것을 편리하고 쉽게 사용하는
방법을 알려 드릴려고 작성한 글입니다.

님이 말씀하신것 처럼 fd를 생성을 해서
해당 fd를 콜백으로 등록을 한것인데,
이것으로 소켓의 접속이나 종료, 데이터 입출력을
모두 제어 가능합니다.
또 fd_set이나 fd_isset같은 매크로는 하부에
감추어져 있어서 구현하기도 쉽구요..
지금은 그 라이브러리가 select랑 kqueue만 지원하는데
poll 모듈을 추가 하면 fd가 많아 졌을때
더 효율이 좋겠지요...

그리고 select에 대한 참고 의견이라고 생각되어서
종복님 글에다가 답글을 달았습니당 ^^;

마지막으로 한가지 덧붙이지면,
소켓의 갯수도 중요하지만, 결국 싱글 프로세스는
동시에 하나의 cpu만 점유 가능하니깐
효율이 문제 겠지요...
(이것의 대한 답으로 재혁님 글에 답글로
멀티플렉싱과, 워커쓰레드를 제안했구요..)

이 논의는 소켓 i/o방법에 대한것과,
받은 자료을 어떻게 처리를해서 어떻게 리턴할것인지가
중요한것 같군요.

ps. select의 max_fd가 어짜피 상수로 1024로 정의된것이니깐
값을 늘려주고 하면 되지 않을까 싶네요
(제가 한 셀렉트에 1024개 까지 fd를 안붙여 봐서여..)

익명 사용자의 이미지

제 기억으로는 select함수는 max_fd을 변경해도 1024개이상의 소켓을 처리할수
없는것으로 알고 있습니다. (관계 자료가 있었는데.. 잊어버렸습니다. T.T;)

아마도 select가 만들어졌을 당시에 library와 kernel에 관련되어 그 이후에도
호환을 이유로 크기가 제한되어있었던걸로.... (확실하지 않습니다. ㅠㅠ)

익명 사용자의 이미지

select가 시스템 콜이니깐 상수변경한 다음에,
커널 컴파일 하고
제가 한번 실험을 해볼께요...

^^;

아 우선 컴파일 안하고 해봐야겠군요.
결과가 나오면 다시 게시판에 올리겠습니다.

익명 사용자의 이미지

/usr/include/linux/posix_types.h의 내용중에서..

/*
* This allows for 1024 file descriptors if NR_OPEN is ever grown
* beyond that you'll have to change this too. But 1024 fd's seem to be
* enough even for such "real" unices like OSF/1, so hopefully this is
* one limit that doesn't have to be changed [again].
*
* Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in
* (and thus ) - but this is a more logical
* place for them. Solved by having dummy defines in .
*/

이거 테스트 할려고 커널 컴파일 까지 다했는데,
지금은 시스템을 내릴수가 없네요..

암튼... 제한이 물리적인게 아니라 소프트웨어적으로
1024개 이상은 필요없다고 생각되어서
상수로 막은것이니깐... 늘려주면 될것 같네여..

익명 사용자의 이미지


Win의 IOCP 같은 건데, 써보신 분들이 괜찮다고 평하시더군요.

쉽고 강력한 것을 얻고 싶으시면 한번 조사해 조시면 좋을 싶습니다.

익명 사용자의 이미지


한참 늦은 얘기지만. )
poll()은 fd set의 제한이 없습니다. set이 아니라
array로 구현되거든요.

익명 사용자의 이미지


asmlinkage long sys_poll(struct pollfd * ufds, unsigned int nfds, long
timeout)
{
int i, j, fdcount, err;
struct pollfd **fds;
poll_table table, *wait;
int nchunks, nleft;

/* Do a sanity check on nfds ... */
if (nfds > NR_OPEN)
return -EINVAL;

^^;
NR_OPEN상수에 의해서 제한 받는게 아닌가요?

익명 사용자의 이미지


NR_OPEN은 fd의 한계입니다. )
어쩔 수 없는거겠죠. fd를 무한게 만들 수 없으니까.

익명 사용자의 이미지

음... 제가 linux쪽의 /usr/include에 대한 지식이 짧아서 그런데요..

This가 언급하는게 머지요? 한 프로세스당 열릴수 있는 화일수인가요? 아님
최대로 열수 있는 화일의 수인가요? 아님 select함수가 동시에 다룰수 있는 fd
의 수인가요? (음.. 영어가 짧아서 죄송합니다..ㅠㅠ)

보통 리눅스 배포판의 경우....하나의 프로세스당 동시에 열수 있는 화일수가
1024로 제한(디폴트로요....^^)이 되어있어서 커널 컴파일 또는 sysctl.conf
를 변경해서 그 수를 늘려주었던 기억이 있는데요... ^^

위의 내용이 select가 동시에 다룰수 있는 fd에 대한 내용인가요?

PS 저의 경우엔 솔직히 리눅스보단 프비가 더 좋더군요... ^^ 좀더 저의
취향에 맞기때문이죠. 그래서인지 노트북이던 데스크탑이던 요즘은 리눅스를
안깔고 프비를 깔기때문에 리눅스의 어떤 디렉토리에 어떤 화일이 있는지를
잘 모릅니다.. 다만 아는 서버에 접속해서 가끔 이것 저것 해보죠.... ^^
리눅스가 좋은 점도 많지만 프비가 좋은 점도 많답니다. ^^

익명 사용자의 이미지

#ifndef _LINUX_POSIX_TYPES_H
#define _LINUX_POSIX_TYPES_H

#include

/*
* This allows for 1024 file descriptors if NR_OPEN is ever grown
* beyond that you'll have to change this too. But 1024 fd's seem to be
* enough even for such "real" unices like OSF/1, so hopefully this is
* one limit that doesn't have to be changed [again].
*
* Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in
* (and thus ) - but this is a more logical
* place for them. Solved by having dummy defines in .
*/

/*
* Those macros may have been defined in . But we always
* use the ones here.
*/
#undef __NFDBITS
#define __NFDBITS (8 * sizeof(unsigned long))

#undef __FD_SETSIZE
#define __FD_SETSIZE 1024

#undef __FDSET_LONGS
#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)

#undef __FDELT
#define __FDELT(d) ((d) / __NFDBITS)

#undef __FDMASK
#define __FDMASK(d) (1UL << ((d) % __NFDBITS))

typedef struct {
unsigned long fds_bits [__FDSET_LONGS];
} __kernel_fd_set;

/* Type of a signal handler. */
typedef void (*__kernel_sighandler_t)(int);

/* Type of a SYSV IPC key. */
typedef int __kernel_key_t;

#include

#endif /* _LINUX_POSIX_TYPES_H */

익명 사용자의 이미지

헐... 그렇군요..

저도 나중에 시간이 나면 kernel compile하고 실험을 해봐야겠습니다..^^

댓글 달기

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