싱글스레드(Single thread), 멀티스레드(Multi thread)

Yuri Lee·2021년 6월 9일
1

Intro

Process 와 thread! 정말 수없이 많이 들어본 단어지만 정확한 정의를 묻는다면 난 대답하지 못할 것 같다 😭😭 위 개념들을 반복하여 상기시키기 위해 블로그에 정리해보자.

Process & thread

Process

  • 운영체제로부터 자원을 할당받는 작업의 단위
  • 디스크로부터 메모리에 적재되어 운영체제로부터 주소 공간, 파일, 메모리 등을 할당받으며 이것들을 총칭하여 프로세스라고 함
  • 함수의 매개변수, 복귀 주소, 로컬 변수와 같은 임시 자료를 저장하는 프로세스 "스택"과 전역 변수들을 저장하는 데이터 섹션, 프로세스 실행 중에 동적으로 할당되는 메모리인 "힙"을 포함

thread

  • 프로세스가 할당받은 자원을 이용하는 실행의 단위
  • 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 Heap, Data, Code 영역을 공유
  • 하나의 프로세스를 다수의 실행 단위인 스레드로 구분하여, 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 함.
  • 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 가지고 있음

Single thread & Multi thread

Single thread

  • 하나의 프로세스에서 하나의 스레드 실행
  • 하나의 레지스터와 스택으로 표현

장점

  1. 자원 접근에 대한 동기화를 신경쓰지 않아도 된다. 여러 개의 스레드가 공유된 자원을 사용할 경우 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며 이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킨다. 단일 스레드 모델에서는 이러한 작업이 필요하지 않다.

  2. 문맥 교환(context switch) 작업을 요구하지 않는다. 문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.

단점

  1. 여러 개의 CPU를 활용하지 못한다. 프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다. 이 때 고려해야할 문제가 있는데, 바로 다수의 프로그램 인스턴스가 어떻게 상태를 공유할 것인가에 대한 문제다. (사실 이것은 멀티 스레드 환경의 서버 프로그램도 확장성을 확보하기 위해 풀어야 할 숙제이긴 하다.) 단순하고 빠른 메모리 기반 NoSQL 데이터 베이스인 Redist가 좋은 고려대상이다. 하지만 서버 프로그램 인스턴스 간 상태 공유를 최소화하거나 가능하면 없애는 방향으로 아키텍처를 설계하는 것이 가장 바람직한 방법이라고 한다.

Multi thread

  • 프로그램을 다수의 실행 단위로 나누어 실행
  • 프로세스 내에서 자원을 공유하여 자원생성과 관리의 중복을 최소화
  • 서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
  • 각각의 스레드가 고유의 레지스터와 스택으로 표현됨

장점

  1. 새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.
  2. 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다
  3. 프로세스의 문맥교환보다 스레드의 문맥교환이 더 빠르다.

단점

  1. 하나의 스레드만 실행중일 때에는 실행시간이 되려 지연될 수 있다.
  2. 멀티 스레딩을 위해 운영체제의 지원이 필요하다.
  3. 스레드 스케쥴링을 신경써야 한다.

Situation

두 개의 작업을 하나의 쓰레드로 처리하는 경우와 두 개의 쓰레드로 처리하는 경우를 가정해보자. 하나의 쓰레드로 두 작업을 처리하는 경우는 한 작업을 마친 후에 다른 작업을 시작하지만, 두 개의 쓰레드로 작업 하는 경우에는 짧은 시간동안 2개의 쓰레드가 번갈아 가면서 작업을 수행해서 동시에 두 작업이 처리되는 것과 같이 느끼게 한다. 하지만 오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸릴 수 도 있는데 그 이유는 쓰레드간의 작업전환(context switching)에 시간이 걸리기 때문이다.

👉 단순히 CPU만을 사용하는 계산작업이라면 오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 효율적이다.

