2 분 소요

파일 디스크립터

운영체제에서 I/O 리소스를 식별하는데 사용되는 정숫값
(유닉스 계열의 운영체제이며,
윈도우에서는 파일 핸들(File Handle)이 비슷한 개념이지만
구체적 구현과 사용방식에 차이 존재)

파일 디스크립터는
각각의 I/O 리소스를 고유하게 식별하며,
이를 통해 해당 리소스에 대한 읽기, 쓰기, 닫기 등의 작업을 수행할 수 있음

주 사용처로는

  1. 파일 I/O : 파일을 열고 읽거나 쓸 때 사용
    (ex : C의 open(),read() 등은 파일 디스크럽터를 반환하거나 사용)
  2. 네트워크 통신 : 소켓이 파일 디스크립터를 가진다
    네트워크 소켓 생성 시, 운영체제는 해당 소켓에 대한
    파일 디스크립터를 할당함
    이를 통해 ‘소켓’을 통한 데이터 송수신이 이루어진다
  3. 파이프 및 기타 리소스 : 파일 디스크립터를 사용하여 리소스에 대한 입출력 작업 수행

대부분의 운영체제에서 0,1,2 번의 파일 디스크립터는 특별한 용도로 예약된다
0(stdin) : 표준 입력
1(stdout) : 표준 출력
2(stderr) : 표준 에러 출력
=> C 언어에서 표준 입출력을 다룰 때 사용하는 라이브러리는
stdin, stdout, stderr 와 같은 특수한 파일 디스크립터를 사용하여
입출력 작업을 수행한다

=> 표준 입출력 함수들 (ex : printf, scanf 등)은
이러한 파일 디스크립터들을 사용하여, 데이터를 읽거나 쓰는 작업을 수행한다

파일 디스크립터는 운영체제에게
‘어떠한 I/O 리소스를 사용할 것인지 가리키는 역할’을 한다
(파일,I/O 리소스, 소켓 을 식별하는데 사용)

  • 파일 핸들
    파일이나 I/O 리소스에 접근하기 위한 추상화된 개념
    파일 디스크립터와 유사한 면이 있음
    다만, 프로그래밍 언어와 플랫폼에 따라 다르게 명명되는 점이 있음
    (ex : Windows에서는 HANDLE이라는 데이터 타입으로 사용되며,
    I/O리소스 및 소켓이 ‘파일’취급 받기에 파일 핸들을 통하여 접근)

파일 디스크립터에 대한 추가적 내용

Open() 등을 호출하여(시스템콜)
파일 디스크립터가 반환되는데,
‘프로그램 수준’에서 새로운 파일을 열 때마다,
OS는 고유한 파일 디스크립터를 할당한다
(이를 통해 프로그램은 ‘읽기 쓰기 닫기’ 등을 수행 가능)

파일 디스크립터는 OS 수준에서 일종의 ‘추상화’된 인터페이스라 인식하는 것이 좋음
프로그램이 운영체제에게 ‘특정한 파일’이나 ‘I/O 리소스’ (ex : 소켓)를 요청할 때
그러한 요청을 식별하고, 추적 및 관리하기 위한 개념

이를 통하여 얻는 여러가지 장점이 있다

  • 파일 디스크립터를 통해, 프로그램은 파일이나 I/O 리소스를 열거나 닫고
    읽거나 쓸 수 있음 => 복잡한 운영체제 기능을 직접 다루지 않아도 됨
  • 운영체제가 파일 디스크립터를 사용해, 여러 프로세스 간 리소스를 ‘분리’하고
    ‘격리’한다
    (각각의 프로세스는 자신의 ‘파일 디스크립터’를 이용하여 자원에 안전하게 접근 가능)
  • 파일 디스크립터로 여러 I/O 작업 관리 및 제어가 가능하여,
    운영체제는 효율적인 I/O 작업 처리가 가능해짐
  • 파일 디스크립터는 파일 뿐 아니라, 네트워크 소켓, 파이프, 디바이스(하드웨어) 등
    다양한 유형의 리소스를 관리할 수 있는 개념이다

‘커널 공간’에서
파일 디스크립터에 대한 ‘테이블’을 관리하며,
각 프로세스(User Mode)는 커널 공간에서 필요 시, 시스템 콜을 호출하여
파일 디스크립터 테이블에 접근한다
(물론 직접 접근하는 것이 아니라, 커널에게 파일을 닫아달라는 등의 요청을 하는 것)
(실제로 커널 코드로 해당 내용이 구현된다)
테이블에서 FD의 정숫값과 특정 ‘파일’에 대한 정보가 연결된다

댓글남기기