본문 바로가기

Computer Science/OS

2-2. Virtualization: 파일 디스크립터와 입출력 관리

파일 디스크립터와 입출력 관리

I/O redirection이란 file, command, program, script의 출력 결과를 다른 file, ...의 입력으로 전달하는 것을 말한다.

shell이 fork()하고 exec("wc", "wc w3.c")를 수행한다.

exec(...)하기 전, shell이 STDOUT(1)을 닫고 open("newfile.txt")한다.

File Descriptor & File Descriptor Table

File Descriptor는 파일, 디렉토리, 또는 기기를 나타내는 정수값이다.

각 프로세스는 File Descriptor Table을 가지고 있는데, STDIN(0), STDOUT(1), STDERR(2)는 기본으로 열려 있다.

File Descriptor Table 구조
File Descriptor Table

각 System Call 정리:

  • open(): 새로운 file descriptor를 할당할 때, 앞에서부터 비어 있는 것 찾는다. (이를 이용 redirection)
  • close(): 'fd'에 해당하는 dile deallocate.
  • fork() : 부모 프로세스에서 자식 프로세스로 file descriptor table을 그대로 넘겨준다. (Parent에서 open하고 fork하면 Child에서도 똑같이 access 가능)
  • exec(): 기존에 가지고 있던 file descriptor table이 exec()에 그대로 넘어간다.
    File Descriptor Table 구조로 보는 "cat" 명령어의 실행 과정

Pipe

한 프로세스에서 다른 프로세스로 한 방향의 (Unidirectional) byte stream

  1. 크기나, 수신/발신자 정보 없이 쭉 흘러간다.
  2. File descriptor로 접근 가능한, kernel buffer이다.
  3. Pipe에 대한 접근은 fd에 읽기/쓰기하는 것과 같다.
    Pipe 구조
    ps -aux ❘ grep root ❘ tail

두 가지 종류의 Pipe가 있다.

1. Anonymous Pipe

이름이 없다 → 누군가가 그 이름으로 open 불가 (Unidirectional)
→ Parent-Child 관계에서만 쓴다.
int pipe(int filedes[2]);

write, read 과정
pipe의 구조

2. Named Pipe

bi-directional, no parent-child relationship.
파일 시스템에 의해 관리되며, 여러 writer 가능. (이름 있고 파일처럼 read, write 가능)
→ (process가 unlink를 하지 않으면) communicating process가 끝난 뒤에도 살아 있다.

  • int mkfifo(const char* path, mode_t mode);
  • int unlink(const char* path);
    mkfifo(), unlink() 예제
  • 만약 FIFO를 O_RDONLY 또는 O_WRONLY 쌍으로 열 경우,
    • O_NONBLOCK이 설정되어 있으면 O_RDONLYopen()은 딜레이 없이 수행될 것이다. / O_RDONLYopen()은 현재 읽고 있는 프로세스가 없으면 error를 반환할 것이다.
    • O_NONBLOCK이 설정되어 있지 않으면, O_RDONLYO_WRONLYopen()이 thread가 읽거나 쓰기 위한 파일을 열 때까지 block할 것이다. (같이 open하지 않는 한 밑으로 내려가지 않는다.)
      open() 예제

Inter-Process Communication (IPC)

서로 다른 프로세스들은 다른 주소 공간을 가지므로, 그들 간의 통신 method가 있어야 한다.

→ 주로 message passing / shared memory로 가능하다.

  • 전통적인 UNIX IPC: signal, pipe, socket
  • System V IPC: message queue, semaphore, shared memory

Producer

Producer code

Consumer

Consumer code

→ 차후 3. Memory에서 다시 다룰 예정.