Shine's dev log

UNIX 의 파일 처리 본문

운영체제

UNIX 의 파일 처리

dong1 2020. 4. 15. 17:09

앞서 말했듯이 UNIX에서는 모든 것을 파일로 생각하고, 처리한다.

 

 

1. 파일의 종류

 

UNIX에서 취급하는 파일은 크게 5가지 종류로 구분할 수 있다.

 

regular, direcotry, special, socket, symbolic link 등이 있다.

 

이렇게 종류를 구분할 뿐, 결국 유닉스는 다 파일로 생각하고 처리한다.

 

 

2. File descriptor

 

모든 프로세스들은 자신들의 file descriptor를 가지고 있다. (process table entry 라고도 불린다)

 

file descriptor를 간단하게 설명하면, 프로세스가 파일에 접근하고자 할 때, 이를 관리하는 표 이다.

 

특정 파일을 open() 하면, 운영체제는 file descriptor에 그 파일에 대한 정보를 심어준다.

 

 

위의 그림은 file descriptor table 을 나타낸 것이다.

 

각 프로세스마다 file descriptor table이 존재하고

 

이 테이블의 0번, 1번, 2번은 stdin, stdout, stderr 로 이미 정해져있다.

 

즉, 모든 프로세스에서 표준 스트림은 이미 file descriptor 에 설정되어 있는 것이다.

 

만약 이 프로세스에서 사용자가 다른 프로그램을 열려고 한다면, 3번에 할당이 될 것이다.

 

왜냐면 파일을 열면 file descriptor table의 비어있는 부분중 가장 작은 숫자로 할당이 되기 때문이다.

 

 

 

3. file table entry

 

앞서 살펴본 file descripter table 이 프로세스내에서 열려진 파일을 관리한다면

 

file table entry는 커널이 모든 열려진 파일들을 관리하는 표이다.

 

이곳에는 파일의 flag, 파일의 offset, 그리고 v-node 테이블의 주소정보가 담겨져 있다.

 

flag는 어떤 읽기전용인지 쓰기전용인지 등의 상태를 나타내고,

 

offset은 파일을 읽고 쓸 때 어디서부터 시작할지를 나타낸다.

 

 

위의 그림은 전체적인 파일 관련 자료구조를 나타낸 것이다.

 

그렇다면 여러 다른 상황에서의 구조도 살펴보자.

 

 

 

위의 그림은 하나의 프로세스에서 서로 다른 두개의 파일을 열었을 때의 구조를 나타낸 것이다.

 

stdin과 stdout 위에서 각각 하나씩의 파일이 열린것을 알 수 있다.

 

 

 

위의 그림은 서로 다른 프로세스에서 하나의 파일을 열었을때의 구조를 나타낸 것이다.

 

이때, 프로세스마다 파일의 읽고 쓰는 위치가 다를것이므로, file table entry의 offset은 다를것이다.

 

하지만 결국 같은 파일에 접근하므로 i-node table은 같은 것을 가리키고 있다.

 

 

 

위의 그림은 하나의 프로세스에서 이미 열려진 파일에 대한 file descriptor를 copy한 경우를 나타낸다.

 

file descriptor table의 1번과 3번이 서로 같은 file table entry를 참조하고 있는데,

 

이는 dup라는 시스템콜을 사용하여 구현할 수 있다.

 

즉, dup는 file descripter를 copy 하는 녀석이라고 생각하면 된다.

 

예를들어 P > A 와 같이 P의 결과값을 A에다가 redirection 하는 경우에

 

원래 file descriptor의 1번은 stdout 으로, 모니터에 연결되어 있지만,

 

dup를 사용해 특정 파일에다가 출력을 하도록 설정하였다.

 

A = dup(1)를 사용하면, 3번에 stdout과 같은 곳을 가리키는 file descriptor가 생성될 것이다.

 

이를 이용하여 A에다가 출력값을 redirection 할 수 있다.

 

 

 

4. 파일 관련 시스템콜

 

- open : 파일을 생성하거나 열 때 사용한다.

 

- create : 파일을 생성할 때 사용한다.

 

- close : 파일을 닫을 때 사용한다.

 

- lseek : 열러진 파일의 offset을 설정한다. ( 파일의 어디에 access 할지 정하는 것 )

 

- read : 열려진 파일을 읽을 때 사용한다.

 

- write : 열려진 파일에 쓸 때 사용한다.

 

- dup, dup2 : file descripter를 복사할 때 사용한다.

 

- fcntl : 이미 열려진 파일의 속성을 변경할 때 사용한다. (get, set을 통해 파일을 읽거나 쓰기 가능)

 

- ioctl : 여러 device 들을 관리할 때 사용한다.

 

- stat : 특정 파일의 상태를 알아볼 때 사용.

 

- umask : access permission 을 조정할 때 사용.

 

- chmod : access permission 을 조정할 때 사용.

 

- link : 새로운 경로로 링크를 걸 때 사용. (파일을 copy하는게 아니라 그냥 링크만 거는것)

 

- sync : 프로세스가 파일에 접근할 때 buffer cache이용하는데, 컴퓨터 종료시 캐시 내용이 날아가는것을 막기 위해 파일에 버퍼 내용을 기록하는 것.

 

*buffer cache : 메모리에 있는것으로, 하드디스크에 있는 파일은 속도가 느리므로 자주 사용하는 것은 buffer cache 에 저장한다. 하지만, 램에 있으므로 컴퓨터가 꺼지면 사라진다.

 

 

본 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.

'운영체제' 카테고리의 다른 글

Concurrency와 Parallelism  (0) 2020.04.26
쓰레드(Thread)_1 (쓰레드란?)  (3) 2020.04.26
Unix 시스템 소개 및 구조  (0) 2020.04.15
IPC_2 (signals, RPCs, pipe)  (0) 2020.04.14
IPC_1 (cooperating process model)  (0) 2020.04.12