udp 패킷 recv 시 select 와 poll 의 차이점 ???

air74의 이미지

안녕하세요.

하나의 소켓에 대하여 recv시 blocking 을 피하기 위하여 현재는 poll(pollset, ct , 0)을 사용 하였습니다.

/*설정된 횟수 만큼 루프를 돌면서 가능한한 모든 메세지 수신한다. */
while (loop_count < thresh){ 
  events = poll(pollset, ct , 0 ); /* no blocking */
  if (events > 0) {
      rval = recvmsg(sn_xudp.fd, &msg_hdr, 0);
      queuing_msg(); /*-> 수신한 메세지 큐잉 */  
  }
  loop_count++;
}

여기서 질문 드립니다.

1. 시스템 성능상에서 보면 poll 대신에 select 쓰는 것이 잇점이 있을까요? (select 가 poll 보다 시스템 리소스를 적게 사용 한다는지?)
어차피 블락킹을 피하기 위한 것이니 예를 들면
select(n, *readfds, *writefds, *exceptfds, *timeout -> 타임아웃을 0 );

2. 비슷하지만 다른 질문 입니다. 위에서 poll 을 빼고 recvmsg(sn_xudp.fd, &msg_hdr, MSG_DONTWAIT); 로 바꾸어서 구현을 해보았더니 stack over flow 가 나는거 같더라구요. ?
소켓 버퍼가 풀나는거 같습니다. 추축컨데... 원래 그런것인가요? 아래는 소스 입니다.

void getting_events_from_network(void) {    
  struct sockaddr_in msg_addr;
  struct iovec  msg_iovector[MSG_IOVECTOR_NUM]; /* always two */
  struct msghdr msg_hdr;

  sn_msg_message *msg; /* possible compile ??? */

  int rval;
  int msg_addrlen;
  int loop_count;
  int xgw_loop_count;

  char in_buff_head[HEAD_BUFFER_SIZE];  /* -> for msg header */
  char in_buff_data[DATA_BUFFER_SIZE];  /* -> for msg data   */

  memset(in_buff_head, 0, HEAD_BUFFER_SIZE);
  memset(in_buff_data, 0, DATA_BUFFER_SIZE);

  msg_iovector[0].iov_base= in_buff_head;   /* msg_header size predefined */
  msg_iovector[0].iov_len = HEAD_BUFFER_SIZE;
  msg_iovector[1].iov_base= in_buff_data;
  msg_iovector[1].iov_len = DATA_BUFFER_SIZE;

  msg_addrlen = sizeof(msg_addr);

  bzero(&msg_hdr, sizeof(msg_hdr));
  msg_hdr.msg_name = &msg_addr;
  msg_hdr.msg_namelen = msg_addrlen;
  msg_hdr.msg_iov = msg_iovector;
  msg_hdr.msg_iovlen = MSG_IOVECTOR_NUM;

  loop_count = 0;

  while(loop_count < xgw_loop_count)
  {

  rval = recvmsg(sn_xudp.fd, &msg_hdr, MSG_DONTWAIT);  /* asyncronous msg redving */

  if (rval > 0) {
      process_msg(msg_hdr);
  }
  loop_count++;
  }
hanzo69의 이미지

흠... 그리고 msg_control 이 제대로 초기화안된게 원인이 아닐까 하네요.

그런데 udp포트를 몇개나 여시는지는 몰라도.. 보통 udp포트는 그리 많이 열지 않을텐데요.
저같은 경우 udp 포트에 대한 이벤트 대기는 udp 소켓당 recvfrom 블러킹을 들어갈 쓰레드 하나를 잡아서 처리합니다. 굳이 이벤트 검출하거나 할 필요가 없으니까요.
send의 경우 tcp처럼 wouldblock 이 걸리는 것도 아니고, connect를 받는 것도 아니니.. udp 포트를 몇십개 씩 열지 않는 이상은...

블러킹을 피하기 위해 이벤트 검사 루프를 돌리면 그만큼 다른 쓰레드의 시간을 대기에 빼앗게 되며, 불필요한 cpu 점유율을 잡아먹게 되니까요.

님ㅎ 즐~

댓글 달기

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