개발놀이터

프로세스와 스레드 본문

CS 지식/운영체제

프로세스와 스레드

마늘냄새폴폴 2023. 4. 8. 18:28

프로세스와 스레드의 차이에 대한 면접질문은 신입 개발자에게 단골 질문이라고 알려져 있습니다. 이 둘은 다른 듯 비슷해 보여서 헷갈리기 쉬운데 이번 포스팅에선 이 둘의 차이와 더 나아가 멀티프로세싱, 멀티스레딩과 더불어 이 둘을 언제 사용하면 좋을지까지 포스팅합니다. 

 

Process

프로세스는 실행된 프로그램의 인스턴스입니다. 우리가 프로그램을 실행할 때 이 프로그램이 직접적으로 실행되는 것이 아니라 프로그램을 실행하기 위해 필요한 스텝들을 거친 뒤 실행이 됩니다. 이렇게 실행을 위해 필요한 스텝들이 바로 프로세스 즉 과정입니다. 

 

프로세스는 한번에 여러개의 일을 수행하기위해 다른 프로세스를 만들 수 있습니다. 이렇게 만들어진 프로세스들은 클론 프로세스 혹은 자식 프로세스라고 부르죠. 메인 프로세스는 부모 프로세스라고 부릅니다. 

 

각각의 프로세스들은 고유한 메모리 공간을 부여받고 다른 프로세스와 이를 일체 공유하지 않습니다. 

 

 

프로세스의 특징

  • 매번 우리는 프로세스를 만들고 OS에서 각각의 프로세스를 요구하는 분리된 시스템을 만들 필요가 있습니다. 이 때 fork() 작업이 프로세스를 만듭니다. 
  • 각각의 프로세스는 고유한 주소와 메모리 공간안에서 존재합니다. 
  • 각각의 프로세스는 독립적이고 OS에 의해 분리된 과정으로서 여겨집니다. 
  • 프로세스들은 서로 통신하기 위해 IPC (Inter-Process Communication)가 필요합니다. 
  • 프로세스들 사이에서 동기화가 필요없습니다. 

 

Thread

스레드는 프로세스 아래 위치하고 알려지기로는 '경량화된 프로세스' 라고 알려져있습니다. 프로세스들은 하나 이상의 스레드를 가지고 있고 각각의 스레드들은 스케쥴러에 의해 독립적으로 관리됩니다. 

 

하나의 프로세스 안에 있는 모든 스레드들은 서로 상호연관되어 움직입니다. 또한, 스레드는 data segment, code segment, files 와 같은 흔한 정보들을 가지고 있는데 각각의 스레드들이 이를 모두 공유합니다. 하지만 register와 stack memory, counter들은 독립적으로 가지고 있습니다. 

 

여기서 register와 stack memory, counter에 대해서 잠깐 짚고 넘어가도록 하겠습니다. 

 

Register는 빠르게 가져오거나 빠르게 저장하거나 빠르게 데이터를 이송하는데에 필요한 컴퓨터 메모리의 한 종류 혹은 CPU에 의해 즉각적으로 사용되는 구조를 말합니다. 

 

Stack Memory는 JVM을 공부해보신 분이라면 알고 계시겠지만 메모리 공간인데 Stack memory는 동작에 의해서 생기는 일시적인 변수들을 저장하는 컴퓨터 메모리의 특별한 공간입니다. 컴퓨터의 테스트(task)가 끝날 때 변수를 담고 있는 메모리들은 자동적으로 지워진다는 특징을 가지고 있습니다. 스택에는 대게 메서드, 지역변수, 참조변수들이 저장됩니다. 

 

Heap Memory 는 프로그래밍 언어에 의해서 생성되는 메모리이고 주로 전역적인 변수들이 저장됩니다. Heap memory는 스택과 다르게 자동적으로 관리되지 않고 CPU에 의해 타이트하게 관리되지 않는 좀 더 프리하게 떠다니는 공간입니다. 주로 Heap memory에는 동적으로 할당된 변수나 배열등이 저장됩니다. 

 

(Program) Counter는현재 실행되는 일련의 코드들 (Instruction)의 주소를 가지고 있는 컴퓨터 프로세서 안에서의 Register를 의미합니다. 

 

 

