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로 대체했습니다.
# 장점
코드가 간결해집니다.
파일 디스크립터 기반이므로
select/poll대신 표준 파일 API로 멀티플렉싱이 가능합니다.디버깅 시
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)를 클론하고, 간단한 “Hello World” 프로그램을 파일 입출력만으로 구현해 보세요. 여러분의 첫 번째 파일 기반 OS 프로젝트가 곧 시작됩니다!
읽어 주셔서 감사합니다. 도움이 되셨다면 댓글과 공유, 그리고 GitHub 스타를 눌러 주세요. 🚀
Comments
Join the discussionNo comments yet. Be the first to comment.