Process와 Thread

ggyu_55·2023년 3월 6일
0

메모

목록 보기
2/46

일반적으로 누구나 컴퓨터와 프로그램, 프로그래머라는 용어에는 익숙합니다.
그렇지만 같은 프씨 집안인 프로세스에 대해서는 잘 알지 못하죠.
프로세스는 프로그램이 실행되면 생기는 인스턴스로,
프로그램이 메모리에 적재되고 필요한 CPU 자원을 할당받아
실행되고 있는 상태를 의미합니다.

Process란?

컴퓨터에서 연속적으로 실행되고 있는 프로그램
컴퓨터 프로그램의 인스턴스로, 하나 이상의 스레드를 통해 실행된다.

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

프로세스가 가진 각각의 독립된 메모리 영역의 역할은 다음과 같습니다.

  • 코드(Code) 영역 : 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 영역입니다. CPU가 이 영역에 저장된 명령어들을 순차적으로 실행합니다.

  • 데이터(Data) 영역 : 코드에서 선언한 전역 변수와 정적(static) 변수가 저장되는 영역입니다. 이는 프로그램의 시작과 함께 할당되어 종료될 때 소멸하게 됩니다.

  • 스택(Stack) 영역 : 스택 영역에는 메서드 호출시 메서드 안에서 선언된 지역변수, 매개변수, 리턴값 등을 저장하고 메서드 호출이 완료되면 제거합니다. 스택이라는 자료구조 명칭에서도 알 수 있듯이 후위선출(LIFO) 메커니즘을 따릅니다. 그 유명한 Stack-Overflow는 메서드 등을 거듭 호출하다가 저장된 정보의 크기가 이 스택 영역의 크기를 넘어서게 되면 발생하게 되는 예외입니다.

  • 힙(Heap) 영역 : 힙 영역은 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간(Free Space)입니다. 동적 메모리 할당 공간이므로 사용이 끝나면 운영체제가 쓸수 있도록 반납해야 합니다. 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 정적 메모리 할당과는 대조적으로, 힙 영역에서의 동적 메모리 할당은 어느 시점에 어느 정도의 공간을 할당할 수 있을지 정확히게 예측할 수 없으므로, 런타임에서만 확인이 가능합니다.

또한 프로세스는 다음과 같은 생명주기를 갖습니다.

  • new : 프로세스가 생성되는 상태

  • ready : 프로세스가 CPU에 할당되어, 처리되기를 기다리는 상태

  • running : 프로세스가 CPU에 할당되어, 명령어들이 실행 되는 상태

  • waiting : 어떤 이벤트의 발생으로 인해 프로세스가 기다리는 상태

  • terminated : 프로세스가 종료되는 상태


Thread란?

프로세스 내에서 실행되는 흐름의 단위
프로세스의 특정한 수행 경로

  1. 쓰레드는 한 프로세스 내에서 실행되어 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유합니다.

  2. 따라서 한 스레드가 Stack을 제외한 영역에서 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있습니다.

  3. Stack 영역의 자원의 경우, 프로세스와 마찬가지로 공유되지 않기 때문에 다른 쓰레드가 점유한 Stack 영역 자원에 접근하려면 Context-switching이 필요합니다.


멀티 태스킹

멀티태스킹이란 OS를 통해 CPU가 작업하는데 필요한 자원(시간)을 프로세스 또는 스레드간에 나누는 행위를 말합니다.

멀티 태스킹을 통해 여러 응용 프로그램을 동시에 열고 작업할 수 있다는 장점이 있습니다.

여러 개의 프로그램을 동시에 실행하는 것처럼 보이지만, CPU는 한 번에 한 가지 명령어밖에 처리하지 못하기 때문에 여러 프로세스들을 번갈아가며 실행하고, 관리합니다. 그 전환이 너무나도 빨라서 마치 동시에 하는 것처럼 보일 뿐이죠. 이를 Context Switching이라고 합니다.

-> 멀티 프로세스

멀티 프로세스는 하나의 프로그램을 여러 개의 프로세스로 구성하여 각각의 프로세스가 하나의 작업을 처리하는 것을 말합니다.

그림과 같이 프로세스들은 각기 독립된 고유한 메모리 공간을 CPU로부터 할당받습니다.

-> 멀티 쓰레드

멀티 쓰레드는 프로세스를 여러 개의 쓰레드로 구성하고 각각의 쓰레드가 작업을 처리하는 것을 말합니다.

쓰레드들은 Stack 영역을 제외하고는 메모리 영역을 공유합니다.


Context-Switching

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

구체적으로는 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 PCB에 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 하는 것을 말합니다.

Context-Switcing은 운영체제의 CPU자원을 할당하는 스케줄러(Scheuler)에 의해 발생합니다. 스케쥴러가 CPU를 적절하고 효율적으로 사용할 수 있도록 하는 작업을 스케줄링이라고 합니다.


Scheduling Algorithm

