Rust 커널, C의 READ_ONCE/WRITE_ONCE 대신 Atomic crate 선택
리눅스 커널(Linux Kernel)의 READ_ONCE() 및 WRITE_ONCE() 매크로를 Rust에 도입하려는 시도가 무산됨
Rust 커뮤니티는 Atomic crate를 활용하여 동시성 문제를 해결하는 방식을 선호함
C 코드와 Rust 코드 간의 동시성 접근 방식 차이(Concurrency Approach Difference)가 발생할 수 있다는 점이 지적됨
Rust 개발 과정에서 C 코드의 취약점(Vulnerability)이 발견되어 개선되는 긍정적 효과도 발생
READ_ONCE() 및 WRITE_ONCE()의 역할과 Rust에서의 대안
READ_ONCE() 및 WRITE_ONCE()는 컴파일러 최적화를 방지하고, 원자성을 보장하여 락리스 알고리즘(Lockless Algorithms) 구현에 필수적이다. Rust에서는 이러한 매크로 대신 Atomic crate를 사용하여 메모리 접근의 의도를 명확히 하는 방식을 선호한다. 특히, Atomic::from_ptr().load(Relaxed)를 통해 개발자는 연산에 필요한 보장을 더 정확하게 지정할 수 있다.
Atomic Crate를 활용한 동시성 프로그래밍
Rust 커뮤니티는 Atomic crate를 통해 동시성 문제를 해결하는 방식을 선호한다. 이는 READ_ONCE()/WRITE_ONCE()의 복잡한 의미론을 피하고, 데이터 레이스(Data Race)를 방지하며, 코드의 의도를 명확하게 표현하기 위함이다. Atomic crate는 개발자가 메모리 접근 순서(Memory Access Order)에 대한 세밀한 제어를 가능하게 하여, 보다 안전하고 예측 가능한 코드를 작성하도록 돕는다.
C 코드의 취약점 발견 및 개선
Rust 개발 과정에서 C 코드의 취약점이 발견되는 긍정적인 효과도 발생했다. 특히, C 표준을 위반하는 원자성(Atomicity) 관련 코드가 식별되었으며, WRITE_ONCE()를 사용하여 수정해야 한다는 지적이 나왔다. 또한, 고해상도 타이머 코드에서 READ_ONCE() 호출이 누락된 부분을 발견하여 C 코드의 품질을 향상시키는 계기가 되었다.
C와 Rust 간의 동시성 접근 방식 차이
Rust 커널 개발에서 READ_ONCE() 및 WRITE_ONCE() 매크로를 사용하지 않기로 결정함에 따라, C 코드와 Rust 코드 간의 동시성 접근 방식에 차이가 발생할 수 있다. 이는 개발자가 두 가지 다른 API를 이해해야 하는 부담으로 이어질 수 있으며, 락리스 데이터 접근(Lockless Data Access)의 어려움을 가중시킬 수 있다. 이러한 차이는 향후 커널 개발에 영향을 미칠 수 있다.