TECH 으로 돌아가기
TECH HACKER NEWS 2026.11.01 16:03 9분 읽기 26 READS

Rust로 만든 OS Redox, 링 버퍼로 마이크로커널의 오랜 숙제에 도전하다

Rust로 만든 OS Redox, 링 버퍼로 마이크로커널의 오랜 숙제에 도전하다
SOURCE IMAGE · HACKER NEWS
Rust로 만든 OS Redox, 링 버퍼로 마이크로커널의 오랜 숙제에 도전하다

Redox OS가 링 버퍼 프로젝트를 마무리했어요

Redox OS는 Rust로 처음부터 새로 짠 운영체제예요. 2015년에 시작된 이 프로젝트는 리눅스처럼 커널에 모든 걸 넣지 않아요. 커널은 꼭 필요한 일만 하고, 드라이버나 파일 시스템은 일반 프로그램처럼 유저 공간에서 돌리는 마이크로커널 구조를 택했죠. 이번에 Redox 팀이 네덜란드의 오픈소스 지원 재단 NLnet의 지원으로 진행한 ‘링 버퍼(Ring Buffers)’ 프로젝트의 결과를 정리해서 공개했어요.

“링 버퍼로 뭘 했다는 거지?” 싶으실 텐데요. 한마디로 프로그램과 운영체제가 대화하는 방식을 바꾸는 작업이에요. 이게 왜 중요한지 알려면 마이크로커널의 오래된 숙제부터 봐야 해요.

마이크로커널의 숙제: 대화 비용

마이크로커널에서는 파일 하나를 읽을 때도 여러 프로세스가 협업해야 해요. 앱이 “이 파일 읽어줘”라고 커널에 요청하면 커널은 그 요청을 파일 시스템 프로세스에 넘기고, 파일 시스템은 다시 디스크 드라이버 프로세스에 부탁하는 식이에요. Redox에서는 이런 서비스를 스킴(scheme)이라고 불러요. file, tcp, display처럼 URL 비슷한 이름으로 자원에 접근하는 구조예요.

문제는 요청이 넘어갈 때마다 컨텍스트 스위치가 일어난다는 거예요. 컨텍스트 스위치는 CPU가 하던 일을 멈추고 레지스터 상태를 저장한 다음 다른 프로세스로 갈아타는 작업인데, 공짜가 아니에요. 리눅스라면 커널 안에서 함수 호출 한 번으로 끝날 일을 마이크로커널은 여러 번 왕복해서 처리하니까 느려질 수밖에 없죠. 1990년대 마흐(Mach) 커널이 성능 문제로 고전한 것도, ‘마이크로커널은 느리다’는 편견이 생긴 것도 이 때문이에요.

링 버퍼가 해결하는 방식

링 버퍼는 끝과 처음이 이어진 원형 큐예요. 회전초밥 레일을 떠올리면 쉬워요. 주방(생산자)은 빈 자리에 초밥 접시를 올리고, 손님(소비자)은 지나가는 접시를 집어가죠. 둘이 매번 말을 주고받을 필요 없이 레일만 보면 돼요.

운영체제에 적용하면 이렇게 돼요. 요청하는 쪽과 처리하는 쪽이 공유 메모리에 링 두 개를 둬요. 하나는 요청을 쌓는 제출 큐(Submission Queue)이고, 다른 하나는 결과를 받는 완료 큐(Completion Queue)예요. 앱은 읽기 요청 10개를 제출 큐에 쭉 써넣고 한 번만 알리면 돼요. 처리하는 쪽은 그걸 몰아서 처리한 뒤 완료 큐에 결과를 쓰고요. 요청마다 시스템 콜을 하나씩 부르던 방식보다 왕복 횟수가 크게 줄어들죠. Redox의 이번 프로젝트도 이 제출/완료 큐 모델을 Redox 구조에 맞게 들여오는 작업이에요. 링 버퍼 구조를 개념만 보면 이 정도예요.

struct Ring<T, const N: usize> {
slots: [T; N], // 고정 크기 슬롯
head: AtomicUsize, // 소비자가 다음에 읽을 위치
tail: AtomicUsize, // 생산자가 다음에 쓸 위치
}

생산자는 슬롯에 데이터를 쓴 뒤 tail을 올리고, 소비자는 tail까지 읽은 뒤 head를 올려요. 여기서 핵심은 메모리 순서(memory ordering)예요. CPU는 성능을 위해 메모리에 쓰는 순서를 바꿀 수 있어요. 그래서 tail이 올라간 게 데이터가 써진 것보다 먼저 보이면 소비자가 쓰레기 값을 읽게 되죠. 이걸 막으려면 Release/Acquire 같은 원자적 연산 규칙을 정확히 지켜야 해요. Rust에서도 unsafe가 필요한 영역이라 설계가 까다롭고요.

보안도 중요해요. 공유 메모리는 상대 프로세스가 언제든 값을 바꿀 수 있는 공간이에요. 그래서 값을 검증한 직후에 상대가 몰래 바꿔치기하는 공격(TOCTOU)을 막아야 해요. 프로세스 사이의 경계를 지키는 게 존재 이유인 마이크로커널이라면 특히 신경 써야 하는 부분이죠.

업계 맥락: io_uring이 연 길

이 아이디어의 가장 유명한 사례는 리눅스의 io_uring이에요. 2019년 리눅스 5.1에 들어간 이 인터페이스도 제출 큐와 완료 큐를 공유 메모리에 두고 비동기 I/O를 처리해요. 효과가 커서 PostgreSQL 18은 비동기 I/O 방식으로 io_uring을 고를 수 있게 됐고, Rust 생태계에도 tokio-uring, monoio, glommio 같은 런타임이 생겼어요. 윈도우도 Windows 11에서 IoRing이라는 비슷한 API를 추가했고요.

다만 그늘도 있어요. 구글은 2023년에 자사 버그바운티(kCTF)로 들어온 커널 익스플로잇 상당수가 io_uring을 노렸다고 밝혔어요. 그래서 ChromeOS와 자사 프로덕션 서버에서 io_uring을 끄고, 안드로이드에서도 사용을 제한했죠. 거대한 기존 커널에 새 인터페이스를 덧붙이면 공격 표면이 늘어난다는 걸 보여준 사례예요.

Redox의 접근이 흥미로운 이유가 바로 여기 있어요. Redox는 처음부터 메모리 안전한 Rust로 작성됐고 서비스 대부분이 유저 공간에 있어서, 버그가 생겨도 피해 범위가 상대적으로 작아요. 동기식 IPC를 극한까지 최적화한 seL4나 채널과 포트 기반 메시징을 쓰는 구글 Fuchsia의 Zircon과 비교하면, Redox는 io_uring식 링 버퍼를 마이크로커널 IPC에 녹이는 길을 택한 셈이에요.

한국 개발자에게 주는 시사점

Redox를 당장 서버에 올릴 일은 없겠지만, 여기서 다루는 개념은 실무와 바로 이어져요.

마무리

한 줄 정리: Redox는 요청을 링 버퍼로 모아 보내는 방식을 도입해서 ‘마이크로커널은 느리다’는 오래된 약점에 정면으로 도전하고 있어요.

여러분은 io_uring 같은 비동기 링 버퍼 인터페이스를 실무에서 써보셨나요? 성능과 보안을 함께 놓고 봤을 때, 이런 공유 메모리 기반 인터페이스를 커널에 넣는 건 남는 장사라고 보시나요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.redox-os.org/news/nlnet-rb-summary/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...