"CPU를 최대한 활용하기, 대기 시간 최소화 하기, 처리량을 최대화 하기"

이와 같은 원칙을 만족시키기 위한 여러가지 스케쥴링 알고리즘들이 존재합니다.

  • FCFS : First Come, First Serve, 즉 먼저 도착한 프로세스를 먼저 처리하는 방식

  • SJF : Shorted Job First, 즉 최단 작업을 우선하는 스케쥴링

  • Priority Scheduling : 프로세스의 우선 순위를 미리 정해놓고, 미리 주어진 우선순위에 따라서 스케쥴링하는 방식

  • Round Robin : 정해진 시간에 주어진 만큼 프로세스를 할당한 뒤 작업이 도중에 끝난 프로세스는 ready-Queue의 가장 마지막에 가서 재할당을 기다리는 방식.

  • Multilevel-Queue : ready-Queue를 여러개의 큐로 분류하여 각 큐가 각각 다른 스케쥴링 알고리즘을 가지는 방식. 특정 프로세스가 큐에 고정.

  • Multilevel-Feedback-Queue : 큐와 큐 사이에 프로세스가 이동하는 것을 허용하는 MultiLevel-Queue 방식


면접 예상 질문

프로세스와 쓰레드의 차이를 설명해 주세요 :

답변 보기 프로세스하나 이상의 스레드를 통해 실행되는 컴퓨터 프로그램의 인스턴스입니다. 각각의 프로세스는 독립된 메모리 영역을 할당받고, 이에 따라서 프로세스간의 통신에 IPC가 필요하고 추가 비용이 발생합니다.

쓰레드프로세스 내에서 실행되는 흐름의 단위를 의미합니다. 각각의 쓰레드는 Stack 영역을 제외한 메모리 공간을 공유하고 있고 따라서 공유 자원에 쉽게 접근할 수 있습니다. 하지만 그로 인해 동기화 문제가 발생하기도 합니다.

멀티 프로세스와 멀티 쓰레드에 대해서 설명해 주세요 :

답변 보기
멀티 프로세스는 하나의 프로그램을 여러 개의 프로세스로 구성하여 각각의 프로세스가 하나의 작업을 처리하는 것을 말합니다. 하나의 프로세스의 작동에 문제가 생기더라도 프로그램의 동작에는 문제가 없지만, Context-switching 비용이 발생한다는 단점이 있습니다.

멀티 쓰레드는 프로세스를 여러 개의 쓰레드로 구성하고 각각의 쓰레드가 작업을 처리하는 것을 말합니다. 시스템 자원의 소모 비용이 감소하고, 처리 비용이 감소합니다. 다만 쓰레드 자원을 공유하기 때문에 점유 문제로 인한 동기화 이슈가 발생할 수 있고, 하나의 쓰레드의 오류로 인하여 전체 프로그램의 동작에 문제가 생기게 됩니다. 거기에 더해 디버깅이 어려워진다는 문제점이 있습니다.

Thread-safe는 무엇을 의미하나요?

답변 보기 여러 쓰레드가 동시에 실행되어도 안전하다는 것을 의미합니다. 특정한 메서드나 변수가 여러 스레드에서 동시에 호출되어도 하나의 스레드에서 호출하였을 때와 동일한 결과를 보장할 수 있을 때 Thread-safe 하다고 말합니다.

Context-switching 에 대해서 설명해 주세요 :

답변 보기 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해서 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 PCB에 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 하는 것을 말합니다.

비동기 프로그래밍에 대해서 알고 있나요? 그렇다면 설명해 주세요 :

답변 보기 답변필요

프로세스의 단점에 대해서 설명해 주세요 :

답변 보기 프로세스 생성에 많은 시간이 소비됩니다. 또한 Context-switching 과정에서 불가피한 비용이 발생하여 비효율적입니다. 별개의 프로세스간에 통신이 어려워 IPC를 사용해야 하는 것 또한 단점이 될 수 있습니다.

쓰레드가 필요한 이유에 대해서 말씀해 주세요 :

답변 보기 멀티태스킹이 빈번해지고 당연해지면서, 많은 프로세스의 생성과 소멸에 따른 오버헤드를 감소시키고 좀 더 빠른 Context-switching을 위해 프로세스보다 크기가 작은 실행 단위가 필요하기 때문에 쓰레드가 필요합니다. 쓰레드들은 서로 공유하는 메모리 공간이 있기 때문에, 프로세스간의 정보 교환보다 효율적으로 작업간에 정보를 교환할 수 있습니다.

쓰레드가 점유하는 주소 공간에 대해서 설명해 주세요 :

답변 보기 한 쓰레드만의 고유공간으로 스레드 코드 공간, 스레드 전용 전역변수 공간, 스택 공간이 있고, 쓰레드간에 서로 공유하는 데이터 공간, 힙 공간, 커널 스택이 있습니다.

0개의 댓글