728x90

모던자바인액션을 읽으며

순차 스트림, 병렬 스트림을 배우면서 

"무엇보다 컴퓨터의 멀티 코어를 활용해서 파이프라인 연산을 실행할 수 있다는 점이 중요한 특징이다."

"따라서 병렬 스트림을 이용하면 멀티코어 프로세서가 각각의 청크를 처리하도록 할당할 수 있다."

라는 말이 멈칫했다. "멀티코어"를 사용한 적이 있었나..? 

 

스레드풀 배우면서 자바는 멀티스레드를 쓰는 구나~ 이해하고 넘어가서 

멀티 코어가 자꾸 등장해서 혼란스러웠다

 

나의 혼란의 원인은 병렬처리의 중복된 용어 사용이었다. chatgpt와 질의응답을 한 내용으로 정리해본다. 

(멀티 스레드: 스레드가 여러개 , 멀티 코어: 코어가 여러개 (cpu))

 

 

 

싱글 코어에서 멀티 스레드로 처리되는 경우는 결국 스레드가 순차적으로 실행되는거야?

 

싱글 코어에서 멀티 스레드를 사용하는 경우, 스레드는 하나의 코어에서 실행됩니다. 이렇게 되면 스레드들은 시분할 방식으로 번갈아가며 실행되기 때문에 동시에 여러 스레드가 병렬적으로 실행되는 것처럼 보일 수 있지만, 사실은 순차적으로 실행됩니다. 이것을 "멀티 스레딩"이라고 합니다.

싱글 코어에서 멀티 스레딩을 사용하면 스레드 간에 시간을 나눠 가지며 작업을 처리하기 때문에 병렬 처리를 하는 것보다는 성능 향상이 제한적일 수 있습니다. 진정한 병렬 처리를 위해서는 멀티 코어 CPU가 필요하며, 각각의 코어에서 별도의 스레드를 동시에 실행할 수 있어야 합니다.

 

그렇다면 스레드풀은 싱글코어에서도 가능하고 멀티코어에도 가능한 멀티 스레드를 만드는 기능인거야?

 

네, 스레드 풀은 싱글 코어 및 멀티 코어 환경에서 모두 사용할 수 있는 멀티 스레딩을 구현하는 데 도움을 주는 기능입니다. 스레드 풀은 스레드를 효율적으로 관리하고 재사용하는 데 도움을 줍니다.

스레드 풀은 스레드를 미리 생성하고 풀에 보관해두고, 작업이 필요할 때 이 풀에서 스레드를 가져와 작업을 실행하고 다시 풀에 반환하는 방식으로 동작합니다. 이렇게 하면 스레드를 반복적으로 생성하고 제거하는 오버헤드를 피하고, 스레드의 재사용을 통해 성능을 향상시킬 수 있습니다.

따라서 싱글 코어 또는 멀티 코어 시스템에서 스레드 풀을 사용하여 멀티 스레딩을 구현할 수 있으며, 이를 통해 작업을 병렬로 처리할 수 있습니다.

 

(오버헤드: 추가 처리 작업에 드는 비용)

 

병렬로 처리한다는 말이 싱글코어와 멀티코어 모두에서 쓸 수 있는 말이야?

 

"병렬로 처리한다"는 말은 원칙적으로 싱글 코어와 멀티 코어 모두에서 사용할 수 있는 말입니다. 그러나 실행 환경에 따라 실제로 얼마나 효과적으로 병렬로 처리되는지는 다를 수 있습니다.

  • 싱글 코어: 싱글 코어에서 병렬 처리라고 말하더라도, 이것은 스레드가 시분할 방식으로 번갈아가며 실행되는 것을 의미합니다. 따라서 실제로는 동시에 여러 작업을 처리하는 것이 아니라 스레드 간에 작업을 번갈아가며 처리합니다. 이로 인해 싱글 코어에서는 병렬 처리의 이점을 크게 누리기 어렵습니다.
  • 멀티 코어: 멀티 코어 CPU에서 병렬 처리는 실제로 여러 코어에서 병렬로 실행되는 작업을 의미합니다. 각 코어는 독립적으로 작업을 처리하므로 실제로 병렬 처리의 이점을 제대로 누릴 수 있습니다. 멀티 스레딩 및 멀티 프로세싱 기술을 사용하여 멀티 코어 시스템에서 병렬 처리를 구현할 수 있습니다.

따라서 "병렬로 처리한다"는 말 자체는 두 환경에서 모두 사용할 수 있지만, 싱글 코어에서는 실제로 병렬 처리의 성능 향상을 기대하기 어렵습니다. 멀티 코어 시스템에서 이 말이 더 효과적으로 적용됩니다.

 

멀티 프로세서와 멀티 코어는 같은 말이야 다른 말이야?

 

