[OS] File Descriptor(FD)에 대하여

진짜임

 

 

File Descriptor(FD)이란


OS에서 I/O장치나 파일에 접근할 때 이들을 식별하기 위해 사용하는 특정한 정수 값이 있다. 이것이 File descriptor다. 특히나 Linux 혹은 Unix 계열 OS에서 프로세스가 파일을 다룰 때 사용하게 되는데, 프로세스에서 특정 파일에 접근할 때 0(stdin), 1(stdout), 2(stderr),...(파일을 열면서 추가적인 FD할당) 와 같은 상수를 쓰게 된다.  

그럼 여기서 Windows는 FD가 없어요? 라는 궁금증이 있었는데, FD와 유사한 개념인 File Handle이 존재하나 FD과 동일한 것은 아니다.

 

File Descriptor의 동작 과정


✔️ 파일 열기


1. 프로세스의 파일 열기 요청

사용자 프로그램은 open()과 같은 System Call을 호출하여 특정 파일을 열어달라고 kernel에 요청한다.

 

2. Kernel의 파일 요청 처리

Kernel은 파일 시스템에서 해당 파일이 존재하는지 검증하며, 파일이 유효하다면 FIle Table에 새로운 항목을 추가한다

 

3. FD 할당

Kernel이 프로세스의 File Descriptor Table에서 사용하지 않은 가장 작은 정수 값을 해당 파일의 FD로 할당한다

 

 

✔️ 파일 작업(Read/Write)


1. Read/Write 요청

파일을 열어 FD를 받은 프로세스가 해당 FD를 통해 read()나 write()를 수행한다

작성한 예시는 FD에 연결된 파일에서 데이터를 읽어와 버퍼에 저장하는 명령을 수행하는 것이다

 

2. Kenel의 요청 처리

커널은 해당 FD를 참조하여 File Table에서 어떤 파일인지 확인한다.

요청이 읽기였다면 해당 파일의 데이터 블록에서 데이터를 가져올 것이고, 쓰기라면 데이터를 파일 시스템에 기록할 것이다.

 

 

File Descriptor의 기본 특징


☝🏻 파일 디스크립터는 3부터 할당된다

프로그램이 메모리에 적재된 뒤 실행될 때, 앞서 살짝 언급하였듯이 0, 1, 2 세가지가 기본적으로 할당되기 때문이다.

0: Standard input(stdin, 표준입력)

1: Standard output(stdout, 표준출력)
2: Standard error(stderr, 표준에러)

 

✌🏻 파일 디스크립터는 프로세스마다 같을 수도 있고 다를 수도 있다

그림처럼

- 서로 다른 Process가 같은 File을 쓰는 경우엔 서로 다른 Descriptor를 가질 수 있다.

- 서로 다른 Process가 다른 FIle을 쓰는 경우엔 같은 Descriptor를 가질 수 있다.

 

프로세스는 자기 자신만의 File Dscriptor Table을 갖고 있기에, 그 Descriptor 결정에 대하여 서로의 동일성을 신경 쓰지 않기때문이다.

 

 

왜 File Descriptor를 쓸까?

시스템이 파일을 사용할 때 기존 파일명으로 접근한다면, 길고 복잡한 파일명임에도 불구하고 이를 참조해야하는 비효율이 있다. 하지만 파일에 별명(FD)를 붙여 사용한다면 보다 짧고 접근이 용이한 별명으로 참조하게 되는 당연한 효율성을 갖추고자 하는 것이다.

 

 

 

이제 File Dscriptor를 이해했다면, I-Node가 연계되는데...