본문 바로가기
I LEARNED/자료구조

[자료 구조] 프로세스 & 스레드

by veganwithbacon 2023. 4. 21.
반응형

용어에 대한 내 기억을 믿지 못해서 정리했다.

✅프로세스 & 스레드

  ☑프로세스?

: 실행중인 프로그램    

운영체제에 의해 메모리 공간을 할당받아 CPU에서 실행/제어되고 있는 프로그램이다.

종종 '스케줄링의 대상이 되는 작업'이라는 용어와 거의 같이 쓰인다.

데이터(data) + 자원(memory) + 스레드(Thread)로 구성돼 실제로 프로그램이 실행되기까지는

스레드가 데이터+자원을 활용하여 작업을 수행한다.

 

▶ 프로그램이란 파일 시스템에 존재하는 실행파일이다.


  ☑스레드

: 하나의 프로세스 내에서 여러 개의 실행 흐름(단일, 동시적, 병렬적)을 두어 작업을 효율적으로 처리하기 위한 모델

 

프로그램 실행 시 JVM이 시작되고 JVM이 시작되면 자바 프로세스가 시작된다. 이때 프로세스 안에 스레드가 있다.

여러 프로세스가 공유하는 하나의 스레드가 수행되는 일은 없다.

어떤 프로세스든 하나 이상의 스레드가 수행된다.

두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.

멀티스레드는 주어진 자원을 극한으로 사용하기 위한 모델이다.

 

멀티스레드에 대해서는 뒤에 좀더 다루겠다.


✅스레드 사용 이유

- 메모리 절약

OS마다 다르지만, 어떤 작업을 수행해도 JVM은 최소 32~64MB 물리 메모리를 점유한다

  하지만 스레드는 1MB 내의 메모리만 점유하기에, 스레드를 '경량 프로세스'라고도 부른다.

 

오버헤드 절감 

 

- 작업들 간 통신 비용 절감

: 프로세스 간의 통신 비용보다 하나의 프로세스 내에서 여러 스레드 간의 통신 비용이 훨씬 적으므로 작업들 간의 통신 부담을 줄일 수 있게 된다.


동기적, 비동기적, 병렬적

1️⃣동기적

 쿵더러러

스레드의 실행 흐름을 알기 위해서는 동기적, 비동기적이라는 의미를 알아야 한다. 지금까지 우리가 작성했던 코드는 메인스레드에 의해 동기적으로 실행됐다.

경과 시간과 상관없이 순서대로 한 줄씩 코드를 수행하며 이전 작업이 끝나야 새로운 작업을 하고 모든 작업을 마무리해야 프로그램이 종료됐다.

이처럼 선 작업이 종료될 때까지 기다린 후 다음 작업을 수행하는 것을 동기적이라고 부른다.

 


2️⃣비동기적

비동기적은 이전 작업이 종료될 때까지 기다리는 것이 아니라 실행 명령만 내리고 다음 작업을 실행하는 것을 비동기적이라고 한다. 위에 있는 0부터 40까지 짝수의 합을 구하는 코드에서 메인 스레드는 두 스레드를 생성하고 두 스레드를 실행시킨 후 바로 밑에 있는 계산 결과를 출력하는 코드를 실행시킨다.

 

즉, 두 스레드가 계산이 끝나기 전에 계산 결과를 출력하므로 원하는 값이 나오지 않는다.

 

비동기적 문제를 해결하기 위해서는 메인 스레드가 서브 스레드들의 작업이 끝날 때까지 기다릴 수 있도록 하면 된다.


3️⃣ 병렬적

병렬적은 해당 시점에 실행 흐름이 동시에 실행되고 있는 것을 말한다. 병렬적인 연산 방식을 하는 이유는 단시간 내에 많은 양의 계산을 하기 위해서이며 하나씩일을 처리하는 것보다 여러 사람이 동시에 일을 끝내면 더 빨리 끝내듯이 병렬적인 연산을 통해 단시간에 더 많은 작업을 빠르게 끝낼 수 있도록 한다.

 

이런 병렬적인 연산의 특징은 시작 순서와 상관없이 끝나는 순서를 통제할 수 없다.

작업량이 적을 수록 더 빨리 끝난다.


스레드와 프로세스의 차이점

프로세스는 완벽히 독립적이기에 메모리 영역을 다른 프로세스와 공유하지는 않으나,

스레드는 해당 스레드를 위한 스택을 생성할 뿐 프로세스 내의 메모리를 공유해서 사용할 수 있다.

 

https://mooneegee.blogspot.com/2015/01/os-thread.html


  멀티 스레드

프로세스에는 최소 하나 이상의 스레드가 존재하며, 둘 이상의 스레드를 가진 프로세스를 멀티 스레드 프로세스라고 한다.

 

프로세스가 가질 수 있는 스레드의 개수는 제한되어 있지 않지만, 스레드가 작업을 수행하는데 개별적인 메모리 공간(호출 스택을 필요로 하기에 프로세스의 메모리 한계에 따라 생성가능한 스레드 수가 결정된다

 

CPU의 코어가 한 번에 단 하나의 작업만 수행가능하다. 실제로 동시에 처리되는 작업의 개수는 코어의 개수와 일치한다. 때문에 프로세스의 성능이 단순히 스레드의 개수에 비례하지는 않기에, 하나의 스레드를 가진 프로세스보다 두 개의 스레드를 가진 프로세스가 되려 낮은 성능을 보일 수도 있다.

 

멀티 스레드를 사용함에 있어 얻을 수 있는 이점은

1. 자원을 효율적으로 사용할 수 있다

2. CPU의 사용률을 향상시킨다

 

우리가 채팅 프로그램에서 채팅을 하면서 동시에 이미지를 다운받거나 하는 일을 동시에 할 수 있는 것도 바로 이와 같이 멀티 스레드로 프로세스가 작성되어 있기 때문이다.

 

하지만 멀티 스레드로 구성되는 것은 양날의 검이다. 여러 스레드가 같은 프로세스 내에서 자원을 공유하며 작업을 하기에 발생할 수 있는 동기화교착상태같은 문제들 때문에 멀티 스레드 프로그래밍은 주의가 필요하다.

 

 


참고 자료:

https://wisdom-and-record.tistory.com/48 
https://www.codelatte.io/courses/java_programming_basic/3YOZQA8ZUYBPYNHY 
https://velog.io/@rocknzero/%EC%93%B0%EB%A0%88%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%83%90 
https://gusdnd852.tistory.com/258 

https://99lib.tistory.com/672

반응형

댓글