스레드의 특징

  • 프로세스들은 다른 프로세스와 독립적으로 움직이지만 스레드들은 논리적으로 모두 연결되어있습니다. 
  • 프로세스는 많이 무거운 반면에 스레드들은 경량화되어있습니다. 
  • 프로세스는 고유한 메모리와 주소를 가지고 있지만 스레드는 개인적으로 존재하지 않습니다. 
  • 프로세스는 동기화가 필요하지 않았지만 스레드는 공유하고 있는 자원이 있기 때문에 충돌이 날 수 있어 적절한 동기화가 필요합니다.

 

Multi-Processing VS Multi-Threading

보통 실무에서 사용한다면 Multi-Processing (이하 멀티프로세싱) 혹은 Multi-Threading (이하 멀티스레딩) 을 사용하겠죠? 이번 섹션에서는 이 둘의 차이에 대해서 설명해보도록 하겠습니다. 

 

멀티스레딩

멀티스레딩은 싱글 프로세스에서 여러개의 코드를 각각 할당하는 프로그래밍 기술입니다. 스레드들은 서로 동시에, 병렬적으로 실행되는데 이러한 스레드들은 부모 프로세스 안에서 같은 메모리공간을 공유합니다. 이렇게 하면 시스템 메모리를 줄일 수 있고 속도와 성능을 끌어올릴 수 있습니다. 

 

예를들어서 우리가 컴퓨터를 할 때 여러개의 브라우저를 띄워놓고 한쪽에선 이메일을 작성하고 한쪽에선 음악을 듣는 경우 두개의 브라우저가 끊기지 않고 동시에 실행되는 상황을 멀티스레딩이 사용되었다고 말합니다. 

 

 

멀티프로세싱

멀티프로세싱은 2개 이상의 CPU가 설치된 시스템을 말합니다. 모든 추가적인 CPU는 시스템의 속도와 파워를 올려주고 더 많은 메모리를 사용할 수 있게 해줍니다. 이는 동시에 여러개의 프로세스를 실행하도록 해주죠. 

 

각각의 CPU들은 독립적으로 실행되고 몇개의 CPU가 시스템 오류로 죽어버려도 그 옆의 CPU가 제대로 작동한다면 애플리케이션이 돌아가는데에는 문제가 없습니다. 

 

멀티 프로세싱에는 두가지 방식이 있는데 동기화 멀티프로세싱과 비동기화 멀티프로세싱입니다.  

 

  • 동기화 멀티프로세싱 (Symmetric Multiprocessing) : 동기화 멀티프로세싱은 각각의 프로세스가 하나의 메모리공간으로 연결된 두개이상의 프로세서로 통합된 하드웨어와 소프트웨어를 사용합니다. 이러한 프로세서들은 모두 Input/Output (이하 I/O) 을 담당하여 사용할 수있습니다. 
  • 비동기화 멀티프로세싱 (Asymmetric Multiprocessing) : 비동기화 멀티프로세싱은 서로 다른 CPU가 분리된 I/O 작업을 수행할 수 있습니다. 예를 들어서 어떤 CPU는 I/O 실행을 담당하고 어떤 CPU는 OS를 담당할 수 있다는 얘기입니다. 

 

멀티스레딩과 멀티프로세싱의 차이

  • 멀티프로세싱은 두개이상의 CPU를 가지고 성능을 끌어올리는 것인 반면에 멀티스레딩은 하나의 프로세스에서 여러개의 코드를 부여받음으로서 성능을 끌어올립니다. 
  • 멀티스레딩은 하나의 프로세스에서 스레드를 늘리는데 초점을 맞췄다면 멀티프로세싱은 CPU를 늘리는 것에 초점을 맞췄습니다. 
  • 멀티프로세싱은 좀 더 신뢰할만한 시스템을 만드는데 사용되고 멀티스레딩은 서로 병렬적인 작업을 수행하는데 사용됩니다. 
  • 멀티스레딩은 적은 리소스를 요구하고 빠르게 생성되는 반면에 멀티프로세싱은 상당한 양의 시간과 특별한 리소스가 필요합니다. 
  • 멀티프로세싱은 많은 프로세스들이 동시에 실행되는 반면에 멀티스레딩은 프로세스는 하나지만 여러개의 스레드가 동시에 실행됩니다. 
  • 멀티스레딩은 모든 스레드가 공통의 메모리와 주소를 가지고 있지만 멀티프로세싱은 각각 고유한 메모리와 주소를 가지고 있습니다. 

 

