Linux 파일 시스템이 어떻게 작동하는지 알고 싶으십니까?

PHPz
풀어 주다: 2024-02-20 09:54:14
앞으로
654명이 탐색했습니다.

Linux 파일 시스템이 어떻게 작동하는지 알고 싶으십니까?

Linux 파일 시스템은 운영 체제의 핵심 구성 요소이며 그 운영 메커니즘은 우리 프로그래머가 이해하고 숙달해야 하는 것입니다. 디스크는 시스템에 대한 가장 기본적인 영구 저장소를 제공하며 파일 시스템은 시스템의 모든 파일을 제공합니다. 리눅스에서는 일반 파일과 디렉터리뿐 아니라 블록 디바이스, 소켓, 파이프 등도 모두 파일로 관리해야 한다. 오늘 우리는 함께 이야기할 것입니다: 디스크와 파일 시스템은 어떻게 작동합니까?

인덱스 노드 및 디렉터리 항목

Linux 파일 시스템에서 파일의 메타데이터에는 디렉터리 항목, 인덱스 노드, 데이터 블록이 포함됩니다.

  • 디렉토리 항목: dentry라고 하며 파일 이름, 인덱스 노드 포인터 및 다른 디렉터리 항목과의 연결을 기록하는 데 사용됩니다. 여러 관련 디렉토리 항목이 파일 시스템의 디렉토리 구조를 구성합니다. 디렉토리 항목은 커널에 의해 유지되는 메모리 데이터 구조이므로 디렉토리 항목 캐시(Cache)라고도 합니다.
  • 인덱스 노드: inode라고 하며, inode 번호, 파일 크기, 액세스 권한, 수정 날짜, 데이터 위치, 링크 수 등을 포함하여 파일의 메타데이터를 기록하는 데 사용됩니다. 인덱스 노드 정보는 디스크에 유지됩니다. 저장을 위해 디스크 공간을 차지합니다.
  • 데이터 블록: 블록이라고도 하며 파일 데이터가 저장되는 곳입니다. 디스크의 가장 작은 저장 단위를 섹터라고 합니다. 각 섹터는 512바이트(0.5KB에 해당)를 저장합니다. 운영체제가 하드 디스크를 읽을 때 섹터별로 읽지 않으므로 너무 비효율적입니다. 한 번에 여러 섹터를 연속적으로 읽습니다. 즉, 한 번에 하나의 "블록"을 읽습니다. 여러 섹터로 구성된 이 "블록"은 파일 액세스의 가장 작은 단위입니다. "블록" 크기는 가장 일반적으로 4KB(8개 섹터)입니다.

파일 액세스 속도를 높이기 위해 일반적으로 인덱스 노드가 메모리에 로드되며 하드 디스크는 포맷 시 슈퍼 블록, 인덱스 노드 영역, 데이터 블록 영역의 세 가지 저장 영역으로 구분됩니다.

  • 수퍼 블록은 블록 수, 블록 크기, 사용 가능한 블록 등과 같은 파일 시스템의 세부 정보를 저장하는 데 사용됩니다.
  • 인덱스 노드 영역, 인덱스 노드를 저장하는 데 사용됩니다.
  • 파일 또는 디렉터리 데이터를 저장하는 데 사용되는 데이터 블록 영역입니다.

가상 파일 시스템

Linux 시스템의 가상 파일 시스템(VFS, Virtual File System)은 사용자와 애플리케이션에 일관된 파일 시스템 인터페이스를 제공하여 다양한 유형의 파일 시스템에 통합된 방식으로 액세스할 수 있도록 하는 핵심 추상화 계층입니다. 기본 파일 시스템의 구현 세부 사항에 대해 걱정해야 합니다.

