PatchworkOS – “모든 것이 파일” 철학을 UNIX보다 더 엄격히 구현한 새로운 OS 소개
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 스타를 눌러 주세요! 🚀
Comments
Join the discussionNo comments yet. Be the first to comment.