동기/비동기 와 프로세스와 스레드

이정기·2023년 4월 14일
0

TIL

목록 보기
54/71
post-thumbnail

동기 (싱크러너스 : synchronous)

  • 시간과 상관없이 요청과 결과가 동시에 일어난다.
  • 코드는 위에서 아래로 순차적으로 실행된다.

비동기 (에싱크러너스 : asynchronous)

  • 요청과 결과가 동시에 일어나지 않는다.
  • 시간이 오래걸리는 일은 백그라운드에서 작업을 하고 있는다.


"비동기는 병렬! 동기는 직렬!"

대표적으로 Node.js 는 비동기 방식으로 요청을 처리!
자세한 내용은 이와 대조되는 개념인 스레드와 스레드방식에 대해 알아가고 그 뒤에 후술 하겠다.


스레드를 알기 전 밀접한 관계가 있는 프로세스에 대해 간단히 알아봤다.

프로세스 (Process)

실행주인 프로그램을 나타는 용어이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

스레드 (Thread)

프로세스 내에서 실행되는 작업의 단위이다. 스레드는 프로세스 내의 메모리 공간을 공유 하기 때문에, 같으 프로세스 내에서 실행되는 스레드들은 서로간에 데이터를 공유 할 수 있다.


작업관리자에서 프로세스를 자세히 보면 몇 개의 스레드가 돌아가고 있는지 확인가능하다.

멀티스레딩 (Multi-Thread)

하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행 하는 것을 의미

대표적으로 Java가 멀티 스레딩 방식을 이용하고 있다.

멀티스레딩의 한계

일반적으로 클라이언트의 요청마다 스레드를 발생
동시 접속자 수가 많을 수록 스레드가 많이 발생한다는 의미이며 그만큼 메모리 자원도 많이 소모된다. 그러나 서버의 자원은 제한되서 일정 수 이상의 스레드를 발생시킬 수 없다.

이런 근본적인 문제 때문에 , 서버를 업그레이드 하거나 로드 벨런싱 (Load-Balancing) 으로 분산처리

또한 멀티스레딩은 멀티스레딩 방식은 스레드 간의 데이터 공유나 동기화 문제 등을 해결해야 하는 복잡한 작업이 필요
이로 인해 개발이 어려워지고, 복잡한 애플리케이션에서는 교착 상태나 경합 조건과 같은 문제가 발생

여기서 Node 의 장점을 알 수 있었는데, Node는 복잡한 동기화 문제를 해결할 필요가 없어 개발이 간편해지고, 작업 처리 속도가 빠르다. 또한 이벤트 루프를 통해 비동기 작업을 처리함으로써, 자원 사용량이 최소화되며 확장성도 높아진다는 장점이 있다!


정리

공부하면서 알았던건 노드는 내부적으로 멀티 스레드를 사용하지만, 개발자가 직접 스레드를 조작하거나 생성할 필요가 없다. 주요 작업은 싱글 스레드에서 실행된다.

쓰레드, 이벤트루프, 비동기처리에 대해 관련성을 다시 한번 정리하고 마무리하자.

스레드 사용

스레드는 여러 개의 작업을 동시에 처리하기 위한 방법으로 사용된다. 쓰레드가 여러 개인 경우, 각각의 쓰레드가 독립적으로 작업을 처리하므로 여러 작업을 동시에 처리할 수 있다.

문제점

각각의 스레드는 독립적으로 실행되기 때문에, 서로 다른 쓰레드가 공유하는 자원에 접근하면 데이터 동기화 문제가 발생할 수 있다. 또한 스레드를 생성하고 관리하는 것 자체가 시스템 자원을 많이 사용하기 때문에 오버헤드가 발생할 수 있다.

노드로 문제 해결

노드는 이러한 문제점을 해결하기 위해 싱글 스레드로 이벤트 루프와 비동기 방식을 사용
이벤트 루프는 이벤트가 발생할 때마다 해당 이벤트에 대한 콜백 함수를 실행하면서 작업을 처리
이 방식으로 여러 작업을 처리할 수 있으며, 하나의 스레드에서 여러 작업을 처리하므로 스레드 동기화 문제가 발생하지 않는다

또한 노드는 비동기 방식으로 동작하기 때문에, 작업이 끝날 때까지 기다리지 않고 다음 작업을 바로 처리할 수 있다. 따라서 오버헤드도 적게 발생

이러한 이유로 노드는 대규모 요청 처리에 적합한 서버 환경으로 평가되고 있다!!


오버헤드(Overhead)란?
어떤 일을 수행하기 위해 추가적으로 필요한 비용, 시간, 자원 등을 말합니다. 일반적으로 컴퓨터 시스템에서는 어떤 작업을 수행하기 위해 필요한 추가적인 연산, 메모리, CPU 등을 의미합니다. 예를 들어, 멀티쓰레드 프로그래밍에서는 쓰레드를 생성하고 관리하기 위해 추가적인 자원이 필요하며, 이때 발생하는 비용이 오버헤드입니다. 오버헤드가 크면 시스템 성능이 저하될 수 있으므로 최소한의 오버헤드로 작업을 처리해야 합니다.

profile
Node.js 로 꿈을 꾸었다..

0개의 댓글