Node. js 이벤트 루프 와 브 라 우 저 이벤트 루프 (이벤트 링)

Event Loop 을 이해 하려 면 먼저 몇 가지 개념 을 배 워 야 합 니 다. 다음은 이러한 개념 을 통 해 Event Loop 을 한 걸음 한 걸음 해석 하 겠 습 니 다.
프로 세 스 와 스 레 드
프로 세 스 는 운영 체제 에서 자원 을 분배 하고 작업 을 스케줄 링 하 는 기본 단위 입 니 다. 프로 세 스 는 프로 세 스에 세 워 진 프로그램 실행 단위 입 니 다. 프로 세 스에 여러 개의 프로 세 스 가 있 을 수 있 습 니 다.
1.1 왜 자 바스 크 립 트 는 단일 라인 입 니까?
자 바스 크 립 트 언어의 큰 특징 은 단일 라인 이다. 즉, 같은 시간 에 한 가지 일 만 할 수 있다 는 것 이다.그렇다면 왜 자바 스 크 립 트 는 여러 개의 스 레 드 가 있 을 수 없 습 니까?이렇게 하면 효율 을 높 일 수 있 잖 아.
JavaScript 의 단일 스 레 드 는 그 용도 와 관계 가 있 습 니 다.브 라 우 저 스 크 립 트 언어 로 서 자바 스 크 립 트 의 주요 용 도 는 사용자 와 상호작용 하고 DOM 을 조작 하 는 것 입 니 다.이것 은 그것 이 단지 단일 라인 일 뿐, 그렇지 않 으 면 매우 복잡 한 동기 화 문 제 를 가 져 올 수 있다 는 것 을 결정 했다.예 를 들 어 JavaScript 에 두 개의 스 레 드 가 있다 고 가정 하면 한 스 레 드 는 특정한 DOM 노드 에 내용 을 추가 하고 다른 스 레 드 는 이 노드 를 삭 제 했 습 니 다. 이때 브 라 우 저 는 어느 스 레 드 를 기준 으로 해 야 합 니까?
그래서 복잡성 을 피하 기 위해 태 어 날 때 부터 자 바스 크 립 트 는 단일 라인 이 었 다. 이것 은 이 언어의 핵심 특징 이 되 었 고 앞으로 도 변 하지 않 을 것 이다.
다 중 핵 CPU 의 컴 퓨 팅 능력 을 이용 하기 위해 HTML 5 는 웹 Worker 표준 을 제시 하여 JavaScript 스 크 립 트 가 여러 개의 스 레 드 를 만 들 수 있 도록 합 니 다. 그러나 하위 스 레 드 는 메 인 스 레 드 에 의 해 완전히 제어 되 고 DOM 을 조작 할 수 없습니다.그래서 이 새로운 기준 은 자 바스 크 립 트 단일 라인 의 본질 을 바 꾸 지 않 았 다.
여기 서 단일 스 레 드 란 메 인 스 레 드 가 단일 스 레 드 라 는 것 을 말 하기 때문에 Node 에서 메 인 스 레 드 는 여전히 단일 스 레 드 입 니 다.
1.2 기타 라인
  • 브 라 우 저 이벤트 트리거 스 레 드 (이벤트 순환 을 제어 하고 setTimeout, 브 라 우 저 이벤트, ajax 의 리 셋 함수 저장)
  • 정시 트리거 스 레 드 (setTimeout 타이머 가 있 는 스 레 드)
  • 비동기 HTTP 요청 스 레 드 (ajax 요청 스 레 드)
  • 단일 스 레 드 의 특징 은 메모 리 를 절약 하고 실행 컨 텍스트 를 전환 할 필요 가 없다 는 것 이다.그리고 단일 스 레 드 는 자물쇠 가 필요 없 는 문제 로 자물쇠 의 개념 을 간단하게 말 할 수 있다.예 를 들 어 수업 이 끝나 면 모두 화장실 에 가 야 하고 화장실 은 하나 로 모든 사람 이 같은 자원 을 방문 해 야 하 는 것 과 같다.그럼 먼저 들 어간 건 자 물 쇠 를 채 워 야 지.노드 에 게 는수업 이 끝나 면 혼자 화장실 에 가기 때문에 자물쇠 문 제 를 면 제 했 습 니 다!
    2. 대기 행렬 과 스 택
    2.1 스 택 메모리 또는 스 택 메모리
    쌓 기와 창고 라 는 두 글 자 를 우 리 는 이미 여러 번 접 했다. 그러면 구체 적 으로 무엇이 창고 에 있 고 무엇이 쌓 여 있 습 니까?자 바스 크 립 트 의 변 수 를 가지 고 말 하면:
  • 우선 자 바스 크 립 트 의 변 수 는 기본 유형 과 인용 유형 으로 나 뉜 다.
  • 기본 유형 은 스 택 메모리 에 저 장 된 간단 한 데이터 세그먼트 이 고 인용 유형 은 메모리 에 저 장 된 대상 을 말한다.

  • 1. 기본 유형
    기본 유형 은 Undefined, Null, Boolean, Number, String 입 니 다.이 유형 들 은 메모리 에 각각 고정 크기 의 공간 을 차지 하고 그들의 값 은 스 택 공간 에 저장 되 며 우 리 는 값 에 따라 접근 합 니 다.
    2. 인용 유형
    참조 형식, 값 크기 가 고정 되 지 않 습 니 다. 스 택 메모리 에 저 장 된 주 소 는 메모리 의 대상 을 가리 키 고 있 습 니 다.인용 으로 접근 하 였 습 니 다.다음 그림 에서 보 듯 이 스 택 메모리 에 저 장 된 것 은 이 대상 의 방문 주소 일 뿐 메모리 에 이 값 을 할당 합 니 다.이 값 의 크기 가 고정 되 어 있 지 않 기 때문에 스 택 메모리 에 저장 할 수 없습니다.그러나 메모리 주소 크기 가 고정 되 어 있 기 때문에 메모리 주 소 를 스 택 메모리 에 저장 할 수 있 습 니 다.이렇게 하면 인용 형식의 변 수 를 조회 할 때 스 택 에서 메모리 주 소 를 읽 은 다음 주 소 를 통 해 더미 의 값 을 찾 습 니 다.이런 것 에 대해 우 리 는 그것 을 인용 방문 이 라 고 부른다.
    2.2 퀘 스 트 대기 열
    단일 스 레 드 는 모든 작업 이 줄 을 서 야 이전 작업 이 끝나 야 다음 작업 을 수행 할 수 있다 는 것 을 의미한다.앞의 임무 가 오래 걸 리 면 뒤의 임 무 는 계속 기다 릴 수 밖 에 없다.
    줄 을 서 는 것 이 계 산 량 이 많아 서 CPU 가 바 빠 서 오히려 그만 두 는 경우 가 많 지만 CPU 가 비어 있 는 경우 가 많 습 니 다. IO 장치 (입 출력 장치) 가 느 리 기 때문에 (예 를 들 어 Ajax 작업 이 네트워크 에서 데 이 터 를 읽 는 것) 결과 가 나 오 기 를 기다 리 고 아래로 실행 해 야 합 니 다.
    JavaScript 언어의 설계 자 는 이때 메 인 스 레 드 는 IO 장 치 를 상관 하지 않 고 대기 중인 작업 을 걸 고 뒤에 있 는 작업 을 먼저 실행 할 수 있다 는 것 을 깨 달 았 다.IO 장치 가 결 과 를 되 돌 릴 때 까지 기 다 렸 다가 다시 고 개 를 돌려 걸 린 임 무 를 계속 수행 합 니 다.
    따라서 모든 작업 은 두 가지 로 나 눌 수 있 습 니 다. 하 나 는 동기 화 작업 (synchronous) 이 고 다른 하 나 는 비동기 작업 (asynchronous) 입 니 다.동기 화 작업 이란 메 인 스 레 드 에서 줄 을 서서 수행 하 는 작업 을 말 합 니 다. 이전 작업 이 완료 되 어야 다음 작업 을 수행 할 수 있 습 니 다.비동기 작업 이란 메 인 스 레 드 에 들 어가 지 않 고 '작업 대기 열' (task quue) 에 들 어 가 는 작업 을 말 합 니 다. '작업 대기 열' 만 메 인 스 레 드 에 알 리 고 어떤 비동기 작업 이 실 행 될 수 있 습 니 다. 이 작업 은 메 인 스 레 드 에 들 어가 서 실 행 됩 니 다.
    구체 적 으로 말 하면 비동기 실행 체 제 는 다음 과 같다.(동기 실행 도 마찬가지 입 니 다. 비동기 작업 이 없 는 비동기 실행 으로 볼 수 있 기 때 문 입 니 다.)
     (1)              ,       (execution context stack)。
     (2)     ,     "    "(task queue)。            ,  "    "        。
     (3)  "   ""    ",         。         ,        ,     ,    。
     (4)             。
    

    3. 브 라 우 저의 Event Loop
    주 스 레 드 는 '작업 대기 열' 에서 이 벤트 를 읽 습 니 다. 이 과정 은 순환 이 끊 이지 않 기 때문에 전체 운영 체 제 를 Event Loop (이벤트 순환) 이 라 고도 합 니 다.
    Event Loop 을 잘 이해 하기 위해 다음 그림 을 보 세 요.
    위의 그림 에서 메 인 스 레 드 가 실 행 될 때 더미 (heap) 와 스 택 (stack) 이 생 깁 니 다. 스 택 의 코드 는 각종 외부 API 를 호출 합 니 다. '작업 대기 열' 에 각종 이벤트 (click, load, done) 를 추가 합 니 다.스 택 에 있 는 코드 가 실행 되 기만 하면 메 인 스 레 드 는 '작업 대기 열' 을 읽 고 이벤트 에 대응 하 는 리 셋 함 수 를 순서대로 실행 합 니 다.
  • 모든 동기 화 작업 은 메 인 스 레 드 에서 수행 되 고 하나의 실행 스 택
  • 을 형성한다.
  • 메 인 라인 외 에 도 작업 대기 열 이 존재 합 니 다.비동기 작업 이 실행 결과 가 나 오 면 작업 대기 열 에 이 벤트 를 놓 습 니 다.
  • 스 택 에 있 는 모든 동기 화 작업 이 완료 되면 시스템 은 작업 대기 열 을 읽 고 대기 열 에 있 는 이 벤트 를 실행 스 택 에 넣 고 순서대로 실행 합 니 다
  • 메 인 스 레 드 는 작업 대기 열 에서 이 벤트 를 읽 습 니 다. 이 과정 은 순환 이 끊 이지 않 습 니 다
  • 전체 이러한 운영 체 제 를 Event Loop (이벤트 순환) 이 라 고도 부른다.
    4: Node. js 이벤트 루프
    Node. js 도 단일 스 레 드 의 Event Loop 이지 만 운영 체 제 는 브 라 우 저 환경 과 다 릅 니 다.
    아래 의 설명도 를 보 세 요.
    위의 그림 에 따 르 면 Node. js 의 운영 체 제 는 다음 과 같다.
  • 우리 가 쓴 js 코드 는 v8 엔진 에 맡 겨 처리 합 니 다
  • 코드 에서 nodeApi 를 호출 할 수 있 습 니 다. node 는 libuv 라 이브 러 리 에 맡 길 것 입 니 다
  • libuv 라 이브 러 리 는 Node API 의 집행 을 책임 집 니 다.이 는 서로 다른 작업 을 서로 다른 스 레 드 에 배정 하여 하나의 Event Loop (이벤트 순환) 을 형성 하고 비동기 적 인 방식 으로 작업 의 수행 결 과 를 V8 엔진 에 되 돌려 줍 니 다.
  • 이벤트 구동 방식 을 통 해 결 과 를 이벤트 대기 열 에 넣 고 최종 적 으로 우리 에 게 맡 깁 니 다.

  • setTimeout 과 setInterval 두 가지 방법 을 제외 하고 Node. js 는 또 다른 두 가지 '작업 대기 열' 과 관련 된 방법 을 제공 했다. process. nextTick 과 setImmediate.
    process. nextTick 방법 은 현재 '실행 스 택' 의 끝 - 다음 이벤트 Loop (메 인 스 레 드 가 '작업 대기 열' 을 읽 기 전에 - 리 셋 함 수 를 촉발 할 수 있 습 니 다.지정 한 임 무 는 항상 모든 비동기 작업 전에 발생 한 다 는 것 이다.setImmediate 방법 은 현재 '작업 대기 열' 의 끝 에 이 벤트 를 추가 하 는 것 입 니 다. 즉, 지정 한 작업 은 항상 다음 이벤트 Loop 에서 실 행 됩 니 다. 이것 은 setTimeout (fn, 0) 과 비슷 합 니 다.
    process.nextTick(function A() {
      console.log(1);
      process.nextTick(function B(){console.log(2);});
    });
    
    setTimeout(function timeout() {
      console.log('TIMEOUT FIRED');
    }, 0)
    // 1
    // 2
    // TIMEOUT FIRED
    

    위의 코드 에 서 는 process. nextTick 방법 이 지정 한 리 셋 함수 로 인해 현재 '실행 스 택' 의 끝 에 항상 트리거 되 기 때문에 함수 A 가 setTimeout 이 지정 한 리 셋 함수 timeout 보다 먼저 실 행 될 뿐만 아니 라 함수 B 도 timeout 보다 먼저 실 행 됩 니 다.이 는 여러 개의 process. nextTick 문 구 를 포함 하 든 안 하 든 모두 현재 '실행 스 택' 에서 실 행 될 것 임 을 설명 합 니 다.

    좋은 웹페이지 즐겨찾기