Java Virtual Machine에 GIL이 없는 이유는 무엇입니까?Python에 왜 그렇게 필요한 것이 있습니까?

StackOverflow https://stackoverflow.com/questions/991904

문제

저는 GIL(Global Interpreter Lock) 없이도 스레드를 훌륭하게 구현할 수 있는 Java Virtual Machine의 근본적으로 다른 점에 대해 누군가가 통찰력을 제공할 수 있기를 바랍니다. 반면 Python에는 그러한 악이 필요합니다.

도움이 되었습니까?

해결책

Python (언어)에는 Gil이 필요하지 않습니다 (이는 JVM [Jython] 및 .NET [IronpyThon]에서 완벽하게 구현할 수 있으며 해당 구현이 멀티 스테이드를 자유롭게 읽습니다). Cpython (인기있는 구현)은 항상 코딩의 용이성 (쓰레기 수집 메커니즘의 코딩)과 비 스레드-안전 C 코딩 라이브러리의 통합 (주변 사람들이 많았습니다. -).

그만큼 무등 한 삼키기 다른 야심 찬 목표 중에서도 프로젝트도 수행합니다 계획 Python 용 Gil-Free Virtual Machine- 해당 사이트를 인용 할 수 있습니다. IBM의 재활용기처럼 (Bacon et al, 2001). "

다른 팁

JVM (적어도 핫스팟)은 "gil"과 비슷한 개념을 가지고 있으며, 자물쇠 세분화에서 훨씬 더 미세합니다. 대부분은 더 발전된 핫스팟의 GC에서 나옵니다.

Cpython에서 그것은 하나의 큰 자물쇠 (아마도 사실이 아니라 논쟁에 충분할 것입니다), JVM에서는 사용되는 위치에 따라 다른 개념으로 더 확산됩니다.

예를 들어 핫스팟 코드에서 VM/Runtime/SafePoint.hpp를 살펴보십시오. 이는 효과적으로 장벽입니다. SafePoint에서 일단 VM 전체가 GIL에서 Python VM 중지와 마찬가지로 Java 코드와 관련하여 중지되었습니다.

Java World에서 이러한 VM 일시 정지 이벤트는 "정지 세계"로 알려져 있습니다.이 시점에서는 특정 기준에 바인딩되는 기본 코드 만 무료로 실행되며 VM의 나머지 부분은 중지되었습니다.

또한 JVM이 FFI 통화에 대한 환경에 대한 보장을 적게 보장하기 때문에 JNI가 더 쉽게 작성하기가 훨씬 더 어려워지면 CPython이 상당히 쉽게 만드는 것 중 하나가 CTYPE를 사용하는 것만 큼 쉽지는 않기 때문에 JNI가 작성하기가 훨씬 더 어려워집니다.

이 블로그 게시물에 아래에 의견이 있습니다. http://www.grouplens.org/node/244 그것은 Ironpython 또는 Jython의 길을 쉽게 분배하는 이유를 암시하지만 Cpython은 기준 계수를 사용하는 반면 다른 2 VM에는 쓰레기 수집기가 있습니다.

이것이 왜 그런지에 대한 정확한 역학은 내가 얻지 못하지만 그럴듯한 이유처럼 들립니다.

이에 링크 그들은 다음과 같은 설명을 가지고 있습니다:

..."인터프리터의 일부는 스레드로부터 안전하지 않습니다. 하지만 대부분 대규모 잠금 사용으로 인해 모두 스레드로부터 안전하게 만들면 단일 스레드의 속도가 극도로 느려지기 때문입니다(원천).이는 참조 카운팅을 사용하는 CPython 가비지 수집기와 관련된 것으로 보입니다(JVM 및 CLR은 그렇지 않으므로 매번 참조 카운트를 잠그거나 해제할 필요가 없습니다).그러나 누군가 수용 가능한 솔루션을 생각하고 이를 구현하더라도 제3자 라이브러리는 여전히 동일한 문제를 안고 있을 것입니다."

Python에는 JIT/AOT가 부족하고 MultithReaded 프로세서에서 작성된 시간 프레임은 존재하지 않았습니다. 또는 Julia Lang의 모든 것을 다시 컴파일하여 길이 부족하고 Python 코드에서 속도 부스트를 얻을 수 있습니다. 또한 Jython 종류는 Cpython과 Java보다 느립니다. Python을 고수하려면 병렬 플러그인 사용을 고려하면 즉시 속도 부스트를 얻지 못하지만 올바른 플러그인으로 병렬 프로그래밍을 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top