CS/Operating System

[Operating System] 프로세스 vs 스레드

hanseongbugi 2024. 4. 4. 16:35

Process(프로세스) & Thread(스레드)?

  • 프로세스는 다음과 같이 정의한다.
    • 운영체제로부터 자원을 할당받은 작업의 단위
  • 스레드는 다음과 같이 정의한다.
    • 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
  • 한줄로 정의하면 프로세스는 작업의 단위이며 스레드는 실행 흐름듸 단위라고 할 수 있다.

프로그램과 프로세스

정적 프로그램(Static Program)

  • 프로그램은 컴퓨터에서 실행할 수 있는 파일을 통칭한다.
  • 단, 아직 파일을 실행하지 않은 상태이기 때문에 정적 프로그램 줄여서 프로그램이라고 부른다
  • 프로그램은 자바나 C언어를 이용해 코드를 작성하여 완성한다. 즉, 프로그램은 코드 덩어리로 볼 수 있다.

프로세스(Process)

  • 프로세스는 프로그램을 실행시켜 정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태를 뜻한다.
    • 즉, 컴퓨터에서 작업 중인 프로그램을 의미한다.
  • 모든 프로그램은 운영체제가 실행되기 위한 공간을 할당해줘야 실핼될 수 있다.
    • 프로그램을 실행하는 순간 파일은 컴퓨터 메모리에 올라가게되고, 운영체제로부터 시스템 자원을 할당받아 프로그램 코드를 실행한다.

스레드(Thread)

프로세스의 한계

  • 과거에는 프로그램을 실행할 때 하나의 프로세스를 사용하였다. 
  • 하지만 기술이 발전됨에 따라 프로그램이 복잡해지고 다채로워짐으로써 프로세스 하나로는 프로그램을 실핼하기에는 한계가 있었다.
  • 동일한 프로그램을 여러 프로세스로 만들게 된다면 그만큼 메모리도 차지하고 CPU에서 할당받는 자원이 중복될 것이다.
  • 스레드는 이러한 프로세스 특성의 한계를 해결하기 위해 탄생 하였다.

스레드의 개념

  • 스레드란, 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위를 말한다.
  • 하나의 프로세스가 실행된다면 여러 작업을 동시에 진행할 수 있다.
    • 즉,  하나의 프로세스 안에서 여러가지 작업의 흐름이 동시에 진행되기 때문에 가능한 것
    •  일련의 작업 흐름들을 스레드라고 하며 여러개가 있다면 이를 멀티(다중) 스레드 라고 부른다.
  • 일반적으로 하나의 프로그램은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
    • 즉, 프로세스를 생성하면 기본적으로 하나의 main 스레드가 생성되게 된다.

프로세스 & 스레드의 메모리

프로세스의 자원 구조

  • 프로그램이 실행되어 프로세스가 만들어지면 4가지 메모리 영역으로 구성되어 할당된다.
  • 코드(Code) 영역
    • 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있다.
  • 데이터(Data) 영역
    • 코드가 실행되면서 사용되는 전역 변수나 각종 데이터들이 모여있다. 
  • 스택(Stack) 영역
    • 지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다.
    • Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 끝나면 완전히 소멸한다.
    • 만일 Stack의 영역을 초과하면 Stack Overflow 에러가 발생한다.
  • 힙(Heap) 영역
    • 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다.
    • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • Stack과 Heap 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들기도 하는 동적 영역이다.
  • 코드 영역과 데이터 영역은 선언할 때 크기가 결정되는 정적 영역이다.

스레드의 자원 공유

  • 스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위로서, 스레드가 여러개 있으면 동시에 작업을 진행할 수 있다.
  • 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한 것
  • 프로세스의 4가지 영역 중 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 고유하기 때문에 서로 다른 스레드에서 읽고 써야한다.
    • 독립적은 스택을 가지고 있는 것은 독립적인 함수 호출이 가능하다는 뜻
    • 독립적인 함수 호출이 가능한 것은 독립적인 실행 흐름이 추가되었다는 말
    • 즉, stack을 가짐으로써 스레드는 독립적인 실행 흐름을 가질 수 있게 되는 것
  • 반면에 프로세스는 기본적으로 프로세스 끼리 다른 프로세스의 메모리에 직접 접근할 수는 없다.
  • 위처럼 구성된 이유는 하나의 프로세스를 다수의 실행 단위인 스레드로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 올리기 위해서다.