멀티스레딩의 이점

  • 적은 메모리 스토리지가 요구됩니다. 
  • 모든 스레드가 부모 프로세스를 공유하기 때문에 메모리에 접근하는 것이 더 쉽습니다. 
  • 스레드사이에 스위칭이 빠르고 효율적입니다. 
  • 새로운 프로세스를 만드는 것보다 새로운 스레드를 만드는 것이 훨씬 빠르고 쉽습니다. 
  • 모든 스레드들이 하나의 프로세스 메모리 풀을 공유하고 같은 주소를 가지고 있습니다. 
  • 스레드들은 더 경량화 되어있고 때문에 낮은 오버헤드를 가집니다. 
  • 스레드들 사이에서 커뮤니케이션하는 비용이 비교적 저렴합니다. 
  • 반응형 UI를 만드는데 쉽습니다. 

 

멀티스레딩의 단점

  • 멀티스레딩은 interrupt 될 수 없습니다. (cf. interrupt는 인터럽트는 컴퓨터를 장착한 디바이스로부터 혹은 컴퓨터안에 프로그램에 의해 방출된 신호입니다.)
  • 코드들이 이해하는데 굉장히 힘듭니다. 
  • 간단한 일을 할 때는 오히려 오버헤드가 발생할 수 있습니다. 
  • 코드가 복잡해서 디버깅이나 트러블슈팅을 할 때 어려움을 겪을 수 있습니다. 

 

멀티프로세싱의 이점

  • 코드를 이해하기 굉장히 쉽습니다. 
  • 자식 프로세스들이 interrupt 할 수 있습니다. 
  • 테스트(task)를 빠르게 처리하거나 많은 양의 데이터를 분석하는 것이 좀 더 용이합니다. 
  • CPU를 새로 다는 것이기 때문에 시스템의 전반적인 성능을 끌어올리는데 쉽습니다. 
  • 동기화를 할 필요가 없습니다. 
  • 싱글 프로세서 시스템보다 더 효율적입니다. 

 

멀티프로세싱의 단점

  • 멀티프로세싱은 많은 메모리 스토리지를 요구하고 프로세스 사이의 데이터를 이동시키는데 스레드에 비해 오버헤드가 발생합니다. 조금 어려운 표현으로 Context Switching에 의한 오버헤드가 발생한다 라고 할 수 있습니다. 
  • 스레드를 만드는 것 보다 프로세스를 만드는 것이 더 오래걸리고 비쌉니다. 

Context Switching이란 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말합니다. 

 

이때 발생하는 오버헤드가 꽤나 크기 때문에 보통의 경우 멀티프로세싱으로 할 수 있는 작업을 멀티스레딩으로 하곤 합니다. 좀 더 자세히 말씀드리면 멀티프로세스로 실행되는 작업을 멀티스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있습니다. 

 

뿐만 아니라 프로세스 간의 통신보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어들게 됩니다. 

 

하지만 멀티프로세싱으로 할 수 있는 작업을 멀티스레딩으로 작업했을 때의 얘기이지 멀티프로세싱이 필요한 작업도 분명히 존재합니다. Context Switching은 장애가 났을 때 기존에 진행되던 프로세스의 정보를 기억하고 있다가 장애가 해결되고 나서 다시 프로세스를 원상복구 시킬 때 굉장히 유용하게 사용됩니다. 

 

혹은 높은 우선순위의 프로세스가 생겨서 ready queue로 떨어진다면 현재 실행중인 프로세스가 정지되게 되고 위에서와 마찬가지로 다시 원상복구 시킬 때 사용됩니다. 

 

멀티스레딩, 멀티프로세싱을 선택하는 기준

만약 반응형 UI를 만든다면 멀티스레딩을 사용하는 것이 좋습니다. 이런 경우 유저 입장에서 이벤트가 발생하는 와중 시스템이 정지해버리면 안되기 떄문에 이때 멀티스레딩을 사용하는 것이 올바른 선택입니다. 

 