👉 CPU 이외의 자원을 사용하는 작업의 경우에는 싱글스레드 프로세스보다 멀티스레드 프로세스가 더 효율적이다.

🌸 CPU는 중앙 처리 장치라는 정식 명칭을 갖고 있다. 컴퓨터 내부에서 시스템들을 통제함과 동시에 프로그램들을 실행하는 가장 기본적인 부품이며 메인보드에 장착된다. 컴퓨터의 두뇌라고 할 수 있으며 컴퓨터로 들어오거나 나가는 모든 정보를 기억하고 출력하며 프로그램의 연산을 실행하는 장치이다.

Question

최근에 Spring 과 Node.js 의 비교에 대해 찾아보고 글을 작성한 적이 있다. Node.js 는 싱글 스레드 모델로 하나의 작업에 시간이 오래걸리면 시스템 전체의 성능이 급격하게 떨어질 수 있다고 알았는데... 이 글을 보고 아니라는 것을 깨달았다.

노드는 싱글스레드인가?

정확하게 말하면 node는 싱글 스레드가 아니다. node 역시 여러개의 스레드를 갖고 있다. 하지만 자바스크립트를 실행하는 스레드는 단 하나이므로 node를 싱글스레드 라고 한다. 그리고 그 싱글스레드가 바로 이벤트 루프이다.

node는 이벤트 기반의 플랫폼이기 때문에 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식으로 작동한다. 이 말은 곧 node 에서 일어나는 모든 처리는 일련의 콜백을 처리하는 것과 같다고 할 수 있다. Nods.js는 v8이라는 자바스크립트 엔진비동기 작업을 처리하는 libuv 라는 라이브러리로 이뤄져있다.

자바스크립트 엔진은 Memory HeapCall stack으로 이뤄져 있다. Memory Heap은 메모리 할당이 일어나는 곳이고, Call Stack은 코드 실행에 따라 호출 스택이 쌓이는 곳이다. 자바스크립트 엔진은 콜스택에 쌓인 실행 컨텍스트에 따라 위에서부터 차례로 실행이 일어나는 곳이기 때문에 비동기 처리를 할 수 없다. 따라서 비동기 처리가 필요하게 될 경우 Node api 를 통해 libuv 라이브러리에서 제공하는 비동기 처리를 하게 된다.

이때 libuv가 제공하는 것이 이벤트루프이다. 이 이벤트루프가 자바스크립트 엔진으로부터 넘겨받은 비동기 작업을 OS의 비동기 interface에 넘겨주거나 스레드 풀에 할당한다. 이후 할당한 작업이 끝나면 태스크큐에 콜백함수를 전달한 후 콜스택이 비게 될 경우 차례로 콜스택으로 다시 넘겨 실행하게 한다. 이 이벤트루프가 싱글스레드이고 실제적으로 자바스크립트를 처리할 수 있는 메인스레드이기 때문에 node.js를 싱글스레드 라고 한다.

다시 정리하자면, 자바스크립트가 싱글스레드라고 하는 이유는 자바스크립트가 구동하는 환경에서 싱글스레드를 사용하기 때문이다. 여기서 싱글스레드가 바로 이벤트루프이다. 흔히들 메인 스레드가 자바스크립트를 실행학고 비동기 처리만 이벤트루프에서 가져간다고 생각하는 것은 잘못된 이해이다.

느낀점

프로세스와 스레드의 차이점부터, node.js 를 왜 싱글스레드라고 하는지 그 이유를 알게 되었다.👏👏


https://velog.io/@eunjin/OS-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9D%98%EB%AF%B8
https://lazymankook.tistory.com/32
https://velog.io/@eunjin/OS-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9D%98%EB%AF%B8
https://buubleunder.tistory.com/241
https://medium.com/@gwakhyoeun/%EC%99%9C-node-js%EB%8A%94-single-thread-%EC%9D%B8%EA%B0%80-bb68434027a3

profile
Step by step goes a long way ✨

0개의 댓글