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