Node. js 이벤트 루프 와 브 라 우 저 이벤트 루프 (이벤트 링)
프로 세 스 와 스 레 드
프로 세 스 는 운영 체제 에서 자원 을 분배 하고 작업 을 스케줄 링 하 는 기본 단위 입 니 다. 프로 세 스 는 프로 세 스에 세 워 진 프로그램 실행 단위 입 니 다. 프로 세 스에 여러 개의 프로 세 스 가 있 을 수 있 습 니 다.
1.1 왜 자 바스 크 립 트 는 단일 라인 입 니까?
자 바스 크 립 트 언어의 큰 특징 은 단일 라인 이다. 즉, 같은 시간 에 한 가지 일 만 할 수 있다 는 것 이다.그렇다면 왜 자바 스 크 립 트 는 여러 개의 스 레 드 가 있 을 수 없 습 니까?이렇게 하면 효율 을 높 일 수 있 잖 아.
JavaScript 의 단일 스 레 드 는 그 용도 와 관계 가 있 습 니 다.브 라 우 저 스 크 립 트 언어 로 서 자바 스 크 립 트 의 주요 용 도 는 사용자 와 상호작용 하고 DOM 을 조작 하 는 것 입 니 다.이것 은 그것 이 단지 단일 라인 일 뿐, 그렇지 않 으 면 매우 복잡 한 동기 화 문 제 를 가 져 올 수 있다 는 것 을 결정 했다.예 를 들 어 JavaScript 에 두 개의 스 레 드 가 있다 고 가정 하면 한 스 레 드 는 특정한 DOM 노드 에 내용 을 추가 하고 다른 스 레 드 는 이 노드 를 삭 제 했 습 니 다. 이때 브 라 우 저 는 어느 스 레 드 를 기준 으로 해 야 합 니까?
그래서 복잡성 을 피하 기 위해 태 어 날 때 부터 자 바스 크 립 트 는 단일 라인 이 었 다. 이것 은 이 언어의 핵심 특징 이 되 었 고 앞으로 도 변 하지 않 을 것 이다.
다 중 핵 CPU 의 컴 퓨 팅 능력 을 이용 하기 위해 HTML 5 는 웹 Worker 표준 을 제시 하여 JavaScript 스 크 립 트 가 여러 개의 스 레 드 를 만 들 수 있 도록 합 니 다. 그러나 하위 스 레 드 는 메 인 스 레 드 에 의 해 완전히 제어 되 고 DOM 을 조작 할 수 없습니다.그래서 이 새로운 기준 은 자 바스 크 립 트 단일 라인 의 본질 을 바 꾸 지 않 았 다.
여기 서 단일 스 레 드 란 메 인 스 레 드 가 단일 스 레 드 라 는 것 을 말 하기 때문에 Node 에서 메 인 스 레 드 는 여전히 단일 스 레 드 입 니 다.
1.2 기타 라인
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) 를 추가 합 니 다.스 택 에 있 는 코드 가 실행 되 기만 하면 메 인 스 레 드 는 '작업 대기 열' 을 읽 고 이벤트 에 대응 하 는 리 셋 함 수 를 순서대로 실행 합 니 다.
4: Node. js 이벤트 루프
Node. js 도 단일 스 레 드 의 Event Loop 이지 만 운영 체 제 는 브 라 우 저 환경 과 다 릅 니 다.
아래 의 설명도 를 보 세 요.
위의 그림 에 따 르 면 Node. js 의 운영 체 제 는 다음 과 같다.
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 문 구 를 포함 하 든 안 하 든 모두 현재 '실행 스 택' 에서 실 행 될 것 임 을 설명 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Thymeleaf 의 일반 양식 제출 과 AJAX 제출텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.