커널 안에 process table이라는 데이터가 있다. process를 생성하면 entry가 생성되고, 이 entry 안에 process와 관련된 각종 정보들이 있다. 이 정보에 file descriptor table이 해당된다.
file descriptor table은 process하나당 한 개씩 존재한다.
커널에서 파일을 open하면 해당 파일에 대한 file table이 생성된다. 각각의 file table들은 entry를 가지고 있다.
file table에는
- 어떤 flag를 이용해서 file을 열었는가에 대한 정보(read, write등 )
- 현재 file offset 값
- pointer가 가르키는 file의 v-node table(v-node table은 file table과 1:1 대응) (지금은 i-node와 v-node를 비슷한 것으로 봐도 무방하다)
에 대한 정보가 있다.
위 그림과 같이 process table entry에는 각 파일에 대한 file descriptor가 있고, 이 file descriptor는 각각 file table을 가리키는 pointer가 있다.
설명을 조금 추가하자면
fd(file descriptor)가 각각의 file table을 가리킨다. (0은 standard input이 할당되고, 1은 std ouput, 2는 std error, 3이 file을 할당)
file table의 v-node pointer가 v-node table을 가리키고, v-node table은 각 I/O 장치 혹은 파일과 1:1 대응한다.
fd1 과 fd2가 모두 출력에 대한 것이므로 v-node pointer도 같은 Screen(출력장치)에 대한 v-node를 가리킨다.
fd3 부터가 file에 대한 file descriptor이므로 각 file에 대응하는 v-node를 가리킨다.
fd1과 fd2의 경우 같은 process에서 출력을 담당하는 파일을 공유했다(UNIX는 장치도 파일취급)
$ ./a.out /* fd = open(“test”, O_RDONLY); */
$ ./b.out /* fd = open(“test”, O_RDONLY); */
위와 같이 a.out이라는 process와 b.out이라는 process가 test라는 같은 파일을 공유하는 상황이다.
그림으로 보면
a.out에 해당하는 process table과 b.out에 해당하는 process table이 각각 있고, 이에 대한 각각의 file table의 v-node pointer가 둘 다 test와 대응하고 있는 v-node를 가리키고 있는 것이다.
이러한 매커니즘으로 서로 다른 process가 같은 파일을 공유한다.
example
int fd3, fd4; char buf[20];
fd3 = open(“file”, O_RDWR);
fd4 = open(“file”, O_RDONLY);
read(fd3, buf, 20); printf(“fd3: %s\n”, buf);
read(fd4, buf, 30); printf(“fd4: %s\n”, buf);
close(fd3);
close(fd4);
위 코드는 한 개의 process 안의 다른 file descriptor fd3, fd4가 같은 파일을 공유하는 상황이다. 하지만 open할 때의 flag가 다르다.
파일을 read and write flag로 open한 반환값을 fd3에 저장하면, read write flag의 file table을 fd3가 가리킨다.
파일을 read only flag로 open한 반환값을 fd4에 저장하면, read only flag의 file table을 fd4가 가리킨다.
하지만 이 두 file table의 v-node pointer는 "file"에 대응하는 같은 v-node table을 가리킨다.
fd3를 20byte만큼 read하면 file table의 offset 값이 20으로 업데이트 된다.
fd4를 30byte만큼 read하면 file table의 offset 값이 30으로 업데이트 된다.
이로서 file을 향해 fd3가 가리키는 offset과 fd4가 가리키는 offset이 각각 다르게 유지된다.
close를 하면 각각 fd3에 해당하는 file table, fd4에 해당하는 file table이 사라진다.
하지만 "file"에 대응하는 v-node table은 fd와 별도로 존재한다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
네트워크 프로그래밍 - 패킷 전달[HLEN, Control Field(SYN, FIN, ACK), Checksum], handshake (0) | 2021.09.22 |
---|---|
컴퓨터 그래픽스 - 컴퓨터 그래픽스의 응용 및 역사 (0) | 2021.09.21 |
UNIX system call - lseek (0) | 2021.09.19 |
UNIX system call - write (0) | 2021.09.18 |
UNIX system call - close, read (0) | 2021.09.17 |