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 |