select를 이용한 소켓프로그래밍에서 질문요.

shilf의 이미지

io 멀티플렉싱 모델이라고 책에 나오더라구요
그래서
select를 이용해서
파일 업로드 하는 서버랑 클라이언트를 짜는 중입니다.

제가 이해하기로는
서버에서는 루프를 돌면서
소켓의 io를 체크하고 io가 발생하면
파일 디스크립터의 어떤것인지(어떤 소켓) 체크해서
데이터를 받는것으로 알고 있습니다.

제가 구현하고자 하는것은
큰 용량의 파일을 여러명이 동시에 보내는 것을 처리할수 있는
서버입니다.

지금까지의 생각으로는
io가 발생하는 디스크립터의 수만큼
파일 포인터를 생성하고, 각각 fopen해서
일정량만큼 올라오는 데이터를
각각의 디스크립터와 연결되어있는 파일포인터에 쓰는
그런 방식으로 생각하고 있습니다.
올라오는 데이터의 앞 몇 바이트는 파일 이름등을
보낼 계획입니다.

제가 생각하는 방식에 문제는 없는지.
또는 표준이라든지 무난한, 방식이 없는지 알고 싶습니다.

덧붙여 궁금한게
서버에서 열어주는 포트는
아무래도 상관없는 겁니까?

익명 사용자의 이미지

파일전송이라면, select()를 이용한 io multiplexing 메카니즘보다는 fork/thread를 이용한 프로그램이 훨씬 효율적입니다. 성능면에서...

이 방면에 표준이라고 하면 없다고 생각해도 될것이며, ftp처럼 2개의 포트를 열어서 하는 방법보다는 오히려 1개의 포트를 열어서 처리하는것도 어떤 면에서는 좋겠습니다.

서버에서 열어주는 포트는 당연히 상관이 없겠지요. 당연히, 변경가능하게 코딩하시고요.

shilf의 이미지

select 함수 써서 하는멀티플렉싱이
무조건 좋은줄 알았는데 그것도 아닌가봐요

다시 멀티스레드 모델 공부해서
이래저래 테스트 중입니다.^^;;

답변 갑사합니다~

익명 사용자의 이미지

select/poll/epoll/kqueue등을 이용한 IO Multiplexing기법으로 프로그래밍하는 경우가 유리한 경우도 있습니다. 이를 테면 통신량이 많지않고(파일전송에 비해) 메시지가 오고가는 경우가 많고, 각 클라이언트간에 상호작용이 빈번하게 일어나야하는 경우에 비교적 용이하게 프로그래밍할 수 있습니다.

묵묵히.... 파일전송이라면, 위에서 말씀드린 쓰레드/포크등을 사용한 모델이 더 어울리고, 프로그램을 간소화할 수 있는 방법이 되겠습니다.

물론, 하이브리드도 고려대상이 될 수 있겠습니다.

익명 사용자의 이미지

shilf wrote:
io 멀티플렉싱 모델이라고 책에 나오더라구요
그래서
select를 이용해서
파일 업로드 하는 서버랑 클라이언트를 짜는 중입니다.

제가 이해하기로는
서버에서는 루프를 돌면서
소켓의 io를 체크하고 io가 발생하면
파일 디스크립터의 어떤것인지(어떤 소켓) 체크해서
데이터를 받는것으로 알고 있습니다.

제가 구현하고자 하는것은
큰 용량의 파일을 여러명이 동시에 보내는 것을 처리할수 있는
서버입니다.

지금까지의 생각으로는
io가 발생하는 디스크립터의 수만큼
파일 포인터를 생성하고, 각각 fopen해서
일정량만큼 올라오는 데이터를
각각의 디스크립터와 연결되어있는 파일포인터에 쓰는
그런 방식으로 생각하고 있습니다.
올라오는 데이터의 앞 몇 바이트는 파일 이름등을
보낼 계획입니다.

제가 생각하는 방식에 문제는 없는지.
또는 표준이라든지 무난한, 방식이 없는지 알고 싶습니다.

덧붙여 궁금한게
서버에서 열어주는 포트는
아무래도 상관없는 겁니까?

