본문 바로가기
나의 공부

프로세스, 스레드, 멀티 스레드?

by 이숴 2023. 4. 6.
반응형

멀티 스레드를 이해하기 위해선 먼저 프로세스와 스레드를 알고 있으셔야합니다. 저도 잘모르는 개념인데요 ㅎㅎ.. 같이 한번 배워봐요!

 

1. 프로세스 (Process)

프로세스란 운영체제에서 실행 중인 하나의 프로그램, 어플리케이션을 말합니다.

 

사용자가 이 프로그램을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당 받아서 어플리케이션의 코드를 실행하는데요.

이때! 실행되는 프로그램이 바로 프로세스 인것이죠.

 

CPU는 한번의 하나의 프로세스만 실행할 수 있다고 합니다.

그러나 평소에 저희는 게임을 하다가 공략을 보려 인터넷을 키거나,

드라마나 영화를 보다 카톡이 오면 카톡을 키는 등 다수의 작업을 동시에 할 수 있는데요!

 

이는 운영체제가 짧은 시간에 실행할 프로세스를 교체하고 있기 때문에 동시에 여러 작업을 하는 것처럼 느끼게 되기 때문입니다.

이 프로세스는 메모리를 할당 받아서 실행된다고 했었는데요.

 

이때 할당받는 메모리, 프로세스 내에서 실행되는 한 작업의 단위가 바로 스레드입니다.

 

2. 스레드 (Thread)

스레드는 CPU의 수행의 기본 단위 또는 프로세스내에서 실제로 작업을 수행하는 주체를 의미합니다.

 

따라서 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.

 

하나의 스레드가 존재할 때는 싱글 스레드라고합니다. 하나의 프로그램에서 하나의 코드만을 실행할 수 있다는 뜻입니다.

이때 한 코드가 끝나면 끝난 지점에서 다음의 코드가 시작되는 형식으로 진행이 됩니다!

 

 

 

3. 멀티 스레드 (Multi-Thread)

멀티 스레드는 멀티 테스킹을 통해 여러 코드를 동시에 처리하는 주체입니다! 운영체제는 모든 프로세스가 멀티 테스킹을 할 수 있도록 모든 프로세스마다 자원을 할당에서 병렬로 실행하는데요. 바로 병렬성을 높일 수 있습니다!

 

프로세스가 하나이면서 여러개의 스레드가 존재하면 멀티스레드 환경이라고 할 수 있는데요. 이 멀티 스레드를 통해 동시성을 높일 수 있습니다. 물론 스레드는 각각의 시간에 한 작업만 수행되지만 병렬적으로 수행되는 것처럼 보이는 것입니다.

 

멀티스레드의 장점

멀티스레드를 사용하게 되면 무엇이 좋을까요?

 

1. 응답성(Responsiveness)

싱글 스레드인 경우, 작업이 끝나기 전까지 사용자에게 응답하지 않는다고 합니다. 반면 멀티스레드인 경우 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답할 수 있게 됩니다.

 

2. 자원 공유(Resource sharing)

프로세스는 오직 공유 메모리나 메시지 패싱을 이용해서 자원을 공유할 수 있지만, 스레드는 자신이 속한 프로세스 내의 스레드들과 메모리나 자원을 공유하여 효율적으로 사용할 수 있습니다.

 

3. 경제성(Economy)

프로세스를 새로 생성하는 비용보다 스레드를 새로 생성하는 게 훨씬 싸다고 합니다. 그리고 Context switching의 오버헤드 또한 스레드가 더 경제적이고 값 손실도 없습니다. 

 

4. 확장성(Scalability)

싱글 스레드인 경우 한 프로세스는 오직 한 프로세서에서만 수행 가능하다. 반면 멀티 스레드인 경우 한 프로세스를 여러 프로세서에서 수행할 수 있으므로 훨씬 효율적이다. 

 

 

스프링에서의 멀티스레드

spring framework에서의 TomCat 뿐만 아니라 대다수의 웹 서버는 멀티 스레드 방식을 따르고 있습니다. 하지만 이러한 방식은 클라이언트의 숫자가 많아지면 그만큼 스레드의 생성,수거의 비용 및 오버헤드가 발생한다고합니다.

 

이에 해결점으로 스레드 풀(Thread pool)이라는 방법으로 스레드 제어 문제를 해결한다고 합니다. 스레드 풀은 매번 생성 및 수거 요청이 올 때마다 스레드를 생성하고 수거하는 것이 아닌, 스레드 사용자가 설정해둔 개수만큼 미리 스레드를 생성해두고 알맞게 사용하는 것이지요. (그러나 이또한 적절한 풀을 유지하지 않으면 메모리 낭비가 될 수있다는 단점이 있다네요!)

 

이전에 같이 확인했던 싱글톤 패턴 또한 이 때문에 적용되었다고 생각할 수도 있을 것 같습니다. 만약 스프링 환경에서 싱글톤 패턴을 사용하지 않는다면, 수많은 클라이언트로 인해 발생하는 요청, 수거로 멀티 스레드로 생성된 많은 스레드가 처리되는 과정마다 객체를 생성해야하기 때문입니다. 따라서 성능저하, 메모리 낭비등을 방지하기 위해 멀티 스레드 환경을 지원하는게 아닌가 생각합니다.

 

반응형

댓글