Linux의 기본 개념인 열린 파일 제한을 이해하는 데 도움이 필요합니다. 특히 오픈 소켓이 시스템의 총 "열린 파일" 수에 포함되는 이유가 무엇인지 혼란스럽습니다.
왜 그런지 자세히 설명할 수 있는 사람이 있나요? 나는 이것이 아마도 Linux의 "모든 것이 파일이다"라는 원칙 전체로 돌아가는 것을 알고 있지만 추가 세부 사항이 있으면 크게 감사하겠습니다.
답변1
"파일 열기" 제한은 실제로 파일에만 적용되는 것이 아닙니다. 수량제한입니다커널 핸들단일 프로세스를 동시에 사용할 수 있습니다. 역사적으로 프로그램은 종종 많은 수의 파일을 열었으므로 이는 열린 파일 수에 대한 제한으로 알려져 있습니다. 제한을 설정하면 프로세스에서 많은 수의 파일을 열거나 실수로 해당 파일을 닫는 것을 잊어버려 결국 시스템 전체에 문제가 발생할 수 있는 상황을 방지할 수 있습니다.
소켓 연결은 커널 핸들이기도 합니다. 따라서 동일한 제한 사항이 동일한 이유로 적용됩니다. 즉, 프로세스가 네트워크 연결을 열고 닫는 것을 잊어버릴 수 있습니다.
주석에서 지적했듯이 커널 핸들은 전통적으로 호출됩니다.파일 설명자유닉스 계열 시스템에서.
답변2
이유TCP/IP 소켓이 파일 설명자를 사용하는 이유글쎄, 소켓 인터페이스가 처음 설계되고 구현되었을 때(BSD 유닉스, 1983), 디자이너는 네트워크 연결을 파일과 유사하다고 간주했습니다. , , 및 둘 다 가능하며 read
" write
모든 close
것이 파일입니다"라는 Unix 철학에 잘 맞습니다.
다른 TCP/IP 네트워크 스택 구현은 반드시 운영 체제의 파일 I/O 하위 시스템과 통합되지는 않습니다.MacTCP. 그러나 BSD 소켓 인터페이스가 매우 인기가 있기 때문에 이러한 다른 구현조차도 Unix와 유사한 기능을 사용하여 소켓 API를 복제하도록 선택했기 때문에 시스템에 있는 동안 TCP/IP 통신에만 사용되는 "파일 설명자"를 얻게 됩니다. 파일 설명자가 있습니다.
질문의 다른 부분은왜 제한사항이 있나요?파일 설명자 조회 테이블을 구현하는 가장 빠른 방법은 배열을 사용하는 것이기 때문입니다. 역사적으로 이 제한은 커널에 하드코딩되었습니다.
다음은 프로세스당 20개의 파일 설명자로 하드 코딩된 제한이 있는 Unix 릴리스 7(1979)의 코드입니다.
이와 대조적으로 Linux는 프로세스의 파일 설명자 테이블에 공간을 동적으로 할당합니다. 절대 제한의 기본값은 8192이지만 원하는 값으로 설정할 수 있습니다. 내 시스템은 /proc/sys/fs/file-max
.
- 파일 시스템/file.c:
alloc_fdtable()
- FDTable.h:
struct fdtable
- FS.h:
#define NR_FILE 8192
Linux에는 더 이상 절대적인 제한이 없지만 프로그램이 중단되는 것을 원하지 않으므로 관리자(또는 배포 패키지 작성자)는 종종 리소스 제한을 설정합니다. 보거나 /etc/security/limits.conf
달리세요 ulimit -n
.
답변3
파일은 디스크나 메모리에 있는 단순한 파일이 아니라 데이터 스트림입니다. 이는 단지 두 가지 예일 뿐입니다.
원격 끝점은 세 번째 예이며, 소켓을 사용하여 원격 끝점과 상호 작용할 수 있습니다.