Linux에서 fd의 전체 이름은 "파일 설명자"이고 중국어 이름은 "파일 설명자"입니다. 이는 열린 파일을 효율적으로 관리하기 위해 커널이 생성한 인덱스입니다. 정수, 사용 열린 파일을 참조하기 위해 I/O 작업을 수행하는 모든 시스템 호출은 파일 설명자를 통해 구현됩니다.
이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.
리눅스에서 fd의 전체 이름은 "파일 설명자"이고, 중국어 이름은 "파일 설명자"입니다. 파일 설명자는 음수가 아닌 정수이며 본질적으로 인덱스 값입니다(이 문장은 매우 중요합니다).
우리는 Linux 시스템의 모든 것이 파일로 간주될 수 있으며 파일은 일반 파일, 디렉터리 파일, 링크 파일 및 장치 파일로 나눌 수 있다는 것을 알고 있습니다. 이러한 소위 파일을 조작할 때 조작할 때마다 이름을 찾아야 하므로 많은 시간과 효율성이 소모됩니다. 따라서 리눅스에서는 각 파일이 인덱스에 해당한다고 규정하고 있기 때문에 파일을 조작하고 싶을 때 직접 인덱스를 찾아 조작하면 된다.
파일 설명자는 열린 파일을 효율적으로 관리하기 위해 커널에서 생성한 인덱스입니다. I 시스템의 모든 실행은 /를 호출하는 데 사용됩니다. O 작업은 파일 설명자를 통해 구현됩니다. 동시에 시스템이 방금 시작되면 0은 표준 입력, 1은 표준 출력, 2는 표준 오류라고 규정되어 있습니다. 즉, 이때 새 파일을 열면 해당 파일 설명자는 3이 되고, 다른 파일을 열면 파일 설명자는 4가 됩니다...
리눅스 커널에는 열려 있는 모든 파일에 대한 파일 설명이 있습니다. 각 파일 디스크립터 사이의 관계를 인덱스로 저장하는 디스크립터 테이블, 간단히 이해하면 아래와 같은 배열입니다. 파일 디스크립터(인덱스)는 파일 디스크립터 테이블에 있는 배열의 첨자입니다. 콘텐츠는 열린 파일을 하나씩 가리키는 포인터입니다.
위 내용은 단순한 이해일 뿐입니다. 실제로 파일 설명자와 관련하여 Linux 커널은 3가지 데이터 구조를 유지합니다.:
Linux 프로세스가 시작된 후 커널 공간에 PCB 제어 블록이 생성됩니다. PCB 내부에는 현재 사용 가능한 모든 파일 설명을 기록하는 파일 설명자 테이블이 있습니다. 프로세스 기호, 즉 현재 프로세스의 열려 있는 모든 파일입니다. 프로세스 수준 설명자 테이블의 각 항목은 단일 프로세스에서 사용하는 파일 설명자에 대한 정보를 기록합니다. 프로세스는 서로 독립적입니다. 한 프로세스가 파일 설명자 3를 사용하면 다른 프로세스도 3를 사용할 수 있습니다. 프로세스 수준 파일 설명자 테이블 외에도 시스템은 열린 파일 테이블과 i-노드 테이블이라는 두 개의 다른 테이블도 유지 관리해야 합니다. 이 두 테이블은 열려 있는 각 파일의 열린 파일 핸들을 저장합니다. 열린 파일 핸들은 열린 파일과 관련된 모든 정보를 저장합니다.
시스템 수준 열린 파일 설명자 테이블:
파일 시스템의 i-노드 테이블:
파일 설명자, 열린 파일 핸들 및 i-노드 간의 관계는 아래와 같습니다.
즉, 동일한 프로세스의 서로 다른 파일 설명자가 동일한 파일을 가리킬 수 있습니다. 서로 다른 프로세스의 동일한 파일 설명자가 서로 다른 파일을 가리킬 수 있습니다. 세 개의 특수 파일(0, 1, 2) 외에도 서로 다른 프로세스의 서로 다른 파일 설명자가 동일한 파일을 가리킬 수도 있습니다.
Linux에서 파일 열기 예
예를 들어 Linux에서 vim test.py를 사용합니다. 파일을 열고 열어 둔 다음 새 셸을 열고 pidof vim Get 명령을 입력합니다. vim 프로세스 pid 번호를 입력한 다음 ll /proc/$pid/fd를 입력하여 vim 프로세스에서 사용하는 파일 설명자 목록을 확인하세요.
/dev/pts은 원격 로그인(telnet, ssh 등) 후 생성된 콘솔 장치 파일이 있는 디렉터리입니다. Xshell을 통해 원격으로 로그인했기 때문에 표준 입력 0, 표준 출력 1, 표준 오류 2의 파일 설명자는 모두 가상 터미널 콘솔 /dev/pts/6을 가리킵니다. 아래 새로 열린 test.py의 파일 디스크립터를 보면 4로 나와 있습니다. 3부터 시작하는 데 동의하셨나요?
이 문제로 오랫동안 고민했는데, 결국 큰 상사의 도움으로 포럼에서 그 이유를 찾았습니다. 중국어로 찾을 수 없으면 한 번 시도해 보세요. 영어 검색. vim과 같은 편집기의 원칙은 먼저 소스 파일을 열고 복사한 다음 소스 파일을 닫은 다음 자신의 복사본을 여는 것입니다. 파일을 수정하고 저장한 후 복사본의 이름을 직접 바꾸고 소스 파일을 덮어씁니다. 따라서 소스 파일을 열 때 파일 설명자 3를 사용한 다음 파일 설명자 4를 사용할 차례입니다. 그런 다음 소스 파일을 닫으면 파일 설명자 3가 해제됩니다. 확인해 보면 4만 남는데, 이는 vim이 만든 복사본 파일을 가리킵니다. 이것은 단지 일반적인 아이디어일 뿐입니다. vim - Oort Nebula Ambassador의 구현 원리를 더 자세히 알아보기 위해 다음은 당시 제가 본 포럼의 정보 스크린샷입니다. 링크는 여기입니다.
믿을 수 없다면 꼬리와 같은 다른 프로세스를 시도해 볼 수 있습니다.
Linux에서 tail -f test.py를 사용하여 파일을 엽니다. 파일을 열어 둔 다음 새 셸을 열고 pidof tail 명령을 입력합니다. tail 프로세스의 pid 번호를 가져온 다음 ll /proc/$ pid/fd tail 프로세스에서 사용하는 파일 디스크립터 목록을 확인하면 3부터 실제로 파일 디스크립터가 사용되는 것을 확인할 수 있습니다. Tail은 편집기에서 파일을 수정하지 않으므로 파일 설명자를 사용하여 소스 파일을 직접 엽니다. 실제로 ll /proc/$pid/fd 명령을 사용하여 현재 실행 중인 모든 프로세스의 파일 설명자 사용량을 가져올 수 있습니다.
확장된 지식: Linux 구성 시스템 최대 열린 파일 설명자 수
(1) 시스템 수준 제한
이론적으로는 시스템 메모리만큼 많은 파일 설명자를 열 수 있지만 실제로는 커널이 이에 따라 이를 처리합니다. 일반적으로 최대 열린 파일 수는 시스템 메모리(KB로 계산)의 10%입니다. 시스템 수준 제한이라고 합니다. 이 숫자는 cat /proc/sys/fs/file-max 또는 sysctl -a | grep fs.file-max 명령을 통해 볼 수 있습니다.
시스템 수준 제한을 변경하는 방법에는 두 가지가 있습니다: 임시 변경과 영구 변경:
임시 변경: 세션 연결이 끊어지거나 시스템이 다시 시작되면 원래 설정 값이 복원됩니다. sysctl -w fs.file-max=xxxx 명령을 사용합니다. 여기서 xxxx는 설정할 숫자입니다.
영구 변경: vim은 /etc/sysctl.conf 파일을 편집하고 끝에 fs.file-max=xxxx를 추가합니다. 여기서 xxxx는 설정할 숫자입니다. 저장하고 종료한 후 sysctl -p 명령을 사용하여 적용합니다.
(2) 사용자 수준 제한
동시에 각 프로세스에서 소비하는 파일 리소스를 제어하기 위해 커널은 단일 프로세스에 대해 최대 열린 파일 수에 대한 기본 제한도 설정합니다. 프로세스, 즉 사용자 수준 제한입니다. 32비트 시스템의 기본값은 일반적으로 1024이고, 64비트 시스템의 기본값은 일반적으로 65535입니다. ulimit -n 명령을 사용하여 볼 수 있습니다.
사용자 수준 제한을 변경하는 방법에는 두 가지가 있습니다: 임시 변경과 영구 변경:
임시 변경: 세션 연결이 끊어지거나 시스템이 다시 시작되면 원래 설정 값이 복원됩니다. ulimit -SHn xxxx 명령을 사용하여 수정합니다. 여기서 xxxx는 설정할 숫자입니다.
영구 변경 사항: vim은 /etc/security/limits.conf 파일을 편집하고 hard nofile xxxx 및 soft nofile xxxx를 수정합니다. 여기서 xxxx는 설정할 번호입니다. 저장하고 종료합니다. 하드와 소프트의 차이에 대해서는 아래 5번째 참고링크를 참고해주세요.
관련 추천: "Linux 비디오 튜토리얼"
위 내용은 리눅스 fd가 뭐야?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!