리눅스 fd가 뭐야?

青灯夜游
풀어 주다: 2023-04-13 09:24:17
원래의
9443명이 탐색했습니다.

Linux에서 fd의 전체 이름은 "파일 설명자"이고 중국어 이름은 "파일 설명자"입니다. 이는 열린 파일을 효율적으로 관리하기 위해 커널이 생성한 인덱스입니다. 정수, 사용 열린 파일을 참조하기 위해 I/O 작업을 수행하는 모든 시스템 호출은 파일 설명자를 통해 구현됩니다.

리눅스 fd가 뭐야?

이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.

리눅스에서 fd의 전체 이름은 "파일 설명자"이고, 중국어 이름은 "파일 설명자"입니다. 파일 설명자는 음수가 아닌 정수이며 본질적으로 인덱스 값입니다(이 문장은 매우 중요합니다).

Linux의 파일 설명자(fd)

우리는 Linux 시스템의 모든 것이 파일로 간주될 수 있으며 파일은 일반 파일, 디렉터리 파일, 링크 파일 및 장치 파일로 나눌 수 있다는 것을 알고 있습니다. 이러한 소위 파일을 조작할 때 조작할 때마다 이름을 찾아야 하므로 많은 시간과 효율성이 소모됩니다. 따라서 리눅스에서는 각 파일이 인덱스에 해당한다고 규정하고 있기 때문에 파일을 조작하고 싶을 때 직접 인덱스를 찾아 조작하면 된다.

파일 설명자는 열린 파일을 효율적으로 관리하기 위해 커널에서 생성한 인덱스입니다. I 시스템의 모든 실행은 /를 호출하는 데 사용됩니다. O 작업은 파일 설명자를 통해 구현됩니다. 동시에 시스템이 방금 시작되면 0은 표준 입력, 1은 표준 출력, 2는 표준 오류라고 규정되어 있습니다. 즉, 이때 새 파일을 열면 해당 파일 설명자는 3이 되고, 다른 파일을 열면 파일 설명자는 4가 됩니다...

리눅스 커널에는 열려 있는 모든 파일에 대한 파일 설명이 있습니다. 각 파일 디스크립터 사이의 관계를 인덱스로 저장하는 디스크립터 테이블, 간단히 이해하면 아래와 같은 배열입니다. 파일 디스크립터(인덱스)는 파일 디스크립터 테이블에 있는 배열의 첨자입니다. 콘텐츠는 열린 파일을 하나씩 가리키는 포인터입니다.

리눅스 fd가 뭐야?

위 내용은 단순한 이해일 뿐입니다. 실제로 파일 설명자와 관련하여 Linux 커널은 3가지 데이터 구조를 유지합니다.:

  • 프로세스 수준 파일 설명자 테이블
  • 시스템 수준 열린 파일 설명자 테이블
  • 파일 시스템의 i-노드 테이블

Linux 프로세스가 시작된 후 커널 공간에 PCB 제어 블록이 생성됩니다. PCB 내부에는 현재 사용 가능한 모든 파일 설명을 기록하는 파일 설명자 테이블이 있습니다. 프로세스 기호, 즉 현재 프로세스의 열려 있는 모든 파일입니다. 프로세스 수준 설명자 테이블의 각 항목은 단일 프로세스에서 사용하는 파일 설명자에 대한 정보를 기록합니다. 프로세스는 서로 독립적입니다. 한 프로세스가 파일 설명자 3를 사용하면 다른 프로세스도 3를 사용할 수 있습니다. 프로세스 수준 파일 설명자 테이블 외에도 시스템은 열린 파일 테이블과 i-노드 테이블이라는 두 개의 다른 테이블도 유지 관리해야 합니다. 이 두 테이블은 열려 있는 각 파일의 열린 파일 핸들을 저장합니다. 열린 파일 핸들은 열린 파일과 관련된 모든 정보를 저장합니다.

시스템 수준 열린 파일 설명자 테이블:

  • 현재 파일 오프셋(read() 및 write() 호출 시 업데이트되거나 lseek()를 사용하여 직접 수정됨)
  • 파일 열 때 식별(열기(플래그 매개변수) of))
  • 파일 액세스 모드(예: open() 호출 시 설정된 읽기 전용 모드, 쓰기 전용 모드 또는 읽기-쓰기 모드)
  • 시그널 드라이버 관련 설정
  • 파일 i-node 객체 참조, i.e. i-노드 테이블 포인터

파일 시스템의 i-노드 테이블:

  • 파일 유형(예: 일반 파일, 소켓 또는 FIFO) 및 액세스 권한
  • 파일에 대한 포인터 보유된 잠금 목록
  • 다양한 유형의 작업과 관련된 파일 크기 및 타임스탬프를 포함한 파일의 다양한 속성

파일 설명자, 열린 파일 핸들 및 i-노드 간의 관계는 아래와 같습니다.

리눅스 fd가 뭐야?

  • 프로세스 A에서 파일 설명자 1과 20은 모두 23이라는 레이블이 붙은 동일한 열린 파일 테이블 항목을 가리킵니다(열린 파일 테이블에서 인덱스 23의 배열 요소를 가리킴). 이는 dup() , dup2( ), fcntl() 또는 동일한 파일에 대한 open() 함수에 대한 여러 호출.
  • 프로세스 A의 파일 설명자 2와 프로세스 B의 파일 설명자 2는 모두 동일한 파일을 가리킬 수 있습니다(즉, 프로세스 A와 B는 상위-하위 프로세스 관계임). 프로세스는 동일한 파일을 열기 위해 open() 함수를 단독으로 호출한다. 이때 프로세스 내부의 디스크립터는 다른 프로세스가 파일을 열기 위해 사용하는 것과 동일한 디스크립터에 할당된다.
  • 프로세스 A의 설명자 0과 프로세스 B의 설명자 3은 각각 다른 열린 파일 테이블 항목을 가리키지만 이러한 테이블 항목은 i-node 테이블(1976으로 표시됨)의 동일한 항목을 가리킵니다. 같은 파일입니다. 이는 각 프로세스가 동일한 파일에 대해 별도의 open() 호출을 하기 때문에 발생합니다. 동일한 프로세스가 동일한 파일을 두 번 열면 비슷한 상황이 발생합니다.

즉, 동일한 프로세스의 서로 다른 파일 설명자가 동일한 파일을 가리킬 수 있습니다. 서로 다른 프로세스의 동일한 파일 설명자가 서로 다른 파일을 가리킬 수 있습니다. 세 개의 특수 파일(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의 구현 원리를 더 자세히 알아보기 위해 다음은 당시 제가 본 포럼의 정보 스크린샷입니다. 링크는 여기입니다.

리눅스 fd가 뭐야?

믿을 수 없다면 꼬리와 같은 다른 프로세스를 시도해 볼 수 있습니다.

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 xxxxsoft nofile xxxx를 수정합니다. 여기서 xxxx는 설정할 번호입니다. 저장하고 종료합니다. 하드와 소프트의 차이에 대해서는 아래 5번째 참고링크를 참고해주세요.

관련 추천: "Linux 비디오 튜토리얼"

위 내용은 리눅스 fd가 뭐야?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