Skip to content

Latest commit

 

History

History
53 lines (41 loc) · 5.3 KB

4. process와 thread의 차이.md

File metadata and controls

53 lines (41 loc) · 5.3 KB

프로세스(Process)

프로세스: 메모리에 올라와 실행되고 있는 프로그램의 인스턴스. 실행되고 있는 프로그램(독립적인 개체). 작업의 단위

한 프로그램이 실행되면 프로그램을 실행하기 위해 메모리에 프로세스를 적재한다. 프로세스는 Code, Data, Heap, Stack으로 구성되어 있다. 한 예로 Excel을 실행하면 1개 이상의 프로세스가 메모리에 적재되며 각각의 Code, Data, Heap, Stack이 생성된다. 또한 프로세스는 다른 프로세스와 자원을 공유하지 않는다.

각 구조의 특징은 아래와 같다.

  • 코드 영역(code area) : 프로그래머가 작성한 프로그램이 코드 영역에 작성된다
  • 데이터 영역(data area) : 코드가 실행되면서 사용한 변수나 파일들의 각종 데이터들이 모여있다.
  • 스택 영역(stack area) : 호출한 함수가 종료되면 되돌아올 메모리의 주소를 스택에 저장하거나 변수 사용 범위에 영향을 미치는 영역을 구현 할때 사용된다.
  • 힙 영역(heap area) : 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. ex) malloc

사실 여러 프로그램이 실행되고 프로세스들이 메모리에 적재되어도, CPU는 한번에 하나의 명령밖에 처리하지 못한다. 우리는 프로그램이 동시에 동작하는 것처럼 보이지만, 실제로는 상상보다 훨씬 빠르게 처리를 하고 있는 것이다.

과거에는 프로그램을 하나의 프로세스로 동작시켰다. 그러나 점점 프로그램이 복잡해지고 많은 성능을 요구하다보니 고안 한 것이 하나의 프로그램을 여러 개의 프로세스로 돌리면 되지 않을까? 하는 생각을 하게 되었으나 운영체제는 안전성을 위해 프로세스 간의 정보를 접근 할 수 없도록 제약을 걸어 두었고, 이를 벗어나는 행위를 하게 되면 오류가 발생했다.

그래서 프로세스보다 작은 실행 단위의 개념이 필요해졌고, 그렇게 생겨난게 스레드(Thread)이다.

스레드(Thread)

스레드: 프로세스 내에서 할당받은 실행의 단위. 스레드는 프로세스 당 CPU의 코어 개수만큼 생성될 수 있습니다.
* 스레드는 프로세스 내의 메모리 공간을 공유하지만, 각각의 프로세스는 별도의 메모리 공간을 갖습니다.

스레드가 생성되면 각각 Stack만 할당 받고 프로세스 내의 Code, Data, Heap를 서로 공유한다. 그렇기 때문에 스레드 하나가 장애가 발생하면 전체 스레드가 강제 종료된다.

멀티 스레드(Multi Thread)란?

하나의 프로세스에 2개 이상의 스레드를 가질 때 멀티 스레드라고 볼 수 있다. 멀티 스레드는 하나의 프로세스가 여러 작업을 다중 스레드를 이용하여 동시 처리하는 것을 의미하며 아래와 같은 장단점을 가진다.

장점

  • 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 Context Switching 비용의 발생이 적어 응답이 빠르다.
  • Context Switching 할 때 공유하는 메모리만큼의 메모리 자원을 아낄 수 있게 된다.

단점

  • 자원을 공유하는 동기화 문제(Synchronization Issue)가 발생한다.
  • 위에 서술한 것과 같이 스레드 하나가 공유 받은 프로세스의 자원(Code, Data, Heap)등에 문제를 발생시킨다면 전체 프로세스가 종료 될 수 있다.

이처럼 성능과 리소스 측면에서 좋은 장점이 존재하지만 문제는 동기화 문제에서 발생한다. 각 스레드는 공유 자원에 접근 할 수 있기 때문에, 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 될 때 오류가 발생 할 수 있다. 이러한 스케쥴링은 운영체제에서 자동으로 되지 않기 떄문에 개발자가 직접 구현해야 하며 디버깅 과정이 까다로워지게 되므로 멀티 스레드 사용에는 신중을 기해야 한다.

그렇다면 멀티 프로세스라는 단어는 왜 있을까?

프로세스는 다른 프로세스의 자원을 공유 할 수 없다라는 특징을 가진다. 그렇다면 멀티 프로세스는 존재 할 수 없다. 서로 협업이 되지 않기 때문에 각각의 프로그램으로 돌아 갈 뿐이다. 하지만 실제로는 프로세스가 다른 프로세스의 정보에 접근하는 것이 가능하다. 공유하는 방법은 아래와 같다.

  • IPC (Inter-Process Communication)을 사용한다.
  • LPC (Local- inter-Process Communication)을 사용한다.
  • 별도로 공유 메모리를 만들어서 정보를 주고 받도록 설정한다.

물론 이 경우 cpu 레지스터 교체 뿐이 아니라 ram과 cpu 사이의 캐시 메모리가 초기화되어 자원 부담이 커지게 된다.

끝으로

프로세스와 스레드는 뗄레야 뗄 수 없는 사이이다. 그 둘을 완벽히 설계하고 사용 할 수는 없더라도 반드시 이해하고 넘어가야 하는 아주 중요한 개념 중 하나이다. Node.js와 같은 언어를 사용 할 때 왜 싱글 스레드를 채택 했고, Non-Blocking I/O를 사용하게 되었는지에 대한 부분을 좀 더 이해 할 수 있게 되고, 더 나아가 이 언어가 어떤 서비스에 더 적합한지를 알 수 있게 선택 할 수 있게 될 것이다.