lovemyin의 이미지

성능면에서 fork/thread 방식이 select 보다 어떤 점에서 효율적이라고 말씀하시는건지 궁금하네요...
클라이언트의 수와 상관없이 fork/thread 방식이 select 방식보다 무조건 효율적인가요???

클라이언트의 수에 따라 서버 모델을 설계할텐데 무조건 좋다는 말씀이 이해가 안되네요...

말씀하신걸 부정하는게 아니라 제가 지식이 모자라 재질문 드리는겁니다.
오해하지 마세요...^^

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

ddoman의 이미지

Anonymous wrote:
파일전송이라면, select()를 이용한 io multiplexing 메카니즘보다는 fork/thread를 이용한 프로그램이 훨씬 효율적입니다. 성능면에서...

이 방면에 표준이라고 하면 없다고 생각해도 될것이며, ftp처럼 2개의 포트를 열어서 하는 방법보다는 오히려 1개의 포트를 열어서 처리하는것도 어떤 면에서는 좋겠습니다.

서버에서 열어주는 포트는 당연히 상관이 없겠지요. 당연히, 변경가능하게 코딩하시고요.

왜 fork/thread가 성능면에서 효율적인가요?
파일서버라면 대부분 병목지점이 I/O 이기 때문에
굳이 select,poll 을 이용해봤자 성능향상이 없다는것 뿐이지

fork/thread가 성능이 더 좋을순 없다고 생각합니다.

물론 위에 말했듯이 파일서버는 대부분 병목이 I/O이기때문에
fork/thread가 개발하기도 편하니 적당합니다.

익명 사용자의 이미지

전형적인 concurrent 프로그램에서 예로 자주 등장하는 파일복사시나리오를
다시 생각해보세요.
* 파일을 읽어서 쓴다! ~지요.
1) 이를 기본적으로 단일 프로그램(1 process or 1 thread)으로 작성할 수 있습니다.

2) 또한, 읽는 프로세스와 쓰는 프로세스를 분리시켜서 코딩할 수 있습니다.
이들(1,2)의 타임라인을 그려서 설명한 예들은 그리 어렵지 않게 찾아 볼 수 있을 것입니다.

* SMP에 대한 고려
요즘 가정용 PC도 Hyperthreading이나, Dual Core등.... 사용합니다.
싱글 프로세스/쓰레드로 코딩한 것과는 좀... 하겠지요?
이를 테면 서버를 4CPU를 사용하는데(별로 비싸지 않지요? 한 2~3백만정도?) 싱글 프로세스의 select/poll/epoll/kqueue등으로 구현했다고 가정하면, 놀고 있을 CPU가 좀 ... 하군요. IO바운드 작업이 다수겠지만 말입니다.

* 성능과 scalability를 고려해 볼때는, Hybrid(짬뽕) 방식도 좋겠지요?

wfellow의 이미지

I/O multiplexing과 fork/thread가 비교 대상일까(?) 의문입니다. 질문자의 의도와는 조금은 핀트가 어긋난 답변들이 보이네요.

read와 write를 thread로 분리해서 처리하든지, 아님 한개의 thread(혹은 fork/exec된 process)에서 처리하든지 그건 구현자의 마음이고, 작업할 시기를 알고자 select를 사용하지 않나여? 다시 말하면 fork/exec나 thread로 구현을 하는 것과 select를 사용하는 것과는 사용 목적으로는 비교 대상이 아닐것 같다는 생각이 듭니다.

글구 SMP와는 상관없는데염..ㅡ.ㅡ

Quote:
왜 fork/thread가 성능면에서 효율적인가요?
파일서버라면 대부분 병목지점이 I/O 이기 때문에
굳이 select,poll 을 이용해봤자 성능향상이 없다는것 뿐이지

fork/thread가 성능이 더 좋을순 없다고 생각합니다.

물론 위에 말했듯이 파일서버는 대부분 병목이 I/O이기때문에
fork/thread가 개발하기도 편하니 적당합니다.

ddoman님이 정밀(?)하게 이유를 달아 주셨네여^^

-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----

댓글 달기

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