이 글을 작성하게 된 이유는 사전면접이나 기술면접에서 항상 등장하는 프로세스와 스레드 차이, 동시성에 대해서 설명해주세요라고 했을 때 제대로 설명하지 못하는 나의 모습을 보고 정리하고자 작성하게 되었다.
본인의 이해 바탕으로 주관적인 생각이 들어가있으니 너무 신뢰하지 않기를 바랍니다..
먼저 동시성을 얘기하기 전에 동시성을 구현할 수 있는 프로세스와 스레드를 보고 넘어가보자!
프로세스라는 것은 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다고 한다.
연속적으로 실행되고 있다는 것은 프로세스가 종료되기 전까지 어떠한 작업을 계속 실행하고 실행할 수 있는 상태를 의미한다고 이해했다.
다음으로 프로세스가 어떻게 실행되는 것인지도 한번 생각해보자.
프로세스는 어떻게 실행되는 것일까?
바로 개발자가 힘들게 만든 코드로 빌드된 프로그램(.exe같은)을 실행했을때 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 것이다.
그림으로 표현하면 위와 같지 않을까한다.
프로세스는 실행코드로 되어있는 프로그램은 하드디스크에 저장되어 있고 이것을 실행하면 메모리 공간을 할당받아 프로세스로 실행되는 것이라 볼 수 있겠다.
프로세스의 중요한 특징 중 멀티 프로세스 환경에서 각 프로세스는 독립적으로 실행된다. 따라서 프로세스간 자원 공유가 불가능한 것은 아니지만 힘들다고 볼 수 있다.
프로세스간 리소스 공유를 위해서는 통신(TCP 통신같은)이나 IPC 등을 통해 가능하다. 이것에 대한 개념은 따로 설명하지 않는다.
스레드라는 것은 프로세스 내에서 실행되는 하나의 실행(흐름) 단위이다.
이렇듯 프로세스와 스레드는 여러 작업? 흐름이 동시에 진행된다는 공통점은 가지고 있지만 서로 어떻게 어디서 실행되는지에 대한 차이가 있다. 지금은 멀티프로세스 방식보다 멀티 스레드 방식이 많이 쓰인다.
여기서 조금 의문점이 생길 수 있다. 그러길 바람
프로세스나 스레드나 동시에 여러 작업을 실행할 수 있는데 어떤 부분이 다르길래 스레드를 쓰는 것일까?
멀티 스레드는 멀티 프로세스와 달리 프로세스 내의 메모리를 공유해 사용할 수 있어서 리소스의 공유가 쉽게 가능하다. 프로세스는 각 프로세스별로 코드, 스택 등의 메모리 공간이 각각 만들어진다면,
스레드는 프로세스처럼 독립적인 구조가 아니라 일부 메모리 공간을 공유하기 때문에 이를 통해 스레드간 통신도 가능하며 Context Switching 시간이 프로세스보다 짧다.
그냥 한마디로 스레드가 프로세스보다 리소스를 덜쓴다고 말할 수 있겠다.
하지만 이런 스레드도 단점들이 존재한다. 역시 세상에 완벽한건 없다.. 좀 있었으면..
메모리 공간을 공유하기 때문에 각 스레드가 리소스를 점유하려고 경합하는 현상이 발생하여 스레드끼리 무한정 대기하는 교착상태(Deadlock)에 빠질 수 있다. 이에 대한 동기화처리가 매우 중요하다 볼 수 있다.
또한 멀티 스레드 환경에서 하나의 스레드가 오류로 인해 죽을경우 다른 스레드에 영향을 미칠수 있다. 프로세스 같은 경우는 독립적으로 실행이 되기 때문에 프로세스 하나가 죽어도 다른 프로세스는 살아있을 수 있다.
후.. 동시성에 대해 적으려다가 서론이 너무 길었다.. 이제 동시성이 뭔지 알아보자!
싱글 코어에서 멀티 스레드를 동작 시켜 동시에 실행되는 것 같이 보이는 것이다.
일단 동시성(Concurrency)이란 병렬성(Parallelism)과 비교해서 보아야한다.
먼저 위에 정의에서 말했듯이 동시성이란 싱글 코어에서 멀티 스레드환경을 구성하여 Context Switching을 통해 동시에 실행되는 것처럼 보이게 하는 것이다.
병렬성은 멀티 코어에서 멀티 스레드를 동작시키는 방식이다. 따라서 실제로 동시에 여러 작업이 처리된다고 볼 수 있겠다.
그림으로 표현하면 이렇지 않을까 한다.
동시성은 하나의 싱글코어가 Context Switch를 통해 여러 개의 스레드를 번갈아가며 실행하며 마치 동시에 실행하는 것처럼 보이는 형태이고 병렬성은 멀티코어로서 물리적으로 작업을 나눠서 처리한다고 볼 수 있겠다.
이렇듯 코어 환경에 대한 차이가 있었다. 앞으로 면접에서 물어보면 헷갈리지 말자!