프로세스의 자원 공유

  • 기본적으로 각 프로세스는 메모리에 별도의 주소 공간에서 실행된다.
    • 따라서 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 하지만 특별한 방법을 통해 프로세스가 다른 프로세스의 정보에 접근하는 것이 가능하다.
    1. IPC(Inter-Process Communcation)
    2. LPC(Local Inter-Process Communcation)
    3. 별도의 공유 메모리를 만들어서 정보를 주고 받도록 설정
  • 프로세스의 자원 공유는 단순히 CPU 레지스터 교체뿐만 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있다.
  • 다중 작업이 필요한 경우 스레드를 이용하는 것이 효율적이라, 다중 프로세싱을 지원하지만 다중 스레딩을 기본으로 하고 있다.

프로세스 & 스레드의 동시 실행 원리

  • 여러 작업을 동시에 할 수 있는 것은 컴퓨터의 내부에서 프로세스와 스레드를 동시에 처리하는 멀티 테스킹 기술 때문이다.
  • 동시에 처리하는 것은 CPU가 동시에 여러 프로그램을 실행하는 것이 아닌 내부적으로 복잡한 원리에 의해 처리된다.

멀티 코어와 스레드

  • CPU 한개는 여러 개의 코어를 가질 수 있다.
    • 코어는 CPU 코어 유닛을 뜻한다.
    • 즉, 4코어는 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛이 4개가 있는 것이다.
  • 4코어 8스레드의 CPU
    • 4코어는 물리적 코어 갯수를 뜻한다.
    • 8스레드는 논리적 코어 갯수를 뜻한다.
    • 이 경우 물리적 코어 한 개가 스레드 두 개이상을 동시에 실행 가능한 것
    • 이를 하이퍼 스레딩(Hyper-Threading) 기술이라고 말한다.
  • CPU의 스레드는 하드웨어적 스레드이며 프로그램의 스레드는 소프트웨어적 스레드를 뜻한다.
  • 컴퓨터를 이용할 때 수십, 수백개의 프로그램을 동시에 실행할 수 있는 것은 병렬성(Parallelism)과 동시성(Concurrency)에 의해 처리된다.

CPU의 작업 처리 방식

병령성(Parallelism)

  • 병렬성은 직관적으로 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛인 여러개의 코어에 맞춰 여러개의 프로세스, 스레드를 돌려 병렬로 작업을 동시 수행하는 것을 말한다.
  • 듀얼코어, 옥타코어 등의 명칭이 붙는 멀티 코어 프로세서가 달린 컴퓨터에서 할 수 있는 방식

동시성(Concurrency)

  • 동시성은 둘 이상의 작업이 동시에 실행되는 것을 의미한다.
    • Parallelism은 물리적으로 정말로 동시에 실행하는 것
    • Concurrency는 동시에 실행하는 것처럼 보이게 하는 것
  • 1개의 코어가 있고 4개의 작업이 있다고 가정
    • 프로세스들을 ​계속 번갈아가면서 조금씩 처리함으로써 마치 프로그램이 동시에 실행되는 것 처럼 보이는 것
  • 프로세스들을 ​번갈아가면서 매우 빠르게 처리하기 때문에 컴퓨터를 모르는 사람들이 보면 마치 동시에 돌아가는 것처럼 보이게 된다.
    • 단, 이때 작업들을 번갈아가면서 실행할때 작업들을 아주 잘게 나누어 아주 조금씩만 작업을 수행하고 다음 작업으로 넘어가는 식으로 동작된다. 
    • 여러 작업을 동시에 처리하는 것처럼 보이게 만들어, 사용자에게 더 빠른 반응성을 제공하기 위해서다. 
  • 진행 중인 작업들을 A → B → C → D 로 번갈아 바꾸는 것을 Context Switching 이라고 부른다.

