Process와 Thread
이번에는 드디어 프로세스와 스레드간의 차이점을 공부해봤습니다.
이전에도 많이 듣고 훑어보는 정도..?로 공부해왔지만 이번을 우아한 테코톡을 보면서 정리해봤습니다.
너무 중요한 개념이고 면접에서도 단골 질문이기에 한 번은 깊게 공부해야한다고 생각합니다.
일단은 시작하기 전 용어에 대한 정리부터 하고 시작하겠습니다.
프로세서, 프로그램, 프로세스...등등 너무 헷갈리는 단어들이 많기 때문에 시작 전 개념을 잡아놓겠습니다.
🧐 용어정리
프로그램 : 운영체제 위에서 실행할 수 있는 파일(ex> 웹 브라우저, 카카오톡)
프로세스 : 운영체제 위에서 실행중인 프로그램
프로세서 : 프로세스가 동작될 수 있도록하는 하드웨어(CPU)
동시성 : 한 순간의 여러가지 일이 처리되는 것이 아니라, 짧은 전환으로 여러가지 일이 동시에 처리되는 것처럼 보이는 현상.
실행단위 : CPU CORE에서 실행하는 하나의 단위 프로세스 + 스레드 포괄 개념
자주 사용하는 용어들을 간단하게 정리해봤습니다.
그럼 실제로 CPU는 어떻게 동작하고 프로세스, 스레드는 어떻게 동작할까요?
제일 중요한 부분은 CPU는 단 하나의 스레드만 처리할 수 있습니다.(코어가 1개인 경우)
한 개만 처리가 가능한데 어떻게 저는 노래도 듣고 코딩도 하고 편집도 동시에 할 수 있는거죠?
그것은 바로 컨텍스트 스위칭을 CPU가 사용하기 때문입니다.
위의 2개의 프로세스는 PCB라는 정보와 각각의 메모리 영역을 가지고 있습니다.
프로세스 1은 동영상 편집 작업이고 프로세스 2는 음반 작업이라고 가정해봅시다.
그럼 한 개의 컴퓨터는 2개를 동시에 작업 할 수 있겠죠?
이렇게 저희는 2개의 프로세스가 동시에 동작하는 것처럼 보이지만
실제로는 컨텍스트 스위칭을 하면서 짧은 시간에 번갈아가면서 진행합니다.
그럼 2개의 프로세스를 실행하려면 엄청난 컨텍스트 스위칭 비용이 들겠죠?
그래서 나온 개념이 "스레드" 개념입니다. 즉 경량화되어진 프로세스입니다.
어떻게 그것이 가능하고 무엇이 다르기에 컨텍스트 스위칭 비용이 줄어드는 것일까요?
아래의 그림을 보면서 설명하겠습니다.
위의 메모리 영역을 얼마만큼 공유하느냐를 기준으로 프로세스와 스레드가 나뉩니다.
프로세스는 각각의 PCB와 메모리 영역을 가지게 됩니다.
스레드는 Code, Data, Heap영역을 서로 공유하고 있습니다. 그래서 스위칭 컨텍스트가 발생할 경우
위의 공유영역은 그대로 사용할 수 있어서 프로세스를 스위칭하는 비용보다 훨씬 줄어들게 됩니다.
또한 스레드는 공유되는 자원들이 있기 때문에 스레드 간의 통신이 필요없어 효율적입니다.
그러나 물론 단점도 존재합니다. 스레드의 최고 단점은 서로 영향을 받는다는 것입니다.
예를 들어 인터넷 익스플로어를 쓰다가 오류가 생기면 한꺼번에 다 꺼지는 상황이 발생한 적이 있을 겁니다.
이것은 멀티 쓰레드의 영향이고 크롬 같은 경우는 하나의 탭에 문제가 생기면 그 탭만 꺼지고 다른탭 에는 영향을 주지 않습니다.
이렇게 프로세스와 스레드는 각각의 장.단점을 가지고 있습니다.
위의 내용을 바탕으로 멀티 스레드와 멀티 프로세스가 어떻게 동작하는지 이해하실 수 있습니다.
멀티 프로세스는 컨텍스트 스위칭비용이 크게 들고 IPC통신을 해야한다는 점이 있지만 독립성을 가져 다른 프로세스에
영향을 주지 않는다는 특징이 있습니다.
멀티 스레드같은 경우는 하나의 프로세스내에서 공유되는 메모리 영역을 가지고 있어 통신 할 필요가 없고 컨텍스트 비용이
낮습니다. 그러나 스레드간의 영향을 줄 수 있으므로 주의해야하는 특징이 있습니다.
각각의 장.단점이 있으니 상황에 맞게 사용하시면 될 것 같습니다.
여기서 또 의문점이 들 수 있습니다.
아니 왜 CPU는 1개의 Core만 가지고 있어서 동시성 문제가 생길 수 있으니
CPU내에 여러 개의 Core를 만드는게 어떨까?라는 생각을 가질 수 있습니다.
바로 위의 개념이 "멀티 코어"개념입니다.
일단 코어가 늘어나는 추세로 많으면 프로그램을 실행 시 성능이 좋아집니다.
그래서 시간이 흐를수록 CPU내에 코어를 많이 넣는 방식으로 CPU를 설계하고 있습니다.
이렇게 간단하게 프로세스와 스레드 간의 차이에 대해서 알아봤습니다.
정리하자면 "메모리 자원"은 Process기준으로 받고 "작업/스케줄링"은 Thread단위로 진행한다고 생각하시면 됩니다.
긴 글 읽어주셔서 감사합니다.