멀티 프로세서와 멀티 코어는 비슷한 개념이지만 약간의 차이가 있습니다.

1. 멀티 프로세서(Multi-Processor):
   - 멀티 프로세서는 여러 개의 독립적인 중앙 처리 장치(CPU) 또는 프로세서를 포함하는 컴퓨터 시스템을 나타냅니다. 각 프로세서는 별도의 작업을 처리하며, 이들은 주로 병렬 컴퓨팅 및 서버 환경에서 사용됩니다.
   - 멀티 프로세서 시스템은 여러 개의 물리적 CPU 칩 또는 소켓을 가질 수 있으며, 각각의 CPU는 독립적인 처리 유닛을 가집니다.

2. 멀티 코어(Multi-Core):
   - 멀티 코어는 하나의 CPU 칩 내에 여러 개의 실행 코어(중앙 처리 장치 코어)가 내장된 프로세서를 나타냅니다. 이러한 코어들은 하나의 CPU 칩 내에서 서로 공유된 리소스를 사용하며, 병렬로 여러 작업을 처리할 수 있습니다.
   - 멀티 코어 프로세서는 물리적 CPU 칩 하나에 여러 개의 논리적 코어를 가지고 있으며, 이러한 코어들은 주로 개인용 컴퓨터 및 노트북과 같은 일반적인 컴퓨터 시스템에서 사용됩니다.

요약하면, 멀티 프로세서는 여러 개의 독립적인 CPU를 가진 전체 시스템을 나타내는 것이고, 멀티 코어는 하나의 CPU 칩 내에 여러 개의 코어가 있는 프로세서를 나타냅니다. 둘 다 병렬 처리를 가능하게 하며 성능을 향상시키지만, 멀티 코어는 일반적으로 개인용 컴퓨터 및 모바일 기기에서 더 일반적으로 사용됩니다.

728x90
728x90

개념 정리 <Node.js교과서>- 조현영 지음 책 요약

 

Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.

 

 

기본개념

 

1.서버

네트워크를 통해 클라이언트레 정보나 서비스를 제공하는 컴퓨터 또는 프로그램

 

노드는 서버 애플리케이션 실행하는데 제일 많이 사용됨.

서버는 클라이언트의 요청에 대해 응답해야 함. 

 

 

2. 자바스크립트 런타임

노드는 자바스크립트 런타임. 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻함

 

 

<노드의 내부 구조>

Node.js Core Library
Node.js Bindings
V8 (  -> 오픈소스 자바스크립트 엔진) libuv (  -> 비동기 I/O)

 

3. 이벤트 기반 event-driven

이벤트(클릭, 네트워크 요청 등과 같은)가 발생할 때 미리 지정해둔 작업을 수행하는 방식 의미한다.

특정 이벤트가 발생할 때 무엇을 할지 미리 등록해놔야하는데 이걸 이벤트 리스너에 콜백함수를 등록한다고 표현한다.

발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기.

 

<이벤트 기반>

시스템 2. 이벤트 발생
--------------------->

<---------------------
3. 등록된 콜백함수 호출
이벤트 리스너

1. 이벤트 리스너에 콜백함수 등록

이벤트 기반 모델에서는 이벤트 루프라는 개념 등장. 여러 이벤트 동시발생시 어떤 순서로 콜백함수를 호출할지를 이벤트 루프가 판단함.  노드와 자바스크립트에서 이벤트 루프는 정말 중요 개념~!

 

이벤트 루프:
이벤트 발생시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행순서결정하는 역할 담당. 노드가 종료될 때까지 이벤트 처리위한 작업을 반복해서 루프라고 부름.
백그라운드:
setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 된다. 여러 작업이 동시에 실행될 수 있음
테스크 큐:
이벤트 발생 후, 백그라운드에서는 테스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서대로 콜백들이 줄 서 있어서 콜백 큐라고 부른다. 보통은 완료된 순서대로 서있지만 특정한 경우 순서 바뀌기도함.

 

4. 논 블로킹 I/O 

 

작업은

동시에 실행될 수 있는 작업과

동시에 실행될 수 없는 작업있음 

 

자바스크립트 코드는 동시에 실행될 수 없음

하지만 js상에서 돌아가는게 아닌 입력Input 출력Output 작업같은 건 동시처리 가능

 

(파일 시스템 접근이나 네트워크를 통한 요청 같은 작업이 I/O의 일종)

 

이런 작업시 노드는 

논블로킹 방식으로 처리하는 방법을 제공한다. 

 

<백그라운드 작업완료 확인 여부>
논블로킹:
이전 작업이 완료될 때까지 대기하지 않고 다음작업 수행
블로킹:
이전 작업 끝나야만 다음작업 수행

 

 

노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리하곤 함.