동시성이 필요한 이유

  • 동시성(Concurrency)은  동시에 돌아가는 것 처럼 보이는 거지, 정말 실제로 동시에 돌아가는 것이 아니기 때문에 최종 작업이 걸리는 시간은 거의 차이가 없을 것이다.
  • 병렬성은 정말로 각 코어에 프로세스를 나눠 실행하는 거니까 듀얼 코어면 반 이상 줄어들 것
  • 첫번째는 하드웨어적 한계 때문
    • CPU 발열 때문에 성능을 올리기에는 한계에 봉착됬기 때문에 코어의 성능을 올리는 대신 코어를 여러개 탑재하여 쿼드 코어, 옥타 코어 CPU들을 출시하고 있다.
    • 하지만 아무리 코어를 많이 넣어도 수십개의 코어를 넣은순 없으니 결국 하드웨어적 제한이 걸리게 되고 수십수백개의 프로세스를 돌리기 위해선 결국 동시성이 필요한 것
  • 두번째는 보다 논리적인 효율적인 이유 때문
    • 4코어 8스레드의 CPU 환경에서 현재 총 16개의 작업이 있다고 가정하면 그중 8개는 오래 걸리는 작업이고, 나머지 8개는 짧은 시간을 필요로 하는 작업일 경우
    • 만일 최악의 경우 8개의 오래 걸리는 작업이 먼저 동시에 처리되기 시작했다면 나머지 가벼운 8개의 작업은 처리하는데 짧은 시간이 걸리는 데에도 불구하고 현재 처리중인 8개의 작업이 다 끝날때 까지 기다려야 할 것
  • 비효율적인 면을 극복하기 위해 작업을 아주 잘게 나눠 번갈아 가면서 처리하는 동시성 개념을 채택한 것
  • 최대 8개의 작업에 대해서 8개의 논리적인 스레드가 병렬적으로 아주 빠르게 동시적으로 작업을 하면서, 그보다 많은 수십개의 소프트웨어적 스레드가 있다면 적절히 병렬성과 동시성을 섞어 동시에 돌리게 되게 된다.

멀티 프로세스 & 스레드

멀티 프로세스

  • 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
  • 장점
    • 안전성
    • 메모리 침범 문제를 OS 차원에서 해결
  • 단점
    • 각각 독립된 메모리 영역을 갖고 있어, 작업량 많을 수록 오버헤드 발생.
    • Context Switching으로 인한 성능 저하
  • Context Switching?
    • 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정
    • 즉, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구하는 과정을 말함
    • 프로세스는 각 독립된 메모리 영역을 할당받아 사용되므로, 캐시 메모리 초기화와 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 문제가 존재함

멀티 스레드

  • 하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것
  • 스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리하도록 해줌
  • 장점
    • 독립적인 프로세스에 비해 공유 메모리만큼의 시간, 자원 손실이 감소
    • 전역 변수와 정적 변수에 대한 자료 공유 가능
  • 단점 :
    • 안전성 문제
    • 하나의 스레드가 데이터 공간 망가뜨리면, 공유 메모리를 갖기 때문에 모든 스레드가 작동 불능 상태에 빠짐
  • 멀티스레드의 안전성에 대한 단점은 Critical Section 기법을 통해 대비함
  • 하나의 스레드가 공유 데이터 값을 변경하는 시점에 다른 스레드가 그 값을 읽으려할 때 발생하는 문제를 해결하기 위한 동기화 과정

 

 

 

출처

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4

 

👩‍💻 ‍완전히 정복하는 프로세스 vs 스레드 개념

한눈에 이해하는 프로세스 & 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아

inpa.tistory.com

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

 

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C

 

[운영체제] 프로세스와 스레드

💡 프로세스와 스레드의 차이? ✅ 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위✅ 스레드 : 프로세스가 할당받은 자원을 이용하는 \*\*실행 흐름의 단위 💁 멀티스레드의 장단점 ?

velog.io

https://velog.io/@kwontae1313/%EB%8F%99%EC%8B%9C%EC%84%B1%EA%B3%BC-%EB%B3%91%EB%A0%AC%EC%84%B1%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%B0%A8%EC%9D%B4

 

동시성과 병렬성의 개념과 차이

😀CS를 준비하면서 동시성과 병렬성을 비교해서 설명하라는 예상질문을 보았다. 근데 비교에서 설명한다면 서로의 차이점에 대해서만 설명하게 되지않을까? 일단 동시성과 병렬성이라는 기본

velog.io

https://github.com/gyoogle/tech-interview-for-developer

 

GitHub - gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖

👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com