[OS] 프로그램, 프로세스, 스레드

coderH·2022년 12월 18일
0

프로그램 (Program, Passive Entity)

프로그램은 특정 작업을 수행하기 위해 작성된 코드의 집합으로
컴퓨터에 설치되어 있는 exe 확장자를 가진 실행 파일을 말합니다.

예를 들어, 크롬은 웹 페이지를 보기 위한 목적의 프로그램이며
메모장(Notepad)은 텍스트 파일을 수정하거나 인쇄하기위한 프로그램입니다.

프로그램은 정적인 개념이기 때문에 프로그램 자체만으로 동작할 수는 없고
보조기억장치인 SSD, HDD와 같은 공간에 저장됩니다.

프로그램의 종류

위 사진에 있는 모든 실행 파일들은 프로그램입니다.

프로세스 (Process, Active Entity)

프로세스는 동적 개념으로 OS로부터 자원(메모리 등)을 할당받아 프로그램이 실행된 것을 말합니다.

프로그램이 프로세스가 되기 위해서는 코드가 포함되어있는 프로그램과 메모리 공간 2가지가 필요합니다.

프로세스는 프로그램과 다르게 주기억장치인 메모리(RAM)에 올라가게 되며
독립적이기 때문에 서로 다른 프로세스 간에 영향을 받지 않습니다.

또한, 프로그램의 인스턴스이기 때문에 JS의 클래스와 상속을 받는 객체처럼 한 개의 프로그램으로 여러개의 프로세스가 생성될 수 있습니다.

여러개의 프로세스

위 사진은 메모장이라는 한개의 프로그램으로 3개의 프로세스를 생성하였으며 실행된 메모장 프로세스들(제목 없음, this.txt, 1225.txt)은 서로 영향을 받지 않기 때문에
만약, 제목 없음 에서 에러가 발생하더라도 this1225 프로세스는 정상적으로 실행됩니다.

프로세스의 내부는 다음과 같은 4가지의 요소로 구성되어 있습니다.

프로세스 구성 요소 4가지

  • Code
    프로그램 내부에 작성되어 있는 코드를 말합니다.
  • Data
    코드가 실행된 뒤 전역 변수정적 변수를 저장하는 공간입니다.
  • Stack
    지역 변수를 저장하고 함수가 종료된 뒤 돌아올 메모리 주소를 저장하는 공간입니다.
  • Heap
    동적으로 할당되는 데이터들이 저장되는 공간입니다.

단일 프로세스 vs 멀티 프로세스

먼저, CPU는 한번에 한 개의 연산만 가능하도록 설계되어 있습니다.

단일 프로세스는 CPU당 한 개의 프로세스만 담당하는것을 말합니다.
예를 들어, 우리가 브라우저로 웹 사이트에 접속한 상태에서
멜론을 통해 노래를 듣고 싶다면 브라우저를 종료해야만 합니다.

반면, 멀티 프로세스는 CPU가 여러개의 프로세스를 담당할 수 있습니다.
우리가 컴퓨터에서 여러개의 프로그램(브라우저, 카톡, 코드 에디터 등)을 실행시켜놓을 수 있는 이유가 멀티 프로세스를 사용하고 있기 때문입니다.

이미 멀티 프로세스를 당연하게 사용하고있는 우리에겐 단일 프로세스가 매우 불편한 환경이겠지만 과거에 멀티 프로세스가 개발 된 이유는 성능 문제 때문입니다.

CPU를 점유하지 않고 있는 프로세스들

프로세스는 항상 CPU를 점유하고 있는게 아니라 메모리에 위치해 있다가 연산이 필요한 경우에만 CPU로 올라가기 때문에
작업 관리자의 프로세스탭을 보면 CPU의 점유율이 0%인 프로세스가 보이는 것입니다.

단일 프로세스 환경에서는 현재 담당하고 있는 프로세스가 연산이 필요하지 않더라도 종료되기전까지는 다른 프로세스의 연산 작업을 진행할 수 없습니다.

이렇게 되면 당연히 연산이 필요하지 않은 시점에 CPU가 노는 시간(유휴 시간)이 생길 수 밖에 없습니다.

그래서 CPU의 사용률을 극대화하고자 멀티 프로세스가 생기게 됩니다.
멀티 프로세스 환경에서는 프로세스의 종료 여부와는 상관없이 현재 담당중인 프로세스가 연산 작업이 필요없다면 연산을 필요로 하는 다른 프로세스로 변경해 연산 작업을 할 수 있습니다.

멀티프로세스의 컨텍스트 스위칭