사용자 프로그램과 glibc 라이브러리는 모두 사용자 공간에 속하며, 파일 작업은 시스템 호출 계층(SCI)의 함수를 호출하여 완료됩니다. 이러한 기능은 사용자가 시스템에 작업을 요청할 수 있도록 Linux 커널에서 제공하는 인터페이스입니다. 예를 들어 시스템의 cat 명령은 open() 함수를 호출하여 파일을 연 다음 read() 함수를 호출하여 파일 내용을 읽고 마지막으로 write() 함수를 호출하여 파일 내용을 콘솔에 출력합니다. . 일반적인 파일 시스템 유형은 여러 가지 광범위한 범주로 나눌 수 있습니다.

  • 로컬 디스크 기반: EXT3, EXT4, XFS, OverlayFS 등 이러한 유형의 파일 시스템의 특징은 데이터가 컴퓨터에 로컬로 마운트된 디스크에 직접 저장되며 성능이 좋고 네트워크 IO 액세스를 소비하지 않는다는 것입니다.
  • 네트워크 파일 시스템 기반: NFS, CIFS/SMB, CephFS, GlusterFS 등. 이러한 유형의 파일의 특징은 사용자가 네트워크를 통해 파일에 액세스하고 관리할 수 있다는 것입니다. 배포, 크로스 플랫폼, 유연성 및 확장성이 가장 큰 장점입니다.
  • 메모리 기반 파일 시스템: tmpfs, ramfs, /proc 등. 이러한 메모리 기반 파일 시스템은 일반적으로 임시 파일 저장, 캐싱, 빠른 데이터 액세스 등과 같은 특정 목적에 사용됩니다. 메모리에서 파일을 읽고 쓰기 위한 고성능 솔루션을 제공하지만 메모리 제한과 데이터 변동성을 인식해야 합니다.

파일 I/O

시스템에서 사용하려면 Linux VFS의 특정 디렉터리에 마운트해야 하는 다양한 유형의 파일 시스템을 만들기 위해 디스크를 분할하고 포맷합니다. 파일 읽기 및 쓰기 작업에는 다양한 I/O 유형이 있으며 응용 프로그램은 필요에 따라 적절한 방법을 선택합니다.

버퍼링된 I/O와 버퍼되지 않은 I/O

  • 소위 버퍼링 없음은 커널이 버퍼링을 제공하지 않는다는 의미가 아니라 함수 라이브러리 호출이 아닌 단순한 시스템 호출만 제공한다는 의미입니다. 시스템 커널은 디스크 읽기 및 쓰기를 위한 블록 버퍼를 제공합니다. 쓰기 함수를 사용하여 디스크에 데이터를 쓸 때 블록 버퍼에 데이터를 쓰고 큐에 넣기 위해 시스템 호출이 직접 호출됩니다. 일정량만큼 블록 버퍼가 대기열에 추가됩니다. 따라서 소위 언버퍼드 I/O는 프로세스가 버퍼링 기능을 제공하지 않음을 의미합니다. 쓰기 또는 읽기 함수가 호출될 때마다 시스템에서 직접 호출됩니다. (커널에 의해 버퍼링됨)
  • 버퍼링된 I/O는 프로세스가 입력 및 출력 스트림을 개선하고 스트림 버퍼를 제공한다는 것을 의미합니다. 쓰기 기능을 사용하여 데이터를 쓰면 데이터가 먼저 스트림 버퍼에 기록됩니다. 스트림 버퍼가 가득 차는 등 특정 조건에 도달하면 데이터가 즉시 커널에서 제공하는 블록 버퍼로 전송됩니다. 그런 다음 블록 버퍼를 통해 디스크에 기록됩니다. (이중 버퍼링)
  • 따라서 동일한 양의 데이터를 디스크에 쓸 때 버퍼링된 I/O에는 버퍼링되지 않은 I/O보다 더 적은 시스템 호출이 필요합니다.

