프로세스와 쓰레드는 자칫 같은 의미로 생각하기 쉬운 개념입니다.
하지만 Process와 Thread의 개념은 실행 범위와 목적에서 차이가 있습니다.
Process 란 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 Program이며,
Thread란 Process 내에서 실행되는 여러 흐름의 단위라고 할 수 있습니다.
흔히 우리가 말하는 프로그램이 실행되면 Process instance가 생성됩니다.
instance가 생성된다는 의미는 프로그램 실행에 필요한 내용이 컴퓨터 메모리인 RAM에 적재된다는 뜻입니다.
컴퓨터의 작업관리자를 실행하면 프로세스 란에 무수히 많은 Process 가 실행되고 있는 모습을 볼 수 있습니다.
컴퓨터 작업을 하는 동안 수많은 Process와 Thread가 실행되고 있습니다.
빠르고 안정적인 좋은 프로그램을 만들기 위해서는 Process와 Thread가 효율적으로 오류없이 일을 처리해야 하며, 개발자가 프로그래밍을 할 때는 자신이 구현하는 코드가 Process 단위에서 실행되어야 하는지, Thread 단위에서 실행되어야 하는지 구분하고 동작방식을 이해할 필요가 있습니다.
Process 는 네가지 구조로 되어 있다.
위 특징 외에도 코드 영역과 데이터 영역은 선언 시 그 크기가 결정되는 정적 영역이지만,
스택 영역과 힙 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들기도 하는 동적 영역입니다.
원칙적으로 서로 다른 Process 간의 메모리 공간 접근은 허용되지 않으며, 만약 Process간 서로 다른 자원에 접근하려면 Process간 통신을 해야합니다.
Thread는 어떠한 프로그램 내에서 또는 Process 내에서 실행되는 흐름의 단위를 말합니다.
일반적으로 하나의 프로그램은 하나 이상의 Process를 가지고 있고, 하나의 Process는 반드시 하나의 Thread 를 가집니다.
즉 Process를 생성하면 기본적으로 하나의 Thread가 생성되는 셈입니다.
Thread 는 Process 내에서 Stack 만 따로 할당 받고 Code, Data, Heap 영역은 공유하고 있습니다.
Thread는 한 Process내에서 동작되는 여러 실행의 흐름으로, 같은 Process 안에 있는 여러 Thread들은 같은 Heap 공간을 공유합니다.
한 Thread가 Process 자원을 변경하면, 다른 이웃 Thread 도 그 변경 결과를 즉시 볼수 있습니다.
Process는 자원을 공유하지 않지만 Thread 는 자원을 공유합니다.
컴퓨터로 어떠한 작업을 한다고 가정해 봅니다. 유튜브도 하고, 음악도 틀고, 문서 작업을 위해 워드도 틀었습니다. 검색을 위해 인터넷도 열고, 카카오톡도 열었습니다.
이렇게 대부분 사람들은 여러 프로그램을 동시에 사용합니다.
컴퓨터는 하나의 명령을 수행해야 하기 위해서 CPU를 점유하고 있으면, 다른 작업은 실행 될 수 없습니다. 그렇다면 어떻게 프로그램들이 실행되는 걸까요.
답은 하나의 CPU가 여러개의 Process를 번갈아가며 실행하기 때문입니다. CPU는 아주 빠르기 때문에 하나의 CPU가 여러 Process를 번갈아가며 실행해도 사용자는 눈치를 못채는 것입니다.
결국 동시에 여러 개의 프로그램이 실행되는 것처럼 보이는 이유는 여러개의 Process가 CPU 할당 시간을 나누기 때문입니다.
이렇게 동시에 여러 Process를 처리하는 형태를 Multi Process라고 합니다. 그리고 Process의 CPU 할당 순서 및 방법을 결정짓는 것을 Scheduling이라고 합니다.
Multi Processing 은 context switching을 필요로 합니다. context switching은 process의 상태 정보를 저장하고 복원하는 일련의 과정을 말합니다. 실행중인 process가 변경되면 CPU내에 존재하는 데이터들도 함께 변경되어야 합니다.
많은 수의 process 생성은 빈번한 context switching 으로 이어집니다.
context switching의 빈도수는 상황과 시스템에 따라 차이가 있지만, 아무리 못해도 초당 수십 회 이상입니다.
따라서 빈번한 context switching은 성능 저하의 원인이 됩니다.
multi process는 사용자에게 편의를 주지만, 두 가지 이상의 일을 동시에 처리하기 위해 추가적으로 process를 생성하는 작업은 상당한 부담입니다.
빈번하게 발생하는 context switching에 소요되는 시간을 줄여 성능을 향상시키기 위해 thread가 탄생했습니다. process는 완전히 독립된 두개의 프로그램을 실행하기 위해 사용됩니다.
그러나 Thread는 하나의 프로그램 내에서 둘 이상의 프로그램 흐름을 만들어 내기 위해 디자인 되었습니다.
그리고 Process와 달리 Thread 간에는 공유하는 상태 정보들이 있습니다. 이것이 context switching을 빠르게 하는 요인이 됩니다.
도서 개발자가 되기 위해 꼭 알아야 하는 IT 용어
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4