멀티스레드, 멀티쓰레드 / 멀티 태스킹 / 멀티 프로세싱 / 프로세스와 스레드의 차이

멀티스레드, 멀티쓰레드 / 멀티 태스킹 / 멀티 프로세싱 / 프로세스와 스레드의 차이

멀티스레드란?

프로세스는 크게 정적인 영역과 동적인 영역으로 구분된다. 정적인 영역은 프로세스가 실행되는 동안 바뀌지 않는 영역이고, 동적인 영역은 스레드가 작업을 하면서 값이 바뀌거나 새로 만들어지거나 사라지는 영역이다.

여러 개의 프로세스를 만들면 필요 없는 정적 영역이 여러 개가 된다. 이 문제를 해결하기 위해 하나의 프로세스 내에 여러 개의 스레드를 생성하는 멀티스레드는 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.

/assets/img/posts/development-os/2021-06-16-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%2C%20%EB%A9%80%ED%8B%B0%EC%93%B0%EB%A0%88%EB%93%9C%20%3A%20%20%EB%A9%80%ED%8B%B0%20%ED%83%9C%EC%8A%A4%ED%82%B9%20%3A%20%EB%A9%80%ED%8B%B0%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1%20%3A%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80%20%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98%20%EC%B0%A8%EC%9D%B4/Untitled.png

워드프로세서 창을 여러개 띄우고 작업하는 모습을 다시 생각해보자. 단일 스레드의 워드프로세서를 여러 개 생성하여 작업하는 것보다, 하나의 워드프로세서에 스레드를 여러 개 생성하여 문서를 편집하는 것이 낭비를 줄이고 자원을 효율적으로 사용할 수 있다. 그런 이유로 첫 번째 워드프로세서는 천천히 실행되지만 두 번째부터는 빠르게 실행되는 것이다.

멀티스레드 장단점

장점

  • 자원 공유로 인한 효율 향상 : 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원 중 공유 가능한 부분에 모든 스레드가 공유하게 되어, 자원 중복 사용의 낭비를 막을 수 있다. 뿐만 아니라 작업의 효율도 높일 수 있다.
  • 응답성 향상 / 효율성 향상 : 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다.
  • 다중 CPU일 경우 효율성 향상 : 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.
  • 예시) 비디오 플레이어 프로세스

    일반적으로 비디오 플레이어는 재생할 파일을 저장장치로부터 가져오는 부분(입출력 부분)과 가져온 데이터를 화면에 재생하는 부분으로 나뉜다. 이러한 기능을 단일 스레드로 구현하면 입출력을 요청한 프로세스는 입출력일 끝날 때까지 대기 상태로 전환된다. 단일 스레드는 프로세스 전체의 입출력이 끝날 때까지 대기 상태에 머물러야 하며, 요청한 입력이 끝나야만 다시 재생할 수 있다.

    비디오 플레이어의 입출력과 재생을 멀티스레드로 구현하면 스레드가 독립적으로 작동하기 때문에 입출력 스레드가 대기 상태에 있더라도 재생 스레드는 실행 상태에 있게 된다. 따라서 멀티스레드의 경우 입출력과 상관없이 재생이 가능하다. 이렇듯 하나의 프로세스를 여러 개의 스레드로 구성하면 복잡한 작업을 쉽게 처리할 수 있다.

  • 예시 2) 채팅 프로그램, 워드 프로세서

    멀티스레드를 활용하면 채팅 프로그램으로 채팅을 하면서 파일을 주고받는다거나, 워드프로세서로 문서를 편집하면서 틀린 글자를 찾는 작업을 독립적인 스레드로 구현하면 작업의 효율이 높아진다.

단점

  • 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다. 반면 프로세스를 여러 개 만드는 방식의 경우 각 프로세스가 독립적이기 때문에 한 프로세스의 문제가 다른 프로세스로 전달되지 않는다.

    인터넷 익스플로러는 하나의 프로세스에 멀티스레드를 사용하고, 크롬은 여러 개의 프로세스를 사용한다. 인터넷 익스플로러에서 여러 개의 화면을 동시에 띄웠는데 그중 하나에 문제가 생겼다고 가정하자. 문제가 있는 화면을 강제 종료하면 그 화면만 사라지는 것이 아니라 익스플로러 전체가 종료된다. 인터넷 익스플로러 프로세스는 하나이고 그 안에 여러 개의 스레드를 사용하므로 스레드만 종료되는 것이 아니라 프로세스 전체가 종료되기 때문이다. 워드 프로세서를 여러 개 띄워놓고 사용하다가 한 문서에 문제가 생기면 워드프로세서 전체가 종료되는 것도 이와 같은 현상이다.

    크롬은 각 화면이 독립적인 프로세스이므로 그 중 하나에 문제가 생겨서 종료해도 다른 화면이 미치는 영향이 작다. 과거와 달리 요즘은 메모리가 넉넉하고 멀티코어 CPU가 대중화되어 여러 개의 프로세스를 여러 개의 CPU에서 동시에 실행할 수 있게 되었다. 크롬은 멀티스레드의 사용으로 인해 다른 스레드가 영향을 받는 것을 최소화하기 위해 낭비 요소가 있더라도 멀티스레드 대신 멀티태스킹을 이용한다.

