[완료] select socket write 를 할 때 CPU 사용률을 줄이고 싶습니다...
글쓴이: jos77 / 작성시간: 화, 2009/02/17 - 10:30오후
select 를 써서 write 를 하게 되면
1byte 라도 쓸 수 있게 되면 바로 넘어가버리더군요.
소스입니다
while (1)
{
select (max_fd , &read , &write , NULL , NULL);
if (send_buf > 0)
send ( ... )
}
select 에서 기다리지 않고 계속 무한루프로 돌아가서 CPU 사용률이 100%로 올라가게 되더군요
프로세스 성격상 timeout 을 설정할 수도 없고 그렇다고 send 를 호출하는 여러 해당 프로세스에서
각자 send() 를 호출해버리면 writable 이 문제가 되기 때문에 어떻게 해야 할지 고민입니다.
조언 부탁드립니다.
Forums:
timeout 값을 설정하는
timeout 값을 설정하는 것이 좋을 것 같은데....
프로세스 성격상 timeout을 설정하지 못한다고 하셨는데, 이에 대한 자세한 설명이 가능할까요?
정말 timeout 을 사용할 수 없다면, [int sched_yield(void);]를 사용하는 것도 하나의 방법이긴 한데...
select 를 여러개 써서 해결중...
응답이 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
네, send와 recv는
네, 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관한 정보의 싱크를 잘 해야하겠네요.
감사합니다.
안그래도 pipe 하나 더 쓸까 하고 있었는데 select 랑 연동시키는 방식이 괜찮은 방식인지 몰라서 고민하고 있던 참입니다
답변 감사합니다~ ^^
-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr
댓글 달기