시스템 호출의 첫 번째 매개변수를 선택하는 목적은 무엇입니까?

시스템 호출의 첫 번째 매개변수를 선택하는 목적은 무엇입니까?

~에서man select

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);

nfds는 세 세트 중 가장 높은 번호의 파일 설명자에 1을 더한 것입니다.

nfds파일 설명자를 결정할 수 있는 , 및 가 이미 있을 때 readfds, 및 writefds의 목적은 무엇입니까 ?exceptfds

답변1

존재하다"UNIX 환경의 고급 프로그래밍", W. Richard Stevens는 이것이 성능 최적화라고 말합니다.

관심 있는 가장 높은 설명자를 지정함으로써 커널은 열린 비트를 찾기 위해 세 가지 설명자 세트에서 사용되지 않은 수백 개의 비트를 탐색하는 것을 방지합니다.

(초판, 399쪽)

어떤 유형의 UNIX 시스템 프로그래밍을 하고 있다면 APUE 책을 적극 권장합니다.


고쳐 쓰다

An은 fd_set일반적으로 최대 1024개의 파일 설명자를 추적할 수 있습니다.

fds어떤 설정이 무엇인지 추적하는 0가장 효율적인 방법 1은 비트 세트이므로 각 fd_set설정은 1024비트로 구성됩니다.

32비트 시스템에서 long int(또는 "단어")는 32비트이므로 각 단어가 1024/32 = 32단어임을 의미 fd_set합니다
.

많은 애플리케이션에서와 같이 8이나 16과 같이 작은 숫자 인 경우 nfds첫 번째 단어만 보면 되는데, 이는 32개 단어를 모두 보는 것보다 확실히 더 빠릅니다.

( 플랫폼의 가치를 확인 FD_SETSIZE하고 __NFDBITS알아보세요 .)/usr/include/sys/select.h


업데이트 2

함수 서명이 아닌 이유는

int select(fd_set *readfds, int nreadfds,
           fd_set *writefds, int nwritefds,
           fd_set *exceptfds, int nexceptfds,
           struct timeval *timeout);

내 생각엔 코드가 모든 매개변수를 유지하려고 하기 때문인 것 같습니다.등록하다, CPU가 더 빠르게 처리할 수 있도록, 추가 2개 변수를 추적해야 하는 경우 CPU에 레지스터가 충분하지 않을 수 있습니다.

즉, select구현 세부 정보를 노출하여 더 빠르게 만듭니다.

답변2

나는 select()의 디자이너가 아니기 때문에 잘 모르겠지만 성능 최적화라고 말하고 싶습니다. 호출 함수는 읽기, 쓰기, 분할 FD에 얼마나 많은 파일 설명자를 넣는지 알고 있는데 왜 커널이 이를 다시 알아내야 할까요?

1980년대 초에 select()가 도입되었을 때 다중 기가헤르츠, 다중 프로세서를 사용할 수 없었음을 기억하십시오. 25MHz VAX는 상당히 빠릅니다. 또한 select()가 빠르게 작동하기를 원합니다(가능하다면). 일부 I/O가 프로세스를 기다리고 있다면 왜 프로세스를 기다리게 할까요?

관련 정보