이렇게 CPU가 담당하고 있는 프로세스를 전환하는 것을 컨텍스트 스위칭이라고 합니다.

스레드 (Thread)

스레드는 CPU의 작업 단위로 프로세스 내부에 위치해있기 때문에 프로그램과 프로세스의 관계처럼 동일한 비교 대상은 아닙니다.

모든 프로세스는 최소 한개의 스레드를 가지고 있으며 프로세스의 구성요소이기 때문에 스레드 단독으로는 실행될 수 없습니다.

또한, 스레드는 스택과 레지스터라는 내부 구성요소를 가지고 있습니다.

  • 스택(Stack)
    함수의 인자, 함수의 지역 변수, 메모리의 주소 값을 저장하는 역할을 합니다.
    메모리의 주소 값은 CPU에서 연산이 이루어진 뒤 반환값을 기존 프로세스에게 돌려줘야하기 때문에 필요합니다.

  • 레지스터(Register)
    함수의 실행과 관련된 데이터를 저장하는 곳입니다.
    뒤에서 다룰 멀티태스킹으로 인해 필요하며 이 부분은 뒤에서 마저 다루도록 하겠습니다.

싱글 스레드 vs 멀티 스레드

스레드 또한 프로세스처럼 싱글과 멀티로 나누어집니다.

대표적인 예가 브라우저인데 우리는 브라우저라는 하나의 프로세스를 사용할 때
유튜브로 영상을 시청하면서 파일을 다운로드 하고 블로그에 글쓰기까지 여러개의 작업을 동시에 할 수 있는데 이는 브라우저가 멀티 스레드를 사용하기 때문입니다.

즉, 여러개의 스레드가 특정 작업을 전담해주기 때문에 여러개의 작업을 동시에 할 수 있는것입니다.
만약, 브라우저가 싱글스레드를 사용했다면 다운로드를 하면서 글을 작성하는것은 불가능합니다.

싱글 스레드와 멀티 스레드를 가진 프로세스의 구조는 아래와 같습니다.

싱글스레드와 멀티스레드의 프로세스 구조

한 프로세스내의 스레드들은 Code, Data, Heap을 공유하며 레지스터와 스택만을 개별적으로 가지고 있습니다.

싱글 스레드는 프로세스당 1개의 스레드만 있기 때문에 CPU의 작업단위가 프로세스가 기준이지만 멀티스레드 환경에서는 스레드가 기준이 됩니다.
그래서 스레드를 경량 프로세스(lightweight process)라고도 부릅니다.

멀티스레드의 장점은 다음과 같습니다.

  • 멀티 프로세스에 비해 컨텍스트 스위칭 비용이 저렴하다.
    싱글스레드 환경에서는 프로세스 전체가 CPU에 올라가는 반면
    멀티스레드 환경에서는 스택과 레지스터만 가진 스레드가 CPU에 올라가며 프로세스가 가지고 있는 데이터들을 공유해 사용하기 때문에 CPU에 올리고 내리는 작업자체가 훨씬 가볍습니다.

스레드 컨텍스트 스위칭

  • 멀티프로세스에 비해 응답성이 좋다.
    여기서 말하는 응답성이란 사용자의 동작에 반응하는 시간을 말합니다.

    예를 들어, API요청이나 다운로드와 같은 긴 작업을 진행하던 도중 사용자가 인풋창에 텍스트를 입력한다고 한다면
    싱글스레드 환경에선 이미 한 개의 스레드가 해당 작업을 진행중이므로 종료되기전까지 사용자의 동작에 반응할 수 없습니다.

    반면, 멀티스레드의 경우 한 개의 스레드가 해당 작업을 전담하고
    다른 스레드를 이용해 사용자의 인풋에 따른 동작을 처리할 수 있습니다.

물론, 멀티 스레드의 장점이 있는만큼 단점도 존재합니다.

  • 한 개의 스레드에서 문제가 발생하면 다른 스레드도 영향을 받는다.
    대표적인 예가 브라우저에서 여러개의 탭을 사용하다가
    한 개의 탭에서 에러가 발생하면 브라우저 전체가 멈춰버리는데 이는 스레드가 서로 영향을 받아 모든 동작이 멈추기 때문입니다.
    브라우저가 멈추는 상황

  • 동기화 이슈가 발생할 수 있다.
    위에서 스레드는 프로세스가 가진 일부 자원들을 공유받아 사용한다고 했는데
    여러개의 스레드에서 전역 변수에 동시에 접근하는 상황이 생길 수 있습니다.

    예를 들어, 전역 변수 counter를 1씩 증가시키는 함수가 있을 때
    해당 함수가 2번 동시에 호출된다면 2가 증가해야 하지만 1만 증가하는 경우가 생길 수 있습니다.

    이런 상황을 방지하는 기술을 Thread Safety라고 하며 이는 다양한 방법으로 설계할 수 있습니다.

  • 디버깅이 어렵다.
    위와 같은 이유로 인해 에러 또는 버그가 발생했을 경우 원인을 특정하기 어려울 수 있습니다.

