프로세스와 스레드의 차이가 무엇인가요?
멀티프로세스와 멀티스레드에 대해 설명해주세요.
위 내용들은 기술 면접에서도 자주 나오는 질문이다. 면접관은 왜 우리에게 이런 질문을 하는 것일까? 이를 이해하기 위해 프로세스와 스레드가 뭔지에 대해 알아보자.
프로세스와 스레드라는 개념을 이해하기 전에 먼저 알아야 할 개념이 있다. 바로 프로그램이다. 프로그램이라는 단어는 많이 들어봤을 것이다. 프로그램의 정의는 무엇일까?
파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태, 즉 아직 실행되지 않은 파일 그 자체이다
그렇다면 메모리에 올라가 있지 않다 라는 건 무슨 뜻일까? 모든 프로그램은 운영체제에서 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있는데, 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해 주지 않았다는 뜻이다.
위에 내용을 좀 더 쉽게 표현하면 프로그램은 아직 실행하기 전의 파일, 즉 코드 덩어리이다. 프로그램의 예시로는 윈도우의 .exe 파일이나 MacOs의 .dmg 파일 등이 있다.
프로그램을 실행시키는 순간 해당 파일은 컴퓨터의 메모리에 올라가게 된다. 프로그램을 실행시키면 동적인 상태로 변하게 되고, 이를 프로세스라고 한다. 따라서 프로세스의 사전적 의미는 컴퓨터에서 실행되고 있는 프로그램이라 할 수 있다.
여기서 한 가지 또 생각할 수 있는 부분이 있다. 프로세스라고 불리려면 프로그램이 컴퓨터의 메모리에 올라가야 한다는 점이다. 이를 통해 프로세스가 운영체제로부터 시스템 자원을 할당받는 작업의 단위임을 알 수 있다.
프로그램이 점점 더 복잡해지면서 하나의 프로세스만으로 프로그램을 실행하기엔 어려워졌다. 하나의 프로그램을 처리하기 위해 여러 프로세스를 만들면 해결할 수 있는 거 아닌가?라는 생각을 할 수 있으나 운영체제에서는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생하기 때문에 불가능하다.
이 문제를 해결하기 위해 생긴 개념이 바로 스레드이다.

스레드는 서로 간에 공유를 할 수 없는 프로세스와 달리 스레드 간 메모리를 공유하며 작동한다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다. 즉 스레드는 프로세스 내에서 실행되는 여러 흐름의 단위이고, 스레드의 흐름이 프로세스의 특정한 수행 경로이다.
아까 프로그램을 코드 덩어리라고 표현했는데, 스레드도 코드에 비유하자면 코드 내에 선언된 함수라고 표현할 수 있다.

프로세스는 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는다. 이때 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해 준다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.

반면에 스레드는 메모리 공유가 가능하다. 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다. 같은 프로세스 내에서 실행되는 서로 다른 스레드는 프로세스의 메모리 공간을 공유한다. 따라서 한 스레드가 프로세스의 자원을 변경하면, 다른 스레드도 그 변경된 결과를 즉시 볼 수 있다.
이 구조에서 프로세스와 스레드의 차이점을 알 수 있다. 에러로 인해 강제 종료가 되는 상황이 발생했을 때, 프로세스는 서로 독립적으로 존재하므로 하나의 프로세스가 종료되어도 다른 프로세스에게 영향을 주지 않는다. 반면 스레드는 메모리 영역을 공유하기 때문에 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
멀티 프로세스는 하나의 프로그램을 여러 프로세스로 구성하여 각 프로세스가 병렬로 작업을 수행하는 방법이다.
이 방법의 장점은 무엇일까? 프로세스는 서로 독립적으로 존재하기 때문에 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않을 것이다.
단점으로는 무엇이 있을까? CPU에서 여러 프로세스를 돌아가면서 작업을 처리한다. 이를 Context Switching이라고 하는데, 멀티 프로세스 방법을 사용하면 Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 된다.
또한 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching이 발생하면 캐시에 있는 모든 데이터를 모두 리셋하고 다시 캐시 정보를 불러와야 하는 문제점이 있다.
마지막으로 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 일반적으로 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다. 특수한 방법을 사용해 공유를 할 수 있으나 CPU 레지스터 교체뿐만이 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 문제점이 있다.
멀티 스레드는 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 방법이다. 많은 운영체제들이 멀티 스레드 방식을 기본적으로 사용하고 있다.
이 방법의 장점은 무엇일까? 멀티 스레드는 하나의 프로세스에서 여러 스레드를 구성하는 것이므로 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
또한 스레드는 서로 메모리를 공유하고 있기 때문에 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다. 그리고 통신의 부담도 적어 프로그램 응답 시간을 단축시킬 수 있다.
단점으로는 무엇이 있을까? 스레드는 메모리를 공유하고 있기 때문에 동기화 문제가 발생할 수 있다. 또한 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
면접관은 우리에게 왜 이런 질문을 하는 걸까? 멀티프로세스, 멀티스레드를 보면 알 수 있듯이 각각 방식에서 생기는 장점과 단점 모두 프로세스와 스레드의 구조와 운영체제에서 이를 어떤 방식으로 할당하는지로부터 나온다. 단순하게 프로세스와 스레드의 정의가 무엇인지가 중요한 게 아니라 이 개념이 나오게 된 과정과 세부 내용을 제대로 알아야 한다고 생각한다.
와.. 진짜 궁금한 점만 쏙쏙 알려주는게 너무 좋아요. 블로그 매일 써주세요