얼랭의 특성
에서 얼랑 프로그래밍 (2009 년) :
Erlang 동시성은 빠르고 확장 가능합니다. Erlang 가상 머신은 생성 된 모든 프로세스에 대해 OS 스레드를 생성하지 않기 때문에 프로세스가 간단합니다. 기본 운영 체제와 상관없이 VM에서 생성, 예약 및 처리됩니다. 결과적으로 프로세스 작성 시간은 마이크로 초 단위이며 동시에 존재하는 프로세스 수와 무관합니다. 이를 Java 및 C #과 비교하십시오. 모든 프로세스에 대해 기본 OS 스레드가 작성됩니다. Erlang을 사용하면 두 언어보다 성능이 훨씬 뛰어납니다.
에서 동시성 얼랑 (PDF)에서 지향 프로그래밍 (슬라이드) (2003)
Erlang 프로세스를 만드는 데 걸리는 시간은 1µs에서 2,500 프로세스까지 일정합니다. 이후 최대 30,000 개의 프로세스에서 약 3µs까지 증가합니다. Java 및 C #의 성능이 그림의 맨 위에 표시됩니다. 프로세스 수가 적 으면 프로세스를 만드는 데 약 300µs가 걸립니다. 2 천 개 이상의 프로세스를 만드는 것은 불가능합니다.
최대 30,000 개의 프로세스에서 두 Erlang 프로세스간에 메시지를 보내는 시간은 약 0.8µs입니다. C #의 경우 최대 프로세스 수 (약 1800 개 프로세스)까지 메시지 당 약 50µs가 걸립니다. Java는 훨씬 더 나빴습니다. 최대 100 개의 프로세스에 대해 메시지 당 약 50µs가 걸리고 그 후 약 1000 개의 Java 프로세스가있을 때 메시지 당 10ms로 빠르게 증가했습니다.
내 생각
Erlang 프로세스가 새로운 프로세스를 생성하는 데 훨씬 더 효율적이고 프로세스 당 메모리 풋 프린트가 훨씬 작은 이유를 기술적으로 완전히 이해하지 못했습니다. OS와 Erlang VM은 모두 스케줄링, 컨텍스트 전환을 수행하고 레지스터의 값을 추적해야합니다.
왜 Erlang의 프로세스와 동일한 방식으로 OS 스레드가 구현되지 않습니까? 그들은 더 많은 것을 지원해야합니까? 그리고 왜 더 큰 메모리 공간이 필요합니까? 왜 산란과 의사 소통이 느려 집니까?
기술적으로 Erlang의 프로세스가 생성 및 통신에있어 OS 스레드보다 더 효율적인 이유는 무엇입니까? 그리고 왜 OS의 스레드가 동일한 효율적인 방식으로 구현되고 관리 될 수 없습니까? 왜 OS 스레드가 더 큰 메모리 풋 프린트와 더 느린 스폰 및 통신을 갖습니까?
더 많은 독서
- SMP에 중점을 둔 Erlang VM 내부 (2008)
- Java와 Erlang의 동시성 (pdf) (2004)
- Java의 스레드 및 Erlang의 프로세스 성능 측정 (1998)
erl +P 1000100 +hms 100
하고 유형 {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
보다 3 분 정도 기다렸다가 결과를 기다립니다. 너무 간단합니다. 내 노트북에는 프로세스 당 140us와 1GB의 전체 RAM이 필요합니다. 그러나 직접 쉘 형태이므로 컴파일 된 코드에서 더 좋습니다.