[질문] 서버 프로그래밍에서 다중 클라이언트들의 메세지 처리에

익명 사용자의 이미지

안녕하세요.
결국 질문하게 되는군요.
혼자 공부하는 상황에서.. 마땅한 답변을 찾을 수
있는 곳이 몇군데 되지 않는 현실이 안타깝습니다.

다름이 아니고, 제가 리눅스에서 GNU C를 이용하
여 socket을 이용한 채팅 프로그램을 구현해보고
자 하였습니다. 하지만, 여러가지 의문사항이 발
생되는군요. 특히 궁금해지는 것은, 서버에 접속
한 여러개의 클라이언트 소켓들에게서 전달되는
데이터들을 효율적으로 처리할 방법이 쉽게 떠오
르지 않습니다. 이것이 경험 부족이라는 것을 느
끼고 있는데요.

저의 짧은 지식으로는, select()를 사용한 블로
킹 방식으로 변화가 생길때마다 한번의 루틴을 실
행하여, 발생된 입력을 감지하여 처리하는 방식을
사용하고 있습니다.

하지만, 여러 클라이언트들에게서 동시 다발적인
메세지가 발생할 경우, 서버가 반복적인 루틴으로
인하여 과부하 또는 딜레이가 발생될 것으로 생
각이되는데요, 실전 프로그래밍에서는 이런 문제
점을 어떤 방식으로 해결하는지 궁금하더군요.

현재 저의 주변에는 블로킹을 이용하는 간단한 소
스밖에 없는 처지라서, 마땅히 분석할 만한 자료
도 없는 실정입니다. 부디, 자세한 설명으로 저의
궁금증을 명쾌히 풀어주실 선배님의 도움을 바라
겠습니다.

관심 가져 주셔서 감사합니다.

익명 사용자의 이미지

http//www.chonga.pe.kr/computer/linux/highperfsvr/

이곳도 참고해보세요.

익명 사용자의 이미지

iron, 배성남 님.

많은 도움을 주셔서 감사합니다.

주말에 인터넷을 못해서 지금 보게 되었군요.

늘 행복하세요. ;)

익명 사용자의 이미지

여러가지 방법론이 있을 수 있겠죠;;

제가 님과 같은 고민을 할때 본 자료들입니다.
참고가 되었으면 하네요

The C10K problem
http//www.kegel.com/c10k.html

Scalable Network I/O in Linux
http//www.citi.umich.edu/techreports/reports/citi-tr-00-4.pdf

I/O Event Handling Under Linux
http//www.atnf.csiro.au/people/rgooch/linux/docs/io-events.html

Projects Linux scalability
http//www.citi.umich.edu/projects/linux-scalability/

ps.
제가 본 이상적인 서버솔류션은 엔티계열의
IOCP란 기술인데, 비동기적인 이벤트 발생과 이것을 처리하는
쓰레드 풀을 구성하는 것이 대략적인 요약입니다.

리눅스에선 엔티의 경우처럼 비동기와 쓰레드풀을
커널레벨에서는 지원하지 않고(제가 아는 지식에선)
select같은 멀티플랙싱과 직접 구현한 쓰레드 풀을
사용하는 방법이 있겠지요 ( 흐흐 시간이 흘러서
좀더 공부를 많이 한 다음에 리눅스에서 iocp같은
io모델을 만들어 보고 싶군요 ^^)

그리고 select나 poll을 사용하시면
그냥 예제처럼 사용하시는 것 보담은,

http//freshmeat.net/projects/libevent/?topic_id=809
이런식으로 랩핑을 해서 사용하시면 보다 효과적으로
사용하실수 있습니다.

마지막으로 한가지만 덧 붙이면,
ADAPTIVE Communication Environment (ACE)
http//www.cs.wustl.edu/~schmidt/ACE-overview.html
이런 공개소스 기반의 프레임 워크도 있으니깐
요것도 분석해보면 나름의 노하우가 생기지 않을까 싶네요;;

댓글 달기

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