CS Chapter_6 - 프로세스와 스레드/ 멀티 프로세스와 멀티 스레드

장선웅·2022년 8월 9일
0

1. 프로세스와 쓰레드

프로세스와 스레드의 차이(Process vs Thread)

프로그램(Program) 이란
사전적 의미
“어떤 작업을 위해 실행할 수 있는 파일”

프로세스(Process) 란
“컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램”
메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
운영체제로부터 시스템 자원을 할당받는 작업의 단위
즉, 동적인 개념으로는 실행된 프로그램을 의미한다.
참고 할당받는 시스템 자원의 예
CPU 시간
운영되기 위해 필요한 주소 공간
Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역

특징

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
  • Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용

스레드(Thread) 란
“프로세스 내에서 실행되는 여러 흐름의 단위”
프로세스의 특정한 수행 경로
프로세스가 할당받은 자원을 이용하는 실행의 단위

특징

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
    같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
    한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

자바 스레드(Java Thread) 란

일반 스레드와 거의 차이가 없으며, JVM가 운영체제의 역할을 한다.
자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.
자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다.
아래와 같은 스레드와 관련된 많은 정보들도 JVM이 관리한다.
스레드가 몇 개 존재하는지
스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지
스레드의 상태는 무엇인지
스레드 우선순위는 얼마인지
즉, 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청하는 일 뿐이다.


2. 멀티 프로세스와 멀티 쓰레드

멀티 프로세스(Multi Process)

정의

  • 프로세스란 운영체제로부터 자원을 달당받는 작업의 단위를 말한다.
  • 두개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업을 동시에 처리하는 것이다.(병렬처리)
  • 각 프로세스 간 메모리 구분이 필요하거나, 독립된 주소 공간을 가져야 할 경우 사용한다.

장점

  • 독립된 구조로 안정성이 높다.
  • 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업속도가 느려지는 손해는 생기지만, 정지되는 문제는 발생하지 않는다.
  • 여러 개의 프로세스가 처리되어야 할 때, 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서(CPU)가 이를 공유하면 비용적으로 저렴하다.

단점

  • 독립된 메모리 영역이기 때문에, 작업량이 많을수록 오버헤드(어떤 처리를 하기 위해 들어가는 간접적 처리시간/메모리)가 발생하여, 성능저하 위험이 있다.
  • 컨텍스트 스위칭(Context Switching) 과정에서 캐시 메모리 초기화 등 부거운 작업이 진행되고 시간이 소모되는 등 오버헤드가 발생한다.

Context Switching : 현재 진행되고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말한다.

멀티 쓰레드(Multi Thread)

정의

  • 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것이다.

장점

  • 시스템 자원 소모가 감소한다. => 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다.
  • 시스텔 처리율이 향성한다. => 스레드 간 데이터를 주고 받는 것이 간단해지고, 시스템 자원 소모가 줄어들며, 스레드 사이 작업량이 작아 컨텍스트 스위칭이 빠르다.(캐시 메모리를 비울 필요가 없다.)
  • 간단한 통신 방법으로 프로그램 응답시간이 단축된다. => 프로세스 내 스택영역을 제외한 메모리 영역을 공유하기 때문에, 통신비용이 적으며, 힙 영역을 공유하므로 데이터를 주고 받을 수 있다.

힙 영역 : 사용자가 직접 관리할 수 있으며, 해야만 하는 역역이다. 이는 자용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. 또한 메모리의 낮은 주소에서 높은 주소 방향으로 할당된다.

쓰레드를 사용하면 자원의 효율성이 증가하기도 하지만, 쓰레드 간의 자원 공유는 전역 변수를 사용하므로, 동기화 문제가 발생할 수 있다 => 프로그래머의 주의가 필수적이다.


ㅁ 멀티 프로세스 VS 멀티 쓰레드

  • 멀티 쓰레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고, 컨텍스트 스위칭이 빠른 장점이 있지만, 동기화 문제와 하나의 쓰레드 장애로 전체 쓰레드가 종료될 위험이 있다.
  • 멀티 프로세스하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 쓰레드보다 많은 메모리 공간과, CPU 시간을 차지하는 단점이 있다.

결론은, 두 방법은 동시에 여러 작업을 수행한다는 공통점이 있지만, 각각의 장/단점이 있으므로 적용한느 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.


3. 프로세스의 상태

프로세스는 실행의 흐름에 따라 상태가 변한다. 상태를 정의하는 이름은 운영체제에 따라 다르지만, 대부분 서로 비슷한 개념으로 구성되어 있다. 프로세스의 흐름은 일반적으로 5개의 상태로 정의된다.

3_1 프로세스의 5가지 상태

  1. 생성 (New) : 프로세스 생성 상태
  1. 실행 (Running) : 프로세스가 CPU에 할당되어 실행 중인 상태

3. 준비 (Ready) : 프로세스가 CPU에 할당되기를 기다리는 상태

  1. 대기 (Waiting) : 보류(Block)라고도 하며, 프로세스가 입출력이나 이벤트를 기다리는 상태
  1. 종료 (Terminated) : 프로세스 종료 상태

3_2 프로세스의 상태 전이

  1. 승인 (Admitted) : 프로세스 생성이 가능하여 승인됨.
  1. 스케줄러 디스패치 (Scheduler Dispatch) : 준비 상태에 있는 프로세스 중 하나를 선택하여 실행시키는 것.
  1. 인터럽트 (Interrupt) : 예외, 입출력, 이벤트 등이 발생하여 현재 실행 중인 프로세스를 준비 상태로 바꾸고, 해당 작업을 먼저 처리하는 것.
  2. 입출력 또는 이벤트 대기 (I/O or Event wait) : 실행 중인 프로세스가 입출력이나 이벤트를 처리해야 하는 경우, 입출력/이벤트가 모두 끝날 때까지 대기 상태로 만드는 것.
  1. 입출력 또는 이벤트 완료 (I/O or Event Completion) : 입출력/이벤트가 끝난 프로세스를 준비 상태로 전환하여 스케줄러에 의해 선택될 수 있도록 만드는 것.
profile
개발을 꿈꾸는 초짜

0개의 댓글