Me/FrontEnd

프로세스와 스레드의 차이

폴스업데이트 2022. 5. 20. 00:21
728x90

  프론트엔드에 대한 내용은 아니지만, 지난 포스트에서 자바스크립트가 싱글 스레드라는 글을 쓰면서 '스레드'의 개념에 대해 좀 더 알아보아야겠다고 생각했습니다.


프로세스

 

  프로세스는 '컴퓨터에서 연속적으로 실행되고있는 프로그램'입니다. 메모리 상에 올려진 프로그램의 한 개체라고 보면 됩니다. 운영체제(OS)로부터 자원을 할당받은 작업의 단위입니다.

  이렇게 각 프로세스는 메모리를 할당 받습니다. 또, 각 프로세스는 서로의 영역의 자원에 접근할 수 없습니다. 사실 있긴 한데, 많이 귀찮고 무거운 과정인데 아래에서 더 설명하겠습니다.

간단히 말해서, 작업관리자를 켰을 때 주르륵 뜨는 목록들이 현재 실행중인 프로그램, 프로세스라고 보면 될 것 같습니다. 하드에 저장만 되어있고 실행하지 않은 프로그램을 실행하면 메모리에 올라가게 되며, 이 상태의 프로그램을 프로세스하고 하는 것입니다.

 


스레드

 

  프로세스 하나만으로 프로그램을 돌릴 수는 있습니다. 그런데 점점 프로그램들이 복잡해졌고, 프로세스 하나로는 실행하기가 어렵게 되었습니다. 프로세스를 여러개 만들기에는 서로 자기에게 할당된 구역에서만 놀 수 있습니다. 즉, 프로세스 안에서 실행의 단위가 더 나뉘어져야했습니다.

 

 

스레드는 '프로세스 내에서 실행되는 작업 흐름의 단위'입니다.

 

  스레드는 한 프로세스 내에서 Stack만 따로 할당을 받고, Code, Data, Heap은 공유합니다. C++로 만든 프로그램을 예로 들면, 실행 시 해당 프로세스 안에서 돌아가는 함수 main() 등등이 스레드라고 볼 수 있겠습니다. 적절한 비유인지 모르겠네요. 중요한건, 스레드는 프로세스 내에서 메모리를 공유하며 실행되는 흐름의 단위라는 것입니다.

 


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

 

  프로세스끼리는 서로의 자원에 접근하지 못한다고 했는데, 멀티 프로세싱은 어떻게 가능한 것일까요?

멀티프로세싱은 한 작업을 공유해서 영차영차하는 것이 아니라, 하나의 프로그램에서의 작업을 각 프로세스가 나누어서 처리하도록 하는 것입니다. 이렇게하면 한 프로세스가 죽어도 다른 작업은 끝마칠 수 있다는 장점이 있습니다. 하지만, 프로세스를 바꿔가는 작업(Context Switching)과정에서 작업이 많이 많이 무거워집니다! 그리고 프로세스끼리는 공유되는 메모리가 없기 때문에 프로세스가 바뀌는 과정에서 데이터 리셋, cache 정보 불러오기 과정을 거쳐야하므로 많이 무겁고 느려집니다. 

 

  멀티 스레드는 하나의 프로세스 내에서 여러개의 스레드를 사용하는 것으로, 각 스레드가 하나의 작업을 처리하도록 합니다. 멀티 스레드를 사용하면 확실히 멀티 프로세스보다 프로세스를 불러오는 작업 횟수가 줄면서 효율도 증대되겠죠. 각 작업별로 메모리도 주고받기 쉽기 때문에 자원 관리도 좋아집니다. 다만, 각 스레드끼리 global variable을 통해 data를 공유하는데요. 이 과정에서 충돌이 발생하는 동기화 문제가 일어나기도 합니다. 


그래서 차이점은?

 

  공통점이 있나...? 개념이 많이 달라요. 인간과 소화기관의 차이점 같은 느낌입니다. 프로세스는 하나의 프로그램이 OS에게 메모리를 할당받아 실행되고 있는 것이며, 스레드는 그 프로세스 내에서 실행되는 작업의 흐름 단위입니다. 프로세스는 OS에게 stack, heap, data 등을 메모리 영역으로써 할당받고, 스레드는 해당 프로세스 내에서 stack을 제외한 자원을 다른 스레드와 공유합니다. 

 

참고문헌

 

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

728x90