본문 바로가기
운영체제

프로세스와 스레드

by Deeppago 2022. 1. 26.

단순히 코딩만 하던 지난날을 반성하며, 더 좋은 엔지니어가 되기 위해 기초부터 이해하며 정리해보려고 한다. 프로세스와 스레드는 좋은 엔지니어라면 반드시 이해해야 하는 개념 중 하나이다. 이 글을 통해 프로세스와, 스레드의 개념과 차이점을 이해해 보도록 하자.

-목차-

1. 프로세스와 스레드에 대한 정의

    1.1 프로그램 → 프로세스

    1.2 프로세스 → 스레드

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

2. 멀티 프로세스와 멀티 스레드

3. 운영체제 관점에서의 스레드와 메모리 공유

4. 멀티 프로세스보다 멀티 스레드를 사용함으로 얻는 이점

 


1. 프로세스와 스레드에 대한 정의

먼저 프로세스와 스레드가 무엇인지 정의부터 살펴보자.

  • 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
  • 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위

 

1.1 프로그램 → 프로세스

먼저 프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말한다.

  1. 메모리에 올라가 있지 않은: 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻이다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있다.
  2. 정적인 상태: 정적이라는 단어 그대로, 움직이지 않는 상태라는 뜻이다. 한 마디로 아직 실행되지 않고 가만히 있다는 뜻이다.

쉽게 말해서 윈도우의 *.exe 파일과 같이 사용자가 실행하기 전의 파일을 말한다.

 

이제 그 실행 파일(프로그램)에게 의미를 부여하기 위해 프로그램을 실행해 보자. 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고 운영체제로부터 자원을 할당받는다. 이 상태를 동적인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다.

 

지금까지의 내용을 이해하기 쉽도록 간단히 그림으로 표현하면 다음과 같다.

한줄로 요약하자면 프로그램은 코드 파일이고, 그 프로그램을 실행하여 작업 중인 것이 프로세스라고 이해하면 된다.

 

※프로세스 제어 블록(Process Control Block, PCB)

PCB 는 특정 프로세스에 대한 중요한 정보를 저장 하고 있는 운영체제의 자료구조이다. 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB 를 생성 한다. 프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 된다. 그리고 다시 CPU 를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.

PCB 에 저장되는 정보

  • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
  • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
  • 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
  • CPU 레지스터
  • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
  • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등

1.2 프로세스 → 스레드

스레드는 프로세스의 실행 흐름의 단위라고 할 수 있다. 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있다. 아래 그림은 프로세스가 진행되는 동안 스레드의 실행 과정을 보여준다.

 

 

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

이제 프로세스와 스레드에 대한 정의를 알았으니 그 차이점을 자세히 살펴보도록 하자.

위에서 프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는다고 언급했었다. 이때 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해 준다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.

 

출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

이와 다르게 스레드는 메모리를 서로 공유할 수 있다고 언급했었다. 이에 대해 더 자세히 설명하자면, 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.

 

출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

여기서 프로세스와 스레드의 중요한 한가지 차이는 만약 한 프로세스를 실행하다가 오류가 발생해서 프로세스가 강제로 종료된다면, 다른 프로세스에게 어떤 영향이 있을까? 공유하고 있는 파일을 손상시키는 경우가 아니라면 아무런 영향을 주지 않는다.

 

그런데 스레드의 경우는 다르다. 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.

 

스택을 스레드마다 독립적으로 할당하는 이유
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.
PC Register 를 스레드마다 독립적으로 할당하는 이유
PC 값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다. 스레드는 CPU 를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.

 


2. 멀티 프로세스와 멀티 스레드

이제 프로세스와 스레드가 어떤것인지 알았다. 그렇다면 멀티 프로세스와 멀티 스레드는 무엇일까?

 

멀티 프로세싱

멀티 프로세싱이란, 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 의미한다. 멀티 프로세싱은 자칫하면 여러 프로세스가 동시에 실행되는 것처럼 보이지만 운영체제의 스케줄링 방식에 따라 프로세스가 실행된다.

프로세스는 서로 자원을 공유하지 않는다는 측면에서 멀티 프로세싱 장점과 단점이 있다.

  • 멀티 프로세싱의 장점
    • 먼저 멀티 프로세싱은 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다. 
  • 멀티 프로세싱의 단점
    • 프로세스간 자원을 공유하고 있지 않기 때문에 Context switching에서 RAM과 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생한다.
    • 프로세스는 각각의 독립된 메모리 영역을 할당 받기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다. 따라서 프로세스 간 통신은 어렵고 복잡한 통신 기법이 필요하다.
오버헤드 : 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다.
Context switching : CPU에서는 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 Context switching이라 한다. 현재 진행 중이던 프로세스의 정보 CPU레지스터값(프로그램 카운터)등을 PCB에 저장하고 다른 프로세스의 PCB를 읽어 CPU에 적제한다.

 

멀티 스레드

멀티태스킹이 하나의 운영 체제 안에서 여러 프로세스가 실행되는 것이라면, 멀티스레드는 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것을 의미한다.

  • 멀티 스레드의 장점
    • Context-Switching할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
    • 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.
  • 멀티 스레드의 단점
    • 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
    • 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없다.
동기화 문제란 멀티스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될지 그 순서를 알 수 없다. 만약 A 스레드가 어떤 자원(ex 전역 변수)을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
이처럼 여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 한다. 멀티 스레드에 대한 스케줄링은 운영체제가 자동으로 해주지 않기 때문에 프로그래머가 적절한 기법을 직접 구현해야 하므로 프로그래밍할 때 멀티스레드를 사용하려면 신중해야 한다. 

 


3. 운영체제 관점에서의 스레드와 메모리 공유

스레드는 "실행 흐름의 단위"라고 한다. 정확히는 CPU 입장에서의 최소 작업 단위가 된다. CPU는 작업을 처리할 때 스레드를 최소 단위로 삼고 작업을 한다. 반면 운영체제는 이렇게 작은 단위까지 직접 작업하지 않기 때문에 운영체제 관점에서는 프로세스가 최소 작업 단위가 된다.

따라서 운영체제 관점에서는 프로세스가 최소 작업 단위인데, 이 때문에 같은 프로세스 소속의 스레드끼리 메모리를 공유하지 않을 수 없다.

 


4. 멀티 프로세스보다 멀티 스레드를 사용함으로써 얻는 이점

상황에 따라 사용되어지는 방법이 다르겠지만 멀티 프로세스는 멀티 스레드보다 자원을 많이 소모한다. 따라서 멀티 프로세스보다 멀티 스레드를 사용함으로써 얻을 수 있는 이점이라고 한다면 아래와 같다. (만약 CPU소비가 없고 시간이 오래걸리는 I/O 연산이 많은 프로그램이라면 오버해드를 감수하더라도 멀티 프로세싱을 사용하여 CPU가 다른 작업을 하도록 할당하는것이 더 유리할 수 있다.)

  • 자원의 효율성 증대
    • 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
    • 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
  • 처리 비용 감소응답 시간 단축
    • 프로세스 간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어든다.
    • 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.

 


참고 자료

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

https://velog.io/@raejoonee/프로세스와-스레드의-차이

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#프로세스와 스레드의 차이

댓글