원희 개발로그

[CS] 프로세스와 스레드 본문

CS

[CS] 프로세스와 스레드

이어니언 2021. 10. 16. 18:35

프로세스란?

 컴퓨터에서 연속적으로 실행되고 있는 프로그램으로 하나의 작업 단위

 

 여기서 로그램이란 실행되기 위해 하드디스크나 SSD 등 보조장치에 저장되어 있는 코드 묶음(바이너리 형식)을 얘기합니다.

이 프로그램이 OS에 의해 메모리를 할당받아 메모리에 올라가게 되면 하나의 프로세스라고 볼 수 있습니다.


여러 개의 프로세스가 동시에 동작할 수 있을까?

 정답은 '없다'입니다. 우리는 컴퓨터를 사용할 때 자연스럽게 여러 개의 프로그램을 동시에 사용합니다. 그럼 이러한 작업은 어떻게 이루어지는 것일까요? 결론부터 얘기하자면 우리가 알아차리지 못할만큼 빠르게 여러 개의 프로세스를 작업 공간에 올렸다 내렸다 하면서 프로그램들을 실행하기 때문입니다. 이러한 과정이 워낙 짧은 순간에 이루어지다 보니 동시에 여러 개의 프로세스가 동작하고 있다고 우리는 인식을 하는 것입니다. 이렇게 진행되고 있는 프로세스를 계속 변경하는 것을 'Context Swiching'이라고 합니다.

 

Context Switching

기존에 진행 중이던 프로세스에 대한 정보를 저장 후 새로운 프로세스를 진행하는 것

 

Context란 문맥, 정황의 뜻을 가지고 있는데 우리가 얘기하고 있는 프로세스 전환에서의 Context는 진행 중이던 프로세스의 정보라고 볼 수 있습니다. 이 정보는 Register에 저장되며 PCB(Process Control Block)으로 관리됩니다. PCB는 프로세스 식별자, 프로세스 계수기, CPU 스케쥴링 정보, 메모리 관리 정보, 프로세스 상태 정보 등으로 구성되어 있습니다. Switching이 일어날 때 마다 이러한 정보들을 저장하고, 불러오는 것을 반복하며 이전에 실행하던 것을 이어서 실행할 수 있는 것이죠!


프로세스 상태

 위에서 알아본 PCB에서 프로세스 상태 정보를 포함하고 있는데 프로세스 상태에는 어떤 것이 있는지 알아봅시다.

 

프로세스 상태

생성 : 프로세스가 생성되는 단계

준비 : 프로세스가 언제든지 실행될 수 있도록 준비하고 있는 단계로 우선순위를 가진다.

실행 : 프로세스의 명령어들이 실행 중인 단계

대기 : 프로세스가 입출력 및 시그널 수신 등을 기다리는 상태

종료 : 프로세스가 종료된 상태

 

준비 단계에는 여러개의 프로세스가 있을 수 있습니다. 하지만 실행단계에서는 위에서 프로세스는 한 번에 하나만 실행될 수 있다고 얘기한 것처럼 단 하나의 프로세스만 존재하게 됩니다. 싱글코어 CPU의 경우에는 말이죠. 이렇게 프로세스에 대해서 간략하게 알아보았고 다음은 스레드에 대해 알아보겠습니다.


스레드란?

프로세스에서 진행 중인 작업의 흐름 혹은 실행 단위

 

 프로세스는 운영체제에 의해 할당받아 실행되는 작업 단위였다면 스레드는 프로세스 내에서 실행되는 작업의 단위입니다. 프로세스는 최소 하나의 스레드를 가지고 동작을 하게 되며 상황에 따라 멀티스레드를 사용하여 작업 효율을 올립니다. 멀티스레드를 사용할 경우 프로세스와 같이 여러 개의 스레드가 동시에 실행될 순 없지만 빠르게 Switching을 하며 프로그램을 실행합니다. 즉 스레드란 프로세스 내에서 일정 자원을 공유하며 여러 작업을 동시에 처리하는 것과 같은 효과를 가지는 작업의 흐름이라고 할 수 있습니다.


프로세스 메모리 구조

 