스레드 관련 혼동 용어 정리

멀티스레드

프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법이다. 예들 들면, 워드프로세서 프로세스 내의 문서 편집, 문서 입출력, 맞춤법 검사, 그림판 같은 스레드들이 동시에 작업을 하는 멀티스레드를 나타낸 것이다. 이러한 스레드들은 강하게 연결되어 있으므로 워드프로세서가 종료되면 프로세스 내의 스레드도 강제 종료된다. 멀티스레드는 변수나 파일 등을 공유하고 전역 변수나 함수 호출 등의 방법으로 스레드 간 통신을 한다.

멀티태스킹

운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다. 이렇게 여러 스레드에 시간을 잘게 나누어주는 시스템을 시분할 시스템이라고 한다. 시분할 시스템에서 운영체제가 CPU에 전달하는 작업은 프로세스가 아니라 스레드이다.

예를 들면, 워드프로세서와 프린터 스풀러는 서로 독립적으로 작동하다 가 필요할 때 출력할 데이터를 주고받는다. 서로 독립적이라는 것은 워드프로세서가 비정상적으로 종료되어도 프린터 스풀러는 정상적으로 작동한다는 의미이다. 이렇게 서로 독립적인 프로세스는 데이터를 주고받을 때 프로세스 간 통신(IPC)을 이요한다.

멀티 프로세싱

하나의 프로그램을 여러 프로세스로 구성하는 방식이다.

프로세스와 스레드의 차이

프로세스와 스레드의 차이를 비교하는 것은, 멀티 프로세싱과 멀티 스레드를 비교하는 것과 아주 비슷하다.

프로세스와 스레드의 근본적인 차이는 프로세스는 운영체제로부터 독립된 시간, 공간 자원을 할당 받아 실행된다는 점이고, 스레드는 한 프로세스 내에서 자원을 공유하면서 병렬적으로(Concurrently) 실행된다는 것이다. 다른 차이는 모두 이 근본적인 차이에서 비롯된다.

이로부터 파생되는 여러 차이는 다음과 같다.

먼저 프로세스는 보다 독립적이다. 서로 구분되는 자원을 할당 받아 정말 필요한 경우가 아니면 다른 프로세스에 영향을 미치지 않고 실행된다. 반면 스레드는 프로세스의 하위 집합으로 여러 스레드가 같은 프로세스 자원을 공유하기 때문에 독립적이지 않다. 같은 의미로 프로세스는 보유한 자원에 대한 별개의 주소 공간을 갖지만 스레드는 이 주소 공간을 공유한다.

프로세스간 통신은 스레드간 통신보다 어렵다. 프로세스는 오직 시스템이 제공하는 IPC 메커니즘을 통해서만 통신할 수 있고 시스템에 의해 관리되기 때문에 상대적으로 안전하다. 반면에 스레드는 단순히 공유 변수 수정만으로도 스레드간 통신을 구현할 수 있어 통신이 매우 용이하지만, 안전한 프로그램을 만들기 위해서는 신중해야 한다.

Context Switch에 있어서도 프로세스보다 스레드가 “일반적으로” 더 빠르고 자원소모가 적다. 프로세스는 Switch될 때의 Context를 PCB 등에 저장하는 등 오버헤드가 발생하는데 스레드는 그런 부하가 적다. 근데 이 부분은 조금 조심해야 한다. 압도적으로 스레드 Switching이 더 저렴하다는 의견이 있는 반면, 운영체제나 배포판에 따라 프로세스의 환경에 따라 거의 차이가 없을 수도 있다는 의견 등이 분분하다.

/assets/img/posts/development-os/2021-06-16-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%2C%20%EB%A9%80%ED%8B%B0%EC%93%B0%EB%A0%88%EB%93%9C%20%3A%20%20%EB%A9%80%ED%8B%B0%20%ED%83%9C%EC%8A%A4%ED%82%B9%20%3A%20%EB%A9%80%ED%8B%B0%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1%20%3A%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80%20%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98%20%EC%B0%A8%EC%9D%B4/Untitled%201.png

References

프로세스와 스레드의 차이

Process와 Thread의 차이