작업 순서에 따라 작업 시간 단축되어 성능 크게 달라짐! 동시에 처리될 수 있는 I/O 작업이라도 논블로킹 방식으로 코딩하지 않으면 의미 퇴색되므로 논 블로킹 방식으로 코딩하는 습관 들이기!!

 

하지만 아무리 논블로킹 방식으로 코드 작성해도 우리가 전부 작성한 코드는 서로 동시에 실행되지 않기에 소요시간이 짧아지진 않는다. 실행 순서만 바뀔뿐. 그래도 논블로킹을 통해 실행 순서를 바꿔줌으로써 그 작업 때무에 간단한 작업들이 대기하는 상황을 막을 수 있다는 점에서 의의가 있다. 

논블로킹과 동시가 같은 의미가 아니라는 것도 알아두기 . 동시성은 동시 처리가 가능한 작업을 논 블로킹 처리해야 얻을 수 있음.

노드에서는 동기와 블로킹이 유사하고 비동기와 논블로킹이 유사함.

<함수가 바로 return되는지 여부>
동기(synchronous : 동시에 일어나는):
블로킹 방식에서는 백그라운드 작업 완료 여부를 계속 확인하며, 호출한 함수가 바로 return되지 않고 백그라운드 작업이 끝나야 return된다. 
비동기(Asynchronous : 동시에 일어나지 않는):
논블로킹 방식에서는 호출한 함수가 바로 return되어 다음 작읍으로 넘어가며, 백그라운드 작업 완료 여부는 신경쓰지 않고 나중에 백그라운드가 알림을 줄 때 비로소 처리함.

 

동기:  요청과 결과가 한 자리에서 동시에 일어남.설계가 매우 간단하고 직관적이지만 과가 주어질 때까지 아무것도 못하고 대기해야 하는 단점이 있고, 

비동기:  요청한 그 자리에서 결과가 주어지지 않음 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있습니다.
출처: https://private.tistory.com/24 [공부해서 남 주자]

 

 

 

5. 싱글스레드

 

스레드가 하나뿐이라는 것.

 

프로세스:  운영체제에서 할당하는 작업의 단위.

노드나 웹브라우저 같은 프로그램은 개별적인 프로세스임. 프로세스 간에는 메모리등의 자원 공유안해

스레드: 프로세스 내에서 실행되는 흐름의 단위.

프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있음. 스레드들은 부모 프로세스의 자원공유해. 같은 주소의 메모리에 접근 가능해 데이터를 공유할 수 있어

 

 

 

노드는 싱글 스레드?

엄밀히 말하면 싱글 스레드로 동작하지 않음

노드를 실행하면 먼저 프로세스 하나 생성됨 그 프로세스 안에서 스레드 여러개 생성함 . 우리가 직접 제어할 수 있는 스레드는 하나뿐! 그래서 흔히 노드가 싱글 스레드라고 여겨짐.

스레드는 작업을 처리하는 일손. 하나의 스레드만 직접 조작할 수 있으니까 일손이 하나인 것임.

블로킹이 발생할 것 같은 경우에는 논블로킹 방법으로 대기시간을 최대한 줄인다. 

 

 

<노드가 싱글 스레드로 동작하지 않는 두 가지 경우>

스레드풀(Thread Pool)

노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용한다. 대표적인 예로 암호화(3.5.5절), 파일입출력(3.6절),압축(3.6.2절) 등이 있다

워커 스레드(Worker Thread)

이제 노드에서도 멀티 스레드를 사용할 수 있게한 기능. 우리가 직접 다수의 스레드를 다룰 수 있음. CPU 작업(연산이 많은 작업)이 많은 경우 워커 스레드를 사용하면 된다.

 

 

 

서버로서의 노드

 

노드는 기본적으로 싱글 스레드, 논블로킹 모델을 사용함. 

따라서 노드 서버의 장단점은 싱글 스레드, 논블로킹 모델의 장단점과 비슷함.

 

노드는 CPU부하가 큰 작업에는 적합하지 않음 연산을 많이 요구하면 스레드 하나가 혼자 감당하기 어려워!

노드는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 적합함.

네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화되어있음

 

<노드의 장단점>

장점 단점
멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용 기본적으로 싱글 스레드라서 CPU코어를 하나만 사용
I/O 작업이 많은 서버로 적합 CPU작업이 많은 서버로는 부적합
멀티 스레드 방식보다 쉬움 하나뿐인 스레드가 멈추지 않도록 관리가 필요함
웹 서버가 내장되어있음 서버 규모가 커졌을 때 서버를 관리하기 어려움
자바스크립트를 사용함 어중간한 성능
JSON형식과 쉽게 호환됨  

 

 

 

 

 

 

 

728x90

+ Recent posts