직접 I/O 및 간접 I/O

  • 직접 I/O: 응용프로그램이 커널 버퍼를 거치지 않고 디스크 데이터에 직접 접근하는 것입니다. 이는 커널 버퍼에서 사용자 프로그램 캐시로 복사되는 데이터를 줄이는 것입니다.
  • 간접 I/O: 파일을 읽거나 쓸 때 먼저 시스템의 페이지 캐시를 통과한 다음 커널이나 추가 시스템 호출을 통해 디스크에 써야 합니다.
  • 직접 I/O의 경우 액세스된 데이터가 애플리케이션 캐시에 없으면 매번 디스크에서 데이터가 직접 로드되므로 직접 로드의 효율성이 느려집니다. 그러나 데이터베이스 관리 시스템과 같은 애플리케이션의 경우 데이터베이스 관리 시스템이 운영 체제보다 데이터베이스에 저장된 데이터를 더 잘 알고 직접 I/O가 더 적합하기 때문에 자체 캐싱 메커니즘을 선택할 가능성이 더 높습니다.

블로킹 I/O 및 비블로킹 I/O

  • Blocking I/O: 응용 프로세스는 I/O 작업을 호출하면 차단되며, 작업할 데이터가 준비되어 응용 프로세스의 버퍼에 복사될 때까지 기다린 후에만 반환됩니다. 특징은 구현 난이도가 낮고 애플리케이션 개발이 용이하며 동시성이 작은 네트워크 애플리케이션 개발에 적합하다는 것입니다.
  • 비차단 I/O: 애플리케이션이 I/O 작업을 수행한 후 현재 스레드를 차단하지 않고 다른 작업을 계속 수행한 다음 폴링이나 이벤트 알림을 통해 호출 결과를 얻을 수 있음을 의미합니다. 특징은 다음과 같습니다. 상대적으로 복잡합니다. 동시성이 적고 적시 응답이 필요하지 않은 네트워크 애플리케이션 개발에 적합합니다

동기식 및 비동기식 I/O

  • 동기 I/O: 애플리케이션이 I/O 작업을 수행한 후 I/O 응답을 얻으려면 전체 I/O가 완료될 때까지 기다려야 함을 의미합니다.
  • 비동기 I/O: 애플리케이션이 I/O 작업을 수행한 후 완료 및 완료 후 응답을 기다릴 필요가 없지만 계속 실행할 수 있음을 의미합니다. 이 I/O가 완료된 후 응답은 이벤트 알림 형식으로 애플리케이션에 통보됩니다.

파일에 대한 몇 가지 상식

아직 디스크에 남은 공간이 많고, 새 파일과 디렉터리를 위한 공간도 부족합니다.

  • 문제 해결 아이디어: 작은 파일이 너무 많아 inode가 모두 사용되었을 가능성이 높습니다. df -i를 사용할 수 있습니다.

du와 df 간의 하드 디스크 사용 통계가 일치하지 않습니다.

  • du는 파일 시스템에 기록된 각 파일의 크기를 계산한 후 파일 시스템을 통해 얻은 전체 크기를 누적합니다. df는 주로 슈퍼블록(superblock)에서 하드디스크 사용량 정보를 읽어옵니다. df가 얻는 것은 디스크 블록의 사용량입니다. 이러한 상황은 파일이 삭제되었지만 다른 프로세스에서 해당 파일을 사용 중(핸들 보유) 때문에 발생할 가능성이 높으며, 이는 lsof | delete를 통해 확인할 수 있습니다. 프로세스가 중지되거나 종료되면 이러한 공간이 해제됩니다.

디스크 용량을 조회할 때 Used+Avail의 크기가 항상 전체 용량(SIze)보다 작은 이유는 무엇인가요?

  • 긴급 상황을 방지하기 위해 Linux ext 파일 시스템은 하드 디스크 공간의 일부를 예약합니다. 특정 예약된 값은 tune2fs -l [dev_name] | grep "Reserved block count"(dev_name)을 통해 확인할 수 있습니다. , 여기에 예약된 공간은 df에 의해 사용된 공간으로 계산되므로 df와 du 사이의 통계가 일치하지 않습니다. 예약된 공간 크기를 조정해야 하는 경우 tune2fs -m [size] [dev_name]을 사용하여 조정할 수 있습니다.

위 내용은 Linux 파일 시스템이 어떻게 작동하는지 알고 싶으십니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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