프로세스와 스레드

Beom·2022년 3월 14일
0

Computer Science

목록 보기
2/4

흔히 말하는 프로그램이 실행된다는 것은 프로세스 인스턴스가 생성된다는 것을 의미한다
여기서 인스턴스 생성이란 프로그램 실행에 필요한 내용이 컴퓨터 메모리에 적재된다는 것을 뜻한다

프로세스

  • 프로세스란 프로그램이 실행될 때 운영체제로부터 자원(주소공간/메모리 등)을 할당받는 작업의 단위이며 CPU에 의해 현재 실행되고 있는 프로그램이다
  • 즉, 실행되고 있는 (동적상태)프로그램이며 메모리에 올라와있는 상태이다

= 실행중인 프로그램

프로세스의 작동방식

  • 프로그램 -> 프로세스
    프로그램이란 파일이 저장 장치에 저장되어 있지만 메모리에는 올라와 있지 않은 정적인 상태를 뜻한다 (어떤 작업을 위해 실행할 수 있는 명령어의 집합)

  • 메모리에 올라와있지 않은 : 아직 운영체제가 프로그램에게 독립적인 공간 할당해주지 않았다 ( 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행가능하다 )

  • 정적인 상태란 아직 실행되지 않고 가만히 있는 상태를 뜻한다

=> 프로그램 : 아직 실행되지 않은 파일 그 자체 ( 코드 덩어리 )
=> 실행하면 프로세스가 된다

  • 프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는다
    이때 운영체제는 프로세스마다 각각 독립된 메모리 영역을 할당해준다
    ( Code / Data / Stack / Heap 의 형식으로 )
    각각 독립된 메모리 영역이 할당되면 다른 프로세스의 변수나 자료에 접근은 안된다
    프로세스가 생성될때마다 운영체제에서는 고유의 PCB (Process Control Block)를 생성한다

프로세스 메모리 4가지

Code : 코드 자체를 구성하는메모리 영역 (프로그램 명령), 프로그래머가 작성한 프로그램이 코드영역에 작성된다

Data : 전역변수, 정적변수, 배열 등 코드가 실행되면서 사용한 변수와 파일들의 각종 데이터들이 모여있다

Heap : 동적 할당 시 사용 (new mallo 등 동적으로 할당되는 데이터들을 위해 존재하는 공간이다)

Stack : 지역변수, 매개변수, 리턴 값(임시 메모리 영역), 호출한 함수가 종료되면 되돌아올 메모리의 주소를 스택에 저장하고 변수사용 범위에 영향을 미치는 영역을 구현할 때 사용된다

정적영역: 데이터 선언할 때 그 크기가 결정된다 (코드/데이터 영역)
동적영역: 프로세스가 실행되는 동안 크기가 늘어났다 줄어들었다 한다 (스택/힙영역)


스레드

  • 스레드란 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다 (프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행단위)
  • 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소공간 및 자원들과 같은 데이터를 프로세스 내의 스레드끼리 공유하며 실행된다
  • 하나의 프로세스가 생성되면 하나의 스레드가 같이 생성 (메인 스레드) 되며 스레드의 추가 생성이 없으면 프로그램의 코드는 메인 스레드에서 실행된다
  • 같은 그룹 내의 스레드와 코드, 주소공간, 운영체제의 자원 등을 공유
  • 스케쥴러에 의해 통제되며 프로그래밍된 가장 작은 지시이다 (스케쥴링 = 프로그램 코드를 실행하기 위해 자원을 할당하는 것)
  • 스레드는 스택만 할당받고 나머지 영역은 서로 공유
  • 프로세스 하나에 자원을 공유하면서 일련의 과정을 여러 개를 동시에 실행시킬 수 있음
  • 스택만 분리해서 사용하는 이유는 스택의 후입선출(LIFO)특성 때문이다. 스택은 쌓이면서 위에서부터 프로세스가 섞인 채로 순서대로 나오기 때문에 원활한 흐름 위해 스택은 따로 독립적으로 존재한다

= 프로세스의 실행 단위, 프로세스의 부분집합

스레드의 작동방식

  • 프로세스가 시작되면 메모리와 자원이 할당된다
  • 프로세스가 할당받은 메모리 영역 내 스택 형식의 메모리를 따로 할당받고 나머지는 Code, Data, Heap 형식으로 할당된 메모리 영역을 공유한다
  • 프로세스가 생성되면 스케쥴러는 프로세스가 해야 할 일들을 CPU에 전달하게 된다. 이때 전달하는 일 하나가 스레드라고 할 수 있다
    => 운영체제 입장에서 작업단위는 프로세스이고 CPU입장에서의 작업단위는 전달받은 스레드이다


프로세스와 스레드의 차이점

  • 프로세스는 실행 중 오류가 발생해도 프로세스에는 아무런 영향을 주지 않는다
    반면 스레드는 메모리 영역 (Code Heap Data)을 공유하기 때문에 오류가 발생하면 프로세스 내 다른 스레드 모두 오류가 발생하게 된다

  • 프로세스는 무겁고 실행이 오래걸린다. 또한 자원을 할당받아 사용하며 독립적이다(데이터 공유 안함)

  • 반면에 스레드는 가볍고 실행이 빠르며 데이터와 자원을 서로 공유하며 사용한다

그럼 쓰레드를 왜 사용할까?

  • 쓰레드는 흐름의 단위이기에 CPU 입장에서 최소 작업 단위이다
    각각의 스텍 데이터가 있고 데이터를 공유 가능하다보니 operational cost 낮고 통신 비용 또한 낮다는 장점이 있다

  • 프로세스는 자원의 소유인데 반해 스레드는 실행 단위라고 생각할 수 있다
    하나의 프로세스를 다수의 실행단위 (스레드)로 구분/구성하여 자원을 공유하며 자원의 생성/관리 중복성 최소화와 수행 능력을 향상시킬 수 있다

  • 스레드는 1MB 이내의 메모리를 점유하기에 경량 프로세스라고도 불리며 메모리 절약이 가능하다


출처
guru99.com
velog.io/@raejoonee/프로세스와-스레드의-차이
velog.io/@hoyun7443/프로세스-스레드
devuna.tistory.com/21
www.geeksforgeeks.org/difference-between-multitasking-multithreading-and-multiprocessing/

0개의 댓글