헷갈리기 쉬운 단어 정리

멀티 프로세싱 (Multi Processing)

먼저, 프로세서와 프로세싱에 대해 알아야 합니다.

  • 프로세서 (Processor)
    프로세서는 명령어를 읽고 쓰는 컴퓨터의 부품 속 내부 구성요소로
    CPU, GPU, HDD 등 대부분의 컴퓨터 부품이 가지고 있습니다.

    다만, CPU는 컴퓨터의 모든것을 컨트롤하고 다른 HDD, GPU 등의 프로세서에게 지시를 내리기 때문에 CPU의 프로세서를 메인 프로세서라고도 부르며 일반적으로 프로세서 하나만을 이야기 할 경우 CPU의 프로세서를 가리킵니다.

  • 프로세싱 (Processing)
    프로세싱은 프로세서에서 실행되는 동작을 말합니다.

    즉, 멀티 프로세싱이란 여러개의 CPU가 동작하는것을 말하는 것으로
    흔히 CPU가 듀얼코어(2), 쿼드코어(4), 옥타코어(8)이다 라고 얘기하는게 바로 멀티 프로세싱 환경을 말하는 것입니다.

    그래서 멀티 프로세싱은 하드웨어와 관련되어 있으며 여러개의 코어가 동시에 작업을 처리할 수 있기 때문에 싱글코어 대비 작업의 처리량이 n배 증가하며
    만약, 한개의 프로세서에 문제가 발생해도 작업을 계속 이어나갈 수 있습니다.

    이처럼 CPU가 여러개의 코어로 동시에 작업을 처리하는것을 병렬성(Parallelism)이라고 합니다.

멀티 프로그래밍 (Multi Programming)

멀티 프로그래밍은 하나의 CPU가 여러개의 프로세스 또는 스레드를 처리하는것을 말하며 소프트웨어와 관련되어 있습니다.

멀티 프로세스와 멀티 스레드 환경은 모두 CPU가 컨텍스트 스위칭을 통해 여러개의 작업을 처리하므로 멀티 프로그래밍 환경입니다.

멀티 태스킹 (Multi Tasking)

멀티 태스킹은 멀티 프로그래밍의 확장 개념입니다.

멀티 프로그래밍은 현재 진행중인 작업이 끝나야만 컨텍스트 스위칭이 이루어지지만
멀티 태스킹은 작업의 완료 여부와는 상관없이
각 작업당 Quantum이라고 부르는 짧은시간(10~100ms)동안만 연산을 처리합니다.

만약, 현재 진행중인 작업이 끝나지 않은 상태에서 해당 시간을 경과했다면 일단 작업을 멈추고 뒤에 대기하고 있던 작업을 진행하게 됩니다.

바로 이 부분이 스레드가 레지스터를 필요로 하는 이유입니다.
해당 스레드의 작업이 다 종료되지 못하고 컨텍스트 스위칭이 일어날 경우 다음 차례를 기다려야하는데
이 때, 이전 작업이 진행되면서 함수 내부의 상태는 어떻게 변했고 다음 실행되어야 할 라인은 어디인지에 대한 정보를 담고 있는게 레지스터의 역할입니다.

멀티 프로그래밍과 멀티 태스킹의 차이

작업당 이루어지는 시간이 매우 짧기 때문에 CPU가 싱글코어이더라도 사용자는 작업을 동시에 처리한다고 느낄 수 있으며 이를 동시성(Concurrency)이라고 합니다.

동시성 (Concurrency)병렬성 (Parallelism)
- 여러개의 작업을 일정 주기로 변경해가며 수행함.
- 컨텍스트 스위칭과정이 매우 빠르고 자주 일어나기 때문에
사용자에겐 작업들이 동시에 수행되는것처럼 느껴짐.
- 여러개의 CPU가 여러개의 작업을 동시에 진행함.
- 즉, 멀티프로세서 환경에서만 가능함.

참조

쉬운코드 | Youtube

gparkkii | Velog

Noah | Brunch

hanamon

Difference between Multiprogramming, multitasking, multithreading and multiprocessing | geeksforgeeks

VictoryWoo | Tistory

0개의 댓글