멀티스레드 환경에서는 프로세스 내의 일정 자원을 공유한다고 하였는데요. 이에 대한 이해를 높이기 위해 먼저 프로세스의 구조에 대해서 간단하게 알아보겠습니다.

프로세스는 크게 4가지 영역으로 구성되어 있습니다.

 

Code : 컴파일된 소스 코드들이 존재하는 영역

Data : 전역 변수나 static 변수의 할당을 위해 존재하는 영역

Heap : 동적으로 생성되는 데이터의 할당을 위해 존재하는 공간

Stack : 지역 변수 할당, 함수 호출 시 전달되는 파라미터를 저장하는 공간

 

Stack 영역과 Heap 영역은 프로그램이 실행 중 데이터가 쌓였다가 삭제되었다가를 반복하는 유동적인 영역입니다. 이때 할당된 메모리를 넘어버리면 Overflow가 발생하게 됩니다. 흔히 볼 수 있는 예로 재귀 함수를 잘못 사용할 때 함수에 대한 데이터가 쌓이는 Stack영역에 데이터가 무한으로 쌓이기 때문에 용량을 넘어가는 순간 Stack overflow가 발생하곤 합니다.

 


 

스레드를 포함한 메모리 구조

 

  위의 개념에서 스레드가 2개가 되었다고 가정해보겠습니다. 오른쪽

그림처럼 스레드는 Code, Data, Heap을 공유하지만 Stack영역은 각각 독립적으로 존재합니다.

 

 Stack의 경우에는 Last In First Out의 구조를 가지고 있기 때문에 여러개의 스레드가 동시에 접근할 경우 스레드 우선순위보다 Stack에 있는 데이터에 따라 우선순위가 뒤 바뀔 수 있어 실행 순위가 복잡하게 됩니다. 따라서 스레드 별로 Stack영역을 나누어 독립적으로 우선순위를 설정할 수 있게 됩니다.

 

 

 


정리

 프로세스스레드는 하나의 작업 단위라는 점에서는 비슷한 특성을 가지고 있지만 각각 실행되는 실행 주체가 다릅니다. 프로세스는 운영체제가 관리하는 작업 단위이고 스레드는 프로세스 내에서 관리되는 작업 단위입니다. 멀티 프로세스와 멀티 스레드를 통해 동시에 여러개의 프로그램을 또는 작업을 실행하는 효과를 볼 수 있습니다. 멀티 프로세스와 멀티 스레드의 장단점에 대해 정리하며 마무리하겠습니다.

 

멀티 프로세스

장점 

  • 프로세스 간에 공유하고 있는 자원이 없어 독립적이다. 따라서 하나의 프로세스에서 오류가 발생하더라도 다른 프로세스에는 영향을 주지 않는다.

단점 

  • Context switching이 발생할 때 공유 자원이 없기 때문에 작업 공간에 데이터를 새로 올렸다가 내렸다가 하는 자원이 소모되어 오버헤드가 발생할 수 있다.
  • 프로세스 간에도 데이터를 주고 받을 수 있으나 프로세스 간의 통신 IPC(Inter-Process Communication)를 필요로 하고, 이는 통신 비용이 크다.  즉 , 시간과 메모리에 효율성을 가지지 못한다.

멀티 스레드

장점

  • 스레드 간 전환 시 Code, Data, Heap 영역을 공유하기 때문에 Stack 영역만 작업 공간에 새롭게 바꿔주면 된다. 따라서, 전환 속도가 빠르고 자원을 적게 소모한다.

단점

  • 공유하는 영역에서 동기화 문제로 충돌이 발생할 수 있다. 스레드 간 진행 순서를 보장하지 못하기 때문에 하나의 스레드가 수정한 데이터를 다른 스레드가 할당을 받아 접근하게 된다면 오류가 발생할 수 있다.
  • 위의 결과로 하나의 스레드에서 에러가 날 경우 전체 프로세스에 영향을 끼치게 된다.

 

 

 

 

Reference

IT 위키 https://itwiki.kr/w/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EC%83%81%ED%83%9C

 

프로세스 상태 - IT위키

Swap-out (Suspend) 준비(대기) 상태에서 기억 장치를 반납하고 지연 준비(지연 대기) 상태로 전이

itwiki.kr

 

Comments