티스토리 뷰

개요

자바스크립트가 왜 단일 쓰레드를 선택했는지, 그리고 그 이유가 무엇인지 찾아보다가 알게 된 글을 정리하게 되었다.

https://www.geeksforgeeks.org/why-javascript-is-a-single-thread-language-that-can-be-non-blocking/

https://www.freecodecamp.org/news/javascript-under-the-hood-v8/

https://www.geeksforgeeks.org/applications-advantages-and-disadvantages-of-stack/

 

How JavaScript Works: Under the Hood of the V8 Engine

Today we’ll look under the hood of JavaScript's V8 engine and figure out how exactly JavaScript is executed. In a previous article [https://lyamkin.com/blog/what-are-web-standards-and-how-does-web-browser-work/] we learned how the browser is structured a

www.freecodecamp.org

 

Why JavaScript is a single-thread language that can be non-blocking ? - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

내용

javasciprt 엔진은 메모리 힙과 호출 스택이 있는 V8 엔진에서 실행되고, 프로그램을 실행하는 데 사용되는 호출 스택이 하나만 있다.

단일 쓰레드는 코드를 실행하는 동안 교착 상태와 같은 다중 스레드 환경에서 발생하는 복잡한 처리를 할 필요가 없기 때문에 구현하기가 매우 쉽다는 장점을 가지고 있다.

javascript는 단일 쓰레드 언어이고, 선입선출 FIFO의 형태를 따르지만, 비동기 호출도 가능하다.

 

V8 엔진이란?

Google Chrome과 node.js에서 사용되고 있는 구글에서 제작한 자바스크립트 엔진

C++로 작성되었고 고성능의 자바 스크립트 전용의 웹 어셈블리 엔진이다.

 

V8 엔진 동작원리

  1. 네트워크에서 javascript 코드를 가져온다.
  2. v8 엔진은 소스 코드를 구분 문석하고 추상 구문 트리(AST)로 바꾼다.
  3. 해당 AST를 기반으로 Ignition 인터프리터라는 작업을 시작하고 바이트코드를 생성할 수 있다.
  4. 그 시점에서 엔진은 코드를 실행하고 유형 피드백을 수집한다.
    1. 더 빠르기 실행하기 위해 피드백 데이터와 바이트 코드를 최적화 컴파일러로 보낼 수 있다.
    2. 최적화 컴파일러는 이를 기반으로 특정 가정을 한 다음 고도로 최적화된 기계어를 생성한다.
  5. 어떤 시점에서 가정 중 하나가 잘못된 것으로 판명되면 최적화 컴파일러는 최적화를 해제하고 인터프리터로 돌아간다.

 

힙 메모리? (동적 메모리)

힙은 각 프로그램에 할당된 메모리 영역이며 스택에 할당된 메모리와 달리 힙에 할당된 메모리는 동적 할당이 가능하다.

  • 프로그램에서 필요할 때 마다 힙 세그먼트를 요청, 해제할 수 있다.
  • 할당된 함수에 의해 지역화 되는 대신 할당된 프로그램의 모든 위치에서 액세스하고 수정할 수 있다. (전역적)
  • 동적으로 할당된 메모리는 '포인터'를 사용하여 참조한다.
    • 로컬 변수(스택)를 사용할 때 약간의 성능 저하가 발생한다.
  • 힙 메모리와 로컬 스택 메모리는 다르다.
    • 함수 호출, 변수 할당, 할당 해제 방식, 변수 할당 해제 방식이 다르다.
    • 메모리의 크기는 생성되는 개체의 크기에 따라 자동으로 결정된다.
  • 메모리 누수를 담당한다.
  • 스택처럼 RAM 메모리에 저장된다.

 

힙 메모리의 장점

  • 메모리 크기 제한이 없다.
  • 전역 변수에 액세스 할 수 있다.
  • 가비지 컬렉션은 힙 메모리에서 실행되어 개체에서 사용하는 메모리를 해제한다.
  • 힙 방식은 priority Queue에서도 사용된다.

 

힙 메모리의 단점

  • 스택에 비해 실행 시간이 오래걸린다.
  • 계산하는데 더 많은 시간이 걸린다.
  • OS가 제공할 수 있는 최대 메모리를 제공할 수 있다.
  • 메모리 관리는 전역적으로 사용되기에 더 복잡하다.

 

호출 스택?

javasciprt에서 여러 함수 호출을 추적하는데 사용된다.

데이터 구조의 스택과 같으며 후입선출(LIFO) 원칙에 따른다.

실행중인 함수를 기억하기 위해 호출 스택을 사용한다. 

 

호출 스택의 장점

  • 배열 또는 연결 목록을 사용하여 구현하기 쉽다.
  • 연속적인 메모리 블록을 사용하므로 다른 데이터 구조에 비해 메모리 활용이 효율적이다.
  • 스택의 맨 위에서 추가 및 제거될 때 요소 추가 및 제거에 대한 빠른 액세스 시간을 제공한다.
  • 함수 호출과 해당 상태를 저장하는데 사용되며, 재귀 함수 호출을 효율적으로 구현하는데 도움이 된다.

 

호출 스택의 단점

  • 고정된 수의 요소만 보유할 수 있으므로 용량이 제한되어 있다.
    • 스택이 가득 찬 뒤 새 요소를 추가하면 스택 오버플로가 발생된다.
  • 해당 요소에 대한 임의 액세스를 허용하지 않고, 스택 맨 위에서 요소를 추가하고 제거하는것만 허용한다.
    •  중간의 요소에 접근하려면 모든 요소를 제거해야한다.
  • 너무 많은 요소가 스택에 push되면 스택 오버 플로가 발생할 수 있으며, 너무 많은 요소가 pop되면 스택 언더 플로가 발생할 수 있다.
  • 재귀 함수 호출을 지원하나 너무 많은 재귀 함수로 인해 스택 오버플로가 발생하여 프로그램이 종료될 수 있다.

 

비동기 호출이 필요한 이유?

  • 동기식 처리를 하게 되면 자원 낭비와 시간 낭비 문제를 발생시킨다.
  • 따라서 이미지 처리 또는 api 호출과 같은 네트워크 요청과 같은 작업을 수행 시 비동기 호출을 사용하게 된다.

 

비동기 호출이 가능한 이유? (추후 한번 더 정리 예정)

  • javascirpt 내에는 실행 컨텍스트 (메모리 힙, 호출 스택)이 있지만 브라우저에는 javasciprt 코드를 실행하는데 사용되는 이벤트 루프, 콜백 대기열 및 webApi가 있다.
    • 이벤트 루프는 호출 스택이 비어있는지 콜백 대기열에 항상 실행되어야 하는 명령문이 있는지 여부를 확인한다.
  • DOM,Ajax,TimeOut은 RunTime 환경 또는 브라우저의 일부이기에 webApi 내에서 콜백 대기열을 사용하여 비동기적으로 실행한다.

 

javascirpt 런타임 환경

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함