[전지적 비전공자 시점의 CS] 프로세스 vs 스레드 vs 싱글 스레드

OFFDUTYBYBLO·2021년 9월 25일
0

Process

프로그램이 실행되서 돌아가고있는 상태를 프로세스라고 부른다.
컴퓨터가 어떤 일을 하고있는 상태를 말한다.

예전 컴퓨터의 멀티테스킹 기술이 있기 전에는 하나의 프로그램을 실행하면 다른 프로그램을 실행할 수 없었다. 쉽게 말해서 웹 브라우저로 유튜브 보면서 이메일 보내면서 게임을 실행할 수 없었다는 의미이다.

그렇다면 지금 우리의 컴퓨터는 어떻게 동시에 여러 프로그램을 빠르게 실행할 수 있을까? 동시성과 병렬성 또는 혼합으로 가능하다.

동시성은 여러 작업을 돌아가면서 조금씩 처리하는 것을 의미한다. 일부분씩 작업을 진행하는 것을 'Context Switch'라고 한다. 이 과정이 체감할 수 없을 정도로 빠르게 돌아가니 동시에 실행되고 있다고 느끼는 것이다. 하지만 자세히 살펴보면 여러 개의 프로그램이 조금씩 실행되고 있다.

병렬성은 프로세스 하나에 코어가 여러개 장착되어 각 작업들을 동시에 수행하는 것을 말한다. 듀얼코어, 쿼드코어, 옥타코어 등의 명칭이 멀티코어 프로세서가 장착된 방식이다. 최근에는 CPU의 속도나 발열 등 물리적 제약 때문에 이전의 버전만큼 획기적으로 속도를 올리지 못하자, 대안으로 코어를 여러 개 달아서 작업을 분담시킨다.

Thread

그렇다면 우리의 똑똑한 컴퓨터는 완성되는가? 아니다.
생각해보자, 우리는 한 프로세스에서 하나의 기능만 사용하는가? 아니다.

우리는 크롬 브라우저에서 유튜브 키고, 기술블로그 작성하면서, 중간 중간 구글에서 검색도 해야하고 해야할 게 많다. 그럼 프로세스가 하나인데 실행 기능은 여러개이다. 어떻게 해야하는가?

즉, 우리는 한 프로세스에서 다양하고 동시에 여러 작업을 진행한다. 이를 위해 스레드가 필요한 것이다. 한 프로세스에서 여러개의 작업 중 하나를 스레드라고 부른다.

스레드를 사용할 때 주의할 점

프로세스는 구역을 나눠서 작업을 진행하지만, 한 프로세스 안에서 여러개의 스레드는 해당 프로세스 안에서 전역 데이터를 공유해서 사용한다. 그렇다면 한 프로세스 안에서 어떤 변수에 다수의 스레드가 동시에 접근해서 변수의 상태를 변경시킨다면? 바로 문제가 생기겠죠?

그래서 이런 부분을 해결하기 위해서 다양한 동기화 방식이 있다. 예로 java의 synchronized 키워드가 있다. 동기화를 통해 스레드의 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤할 수 있다. 그러나 불필요한 부분까지 동기화를 하는 경우, 과도한 lock으로 병목 현상을 발생시켜 성능이 저하될 가능성이 높아서 주의해야 한다.

자, 이제 우리의 Javscript로 돌아와서 싱글 스레드와 멀티 스레드를 말해보자.

멀티 스레드는 말 그대로 동시에 여러 스레드를 열어서 병렬적으로 작업을 수행하는 것을 말한다. 싱글 스레드는 순차적으로 하나의 작업을 완료하고 다음 작업을 수행한다.

여기서 Javascript를 사용하는 개발자들은 의문을 갖는다. 엥 그럼 비동기 프로그래밍은 어떻게 가능함? 아니 하나씩 처리한다면서 그럼 그 무수히 많은 비동기 요청들은 어떻게 되는건가? 자바스크립트에서 어떻게 비동기 프로그래밍을 수행하는지 하나씩 살펴보자.

Call Stack
Javascript에서 수행해야 할 작업(함수)들이 순차적으로 스택에 담기고 순서대로 처리한다.

Task Queue(Callback Queue)
Web API, 비동기 요청을 통해서 넘겨받은 Callback 함수를 임시적으로 저장한다. (Web API인 setTimeout, AJAX 비동기 요청은 Javascript엔진이 아닌 Web API가 처리한다.)

Event Loop
Call Stack을 감시하다가 Stack이 비어있으면 Task Queue에서 작업을 옮긴다.

순서 정리

  1. 비동기 요청의 로직이 실행되면서 Call Stack에 추가된다.
  2. 비동기 요청이 실행되고 해당 비동기 로직은 Call Stack에서 사라지고, 요청이 완료될때까지 Task Queue에 저장된다. => callback 함수
  3. 이제 Event Loop는 Call Stack이 비어있는 것을 감지하면 비동기 요청이 완료된 콜백 함수를 Call Stack에 다시 옮겨서 작업을 마무리한다.

뭐야 복잡하네 멀티 스레드 사용하면 안됨?

정신차려!! 앞에서 봤던 멀티 스레드 동기화 작업을 하고싶은 건가? 어떤 작업 마다 스레드를 열고, 해당 프로세스에서 스레드들의 동기화 작업을 하고, 병목현상이 없도록 주의해서 코드를 작성해야 한다. 결국 싱글스레드 방식이 우리가 조금 더 쉽게 프로그래밍을 할 수 있는 방법이다. 장단점은 어디서나 존재한다. 상황에 맞는 기술이 정말 중요하다는 것을 다시 느낀다.

profile
블로그 운영 x

0개의 댓글