I/O bound 나 네트워크 bound 애플리케이션을 만들 때도 멀티스레딩을 활용하면 좋습니다. 쉽게 말해서 네트워크가 왔다갔다 하는 도중에 시스템이 정지해버리면 안되기 때문에 이때 멀티스레딩을 사용하는 것이 올바른 선택입니다. 예를 들어서 파일을 다운로드 하고 있는데 시스템이 멈춰버리면 안되겠죠? 

 

빅데이터를 분석하는데에는 멀티프로세싱을 사용하면 좋습니다. 멀티프로세싱이 멀티스레드에 비해 빅데이터를 분석하는데 탁월하기 때문에 이떄는 멀티프로세싱을 사용하는 것이 올바른 선택입니다. 

 

또한 멀티프로세싱은 CPU를 강력하게 사용해야 하는 프로그램을 개발할 때 사용하면 좋습니다. 대부분의 대규모 애플리케이션이 그렇겠지만 보통 이렇게 많은 CPU를 요구하는 애플리케이션에선 멀티프로세싱이 굉장히 유용합니다. 

 

 

 

여기까지 프로세스와 스레드에 대해서 알아봤습니다. 운영체제에 대해서 처음 공부하는건데 좋은 공부가 됐습니다. 하지만 네트워크나 데이터베이스나 Java, Spring에 비해 굉장히 추상적이고 이해하기가 까다로웠습니다. 

 

아마 데이터베이스나 네트워크같은 CS 지식들은 아무래도 눈에 보이는 경우가 대부분이고 우리가 보통 사용하는 기능들에 대해서 설명하기 떄문에 좀 더 직관적인 것 같습니다. 

 

프로세스, 스레드에 대한 포스팅은 여기서 마치도록 하겠습니다. 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 보내세요!

 

 

참조

https://www.javatpoint.com/process-vs-thread

 

Process vs Thread: What's the Difference? - javatpoint

Process Vs. Thread | Difference Between Process and Thread with list of top differences and real time examples including images, dog, cat, gross, net, java, database, science, general, english etc.

www.javatpoint.com

=> 프로세스에 대한 개념과 특징

 

https://www.javatpoint.com/computer-registers

 

Computer Registers - javatpoint

Computer Registers with introduction, evolution of computing devices, functional units of digital system, basic operational concepts, computer organization and design, store program control concept, von-neumann model, parallel processing, computer register

www.javatpoint.com

=> Register에 대한 개념

 

https://www.guru99.com/stack-vs-heap.html

 

Stack vs Heap Memory – Difference Between Them

What is a Stack? A stack is a special area of computer's memory which stores temporary variables created by a function. In stack, variables are declared, stored and initialized during runtime. It is a

www.guru99.com

=> Stack, Heap 메모리에 대한 개념

 

https://www.techtarget.com/whatis/definition/program-counter

 

What is program counter? | Definition from TechTarget

A program counter is a register in a computer processor that contains the address (location) of the instruction being executed at the current time.

www.techtarget.com

=> Counter에 대한 개념

 

https://www.indeed.com/career-advice/career-development/multithreading-vs-multiprocessing

=> 멀티스레딩과 멀티프로세싱에 대한 개념과 차이 그리고 선택기준

 

https://brunch.co.kr/@kd4/3

 

프로세스와 스레드의 차이

기술 면접 단골손님 feat. 운영체제 | 프로세스와 스레드에 대해서 설명해주세요. 익숙한 질문입니다. 신입 개발자 면접 질문 목록에 빠지지 않고 등장하는 질문인데요. 아무리 쉽고 익숙한 질문

brunch.co.kr

=> 멀티프로세싱을 멀티스레딩으로 바꿔야하는 이유

 

https://www.javatpoint.com/what-is-the-context-switching-in-the-operating-system

 

Context Switching in OS (Operating System) - javatpoint

Context Switching in OS (Operating System) with OS Tutorial, Types of OS, Process Management Introduction, Attributes of a Process, CPU Scheduling, FCFS with overhead, FCFS Scheduling etc.

www.javatpoint.com

=> Context Switching에 대한 개념과 필요한 이유

'CS 지식 > 운영체제' 카테고리의 다른 글

리눅스 커널  (0) 2024.06.02
세마포어와 뮤텍스  (0) 2023.04.27
교착상태 (DeadLock) 와 기아상태 (Starvation)  (0) 2023.04.24
프로세스 동기화  (0) 2023.04.16
동시성문제와 Thread-safe  (0) 2023.04.13