select 사용시 cpu 점유율은?

익명 사용자의 이미지

프로그램이 대충,

main()
{
while(1)
{
accept();
thread_create(socket_thread);
}

}

socket_thread()
{
select();
recv();
send();
}

와 같이 되어 있는데, select()의 timeout인자가 NULL일

경우에는 문제가 없지만, 시간을 설정하고, 접속을 하면

바로 cpu 점유율이 100%가 되어 버립니다. 3~4개 정도 달라

붙으면 로드가 3~4까지 계속 올라갑니다. cpu가 p4-1.6G라서

cpu가 딸릴 일도 아닌데..

다른 사람은 어떤지 궁금합니다. 해결책이나 다른 방법도.. ^^

익명 사용자의 이미지

timeout 값이 0이라면야... CPU를 엄청 사용하게됩니다.

중간에 select에 들어가기 전에 usleep 을 적당히 호출해주시면

상당히 떨어집니다. 그럼고운 하루...

익명 사용자의 이미지

select의 timeout인자가 null이면 무한 대기 입니다...

timeout is an upper bound on the amount of time elapsed
before select returns. It may be zero, causing select to
return immediately. If timeout is NULL (no timeout), select
can block indefinitely.

아마도 원 질문자의 timeout 셋팅이 잘못되서 그런거 같습니다.
timeout셋팅하는 부분을 체크해봐야 겠군요,,

익명 사용자의 이미지

혹시나 잘못 생각하실 분들이 있을까봐 적습니다.

select 의 경우 다섯 번째 인자로 struct timeval 구조체의 포인터가

들어가게 됩니다.

struct timeval waitTime;

select( , , , , &waitTime );

위와 같이 사용하게 됩니다.

만약 여기서 select( , , , , NULL );을 사용하게 되면

어떤 이벤트가 발생할 때 까지 무한정으로 대기하게 됩니다.

그런데, waitTime 의 tv_sec 과 tv_usec 을 0으로 주게되면

0의 시간 만큼 기다리게 되기 때문에 CPU를 엄청 잡아먹게 됩니다.

그럼 고운 하루되시길... ^^

익명 사용자의 이미지

..

익명 사용자의 이미지

select man page를 보면 이런 말이 있는데..

On Linux, timeout is modified to reflect the amount of time not slept; most other implementations do
not do this. This causes problems both when Linux code which reads timeout is ported to other oper?
ating systems, and when code is ported to Linux that reuses a struct timeval for multiple selects in
a loop without reinitializing it. Consider timeout to be undefined after select returns.

처음엔 이말이 무슨 의미인지 잘 몰랐습니다.

int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval;

/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;

while (1) {
retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */

if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n");

}
exit(0);
}

이런식으로 select를 사용을 하면 select가 리턴을 할때 tv의 값을
변경을 시킵니다. (지정한 5초에서 사용된 시간...)
그래서 while루프를 돌다보면 tv값이 계속 작아져서 결국 0에 이르게 되거든요..

요것 주의하셔야 해요..
tv값은 while안에서 설정해주시는게 좋아요..

질문하신 님도 이런 경우가 아닐지... 싶네요..

익명 사용자의 이미지

두분 답변 모두 감사드립니다.

둘다 모르는 내용은 아니었는데, 제가

간과하고 있었습니다.

딴에는 최적화한다고 while()밖에서 값을 설정했었는데,

while()안에서 시간을 설정하니까 문제가 없어졌습니다.

다시한번 더 감사~~~ ^^

댓글 달기

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