본문으로 바로가기

[OS] File Descriptor (파일 디스크립터)

category Computer Science/OS 2023. 7. 12. 22:02

Contents

    ➡️ File Descriptor란?

    Unix 계열의 OS에서 파일을 액세스 할 때 사용되는 추상적인 표현이다.

    • 일반적으로 0이 아닌 정수값을 갖는다.

    Unix 파일 시스템에서는 모든 것을 파일로 관리하는데 (일반파일, 디렉터리, 소켓, 파이프 등) 프로세스가 파일들을 접근할 때 File Descriptor라는 개념을 이용하는 것이다.

    ✅ File Descriptor 할당 흐름

    1. 프로세스가 파일을 Open한다.
    2. 커널은 해당 프로세스의 File Descriptor 숫자 중 사용하지 않는 가장 작은 값을 할당해 준다.
    3. 프로세스가 File Descriptor를 통해 파일에 System Call을 이용하여 접근한다.

    ✅ File Descriptor의 고정값

    File Descriptor의 값 중 0,1,2는 목적이 고정되어 있다. 각각 표준 입력, 표준 출력, 표준 에러를 뜻한다.

    • 즉, 0,1,2를 제외한 FD 값이 할당이 된다.
    File Descriptor 정수값 FD 대신 사용하는 이름 목적
    0 stdin 표준 입력
    1 stdout 표준 출력
    2 stderr 표준 에러

    ✅ File Descriptor Table

    File Descriptor가 단순 숫자인 이유는 File Descriptor는 프로세스가 Open 중인 File Descriptor Table의 인덱스 값이기 때문이다.

    File Descriptor = File Descriptor Table의 Index 값

    출처 : https://en.wikipedia.org/wiki/File_descriptor

    File Descriptor Table의 각 항목은 File Descriptor의 Flag와 File Table의 포인터를 갖고 있다.

    File Table의 포인터는 또 I-node Table을 참조하고 있어서 File Descirptor를 통해 파일에 최종적으로는 파일에 접근할 수 있는 것이다.

    ➡️ File Descriptor 확인하기

    백문이 불여일견이다.

    1. 확인하려는 프로세스의 PID 확인
    2. File Descirptor 확인
    > ls -trn /proc/19066/fd
    total 0
    lr-x------ 1 1003 502 64 Jul 12 20:44 19 -> /usr/local/java/jdk1.8.0_321/jre/lib/ext/localedata.jar
    lrwx------ 1 1003 502 64 Jul 12 20:44 18 -> socket:[1284785193]
    lrwx------ 1 1003 502 64 Jul 12 20:44 17 -> socket:[1284785192]
    lrwx------ 1 1003 502 64 Jul 12 20:44 16 -> socket:[1284785190]
    # (중략...)
    l-wx------ 1 1003 502 64 Jul 12 20:44 2 -> /var/log/java/catalina.out
    l-wx------ 1 1003 502 64 Jul 12 20:44 1 -> /var/log/java/catalina.out
    lr-x------ 1 1003 502 64 Jul 12 20:44 0 -> /dev/null

     

    명령어의 결과를 보면 0,1,2는 입력, 출력, 에러로 목적이 고정되어 있다.

    그 외의 정수값을 가지는 File Descirptor는 특정 파일을 가리키고 있다. 프로세스는 해당 정수값을 통해 파일에 접근할 수 있다.

    위에서도 설명했듯이 File Descriptor는 파일 시스템이 프로세스가 파일에 쉽게 접근하기 위해 제공해 주는 숫자 (인덱스 값)에 지나지 않는다.

    ➡️ File Descriptor 최댓값 수정

    기본적으로 프로세스는 사용할 수 있는 File Descirptor의 최대 수가 정해져 있다. 최댓값은 아래의 시스템 명령어로 변경할 수 있다.

    ✅ OS

    1. OS의 전체 Limit 확인

    > cat /proc/sys/fs/file-max 20000

    2. 수정 (영구 반영)

    • 적용을 하기 위해선 프로세스의 재기동이 필요하다.
    > vi /etc/sysctl.conf
    fs.file-max = 65535
    

    ✅ 프로세스

    1. 프로세스 Limit 확인

    # Soft Limits
    > ulimit -Sn
    1024
    
    # Hard Limits
    > ulimit -Hn
    4096

     

    2. 현재 실행 중인 프로세스의 File Descriptor 개수 확인

    • 프로세스의 Owner가 payment인 총 File Descriptor 수 확인
    > lsof -u payment |wc -l
    3020

    3. Maximum File Descriptor 수정 (즉시 반영)

    • 즉시 반영은 되나 프로세스 재기동 시 다시 설정을 해줘야 한다.
    > prlimit --nofile=40000 --pid=<PID_입력>

    4. Maximum File Descriptor 수정 (영구 반영)

    • 프로세스의 재기동이 필요하다.
    > vi /etc/security/limits.conf
    payment soft nofile 40000
    payment hard nofile 40000
    

     

    Reference

    'Computer Science > OS' 카테고리의 다른 글

    [CPU] Hyper Threading (하이퍼 쓰레딩)  (0) 2023.05.03