System — VM과 호스트 시스템에 직접 접근하는 함수들
System — VM과 호스트 시스템에 직접 접근하는 함수들
System 모듈은 가상 머신(VM)이나 호스트 운영체제와 직접 상호작용하는 함수들을 제공해요. 환경 변수를 읽거나, 시스템 정보를 얻거나, 명령을 실행하는 일 등이 여기에 속해요.
출처: System — The System module provides functions that interact directly with the VM or the host system
본문
System 모듈의 함수는 크게 두 부류로 나눌 수 있어요.
- VM/OS 상호작용: 환경 변수(
System.get_env/1,System.fetch_env!/1,System.put_env/2), 호스트 정보, 명령 실행(System.cmd/3), 종료(System.halt/0), 스택 추적 등 - 시간 다루기: 시스템이 유지하는 다양한 시간값을 여러 시간 단위로 돌려주는 함수들
시간과 "타임 워프(time warp)"
시스템 시간에 의존할 때의 어려움 중 하나는 시간이 조정될 수 있다는 점이에요. 예를 들어 서머타임(daylight saving time)이 시작·종료될 때 시스템 시계가 조정되면서 보통 한 시간이 더해지거나 빠져요. 이런 변화를 "타임 워프(time warp)" 라고 불러요.
이런 변화가 왜 위험할 수 있는지 다음 코드를 보면 이해가 돼요.
## DO NOT DO THIS
prev = System.os_time()
# ... execute some code ...
next = System.os_time()
diff = next - prev
코드가 실행되는 동안에 시스템 시계가 바뀌면, 실제로는 1초밖에 안 걸린 코드가 1시간 넘게 걸린 것으로 보고될 수 있어요! 이런 문제를 피하려면 VM은 System.monotonic_time/0을 통해 단조 시간(monotonic time) 을 제공해요. 이 시간은 결코 줄어들지 않고 도약하지 않아요.
## DO THIS
prev = System.monotonic_time()
# ... execute some code ...
next = System.monotonic_time()
diff = next - prev
VM이 제공하는 세 가지 시간
일반적으로 VM은 세 가지 시간 측정값을 제공해요.
os_time/0— 운영체제(OS)가 보고하는 시간. 제한 없이 앞뒤로 조정될 수 있어요.system_time/0— VM이 바라보는os_time/0. 타임 워프가 있으면 시스템 시간과 OS 시간이 일치하지 않을 수 있어요. 이 시간은 단조적이지 않아서(줄어들 수 있음) VM의 타임 워프 모드에 따라 동작이 달라져요.monotonic_time/0— Erlang VM이 제공하는 단조 증가 시간. 다만 엄밀히 단조 증가는 아니어서, 연속으로 여러 번 호출해도 같은 값을 돌려줄 수 있어요.
이 모듈의 시간 함수들은 (별도로 명시하지 않으면) :native 시간 단위로 동작해요. :native는 운영체제에 따라 달라지는데, 대부분의 계산을 :native 단위로 해서 정밀도 손실을 피하고, 마지막에 convert_time_unit/3으로 :millisecond나 :microsecond 같은 특정 단위로 변환해요.
명령 실행
System.cmd/3은 외부 명령을 실행해요. 예를 들어:
{output, status} = System.cmd("echo", ["hello"])
첫 번째 반환값에 표준 출력, 두 번째 반환값에 종료 상태가 담겨요. System.cmd/3에는 cd, env, stderr_to_stdout, into, arg0 같은 옵션도 넘길 수 있어요.
더 알아보기
- 환경 변수:
System.get_env/1,System.fetch_env!/1,System.put_env/2,System.delete_env/1 - 시간:
System.monotonic_time/0,System.os_time/0,System.system_time/0,System.convert_time_unit/3 - 명령 실행:
System.cmd/3 - 시스템 종료·정보:
System.halt/0,System.pid/0,System.schedulers_online/0