2012-11-07 3 views
2

서버/클라이언트 설정에서 나는 다른 소켓의 소수 (현재 4)에 클라이언트와 연결되어있는 서버를 가지고있다. 지금은 계산 된 set_size를 사용하여 select를 사용하지만, FD_SETSIZE를 사용하는 것이 가치가 있기 전에 상한값은 무엇입니까?FD_SETSIZE 대 계산 된 값

다음은 요점을 설명하기위한 몇 가지 코드 예제입니다.

set_size = MAX(socket1, socket2); 
set_size = MAX(set_size, socket 3); 
set_size = MAX(set_size, socket4); 
set_size += 1; 

그리고 사용은 : :

while ((cnt = select(set_size, &set, NULL, NULL, &t)) != -1 || errno == EINTR) { 
    if (cnt > 0) 
     // Do different stuff depending what socket is active 
    else 
     // Keep everything alive and add the sockets to the set again 
} 

최근에 나는 두 개의 새로운 소켓을 추가했다 나는 수도

여기
FD_ZERO(&set); 
FD_SET(socket1, &set); 
FD_SET(socket2, &set); 
FD_SET(socket3, &set); 
FD_SET(socket4, &set); 

가 set_size 계산하는 방법이다 : 첫 번째 세트를 구축 앞으로 더 추가해야합니다. 계산 된 set_size와 반대로 FD_SETSIZE를 사용 하시겠습니까?

답변

1

처음에는 select()을 사용하여 성능 저하에 비해 매우 작은 차이가 나는 것처럼 보였으므로 걱정하지 않았습니다.

그것을 계산하는 매우 고가 아니기 때문에, 나는 항상 정확한 값을 계산 가치가 있다고 생각했다 가졌 : 당신이 제안으로 로컬 변수에 현재 set_size을 유지하는 경우, 그것은 아주와 O (1)있어 fd를 추가 할 때마다 낮은 상수 (즉, 비교 및 ​​가능한 업데이트). fd를 제거하는 작업은 O (1)이며 목록의 마지막 것입니다 (이 경우 O (set_size)이지만 일반적으로 더 좋음). 반면에 set_size을 계산하지 않으면 커널이 개의 항목을 모두 트래버스해야 함을 의미합니다 ( select). set_size은 아마도 FD_SETSIZE보다 약간 작으므로 더 작은 값을 제공해야합니다. set_sizeFD_SETSIZE에 가까울지라도 set_size을 계산하는 것은 매우 싸기 때문에 거의 항상 가치가 있습니다.

물론 성능이 걱정된다면 대신 이 필요합니다. 더 좋은 점은 epollkqueue을 살펴볼 필요가 있다는 것인데,이 기능은 Linux와 FreeBSD (MacOS 포함)에서만 사용할 수 있기 때문에 이식성이 없다는 점이 다릅니다.

+0

감사합니다. 정말 좋은 설명입니다. 지금은 성능에 대해 너무 걱정하지 않지만 소프트웨어 사용이 늘어남에 따라 성능이 향상 될 수 있습니다. 이를 염두에두고 어디서부터 시작해야 할지를 아는 것이 좋습니다 :) –