프로세스와 스레드

김명주·2023년 6월 12일
0
post-custom-banner

프로세스

프로세스란 현재 실행중인 프로그램을 의미한다. 여기서 프로그램이란, 어떤 작업을 위해 실행할 수 있는 파일을 의미한다. 실행 이전의 프로그램을 정적 프로그램이라고 말하는데 이 상태는 그냥 코드 덩어리일 뿐이다. 하지만 프로세스는 프로그램을 실행 시켜 정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태, 즉 작업 중인 프로그램을 의미한다.
프로세스의 사전적 의미로는
1. 컴퓨터에서 연속적으로 실행하고 있는 컴퓨터 프로그램
2. 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
3. 운영체제로부터 시스템 자원을 할당받는 자원의 단위

이렇게 3개의 의미가 있는데, 정리하면 프로그램의 실행된 부분을 의미한다.

특징

프로세스는 다음과 같은 특징을 갖는다.

  1. 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다.

    • 코드 영역(code area): 프로그래머가 작성한 프로그램이 저장되는 영역
    • 데이터 영역(data area): 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들이 모여있다.
    • 스택 영역(stack area): 호출한 함수가 종료되면 되돌아올 메모리의 주소나 지역 변수 등이 저장된다.
    • 힙 영역(heap area): 동적으로 할당되는 데이터를 위해 존재한다.
  1. 최소 1개 이상의 스레드(메인 스레드)를 가지고 있다.

  2. 각 프로세스는 별도의 주소 공간에서 실행되며 기본적으로 다른 프로세스의 자원에 접근할 수 없다.

  3. 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC)를 사용해야 한다. ex) 파이프, 파일, 소켓 등을 이용한 통신 방법

위의 그림을 보면 여러 프로세스가 동시에 실행되고 관리 되는 것 처럼 보이지만, CPU는 한번에 하나의 한 번에 한 가지 명령밖에 처리할 수 없다. 즉 동시에 여러개가 실행되는 것이 아니라, 빠르게 프로세스들을 번갈아가면서 실행하고 관리하고 있는 것이다.

스레드

스레드는 기존의 프로세스 특성의 한계인 동시에 여러개의 작업을 처리할 수 없다거나 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되는 문제를 해결하기 위해 탄생되었다.

스레드란, 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위를 말한다. 우리는 브라우저를 통해 동시에 여러개의 작업을 수행할 수 있다. 즉, 하나의 프로세스 안에서 여러가지 작업들 흐름이 동시에 진행되기 때문에 가능한 것인데, 이러한 일련의 작업 흐름들을 스레드라고 하며 여러개가 있다면 이를 멀티(다중) 스레드 라고 부른다.
그리고 당연하게도, 스레드가 많을수록, 당연히 프로그램 속도도 동시에 하는 작업이 많아져 성능이 올라간다.

특징

스레드는 다음과 같은 특징을 갖는다.

  1. 프로세스 내에서 각 필요한 Stack만 할당받고 Code, Data, Heap 영역은 공유해서 각 스레드가 공유한다.

  2. 같은 프로세스 내 스레드끼리 자원(Heap 등)을 공유하며 실행된다.

  3. 스레드는 공유하는 자원인 Heap 영역에 있는 변수를 수정할 수 있다.

차이점은 자원의 공유 유무

즉, 스레드와 프로세스의 가장 큰 차이점은 프로세스는 자원을 공유하지 않지만 스레드는 자원을 공유한다는 점이다.
스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한 것이다. 위의 사진에서 처럼 하나의 프로세스 내에 여러개의 스레드가 들어있는 상태인 것.
이때 프로세스의 4가지 메모리 영역(Code, Data, Heap, Stack) 중 스레드는 Stack만 할당받아 복사하고 Code, Data, Heap은 프로세스내의 다른 스레드들과 공유된다. 따라서 각각의 스레드는 별도의 stack을 가지고 있지만 heap 메모리는 고유하기 때문에 서로 다른 스레드에서 가져와 읽고 쓸 수 있게 된다.

그렇다면 프로세스는 영원히 다른 프로세스 정보에 접근할 수 없을까?

프로세스 간 정보를 공유하는 방법에는 다음과 같은 방법들이 있다.

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

그러나 프로세스 자원 공유는 단순히 CPU 레지스터 교체뿐만이 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있다. 그래서 다중 작업이 필요한경우 스레드를 이용하는 것이 훨씬 효율적이라, 현대 컴퓨터의 운영체제에선 다중 프로세싱을 지원하고 있지만 다중 스레딩을 기본으로 하고 있다.

다중 스레딩?

다중 스레딩, 즉 멀티 스레딩이란 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것이다. 즉, 하나의 프로그램에서 동시에 여러 개의 일을 수행할 수 있도록 해주는 것이다. 실제로는 분산처리를 통해 동시에 실행되는 것 처럼 보이는 것이다.

멀티 스레딩의 특징은 다음과 같다

  1. 시스템 자원 소모 감소 (자원의 효율성)

    • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어서 자원을 효율적으로 관리할 수 있다.
  2. 시스템 처리량 감소 (처리 비용)

    • 스레드 간 데이터를 주고 받는 것이 간단해지면서 시스템 자원 소모가 줄어든다.
    • 스레드 사이의 작업량이 작아 스레드 간 Context Switching이 활발하게 일어난다.

하지만 디버깅이 까다롭고, 동기화나 교착 상태가 발생할 수 있다는 단점이 있다. 또한 프로세스 밖에서는 해당 스레드를 제어할 수 없으며, 하나의 스레드가 문제가 발생하면 프로세스 전체가 영향을 받는 문제가 있다.

profile
개발자를 향해 달리는 사람
post-custom-banner

0개의 댓글