Skip to main content

PatchworkOS – “모든 것이 파일” 철학을 UNIX보다 더 엄격히 구현한 새로운 OS 소개

Published 3 min readMarkdown

SEO 키워드: PatchworkOS, 파일 시스템, 운영체제 개발


# 📌 서론 – 왜 새로운 OS가 필요할까?

우리는 일상에서 UNIX 기반 시스템이 “모든 것이 파일이다”는 원칙을 부분적으로만 적용하는 모습을 자주 보게 됩니다. 파일, 디바이스, 소켓, 심지어 프로세스 간 통신까지도 각각 별도의 인터페이스를 제공하죠. 이런 복잡성은 특히 운영체제 개발을 처음 시작하는 초보자에게 큰 장벽이 됩니다.

그런데 PatchworkOS는 이 철학을 Plan9에서 영감을 받아 완전히 구현합니다. 파일 하나만으로도 소켓 통신, 프로세스 생성, 시그널(신호) 처리까지 가능하도록 설계돼, 기존 UNIX‑like 시스템보다 훨씬 직관적인 API를 제공합니다. 이번 포스트에서는 PatchworkOS가 어떻게 “Everything Is a File”을 실현했는지, 그리고 핵심 기능인 소켓, 프로세스 스폰, 시그널을 간단히 살펴보겠습니다.


# 🗂️ 1. 파일 시스템이 곧 인터페이스 – PatchworkOS의 핵심 설계

  • 통합 파일 네임스페이스

    • /dev, /net, /proc 등 기존 UNIX와 달리 모든 리소스가 하나의 파일 트리에 존재합니다.

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

  • 동적 파일 생성

    • 프로세스를 생성하면 /proc/<pid> 디렉터리가 자동으로 생성되고, 그 안에 stdin, stdout, stderr 뿐 아니라 시그널 파일(sigint, sigterm 등)도 포함됩니다.
  • 간단한 권한 관리

    • 파일 권한(rwx)이 곧 리소스 접근 권한이 되므로, 복잡한 시스템 콜 대신 chmod만으로 보안 정책을 적용할 수 있습니다.

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


# 🌐 2. 소켓 통신 – 파일 하나로 네트워크 연결

# 2.1 소켓 열기

c

int fd = open('/net/tcp/0', O_RDWR);
  • 0은 첫 번째 TCP 소켓을 의미합니다.

  • 파일 디스크립터 fd는 일반 파일과 동일하게 read와 write를 사용할 수 있습니다.

# 2.2 연결 및 데이터 전송

c

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

char buf[256];

int n = read(fd, buf, sizeof(buf));
  • write는 바로 네트워크 패킷으로 변환됩니다.

  • read는 수신된 데이터를 버퍼에 채워 반환합니다.

# 2.3 장점

  • 시스템 콜이 하나 뿐이라 코드가 간결합니다.

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


# ⚙️ 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도 파일 입출력으로 처리됩니다.

# 3.3 장점

  • 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 전송
  • 다른 프로세스의 시그널 파일에 빈 데이터를 쓰면 해당 시그널이 전달됩니다.

# 4.4 장점

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

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

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

  • 소켓 → /net/... 파일

  • 프로세스 스폰 → /proc/spawn 파일

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

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

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


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

No comments yet. Be the first to comment.

More from this blog