계발하는 개발자

동기/비동기 개념과 프로세스와 스레드 본문

🖥 Computer Science/Programming

동기/비동기 개념과 프로세스와 스레드

dev_genie 2023. 11. 28. 13:32

동기(Synchronous)

  • 작업을 다른 스레드로 보낸 후, 그 작업이 끝나길 기다렸다가 다음 일을 진행한다 (직렬적으로 진행)
  • 다른 스레드로 보낸 작업이 끝날 때까지 작업 중단(blocking)이 일어난다.
  • 시작 시점과 끝나는 시점이 일치한다.
  • 한 스레드에서 여러 요청을 동시에 처리할 수 없다.

 

비동기(Asynchronous)

  • 작업을 다른 스레드로 보낸 후, 그 작업이 끝나길 기다리고 다음 일을 진행한다 (병렬적으로 진행)
  • 여러 스레드에서 요청을 동시에 처리할 수 있다.
  • 작업이 언제 끝날지 예측하기 힘들기 때문에, 보통 시간이 많이 걸리는 작업을 요청할 때 쓰인다.

 

직렬(Serial)

메인스레드에서 다른 스레드로 분산처리 시킨 작업을 오직 하나의 스레드에서만 순차적으로 처리하는 것을 말한다.

즉 1번 스레드에서 4개의 작업을 분산처리 시켰는데, 이를 2번 스레드에서만 처리하는 것이다.

 

동시(Concurrent)

메인스레드에서 다른 여러 개 스레드로 작업을 분산시켜 동시에 처리하는 것을 말한다.

작업들이 각자 독립적이지만 유사한 작업들일 경우 유용한 처리 방식이다.

 

여기서 드는 의문.. 🧐

1. 동시랑 비동기는 같은 개념인가?

2. 직렬은 왜 사용하지? 동시가 더 좋아보인다.

 

비동기가 동시는 비슷해보이나, 아예 다른 개념이다.

동기와 비동기는 메인 스레드의 대기열을 어떤 방식으로 처리할지를 정하는 것.

직렬과 동시는 어떤 대기열을 사용할 지를 정하는 것(한 개 or 여러 개 스레드).

작동되는 개념이 비슷하다고 혼용해서 생각하지 말자! 아예 다른 개념이다.

 

직렬을 사용하는 이유

작업의 '순서'가 중요할 때 직렬이 사용된다.

동시는 여러 개 스레드에서 분산 처리하기 때문에 순서에 상관하지 않고 스레드에 할당된 작업은 각 스레드가 모조리 처리하는 특징이 있다. 이 때문에 만약 어떤 작업이 꼭 먼저 이뤄져야 하는 경우라면, 그럴 때는 직렬을 사용하는 것이 좋다.

 

프로세스(Process)

실행 중인 프로그램을 나타낸다. 하나의 프로세스는 여러 개의 스레드를 가진다.

 

스레드(Thread)

프로세스 내에서 실행되는 작업의 단위를 가리킨다. 스레드는 프로세스 내의 메모리 공간을 공유하기 

때문에, 같은 프로세스 내에서 실행되는 스레드들은 서로 간에 데이터를 공유할 수 있다.


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

 

멀티스레딩(Multi-Thread)

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

대표적으로는 Java가 이러한 멀티 스레딩 방식을 채택하고 있다.

 

멀티스레딩의 한계

일반적으로 클라이언트의 요청마다 스레드를 발생시킨다.

동시 접속자 수가 많다는 것은, 그만큼 스레드가 많이 발생한다는 의미이며 따라서 메모리 자원도 많이 소모되게 된다. 그러나 서버의 자원은 제한되서 일정 수 이상의 스레드를 발생시킬 수 없다.

이러한 근본적인 문제들로, 서버를 업그레이드 하거나 로드 밸런싱(Load-Balancing) 으로 분산처리 해야하며

또한 스레드 간의 데이터 공유나 동기화 문제 등을 해결해야 하는 복잡한 작업들이 필요하다.

이로 인해 개발이 어려워지고, 복잡한 애플리케이션에서는 교착 상태나 경합 조건과 같은 문제가 발생하기도 한다.

이때 Node의 장점이 있는데, Node는 내부적으로는 멀티 스레드를 사용하지만, 개발자가 직접 스레드를 조작하거나 생성할 필요가 없이 주요 작업은 싱글 스레드에서 실행된다. 따라서 복잡한 동기화 문제를 해결할 필요가 없어 개발이 간편해지고, 작업 처리 속도가 빨라지게 된다. 또한 이벤트 루프를 통해 비동기 작업을 처리함으로써, 자원 사용량이 최소화되며 확장성도 높아진다는 장점이 있다.

LIST
profile

dev_genie

@dev_genie

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!