프로세스, 스레드, 멀티 스레드

yezo cha·2021년 8월 5일
0
post-thumbnail
post-custom-banner

프로세스 Process

운영체제에서는 메인 메모리에 할당되어 실행 중인 하나의 애플리케이션프로세스라고 부른다.
사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당 받아 애플리케이션의 코드를 실행한다.
이때 실행되는 애플리케이션을 프로세스라고 부른다.

예를 들어 Chrome 브라우저를 두 개 실행하면, 두 개의 프로세스가 생성된다.
이렇게 하나의 애플리케이션은 여러 프로세스(다중 프로세스)를 만들기도 한다.

하단의 사진(활성 상태창)에서 확인할 수 있는 항목 하나하나가 전부 프로세스.

프로그램과 프로세스

프로그램

프로그램은 일반적으로 하드 디스크 등에 저장되어 있는 실행 코드.
어떤 작업을 하기 위해 실행할 수 있는 파일.

프로세스

프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위.
메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태.
프로세스는 실행하면서 stack, pointer, text, data, register 등 끊임없이 변한다.
job, task 등으로 불리기도 한다.

멀티 태스킹

OS를 통해 CPU가 작업하는데 필요한 자원을 프로세스 또는 스레드 간에 나누는 행위를 멀티 태스킹이라고 한다.
이를 통해 여러 응용 프로그램을 동시에 열고 작업할 수 있다는 장점이 있다.

여러 Process를 관리하는 운영체제의 모습을 도식화함

여러 프로세스가 동시에 실행되고 관리되는 것처럼 보이지만, 사실 CPU는 한번에 한 가지 명령어 밖에 처리하지 못한다.

CPU가 상상 이상으로 빠르기 때문에 프로세스들을 번갈아가며 실행하고 관리하는 것이 마치 동시에 하는 것처럼 보일 뿐이다.(Context Switching)

  • Context Switching
    하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업.

스레드(Thread)

프로세스 내에서 실행되는 흐름의 단위.
일반적으로 하나의 애플리케이션(프로그램)은 하나 이상의 프로세스를 가지고 있다.
하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
즉, 프로세스를 생성하면 기본적으로 하나의 (메인)스레드가 생성된다고 생각하자.
하나의 프로세스를 구성하는 스레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.

하나의 프로세스는 여러 개의 스레드로 구성이 가능하다.
하나의 스레드코드가 실행되는 하나의 흐름이기 때문에, 한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개 생긴다는 의미다.

프로세스와 스레드

프로세스는 실행될 때 운영체제로부터 각각 독립된 메모리 영역을 할당 받는다.

스레드는 한 프로세스 내에서 동작되는 흐름으로서, 프로세스 내에서 Stack영역만 별도로 할당 받고, 부모 프로세스의 Code, Data, Heap 영역은 공유한다.
즉, 프로세스내에서 자식 스레드들을 서로 주소 공간이나 자원들을 공유하면서 실행될 수 있다.

멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 하나의 작업을 수행하는 것.

  • 안정성이 좋다.
    • 여러 개의 자식 프로세스 중 하나에 문제가 발생해도, 다른 자식 프로세스에 영향이 확산되지 않는다.
  • 구현이 비교적 간단하다.
  • 메모리 사용량이 많다.
  • 프로세스 간 통신을 하기 위해서 IPC를 통해야 한다.
  • 스케쥴링에 따른 Context Switch이 많아지고, 성능 저하의 우려가 있다.

멀티 스레드(Multi-Thread)

멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 할 수 있다.

멀티 스레드는 하나의 애플리케이션을 여러 개의 스레드로 구성하여 하나의 스레드가 하나의 작업을 처리하도록 하는 것을 말한다.

멀티 스레드는 다양한 곳에서 사용된다.
대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할하여 병렬로 처리하는 데에 사용할 수도 있고, UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용할 수도 있다.
그리고 여러 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용된다.

  • 응답성이 좋다.
  • 자원 공유가 쉽다.
    • 스레드들은 부모 프로세스의 자원과 메모리를 공유할 수 있다.
  • 프로세스를 할당하는 것보다 스레드를 할당하는 것이 비용이 적다.
  • 구현 및 테스트, 디버깅이 어렵다.
  • 너무 많은 스레드 사용은 오버헤드를 발생시킨다.

멀티 프로세스와 멀티 스레드

자원의 효율성 증대

멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 비용이 적어진다.
스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.

응답 시간 단축, 처리비용 감소

프로세스간 IPC를 사용하여 통신하는 것은 상대적으로 비용이 크다.
하지만 스레드는 프로세스 메모리 영역을 공유하여 스레드 간의 통신 비용이 적게 든다.

멀티 스레드의 안정성 문제

멀티 프로세스는 프로그램이 문제가 생기면 해당 프로세스가 중단되거나, 중단 시키고 다시 시작하면된다.
하지만 멀티 스레드 방식의 프로그램에서는 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면, 해당 데이터 공간을 공유하는 모든 스레드를 망가뜨릴 수 있다.

profile
(ง •̀_•́)ง
post-custom-banner

0개의 댓글