본문 바로가기

Tech

[concurrency] volatile 수식자

Rust, C, 어셈블리어로 동시성 프로그래밍을 공부하기 전에 volatile 수식자에 대해서 알아보자.
volatile 수식자를 이용하면 컴파일러의 최적화를 억제하여 메모리 접근을 구현할 수 있다.

1. Arm 64bit gcc 설치 및 테스트 환경

  • aarch64 gcc 설치: sudo apt-get install gcc-aarch64-linux-gnu
  • 테스트 환경: Linux kali 5.15.0-kali3-amd64 #1 SMP Debian 5.15.15-2kali1 (2022-01-31) x86_64 GNU/Linux

2. non-volatile

    1) non-volatile.c

void non_volatile(int *p) {
    while (*p == 0) {}
}

    2) non-volatile.s  // aarch64-linux-gnu-gcc non-volatile.c -O3 -S

non_volatile:
.LFB0:
	.cfi_startproc
	ldr	w0, [x0]
	cbnz	w0, .L1 
.L3:
	b	.L3
	.p2align 2,,3
.L1:
	ret
	.cfi_endproc

// cbnz reg, label ; 레지스터 reg가 0이 아니면 라벨 label로 점프
// cbz reg, label ; 레지스터 reg가 0이면 라벨 label로 점프
// *p의 값이 즉 w0가 0인 경우 라벨 .L3로 분기되어 무한루프에 빠진다
// 최적화로 인해 우리가 예상치 못한 결과가 나왔다 (즉, *p값 다시 확인 안함)
// 여러 다른 프로세스가 같은 메모리에 접근해 결과를 도출해 낸다고 하면 예상치 못한 결과를 낼 수 있다

3. volatile

    1) volatile.c

void volatile_func(volatile int *p) {
    while (*p == 0) {}
}

   2) volatile.s  // aarch64-linux-gnu-gcc volatile.c -O3 -S

volatile_func:
.LFB0:
	.cfi_startproc
	.p2align 3,,7
.L2:
	ldr	w1, [x0]
	cbz	w1, .L2
	ret
	.cfi_endproc
 
 // *p값이 0일 때, .L2로 분기하고 또 다시 *p값을 확인한다

4. Reference

'Tech' 카테고리의 다른 글

파친코 드라마 토렌트 마그넷  (0) 2022.04.24
[concurrency] 조건변수  (0) 2022.04.24
[Rust] 토렌트 검색기  (0) 2022.04.09
[Python] 일본 드라마, 예능 영상 다운로드  (0) 2022.04.09
Python - [youtube_dl] tver.jp fixed  (0) 2022.04.03