[트리비아의 씨앗] TaskQueue가 오버플로우합니까? 결과는… 아훗

이 기사는 내가 소박한 의문을 품은 곳에서 검증해 보았을 때까지의 일부 시종입니다.
착각 등이 있으면, 지적하실 수 있으면 다행입니다.

결과만 알고 싶은 분은 이쪽.

오류가 발생하지 않았습니다.

이번 편지는 여기



어느 날, JavaScript의 비동기 처리에 대해 공부하고 있을 때 스택과 큐의 존재를 알았습니다. 1
이것이 "스택에 작업이 너무 쌓여 오버플로가 될 것인가!"라고 무릎을 꿇었습니다.
그와 동시에, 큐 오버플로우라고 들은 적이 없다고 의문에 생각했습니다.
그래서 큐 오버플로우가 되도록 굳이 코드를 실행하면 어떻게 될까요?
이것이 씨앗이되지 않습니까? 잘 부탁드립니다.

이 트리비아의 종 즉 이런 것입니다.



큐 오버플로우가 될 수 있도록 굳이 코드를 실행하면 결과는,, "오픈".

스택 오버플로우란?



wikipedia 선생님 부탁드립니다.

스택 오버플로우는 컴퓨터 프로그램에서 호출 스택 영역의 한계를 초과하는 데이터 푸시로 인해 발생하는 버퍼 오버플로의 일종입니다. 2

전문가에게 물어 보았다 (현장의 선배)



Q. 어떻게 확인하면 좋을까?
A. 오류가 발생했는지 확인합니다. 혹은 브라우저상에서 조작에 영향이 있으면 그것이 오버플로우하고 있다고 판단해도 좋을 것입니다.

Q. 실행 환경은?
A. 자바스크립트는 일반적으로 브라우저에서 실행되므로 가장 중요한 Chrome에서 확인하면 됩니다.

검증 방법


  • Chrome (버전 : 78.0.3904.108)
  • 런타임 오류가 발생하는지
  • 브라우저 거동에 변화가 없는가

  • 우선 스택 오버플로를 발생시켰습니다.



    이번 검증에 사용하는 코드는 이쪽


    function push() {
      try {
        return push();
      } catch (e) {
        console.log(e);
      }
    }
    push();
    

    결과



    오류가 발생했습니다.RangeError: Maximum call stack size exceeded

    큐 오버플로우가 발생하는지 확인해 보았습니다.



    이번 검증에 사용하는 코드는 이쪽


    enqueue() 를 빠져나가지 않으면, 늘 큐에 태스크를 담는다.

    ※무한 루프에 주의.
    function enqueue() {
      while (1) {
        try {
          setTimeout(() => {console.log('詰めまくり!')}, 0);
        } catch (e) {
          console.log(e);
        }
      }
    }
    enqueue();
    

    결과



    오류가 발생하지 않았습니다.

    무한 루프로 굳어 버렸기 때문에 강제 종료.


    여기에 새로운 트리비아가 탄생했습니다.



    큐 오버플로우가 되도록 굳이 코드를 실행하면, , 에러는 발생하지 않는다.

    번외편



    큐에 쌓인 상태에서 스택에 부딪히면 어떻게 되는지 검증해 보았다.

    우선 여기에서 최대치를 계측한다.
    let n = 0;
    function push() {
      try {
        ++n;
        return push();
      } catch (e) {
        console.log(`${n}個目のタスクでエラーでした。`);
      }
    }
    push();
    

    결과





    이어서 여기를 실행



    루프 처리는 이쪽을 참고로 했다. 3
    가정에서는, enqueue() 를 빠진 후에 큐에 포장된 태스크가 스택에 쌓일 것이다. .
    function enqueue() {
      for (let i = 0; i < 10452; i++) {
        try {
          setTimeout(() => {() => {console.log('詰めまくり!')}}, 0);
        } catch (e) {
          console.log(e);
        }
      }
      // キューに積み切るまでの時間稼ぎ
      const ms = new Date();
      while (new Date() - ms < 100000);
    }
    enqueue();
    

    결과



    오류가 발생하지 않았습니다.



    감상



    어디까지나 예상이지만, 오버플로우 하지 않게 어느 정도 분할해 스택에 쌓고 있는 것일까...?
    혹시 webapis가 잘 해주고 있습니다 ...?
    검증은 이상이 됩니다.



    htps : //에서 ゔぇぺぺr. 모잖아. 오 rg / 자 / 도 CS / 우 B 

    htps : // 그럼.ぃきぺぢ아. 오 rg/우키/%에 3% 82% B9% 에 3% 82% BF% 에 3% 83% 83% 에 3% 82% 아 F% 에 3% 82% 3% 83% 90% 에 3% 83% BC% 에 3% 83% 95% 에 3% 83% 에 D% 에 3% 83% BC 

    htps //w w. 세주쿠. 네 t/bぉg/24629 

    좋은 웹페이지 즐겨찾기