Search
Duplicate
📁

파일 디스크립터(file descriptor)

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
CS
Operating System
태그
file descriptor
Scrap
8 more properties
목차

1. 유닉스 파일이란?

유닉스를 구성하고, 유닉스에서 사용하는 모든 데이터들은 파일로 구성된다. 즉 파일은 데이터를 읽을 수 있는 자원 또는 데이터를 쓸 수 있는 모든 대상으로, 우리가 흔히 떠올리는 파일 뿐 아니라 모든 물리적인 구동 장치를 가리킨다. 입력 자원인 키보드도 파일이고, 출력 대상인 모니터나 프린터도 파일이라고 할 수 있다.
유닉스에서는 파일의 효율적인 관리와 접근을 위해 inode(index node) 구조를 사용한다. 아이노드는 파일 시스템에서 가장 기본이 되는 단위가 되며, 각각의 파일은 모두 고유한 inode 번호를 가지고 있다.

2. 파일 디스크립터

프로세스(실행중인 프로그램)가 파일을 다룰 때 사용 하는 개념이다. 특정 파일에 접근하기 위한 추상적인 키를 말한다고 한다.
커널이 한 프로세스가 접근하는 파일들을 식별하기 위해 사용한다.

(1) 표준 입력, 표준 출력, 표준 오류

관례상 모든 은 프로그램이 새로 실행될 때마다 세 개의 파일 디스크립터를 연다. 바로 표준 입력(standard input), 표준 출력(standard output), 표준 오류(standard error)이다.
관례상 은 표준 입력의 파일 디스크립터는 0, 표준 출력의 파일 디스크립터는 1, 표준 오류의 파일 디스크립터는 2로 표현한다. 이러한 관례는 쉘과 여러 응용 프로그램들에 쓰이지만 UNIX 커널의 한 특징은 아니다.
0, 1, 2라는 값들이 POSIX.1에 의해 표준화되긴 했지만, 가독성을 위해서는 <unistd.h> 헤더 파일에 정의되어 있는기호 상수 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO를 사용하는 것이 바람직하다.
파일디스크립터의 범위는 본질적으로는 무한대이다. 하지만 시스템의 가용 메모리 용량, 정수 형식의 크기, 그리고 시스템 관리자가 설정한 정적(hard), 동적(soft) 한계들에 제한을 받는다. (FreeBSD 8.0, Linux 3.2.0, Mac OS X 10.6.8, Solaris 10 등)

(2) 프로세스간 파일 공유

프로세스는 하드 디스크에 있는 실행 파일을 실행하면 메모리에 올라가는 프로그램을 말한다. 커널은 프로세스별로 PCB(Process Control Block)라는 자료구조로 프로세스를 관리한다.
커널은 파일의 메타 데이터(meta data)를 저장한 FCB(File Control Block)를 사용해 파일을 제어한다. 유닉스 계열에서는 inode(index node)라고 불린다. 파일의 이름과 inode number가 inode table에 mapping되어 있다.
v-node 구조체를 도입하기 이전에는 여러 프로세스가 같은 파일에 접근하려고 하면 프로세스 별로 각각 FCB를 따로 할당 받아서 프로세스가 실행되었다. 만약 두 개의 프로세스가 동일한 파일을 열었을 때 한 프로세스에서 다른 쪽은 권한을 변경하고자 시도한다면 문제가 발생하게 된다.
위와 같은 경우를 방지하기 위해 offset 값을 제외한 나머지 정보들을 여러 프로세스가 공유하는 공간을 만들었다. 파일마다 v-node를 할당하고, 해당 파일을 쓰는 프로세스들은 같은 v-node를 공유한다. 또한 파일에 대한 접근을 용이하기 위해 file descriptor라는 개념이 도입되었다.

1) PCB (in Kernel)

