DC, DMB, DSB
example
이번 친구들은 CPU와 메모리, 그리고 캐시(Cache) 사이의 복잡한 하드웨어 교통정리를 담당하는 깊숙한 영역의 명령어들입니다. 운영체제(OS) 커널이나 시스템 드라이버를 만드는 개발자가 아니면 평생 한 번 볼까 말까 한 어려운 녀석들이죠.
DC
Data Cache operation (데이터 캐시 청소부)
- 이름의 뜻: Data Cache
- 한 줄 요약: CPU 바로 옆에 있는 초고속 임시 메모리(캐시)를 “강제로 비우거나, 지우거나, 최신화”하라는 명령입니다.
💡 왜 필요한가요? (비유)
CPU는 똑똑하고 빨라서, 저 멀리 있는 메인 메모리(RAM)까지 가기 귀찮아합니다. 그래서 자주 쓰는 데이터를 자기 바로 옆 주머니인 ‘캐시 메모리’에 넣어두고 씁니다. 그런데 주변 장치(예: 그래픽 카드나 네트워크 카드)가 메인 메모리(RAM)의 데이터를 직접 수정해 버렸다면? CPU는 그 사실을 모르고 자기 주머니(캐시)에 있는 낡은 데이터를 계속 쓸 수 있습니다. 혹은 반대로 CPU가 주머니에만 새 데이터를 적어두고 RAM에는 아직 안 보냈을 수도 있죠. 이때 DC 명령어를 내려서 “주머니에 있는 거 당장 RAM에 집어넣어!(Clean)” 혹은 “주머니에 있는 거 낡았으니까 다 버리고 RAM에서 새로 읽어와!(Invalidate)”라고 명령하는 것입니다.
- 실제 코드 예시 (ARM64):
DC CIVAC, X0 ; X0 주소에 해당하는 캐시 라인을 강제로 청소(Clean)하고 비워라(Invalidate)!
DMB
Data Memory Barrier (데이터 통행 제한 표지판)
- 이름의 뜻: Data Memory Barrier
- 한 줄 요약: 데이터 읽기/쓰기 명령어들의 “순서가 뒤바뀌지 않도록 막아주는 바리케이드”입니다. [1]
💡 왜 필요한가요? (비유)
현대 CPU는 속도를 높이기 위해, 자기 마음대로 코드의 실행 순서를 앞뒤로 바꿉니다(Out-of-order execution). 예를 들어 A 마트에서 물건 사고 B 마트에서 물건 사는 코드가 있다면, CPU가 보기에 B 마트가 더 가까우면 B 마트부터 들렀다 오는 식이죠. 혼자 일할 때는 아무 문제가 없습니다. 하지만 멀티코어(CPU 코어가 여러 개) 환경이라면 대참사가 날 수 있습니다.
- 1번 코어: “내가 가구 조립 다 하고(Data), 완료 플래그(Flag=1) 켤게!”
- 2번 코어: “오케이, 난 Flag==1이 되면 가구를 가져다 쓸게!”
그런데 1번 코어의 CPU가 똑똑한 척하느라 Flag=1로 바꾸는 작업을 가구 조립(Data)보다 먼저 처리해 버린다면? 2번 코어는 조립도 안 된 가구를 가져가서 에러가 납니다. 이때 두 명령어 사이에 DMB 바리케이드를 치는 것입니다.
STR X0, [X1] ; 가구 조립 데이터 저장 DMB ISH ; ⛔ 바리케이드! 이 이전의 모든 메모리 작업이 끝날 때까지 절대 넘어가지 마라! STR W2, [X3] ; 완료 플래그(Flag=1) 저장
DMB를 만나면 CPU는 절대로 이 선을 넘어 명령어 순서를 뒤집지 못합니다. 안전한 데이터 교환을 위한 교통 표지판인 셈이죠.
DSB
Data Synchronization Barrier (데이터 작업 완료 대기소)
- 이름의 뜻: Data Synchronization Barrier
- 한 줄 요약: DMB보다 훨씬 더 엄격한 바리케이드로, “내 앞의 메모리 작업이 ‘진짜로 완료’될 때까지 CPU 너는 아예 다음 줄 코드 실행도 하지 말고 멈춰 서 있어라!” 하는 명령입니다. [2]
💡 DMB와 무엇이 다른가요?
- DMB (순서만 보장): “앞뒤 순서 뒤바꾸지만 마! 근데 다른 연산(예: 덧셈, 뺄셈)은 멈추지 말고 계속 하고 있어도 돼.”
- DSB (전면 대기): “순서 보장은 당연하고, 내 앞의 메모리 보내기/받기가 하드웨어적으로 ‘완전히 끝날 때까지’ CPU 너는 다음 줄 명령어 파이프라인 진행을 완전히 멈춰!”
보통 하드웨어 장치를 제어하는 드라이버 코드에서, 장치에 명령을 내린 뒤 그 명령이 하드웨어 칩에 완전히 도달해서 반영된 것을 백프로 보장받고 다음 단계로 넘어가야 할 때 사용합니다. 아주 무겁고 강력한 바리케이드죠.
STR X0, [X1] ; 하드웨어 컨트롤러에 명령 전달 DSB SY ; 🛑 정지! 위의 하드웨어 쓰기 작업이 완벽하게 끝날 때까지 CPU 동작 일시 정지! ADD X2, X2, #1 ; 그 후에야 다음 줄 연산 시작
🧱 눈높이 맞춤 교본용 요약 판넬
| 니모닉 | 이름 | 쉽게 이해하는 역할 | 주 사용처 |
|---|---|---|---|
| DC | Data Cache operation | CPU 주머니(캐시)와 실제 창고(RAM)의 데이터 싱크 맞추기/청소하기 | 드라이버 개발, 메모리 관리 |
| DMB | Data Memory Barrier | 멀티코어 환경에서 명령어 읽기/쓰기 순서 뒤바뀜 방지 (통행 제한) | 멀티스레드 동기화 (Lock 구현) |
| DSB | Data Synchronization Barrier | 앞의 메모리 작업이 하드웨어적으로 끝날 때까지 CPU 다음 코드 진행 차단 (완전 정지) | 주변 장치(I/O) 제어, 시스템 부팅 |