~에서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
구현 세부 정보를 노출하여 더 빠르게 만듭니다.
- BSD 4.4 Lite 선택 소스 코드(스캔 기능 선택 및 선택)
- Linux 2.6.37 소스 코드 선택(do_select 및 max_select_fd 함수)
답변2
나는 select()의 디자이너가 아니기 때문에 잘 모르겠지만 성능 최적화라고 말하고 싶습니다. 호출 함수는 읽기, 쓰기, 분할 FD에 얼마나 많은 파일 설명자를 넣는지 알고 있는데 왜 커널이 이를 다시 알아내야 할까요?
1980년대 초에 select()가 도입되었을 때 다중 기가헤르츠, 다중 프로세서를 사용할 수 없었음을 기억하십시오. 25MHz VAX는 상당히 빠릅니다. 또한 select()가 빠르게 작동하기를 원합니다(가능하다면). 일부 I/O가 프로세스를 기다리고 있다면 왜 프로세스를 기다리게 할까요?