운영 체제 커널은 각 프로세스마다 관련 정보를 관리하기 위해 커널의 데이터 영역에 모든 프로세스의 PCB를 저장한다.
프로세스가 한 상태에서 다른 상태로 전환(문맥 교환)될 때 프로세스 관련 정보들이 필요하기 때문에 PCB 자료구조에 해당 내용을 저장하는 것이다.
[구성요소]
운영체제가 관리상 필요한 정보 : 프로세스 상태(ready/running/blocked/suspended), 프로세스 ID, scheduling 정보, 우선순위
CPU 수행 관련 하드웨어 값 :
program counter, register
메모리 관련 :
code, data, stack의 위치 정보
파일 관련 :
열린 파일의 파일 디스크립터 정보

2) Process Table (in Kernel)

운영체제는 프로세스 테이블에 각 프로세스의 PID(프로세스 ID)별로 PCB에 대한 포인터를 유지하여 PCB에 빠르게 접근한다.
프로세스 테이블의 한 항목으로 열린 파일의 파일 디스크립터 테이블이 있다.

3)Three Basic Tables

3-1) File Descriptor Table (in Kernel)

각 프로세스는 열린 파일을 관리하기 위해 파일 디스크립터 테이블을 가지고 있다.
파일을 열때 사용한 flag와 파일테이블에서의 위치 정보를 담고 있다.
커널(kernal)의 프로세스 테이블에 보통 저장되지만 사용자 영역(user space)에 저장되는 경우도 있다.

3-2) (Open) File Table (in Kernel)

커널은 모든 열린 파일을 관리하는 파일 테이블을 “하나” 관리한다.
이 테이블은 모든 프로세스가 접근할 수 있게 공유되어 있다.(shared by all processes)
테이블의 각 entry는 각 파일 open마다 할당되는 형태이다.
파일 테이블 안에는 refcnt라는 변수가 있다.
현재 파일을 참조(reference)하고 있는 프로세스의 개수를 나타낸다.
일반적으로 forkdup 함수에 의해 개수가 늘어난다.
파일 테이블의 항목
파일의 상태 flag : 읽기, 쓰기, 추가, 동기화, 비차단 등
현재 파일의 작업 offset
참조 횟수(reference count, refcnt)
파일의 v-node의 포인터(위치 정보)

3-3) v-node Table (in Kernel)

커널 내 하나의 활성화된 파일을 나타내는 추상화로, 파일에 대한 인터페이스를 정의하고 파일에 대한 정보들을 담고 있다.
v-node
각각의 열린 파일(또는 장치)마다 하나씩의 v-node 자료구조가 존재한다.
v-node에는 파일의 종류에 관한 정보 및 그 파일에 대해 작동하는 함수들을 가리키는 포인터들이 담겨 있다.
대부분의 파일의 경우 각 v-node는 파일에 대한 i-node를 담고 있다.
i-node
파일 소유자, 파일 크기, 파일의 실제 자료 블록들이 디스크에 할당되어 있는 위치를 가리키는 포인터 등의 정보
v-node 참고 내용
v-node는 하나의 컴퓨터 시스템에서 여러 종류의 파일 시스템을 지원하기 위해 고안된 것이다. 해당 작업은 Peter Weinberger(벨 연구소)와 Bill Joy(Sun Microsystems)가 각각 독립적으로 진행했다. Sun은 이를 Virtual File System(가상 파일 시스템)이라고 불렀으며, i-node 중 파일 시스템에 독립적인 부분을 v-node라고 불렀다.([Kleiman 1986]). v-node는 Sun의 Network File System (NFS)에 대한 지원이 추가되면서 여러 제조사 구현들에 전파되었다.
버클리의 릴리즈 중에 v-node를 처음으로 지원한 것은 NFS가 추가된 4.3BSD Reno 릴리즈이다.
SVR4는 SVR3의 파일 시스템 독립적 i-node를 v-node로 대체했다. Solaris는 SVR4에서 파생된 것이므로 v-node를 사용한다.
Linux는 자료구조들을 v-node와 i-node로 나누는 대신 파일 시스템 독립적 i-node와 파일 시슽템 의존적 i-node로 나눈다.

3. 참고자료

1. Tstory : UNIX 시스템 소개
2. 책 : Advanced Programming in the UNIX environment, Third Edition (고급 UNIX 프로그래밍) (W. Richard Stevens, Stephen A. Rago)
3. GeeksforGeeks : Process Table and Process Control Block
4.
개인 블로그