2013-03-21 3 views
1

결정 론적 경량 동시성 (coroutine)을 지원하는 일부 언어가 있습니다.루틴, 파이썬, 루비 또는 다른 언어로 루틴 스택이 커지나요?

  1. 루아 - 코 루틴
  2. 스택리스 파이썬 -
  3. 루비 태스크 릿 - 섬유
  4. 이 ... 더 많은 수 있어야하지만, 현재 내가 많은 생각이 없습니다.

필자가 아는 한, 분리 된 스택이 많이 필요하므로 이러한 언어가 스택 증가를 어떻게 처리하는지 알고 싶습니다. 이것은 4KB와 함께 제공되는 some mention about Ruby Fiber을 읽었 기 때문입니다. 스택 오버플로를 방지하는 기능으로 광고하고 있습니다. 그러나 왜 그들이 스택이 자동으로 커질 것이라고 말하는지 이해할 수 없습니다. C 스택에만 국한되지 않는 VM이 ​​스택 증가를 처리 할 수는 없지만 내부에 대해 잘 모르기 때문에이를 확인할 수는 없습니다.

이러한 종류의 마이크로 스레드에서 스택 성장을 어떻게 처리합니까? 명시 적/암시 적 제한 사항이 있습니까? 아니면 그냥 명확하고 자동으로 처리됩니까? 루비 VM 각 스레드에 대한 C 스택의 복사본을 구비하고 메인 스택에가 섬유 사이를 전환 할 때마다 그 스택 복사 관련된 약간 해키 시스템을 사용하여이 google tech talk으로 당

: 루비

답변

2

. 이것은 Ruby가 여전히 각 광섬유가 4KB 이상의 스택을 갖는 것을 제한하지만 심하게 중첩 된 광섬유 사이를 전환하면 해석기가 오버플로하지 않음을 의미합니다.

파이썬의 경우 :

task-lets는 스택리스 변형에서만 사용할 수 있습니다. 각 스레드는 스택없는 파이썬 VM이 힙 기반 스택을 사용하기 때문에 자체 힙 기반 스택을 얻습니다. 이 혼란은 본질적으로 스택 성장에서 힙의 크기로만 제한됩니다. 즉, 32 비트 시스템의 경우 여전히 1 ~ 4GB의 유효 제한이 있습니다. 루아 들어

:

루아 때문에 본질적으로 만 성장 스택의 힙의 크기에 한정되어 힙 기반 스택을 사용한다. 각 코 루틴은 메모리에서 자체 스택을 가져옵니다. 즉, 32 비트 시스템의 경우 여전히 1 ~ 4GB의 유효 제한이 있습니다.

목록에 더 추가하려면 C#과 VB.Net이 모두 async/await를 지원해야합니다. 이것은 프로그램이 시간이 많이 걸리는 작업을 수행하고 그 기능의 나머지는 나중에 계속할 수있게 해주는 시스템입니다. 이것은 결과를 비롯한 다양한 내부 위치를 얻으려고 할 때 호출되는 메서드의 다음 단계로 진행하기 위해 호출되는 단일 메서드로 메서드를 나타내는 개체를 만들어 구현됩니다. 원래 메소드는 오브젝트를 작성하는 메소드로 대체됩니다. 이것은 재귀 깊이가 영향을 미치지 않는다는 것을 의미합니다. 메서드가 예상보다 스택에서 조금 아래로 내려와 있지 않기 때문입니다.