스레드와 멀티-프로세싱, 프로그래밍, 태스킹, 스레딩의 개념
[스레드(Thread)]
- 정의 : 프로세스 내에서 실행되는 세부 작업의 단위.
- 여러 스레드가 모여서 하나의 프로세스를 구성할 수 있습니다.
- 즉, 프로세스의 작업 단위를 나눈 것을 스레드라 할 수 있습니다.
[특징]
- 스레드는 프로세스 내의 다른 스레드들과 Code, Data, Heap 영역을 공유하고 자신만의 Stack 영역을 소유합니다.
영역별 설명
- Code : Program Counter(다음번에 실행할 명령어 주소), 프로그램 코드를 저장
=> Code를 공유하기 때문에 두 개 이상의 스레드가 자신이 포함된 프로세스의 Code영역에 있는 함수를 호출할 수 있습니다.
- Data : 글로벌 변수, 스태틱 변수 저장
- Heap : 동적 메모리 할당 공간
=> 메모리 영역을 공유하기 때문에 프로세스 보다 Context Switching에 걸리는 시간이 적으며 스레드간 통신이가능합니다.
- Stack : 임시 데이터 저장(로컬 변수, 리턴 어드레스)
왜 Stack은 독립적으로 할당될까요?
- Stack에는 함수 호출시 전달되는 인자, 되돌아갈 주소값, 함수 내의 로컬 변수 등이 저장됩니다. 따라서, Stack 영역이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립 실행 흐름이 가능하다는 것입니다.
[멀티 프로세싱(Multi Processing)]
- 일반적으로 CPU는 하나의 프로세스만 처리할 수 있습니다.
- 정의 : 다수의 프로세서(CPU)가 협력적으로 작업을 동시에 처리하는 것
- 하나의 프로세서가 다수의 작업을 처리하며 하나의 작업 또한 다수의 프로세서에 의해 처리되는 방식입니다.
[장점]
- 여러개의 프로세스가 동일한 데이터를 사용한다고 할 때 프로세서가 이러한 데이터를 하나의 디스크에 두고 공유한다면 더욱 효율적입니다.
- 만약 하나의 프로세서가 작업하는 도중 정지된다면 작업이 중지되는게 아니라 다른 프로세서가 작업을 이어서 진행할 수 있습니다.
[멀티 프로그래밍(Multi Programming)]
- 정의 : 하나의 프로세서가 여러개의 프로세스를 돌아가면서 처리하는 것
- 프로세서 자원을 낭비하지 않고 효율적으로 쓰기 위함
[장점]
- 프로세스 처리 도중 대기하는 시간 동안 다른 프로세스를 처리하여 응답시간을 줄일 수 있습니다.
ex) 프로세스 A를 처리하는 도중 A에서 입출력 이벤트 발생 -> 입출력이 완료될 때 까지 기다리지 않고 다른 프로세스 B를 처리 -> 더욱 빠른 응답시간
[멀티 태스킹(Multi Tasking)]
- 태스크(Task) : 프로세스보다 더욱 포괄적인 작업으로써의 개념
- 정의 : 운영체제 스케쥴링에 의해 프로세서가 다수의 Task를 번갈아 가면서 수행하는 것
- Task를 조금씩 번갈아 가면서 수행하기 때문에 동시에 여러 Task가 수행되는 것 처럼 보입니다.
번갈아 가면서 처리한다면 멀티 프로그래밍과 다른점이 무엇일까요?
- 멀티 프로그래밍은 자원을 효율적으로 사용하기 위함이며, 멀티 태스킹은 일정한 시간동안 번갈아 가면서 Task를 수행하는 개념입니다.
- 즉, 멀티 프로그래밍이 프로세서의 대기 시간을 줄이고 처리시간을 늘리는 방법이라면 멀티 태스킹은 정해진 시간을 할당하여 Task를 수행하는 것입니다.
[멀티 스레딩(Multi Threading)]
- 정의 : 프로세스를 다수의 스레드로 나눠 프로세스를 수행하는 것
- 멀티 프로그래밍에서 연계된 개념으로 생각할 수 있습니다. 즉, 하나의 프로세서가 돌아가면서 스레드를 처리하게 되는 것입니다.
- 프로그램이 실행되면 스레드는 CPU를 점유하여 실행됩니다. 하지만 CPU에 의해 정해지는 우선순위는 예측할 수 없습니다.
[장점]
- 작업 단위를 나눌 수 있어 하나의 프로세스에서 병렬처리가 되는 것 처럼 보이게 할 수 있습니다.
- 스레드의 특징에서 얘기했듯이 스레드는 스레드 간에 데이터 자원을 공유합니다.
- 프로세스에 여러 스레드(실행흐름)가 존재한다면, 하나의 프로세서가 여러 스레드를 처리할 수 있습니다. 즉, 멀티 프로그래밍 방식처럼 프로세서가 돌아가면서 스레드를 처리하고 응답시간을 줄일 수 있습니다.
- 추가적으로 스레드의 특징에서 말씀드렸듯이, 스레는 한 프로세스 안에서 데이터 영역을 공유합니다. 이 때문에 프로세서가 작업하는 스레드를 바꾸는 데에 비용이 크게 발생하지 않습니다.
그렇다면 프로세스 내의 멀티쓰레드는 병렬 처리 되는 것일까요?
=> 반은 맞고 반은 틀립니다. 프로세스의 작업을 여러 스레드로 분리하고 이를 각 다른 코어에서 처리하게 하면 병렬로 처리될 수 있습니다. 하지만 하나의 코어에서 하나의 프로세스를 처리하면 스레드는 병렬로 처리되는 것 처럼 보일뿐 실제로 병렬처리 되는 것은 아닙니다.
스타2에서 마린 100마리를 이동시킨다고 생각해 봅시다. 스타2는 멀티 프로세싱을 지원하지 않고, 하나의 프로세서가 이를 처리해야 하므로 마린 100마리를 동시에 이동시키기(병렬처리)란 불가능 할 것입니다. 하지만, 마린 100마리를 각각 하나의 스레드로 분할하여 각 마린을 하나의 처리기가 돌아가면서 이동시킨다면 동시에 이동하는 것 처럼 보일 수 있습니다.
[참고 자료]
- 멀티-에 관한 개념들 : https://doorbw.tistory.com/26
- http://jeong-pro.tistory.com/71
- http://raccoonjy.tistory.com/15