read 우선순위.. ?? ( select )

yangsg의 이미지

sockfd1, sockfd2 생성.
select ()
    sockfd1일 경우
     - read watch thread 생성.
     - write watch thread 생성.( sockfd2 접속 시까지 대기.. )
    sockfd2일 경우
     - read watch thread 생성.
     - write watch thread 생성.( sockfd1 접속 시까지 대기.. )

socket 두개를 읽고 쓰고 감시할려고 합니다..

질문1. 저렇게 구성할 경우 select에서 read를 먼저하는지 아니면 read 감시 thread에서 read를 먼저하는지 우선순위를 어떻게 보장받나요 ??

질문2. 위와 같이 구성하여 sockfd1에서 sockfd1으로 혹은 sockfd2로 혹은 sockfd1, 2로 write(반대의경우도 마찬가지) 가능할까요 ?

pynoos의 이미지

select와 thread는 둘 중 하나를 선택하는 방식으로 설계하는 것이 보통입니다.
즉, 하나의 쓰레드에서 두 개를 동시에 감시할 때는 select, 전담하여 쓰레드 마다 하나의 소켓을 감시하게 할 때는 멀티 쓰레드로 사용하는 것입니다.

하나의 쓰레드에서 select 함과 동시에 다른 쓰레드에서 read 대기를 한다는 것은 서로 경쟁하기 때문에 우선순위 보장이 없습니다.

하나의 쓰레드에서 다른 쓰레드가 가지고 있는 소켓에 직접 write하는 것은 가능합니다. 그럴려고 쓰레드 쓰는 것이죠. :)

rasungboy의 이미지

스레드로 나누실려고 하시는것 같은데

저같은경우는 이벤트 감지 스레드와

쓰기 스레드, 읽기 스레드, 접속처리 스레드로 나누어

사용합니다.

이벤트감지 스레드에서는 select 로 주어진 fdset 의

이벤트가 왔나 검사하고 각 이벤트별로

쓰기 스레드, 읽기 스레드, 접속처리 스레드의 메세지큐에

에빈트가 발생한 소켓을 넣어줍니다.

보통 스레드로 나눌때 이런식으로 처리하는걸로 압니다.

yangsg의 이미지

우선 답변 감사드립니다..

제가 처음에 생각했던것은 우선순위보장이 안되므로 포기하였구요..
개념이 없어 잘못 생각했던거 같습니다..
머 강제로 돌아가게 할려면 소스가 지저분 해질꺼 같아서..
쓰레드당 하나 접속으로 처리하였습니다..

접속처리 쓰레드를 만들고.. 접속이 들어왔을 시에..
쓰레드 하나당 fd를 관리하도록 만들었습니다...
이럴경우 동시접속 얼마나 처리가 가능할지... 조금 의문이 되는군요...

pynoos의 이미지

동시 접속 처리는 쓰레드 생성 최대 개수와 상관있습니다. linux에서는 1024 인가요?
그리고, 간혹 stack 사이즈와 관련되어 더이상 새로이 stack을 만들수 없을 때도 문제가 생깁니다.

일반적으로 하나의 쓰레드에서 여러 소켓을 관리하는 것과 전담하는 쓰레드로 구현하는 것의 차이는, 멀티플렉싱을 스케쥴링하는 것을 직접 구현할 것인지 시스템의 라이브러리에 이관할 것인지의 차이를 가져옵니다.

사용자의 쓰레드 관련 함수들이 커널레벨로 구현될 경우(리눅스, 윈도우즈의 경우) 커널에 디스크립터간 스케쥴에 대한 비용을 이관하는 것이며, select로 처리하는 경우 사용자 공간에서 직접 스케쥴을 하는 것이 되는 것의 차이인데

소켓에서 데이터량이 많은 경우와 많지 않은 경우에 따라 각각의 비용은 달라 집니다.

데이터량이 많아지면, 모든 소켓이 바쁜 상태이므로 쓰레드를 쓰는 장점이 충분히 살아나는 반면, 데이터량이 적을 경우 쓰레드를 스케쥴링하는 비용이 들어가게 되므로 select를 통한 단일 쓰레드가 더 효율적이게 됩니다.

따라서 데이터 량이 적은 소켓이 많은 상황이라면, pth 같은 user level 쓰레드가 더 좋은 선택으로 선호하는 사람도 있습니다.

댓글 달기

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