최초의 컴퓨터에는 운영체제(OS)가 없었다 (OS없이도 컴퓨터 운영 가능). OS는 일반 사용자들이 컴퓨터를 사용하기에 편리하도록 만들어진 소프트웨어로 하드웨어를 운영해주는 시스템이다.
OS는 하드웨어 기능을 관리하며 동시에 응용프로그램을 위한 환경을 제공한다.
OS는 실행되는 응용 프로그램들이 메모리와 CPU, 입출력 장치 등의 자원들을 사용할 수 있도록 만들어 준다.
응용프로그램은 OS로부터 컴퓨터 조작을 위한 권한을 받아 OS가 제공하는 기능을 이용할 수 있다.
하드웨어 <-> OS <-> 응용프로그램 <-> 사용자
JS코드는 응용 프로그램일까?
JS코드는 운영체제가 아닌 웹 브라우저라는 응용 프로그램 위에서 동작한다. 즉, 응용 프로그램이 아니다. 운영체제는 신경 쓸 필요 없이 동작할 웹 브라우저만 고려하면 된다.
Node.js의 경우는 다르다. 이는 응용 프로그램이라고 볼 수 있다. Node.js의 JS코드가 V8엔진을 실행시키고 V8엔진은 운영체제 위에서 동작한다.
따라서 일반 JS 코드를 작성할 때와 Node.js 코드를 작성할 때의 고려사항이 다르다. (동작 환경이 웹 브라우저인가 OS인가)
프로세스와 스레드
OS 상에서 응용 프로그램이 실행되려면 일정 공간(메모리)이 필요하다. OS는 프로세스 단위로 프로그램에 공간을 제공한다.
스레드는 프로세스 안에서 코드가 실행되는 흐름으로 프로세스가 공장이라면 스레드는 그 안에서 돌아가는 각각의 컨베이어벨트라고 할 수 있다.
스레드는 한 번에 한 가지 일밖에 하지 못한다.
프로세스가 여럿이라면 멀티 프로세스, 스레드가 여럿이면 멀티 스레드라고 불린다.
멀티스레드는 동시에 여러 일을 처리할 수 있기 때문에 싱글 스레드보다 빠르다. 하지만 개발자가 업무 배분을 관리해 주어야 하며 버그가 발생할 지점이 늘어난다. 스레드가 3개 이상이 되면 관리하기 복잡해지기 때문에 보통 3개를 한계라고 본다.
비동기
멀티 스레드의 문제를 해결하기 위해 등장한 개념
스레드에 업무 분배, 결과 수집 등의 과정을 비동기 시스템으로 자동화할 수 있다.
개발자가 싱글 스레드로 개발하면 자동으로 멀티 스레드로 돌려주는 것으로 생각할 수 있다.
자바스크립트는 기본적으로는 하나의 호출 스택만 존재하며 이 스택에서 업무는 순차적으로 실행된다. 이벤트 루프의 백그라운드 위에는 여러 워크 스레드가 존재하며 각각의 작업들을 동시에 실행한다. 하지만 개발자가 스레드를 생성/관리하는 것이 아니라 V8이 자동으로 처리하는 것이기 때문에 싱글 스레드라고 하는 것이다.