[2회 항해톡] 프로세스와 스레드

G-NOTE·2022년 7월 25일
1

항해99

목록 보기
16/36

프로세스란?

프로세스(process)란 실행 중인 프로그램이다.
현대 컴퓨팅 시스템에서 OS로부터 CPU 자원을 할당 받는 작업의 단위를 프로세스라 한다.

프로그램이란?

프로그램(program)이란 메모리(주기억장치)에 할당되지 않고 저장 장치에 저장되어 있는 정적인 상태의 실행 파일(명령어 집합)
모든 프로그램은 CPU(프로세서)가 처리하기 위한 메모리 공간을 할당 받아야 실행할 수 있다.
프로그램은 코드 덩어리 파일, 프로그램을 실행시키면 프로세스

프로세스와 메모리

프로세스는 OS로부터 독립된 메모리 영역을 할당 받는다.
하나의 프로그램을 실행하는데 다수의 프로세스를 사용하는 것을 멀티 프로세스라 한다.

메모리 구조

  • Code 영역
    • 실행될 프로그램의 코드(개발자가 작성)가 저장되어 있는 영역
    • CPU는 코드 영역에 저장된 명령어를 하나씩 가져와 처리한다.
  • Data 영역
    • 전역 변수와 정적 변수가 저장되어 있는 영역
    • 코드가 실행되면서 사용한 변수, 파일의 각종 데이터 저장
    • 프로그램 실행 시 데이터 영역이 할당되고 프로그램 실행이 종료되면 소멸
  • Stack 영역
    • (함수 호출 시 생성되는) 지역 변수와 매개 변수가 저장되어 있는 영역
    • 컴파일 타임(compile time)에 크기 결정 (함수 호출과 함께 할당되고 호출이 종료되면 해제)
  • Heap 영역
    • 사용자에 의해 프로그램 실행 중 동적으로 할당/해제될 수 있는 데이터 저장
    • 런타임(runtime)에 크기 결정 (할당해야 하는 값의 크기를 프로그램 실행 도중에 알 수 있다.)

멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성한 것으로, 여러 개의 CPU를 장착하여 동시에 여러 작업을 병렬적으로 실행하는 방법
1개의 CPU만 장착할 수 있었던 초기 컴퓨터와 달리 최근 컴퓨터는 멀티코어, 쿼드코어 등 CPU를 여러 개 장착하여 동시에 프로세스를 실행할 수 있게 되었다.

  • 장점
    • 프로세스는 독립된 메모리 구조를 갖기 때문에 하나의 프로세스가 죽어도 다른 프로세스에 영향이 확산되지 않는다. (안정성↑)
    • 프로세스 중 하나에 문제가 생겨도 다른 프로세스가 정지되는 등의 문제는 발생하지 않는다. (단 문제가 생긴 프로세스의 작업 처리를 위해 속도는 느려질 수 있다.)
  • 단점
    • context switching으로 인한 성능 저하 유발 (context switching을 위한 오버헤드 자주 발생)
    • 프로세스 간 복잡하고 어려운 IPC(Inter-Process Connection, 프로세스 간 통신) : 독립된 메모리 공간을 할당 받기 때문에 변수 공유가 안되고 통신이 어렵다.

context switching

멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하는 중, 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스 상태나 레지스터 값(context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태나 레지스터 값(context)을 교체하는 작업

  • CPU는 한 번에 하나의 프로세스만 실행 가능하며, 우선 순위에 따라 작업을 처리한다.
  • interrupt : 입출력 관리자가 CPU에 보내는 완료 신호로, 인터럽트가 발생하면 CPU는 즉시 실행을 멈춘다.

overhead

프로그램 실행 흐름에서 나타나는 현상 중 하나로, 특정 기능을 수행하는데 드는 간접적인 시간, 메모리 등의 자원을 의미한다.
EX. A라는 기능을 단순 실행할 때 10초가 소요될 때, A의 안정성을 위해 B라는 처리를 추가한 결과 전체 처리 시간이 16초가 걸린 경우, 오버헤드는 6초

스레드란?

스레드란, 프로세스 내부에서 할당 받은 자원을 이용해 실행되는 흐름의 단위이다.
프로세스 내부에서 여러 개의 스레드를 사용할 수 있다. (=멀티 스레드)

멀티 스레드

하나의 프로세스의 작업을 병렬적으로 진행하는 것 (프로세스 내부 자원을 공유하여 효율적인 업무 수행 가능)

  • 장점
    • IPC보다 스레드 간 통신 비용이 적다. : context switching 시 스레드는 stack 영역만 처리하기 때문에 스레드 간 전환 속도가 더 빠르다.
    • code, data, heap 영역을 공유하기 때문에 자원의 생성/관리 중복을 방지할 수 있어 효율적인 자원 관리가 가능하다.
  • 단점
    • 하나의 스레드에 문제가 생기면 전체 프로세스에 영향을 준다.
    • Dead Lock (교착 상태) : 자원 공유로 인한 동기화 문제가 발생할 수 있다.

Dead Lock (교착 상태)

프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태
두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 무한히 기다리고 있어 다음 단계로 진행하지 못하는 상태 (프로세스, 스레드 모두 발생할 수 있음)
시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다.

  • Dead Lock 발생 조건 : 상호배제/점유대기/비선점/순환대기 4가지 조건을 모두 만족해야 한다.
    • 상호 배제 (Mutual Exclusion)
      • 하나의 자원을 특정 시기에 하나의 프로세스나 스레드만 소유할 수 있는 형태
      • 한 자원에 대한 여러 프로세스의 동시 접근 불가
    • 점유 대기 (Hold and Wait)
      • 하나의 자원을 소유하고 다른 프로세스나 스레드의 자원을 요청하는 상태
    • 비선점 (Non-preemptive)
      • 하나의 프로세스나 스레드에 주어진 자원은 해당 프로세스나 스레드가 스스로 놓기 전에는 놓게 만들 수 없는 상태
    • 순환 대기 (Circle wait)
      • 각 프로세스가 다음 프로세스가 요구하는 자원을 가지고 있는 상태
        EX. A → B → C → A
  • Dead Lock 해결 방법 : 4가지 조건 중 하나라도 제거하면 가능
  • 대부분의 dead lock 방지 알고리즘은 순환 대기 방지에 초점이 맞춰져 있다.

멀티 프로세스 vs. 멀티 스레드

멀티 스레드?

  • 작업량이 많을수록 멀티 프로세스는 context switching이 자주 발생하여 오버헤드로 인한 성능저하가 발생할 수 있다.
  • 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 경우가 줄어들어 자원을 더 효율적으로 관리할 수 있다.
  • 프로세스 간 통신보다 스레드 간 통신 비용이 적다.

멀티 프로세스?

  • 스레드 간 자원 공유는 전역 변수를 이용하므로 동기화 문제가 발생할 수 있다.
  • 멀티 프로세스는 독립된 구조로 작업을 처리하기 때문에 안전성이 높다.

자바스크립트 엔진과 싱글 스레드

자바스크립트의 탄생 목적은 웹페이지의 보조적인 기능 수행을 위해 도입된 경량화된 언어
따라서 복잡한 동기화 문제를 피하고 context switching 문제 등을 피하기 위해 싱글 스레드로 동작하도록 설계되었다.

하지만 자바스크립트 또한 비동기로 동작한다. How?

브라우저에서 작동되던 자바스크립트를 브라우저 이외인 환경(서버)에서도 사용할 수 있도록 JavaScript runtime 환경인 Node.js가 등장했고,
자바스크립트 엔진과 Node.js에서 비동기 처리를 지원(이벤트루프 등)하는 libuv라이브러리를 통해 비동기 처리를 수행한다.
Node.js 자체는 멀티 스레드로 동작한다. 단, 자바스크립트를 실행하는 부분이 싱글 스레드로 구성되어 있다.

Node.js의 background에서 thread pool을 구성하여 작업을 수행하고, thread pool은 개발자가 아닌 플랫폼이 관리한다.
Node.js는 동시에 많은 비동기 요청을 처리하기 위해 싱글 스레드 non-blocking 모델로 구성되어 있다.

  • non-blocking : 호출된 함수가 자신의 할 일을 마치지 않았어도 ‘호출한 함수’에게 제어권을 넘겨주어 다른 일을 할 수 있도록 하는 경우
  • blocking : 호출된 함수가 자신의 할 일을 모두 마칠 때까지 제어권을 갖고 ‘호출한 함수’에게 제어권을 넘겨주지 않는 경우

Node.js의 활용

간단한 로직, 빠른 응답시간, 비동기 처리 방식에 적합하다

  • 실시간 채팅, SPA, I/O가 잦은 애플리케이션, 데이터 스트리밍, json API 기반, 대용량 프로그램(동시에 여러 request 처리)
  • 부적합한 경우 : 단일 처리가 오래 걸리는 경우 , 서버 체크 로직이 많은 경우(callback hell 발생 가능), 업무 복잡도가 높은 경우

참조

운영체제(Operating System Concepts) (저자: Abraham Silberschatz, Peter Baer Galvin, Greg Gagne)

http://www.tcpschool.com/c/c_memory_structure

https://eunjinii.tistory.com/39

https://eunjinii.tistory.com/m/41

https://velog.io/@xxhaileypark/멀티-스레드Multi-Thread-멀티-프로세스Multi-process

https://wooody92.github.io/os/멀티-프로세스와-멀티-스레드/

https://hongcoding.tistory.com/138

https://itnovice1.blogspot.com/2019/09/stack-heap-data.html

https://dreamsh19.github.io/javascript/3장-자바스크립트-개발-환경과-실행-방법/

https://sjh836.tistory.com/149

profile
FE Developer

0개의 댓글