# PatchworkOS – “Everything Is a File” 철학을 UNIX보다 더 엄격히 구현한 새로운 운영체제

*SEO 키워드: **PatchworkOS**, **파일 시스템**, **운영체제 설계***

---

# # 📌 서론 – 파일 하나로 OS 전체를 제어한다면?

우리는 일상에서 **UNIX** 기반 시스템이 “모든 것이 파일이다”는 원칙을 부분적으로만 적용하는 모습을 자주 보게 됩니다. 파일, 디바이스, 소켓 등 각각을 별도의 API로 다루다 보니 초보자에게는 **시스템 콜**이 난해하게 느껴집니다.

이런 복잡성을 없애고자 **PatchworkOS**는 Plan9에서 영감을 받아 **“Everything Is a File”** 철학을 **완전**하게 구현했습니다. 파일 하나만으로도 네트워크 소켓, 프로세스 생성, 시그널(신호) 처리까지 가능하도록 설계돼, 기존 UNIX‑like 시스템보다 훨씬 직관적인 인터페이스를 제공합니다.

이번 글에서는 PatchworkOS가 어떻게 파일 시스템을 **통합 인터페이스**로 활용하는지, 그리고 **소켓**, **프로세스 스폰**, **시그널**을 초보자도 이해하기 쉽게 설명합니다.

---

# # 1️⃣ PatchworkOS의 파일 중심 설계

## # 1.1 통합 네임스페이스

- 모든 리소스는 `/dev`, `/net`, `/proc` 등 하나의 트리 구조에 **파일 형태**로 존재합니다.

- 예를 들어 TCP 소켓을 열 때는 `open('/net/tcp/0')`만 하면 되고, 반환된 파일 디스크립터를 `read/write`로 바로 사용합니다.

## # 1.2 동적 파일 생성

- 새로운 프로세스가 생성되면 자동으로 `/proc/<pid>` 디렉터리가 만들어지고, 그 안에 `stdin`, `stdout`, `stderr`뿐 아니라 **시그널 파일**(`sigint`, `sigterm` 등)도 포함됩니다.

## # 1.3 권한 관리가 쉬워진다

- 파일 권한(`rwx`)이 곧 리소스 접근 권한이 되므로, `chmod`만으로 보안 정책을 적용할 수 있습니다.

> **핵심 포인트**: 파일 입출력(`open`, `read`, `write`, `close`)만 알면 OS 전체를 제어할 수 있다는 점이 PatchworkOS의 가장 큰 매력입니다.

---

# # 2️⃣ 소켓 – 파일 하나로 네트워크 통신

```
c

int fd = open('/net/tcp/0', O_RDWR);   // 첫 번째 TCP 소켓 열기

write(fd, 'GET / HTTP/1.0\r\n\r\n', 18);

char buf[256];

int n = read(fd, buf, sizeof(buf));

```

- `write`는 바로 네트워크 패킷으로 변환되고, `read`는 수신된 데이터를 버퍼에 채워 반환합니다.

- 기존 UNIX에서 `socket()`, `connect()`, `send()`, `recv()`를 각각 호출하던 과정을 **단일 파일 API**로 대체했습니다.

## # 장점

1. **코드가 간결**해집니다.

2. 파일 디스크립터 기반이므로 `select`/`poll` 대신 표준 파일 API로 멀티플렉싱이 가능합니다.

3. 디버깅 시 `lsof` 같은 도구로 소켓 파일을 바로 확인할 수 있어 **가시성**이 높습니다.

---

# # 3️⃣ 프로세스 스폰 – 파일 하나로 새로운 작업 실행

## # 3.1 프로세스 생성 방법

```
c

int pid = open('/proc/spawn', O_WRONLY);

write(pid, 'bin/hello_world', 15);   // 실행 파일 경로를 쓰면 프로세스가 생성

close(pid);

```

- `/proc/spawn` 파일에 실행 파일 경로를 쓰면 새로운 프로세스가 **자동으로 생성**됩니다.

- 반환값은 새 프로세스의 **PID**이며, 이후 `/proc/<pid>` 디렉터리를 통해 입출력, 시그널 등을 제어합니다.

## # 3.2 입출력 연결

```
c

int in  = open('/proc/1234/stdin',  O_WRONLY);

int out = open('/proc/1234/stdout', O_RDONLY);

write(in, 'Hello Patchwork!', 16);

read(out, buf, 64);

```

- 부모와 자식 간의 I/O도 일반 파일 입출력으로 처리됩니다.

## # 장점

- `fork`·`execve` 같은 복잡한 시스템 콜이 사라지고 **단일 파일 인터페이스**만으로 프로세스 관리가 가능합니다.

---

# # 4️⃣ 시그널(신호) – 파일로 이벤트를 받다

## # 4.1 시그널 파일 열기

```
c

int sig = open('/proc/1234/sigint', O_RDONLY);   // SIGINT 시그널 파일

```

- 파일을 **읽기 전용**으로 열면 해당 프로세스에 `SIGINT`가 발생했을 때 데이터가 채워집니다.

## # 4.2 시그널 대기 및 처리

```
c

char buf[1];

read(sig, buf, 1);      // SIGINT가 오면 블록 해제

printf('Ctrl+C 가 눌렸습니다!\n');

```

- `read`가 반환될 때마다 시그널이 발생했음을 의미합니다.

## # 4.3 시그널 전송

```
c

int target = open('/proc/4567/sigterm', O_WRONLY);

write(target, '', 0);   // SIGTERM 전송

```

- 다른 프로세스의 시그널 파일에 **빈 데이터를 쓰면** 해당 시그널이 전달됩니다.

## # 장점

- `kill`, `signal` 함수 대신 **파일 쓰기**만으로 시그널을 주고받을 수 있어 **코드 가독성**이 크게 향상됩니다.

---

# # 5️⃣ 결론 – PatchworkOS와 함께 “파일 하나로 모든 것”을 경험해보세요

PatchworkOS는 **파일 시스템**을 모든 시스템 리소스의 **공통 인터페이스**로 승격시켜, 복잡한 시스템 콜을 **단일 파일 입출력**으로 대체했습니다.

- **소켓** → `/net/...` 파일

- **프로세스 스폰** → `/proc/spawn` 파일

- **시그널** → `/proc/<pid>/sig*` 파일

이러한 설계는 **운영체제 설계**를 처음 배우는 초보자에게 큰 학습 장벽을 낮춰 주며, 동시에 고급 개발자에게는 **일관된 API**로 생산성을 높여 줍니다.

> **지금 바로** PatchworkOS 레포지토리([GitHub](https://github.com/KaiNorberg/PatchworkOS))를 클론하고, 간단한 “Hello World” 프로그램을 파일 입출력만으로 구현해 보세요. 여러분의 첫 번째 파일 기반 OS 프로젝트가 곧 시작됩니다!

---

*읽어 주셔서 감사합니다. 도움이 되셨다면 댓글과 공유, 그리고 GitHub 스타를 눌러 주세요. 🚀*
