[완료] select socket write 를 할 때 CPU 사용률을 줄이고 싶습니다...

jos77의 이미지

select 를 써서 write 를 하게 되면

1byte 라도 쓸 수 있게 되면 바로 넘어가버리더군요.

소스입니다

while (1)
{
select (max_fd , &read , &write , NULL , NULL);

if (send_buf > 0)
send ( ... )

}

select 에서 기다리지 않고 계속 무한루프로 돌아가서 CPU 사용률이 100%로 올라가게 되더군요

프로세스 성격상 timeout 을 설정할 수도 없고 그렇다고 send 를 호출하는 여러 해당 프로세스에서

각자 send() 를 호출해버리면 writable 이 문제가 되기 때문에 어떻게 해야 할지 고민입니다.

조언 부탁드립니다.

ssehoony의 이미지

timeout 값을 설정하는 것이 좋을 것 같은데....
프로세스 성격상 timeout을 설정하지 못한다고 하셨는데, 이에 대한 자세한 설명이 가능할까요?
정말 timeout 을 사용할 수 없다면, [int sched_yield(void);]를 사용하는 것도 하나의 방법이긴 한데...

jos77의 이미지

응답이 UI 처럼 제때 제때 나가야 하는 프로세스라서요.
job 이 오면 이를 처리하고, 처리한 결과를 다시 return 하는데
job 이 항상 날아오는 것만이 아니라 프로세스가 자기가 직접 생성한 send 를 보내야 할 때도 있습니다.
send / recv 를 하나의 select 로 처리하려니 read set / write set 을 구현하는데 있어서 CPU 100% 를 피할 수가 없구요

send 를 각각 프로세스에서 fd 를 넘겨받아 따로 보내려고 하는데 socket 이 recv 도중에 send 하게 될 수도 있으니 괜찮을지 걱정입니다.
각각의 프로세스에서 select 를 쓰자니 좀 이상할 것 같은데 자기 fd 의 write set 만 확인하는 방법 같은 건 없을까요?

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

ssehoony의 이미지

네, send와 recv는 동시에 해도 상관 없습니다.
한 쓰레드로 select를 이용해 recv하고 있다가, send해야 할게 발생 했을 때 즉시 send하고 싶은데 select로 인해 timeout 시간동안 blocking 되어 있는 것이 걱정인가 보군요.

해결 방법 중 하나는 select로 대기하고 있는 쓰레드에 alarm 시그널을 보내면 select는 EINTERRUPT를 리턴하면서 blocking 상태에서 빠져 나옵니다. 이렇게 시그널을 이용하는 방법을 생각해 볼 수 있겠네요.

그게 아니면, socketpair 나 pipe 등으로 임의의 fd를 하나 만들고 이 것 역시 select 에서 같이 모니터링 합니다.
send할게 발생했을 때 임의로 만든 fd에 뭔가를 기록해서 select로 blocking되어 있는 녀석을 깨울 수도 있습니다.

또는 생각하시는데로, send와 recv를 두개의 쓰레드로 분리 할 수도 있겠네요.
이 경우는 fd가 동일하므로 두 쓰레드간의 fd관한 정보의 싱크를 잘 해야하겠네요.

jos77의 이미지

안그래도 pipe 하나 더 쓸까 하고 있었는데 select 랑 연동시키는 방식이 괜찮은 방식인지 몰라서 고민하고 있던 참입니다
답변 감사합니다~ ^^

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

댓글 달기

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