프로세스, 스레드
프로세스
프로세스는 실행 중에 있는 프로그램을 의미한다. 여러분이 게임을 즐기기 위해서 게임 실행파일을 더블클릭하면, 그 순간 프로그램 실행을 위해 메모리 할당이 이루어집니다. 그리고 이 메모리 공간으로 바이너리 코드가 올라가게 되며, 이 순간부터 프로그램은 프로세스라고 불리게 된다.
대부분의 사람들은 하나의 프로그램만 사용하기보다는, 여러 프로그램을 동시에 사용하고 싶어한다. 하지만 컴퓨터가 하나의 명령을 수행하기 위해서 CPU를 점유하고 있으면 다른 작업은 실행될 수 없다. 둘 이상의 프로그램이 동시에 실행이 가능했던 이유는 하나의 CPU가 여러 개의 프로세스를 번갈아가며 실행하기 때문이다.
CPU는 아주 빠르기 때문에 하나의 CPU가 여러 프로세스를 번갈아 실행해도 사용자는 전혀 눈치를 채지 못한다. 결국 동시에 여러 개의 프로그램이 실행되는 것처럼 보이는 이유는 여러 개의 프로세스들이 CPU 할당 시간을 나누기 때문이다. 이렇게 동시에 여러 프로세스를 처리하는 형태를 멀티프로세스라고 하며, 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일을 가리켜 스케줄링이라고 한다.
스레드
컨텍스트 스위칭
멀티프로세스는 컨텍스트스위칭을 필요로 한다. 컨텍스트 스위칭은 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정이다. 실행중인 프로세스가 변경되면 CPU 내에 존재하는 데이터도 함께 변경되어야 한다.
예를 들어 프로세스 A가 실행중에 있다. 일정 시간이 지나서, 이제 프로세스 B를 실행해야 한다. 따라서 프로세스 B가 실행되기 전에 CPU에 저장된 A프로세스의 데이터를 메모리에 저장해야 한다. 이 데이터들은 프로세스 A가 실행을 이어서 진행할 경우 필요한 데이터들이기 때문이다. 또한 프로세스 B도 새롭게 실행되는 프로세스가 아니라면, 이전에 실행될 때 CPU에 있던 데이터들을 메모리에 저장해놓았을 것이다. 이 데이터들을 다시 CPU에 복원해야 한다. 그래야 프로세스B의 작업이 멈춰진 부분부터 이어질 수 있다.
컨텍스트 스위칭을 줄이는 새로운 대안, 스레드
많은 수의 프로세스 생성은 빈번한 컨텍스트 스위칭으로 이어진다. 컨텍스트 스위칭이 발생하는 빈도수는 상황과 시스템에 따라서 차이가 있지만, 아무리 못해도 초당 수십 회 이상이다. 따라서 빈번한 컨텍스트 스위칭은 성능 저하의 원인이 됩니다. 멀티프로세스는 사용자에게 편의를 가져다 주지만, 두 가지 이상의 일을 동시에 처리하기 위해서 추가적으로 프로세스를 생성하는 작업은 상당히 부담스럽다.
빈번하게 발생하는 컨텍스트 스위칭에 소요되는 시간을 조금이라도 줄일 수 있다면 성능에 큰 향상을 기대할 수 있다. 이러한 생각에서 스레드가 탄생했다. 프로세스는 완전히 독립된 두 개의 프로그램 실행을 위해 사용된다. 그러나 스레드는 하나의 프로그램 내에서 둘 이상의 프로그램 흐름을 만들어내기 위해서 디자인되었다. 그리고 프로세스와 달리 스레드 간에는 공유하는 상태 정보들이 있다. 이것이 컨텍스트 스위칭을 빠르게 하는 요인이 된다.
멀티스레드 방식에서 주의할 점
동시에 처리해야 할 일을 스레드로 구현할 경우 메모리 공간과 자원 소모를 줄일 수 있게 된다. 그러나 멀티스레드 방식에서는 주의해야할 점이 있다. 멀티 프로세스 기반으로 프로그래밍할 때는 프로세스 간 공유하는 자원이 없기 때문에 동일한 자원에 대해 접근하는 일이 없었지만, 멀티 스레딩을 기반으로 프로그래밍할 때는 동일한 자원에 접근하는 일이 발생할 수 있다. 그 결과, 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 따라서 개발자들이 구현한 코드 중에 공유되는 메모리 자원에 대해서 한번에 한 스레드만 실행되도록 보호해주는 장치가 필요하다. 이를 동기화라고 한다.
참고
개발자가 되기 위해 꼭 알아야 하는 IT 용어, 비제이퍼블릭