File Descriptor

이재원·2024년 2월 27일

File Descriptor(FD)

  • 파일 디스크립터는 유닉스 및 유닉스 계열 운영 체제(예: Linux, macOS)에서 프로세스가 파일, 소켓, 파이프 같은 리소스 또는 다른 I/O 자원에 대한 참조를 관리하는 데 사용하는 추상화된 핸들
  • 일반적으로 0~ 양의 정수로 표현되며, 운영 체제 커널 내부에서 파일이나 다른 자원에 대한 접근을 인덱스를 이용하여 추적하는 데 사용
  • 프로세스는 리소스의 실제 물리적 위치를 몰라도, 인덱스를 통해 접근 가능
  • 열린 파일이나 리소스를 나타내는 정수(integer)
  • 파일 디스크립터를 통해 운영 체제는 다양한 입출력(I/O) 리소스를 일관된 방식으로 관리할 수 있다.

기본개념

  • 정수 값: 파일 디스크립터는 운영 체제가 할당하는 정수 값으로, 열린 파일, 소켓, 파이프 등의 자원을 나타낸다.
  • 자원 관리: 운영 체제는 열린 파일과 자원에 대한 정보를 파일 디스크립터 테이블에 저장한다. 이 테이블은 프로세스마다 독립적으로 유지된다.
  • 표준 입출력: UNIX 및 UNIX 계열 시스템에서는 표준 입력(0), 표준 출력(1), 표준 오류(2) 등 몇몇 파일 디스크립터가 사전에 정의되어 있다.
  • 리소스 제한: 시스템에는 동시에 열 수 있는 파일 디스크립터의 최대 개수에 대한 제한이 있다. 이는 시스템의 ulimit 명령어를 통해 확인하거나 설정할 수 있다.
  • 파일 디스크립터는 단순히 디스크에 저장된 파일에만 사용되는 것이 아니라, 네트워크 소켓이나 프로세스 간 통신에 사용되는 파이프와 같은 다른 형태의 I/O 리소스에도 사용된다.
  • 시스템 리소스를 효율적으로 관리하고, 불필요한 리소스 유출을 방지하기 위해 더이상 불필요한 리소스에 close를 명시적으로 해줘야한다.
  • 파일 디스크립터를 통해 다양한 유형의 리소스를 추상화하고 일관된 인터페이스를 제공함으로써, 개발자는 다양한 I/O 작업을 더 쉽고 효율적으로 수행할 수 있다.

프로세스의 FD활용

  • 리소스 열기
    • 프로세스가 open , socket 등의 system call을 사용해 리소스를 열면 운영체제는 해당 리소스에 대한 핸들을 생성하고, 이를 가리키는 파일 디스크립터를 프로세스에 반환한다.
  • 리소스 조작
    • 프로세스가 read, write, send, recv 등의 system call로 리소스를 조작할 때, fd 값을 인자로 운영체제에 제공해야 한다.
    • 운영체제는 이 fd를 통해 해당 프로세스의 fd table에서 리소스를 찾아 요청된 리소스 조작을 수행한다.
  • 리소스 닫기
    • 프로세스가 close system call로 리소스를 닫아달라 요청할 때, fd 값을 인자로 운영체제에 제공해야 한다.
    • 운영체제는 fd table에서 해당 엔트리를 제거하고, 리소스를 해제한다.

File Descriptor Table

  • 운영체제의 커널 내부에 각 프로세스 별 fd table이 생성된다.
  • 각 프로세스가 열어 놓고 있는 모든파일, 리소스에 대한 fd를 인덱스로 하는 배열이다.

각 entry의 구성

  • 인덱스
    • 리소스별 file descriptor
  • 리소스 타입
    • 파일, 소켓, 파이프 중 어떤 것인지 표시
  • 리소스 상태 정보
    • 읽기/쓰기 가능 여부
    • 블로킹/논블로킹 모드
    • 열린 파일의 현재 위치
  • 리소스에 대한 참조
    • 실제 리소스에 대한 포인터

Default File Descriptor

  • 프로세스가 시작될 때 자동으로 할당되는 기본적 fd 값
  • 프로세스가 실행되고 있는 동안은 항상 열려있는 것으로 표시된다
  • 다른 파일이나 리소스는 이 default fd 인덱스 이후 숫자부터 할당된다.
  • 이렇게 입출력기가 file descriptor로 관리되는 이유는 OS에서 입출력기도 파일로 인식하여 관리하기 때문이다.
  • 종류
    • 0
      • 표준 입력 (stdin)
    • 1
      • 표준 출력 (stdout)
    • 2
      • 표준에러 (stderr)

이메일에 첨부 파일을 추가하고 전송하는 과정을 통해 파일 디스크립터와 MIME의 역할 알아보기

  1. 파일 선택: 사용자가 이메일 작성 시 웹 인터페이스의 "첨부" 버튼을 클릭하여 파일을 선택합니다.
  2. 파일 열기: 웹 브라우저는 open 시스템 콜을 사용하여 운영체제에 파일 열기 요청을 한다. 운영체제는 파일을 열고, 해당 파일에 대한 파일 디스크립터를 생성하고 파일 디스크립터 테이블에도 항목을 생성 후, 해당 파일에 대한 접근 권한과 위치 정보등을 저장한 뒤 해당 항목에 대한 파일 디스크립터를 웹 브라우저에 반환한다.
  3. 파일 읽기: 웹 브라우저는 read 시스템 호출을 사용하여 운영체제로부터 파일 내용을 읽어들인다. 이 과정에서 파일 디스크립터가 사용된다. 파일 디스크립터를 이용해 파일 읽기(read), 쓰기(write), 설정 변경(fcntl), 비동기 I/O 작업 등을 수행할 수 있다.
  4. 파일 데이터 인코딩: 웹 브라우저는 읽어들인 파일 데이터를 MIME 형식으로 인코딩하여, 이메일 메시지의 일부로 준비한다. 이는 첨부 파일이 이메일과 함께 올바르게 전송되고, 수신자가 파일을 정확히 해석할 수 있게 한다.
  5. 파일 전송 및 메일 발송: 사용자가 이메일 전송 버튼을 클릭하면, 인코딩된 파일 데이터를 포함하는 이메일이 서버로 전송된다. 이 과정에서 웹 브라우저는 네트워크 소켓을 사용하여 데이터를 서버로 전송하며, 소켓 역시 파일 디스크립터를 사용하여 관리된다.
  6. 파일 및 소켓 닫기: 데이터 전송이 완료되면, 웹 브라우저는 close 시스템 호출을 사용하여 파일과 네트워크 소켓을 닫는다. 운영체제는 해당 파일 디스크립터를 해제하고 리소스를 정리한다.

중요성

  • 파일 디스크립터를 통해 운영 체제는 열린 파일과 자원을 효율적으로 관리할 수 있다. 이는 자원의 낭비를 방지하고, 시스템의 성능을 최적화하는 데 도움이 된다.
  • 파일 디스크립터를 사용함으로써, 시스템은 각 프로세스가 접근할 수 있는 파일과 자원을 엄격히 제어할 수 있다. 이는 무단 접근과 데이터 유출을 방지하는 데 중요한 역할을 한다.
  • 파일 디스크립터는 단순히 디스크 상의 파일뿐만 아니라, 네트워크 소켓, 파이프, 메모리 매핑 파일 등 다양한 종류의 입출력 자원에 대한 접근을 추상화한다. 이로 인해 개발자는 다양한 유형의 자원을 통일된 인터페이스로 쉽게 다룰 수 있다.
profile
최고가 되기 위한 여정

0개의 댓글