CS

프로세스와 스레드

Lahezy 2023. 2. 9.
728x90

스터디 중에 사용했던 발표 자료입니다

 

💡 아이스 브레이킹

→ 단골 질문으로 면접을 준비했는지 확인하는 질문!

Q. 면접에서 프로세스와 스레드의 차이는 왜 계속 물어보는 걸까?

→ 기본적인 동작 방식, 컴퓨터의 동작방식을 알고 있는지 확인하기 위해 물어보는 질문!

 

 

간단하게 프로세스와 스레드란!?

프로세스 : 운영체제에 의해 실행되는 프로그램의 인스턴스입니다.

스레드 : 프로세스 내에서 실행되는 독립적인 실행 흐름입니다.

간단하게 그림을 먼저 보다면 스레드가 하나인 싱글 스레드 프로세스와 멀티 스레드를 가진 프로세스의 차이는 아래 사진과 같습니다.

각 프로세스는 코드, 데이터, 파일을 가지고 있고 스레드는 독립되어 레지스터 세트, 프로그램 카운터 (PC), 스택 영역을 가지고 있음을 확인할 수 있다.

간단하게 예시를 들어보면 우리가 사용하는 하나의 어플리 케이션이 프로세스라면 어플리케이션 내에서 동시에 동작하는 여러 로직들은 프로세스와 같습니다.

  • 인텔리 제이에서의 코드 편집, 빌드, 디버깅, 테스트, 프로젝트 관리 등 다양한 작업은 별도의 스레드에서 동시 처리
  • 카카오톡은 메시지 전송 및 수신, 사용자 인터페이스 업데이트, 알림 처리, 이미지/동영상 전송 및 다운로드 등의 작업을 별도의 스레드에서 처리

💡참고

구글 크롬의 각탭은 스레드일까 프로세스 일까 - 참고

크롬은 프로세스 기반으로 동작합니다. (실제로 면접에서 물어보는곳이 있었다고 하더라구용)

프로세스를 선택해서 얻은 장점 : 안정성과 보안을 위해서 실제로 CMD/터미널에서 에서 실행되는 프로세스를 검색해서 보다보면 프로세스가 늘어나고 부모 프로세스를 죽이는 경우 크롬이 닫히는것을 확인할 수 있습니다.

 

 


진짜 시작!!

(멀티 스레딩, 멀티 스레드), 멀티 프로세스,멀티 프로세싱, 멀티 태스킹 (멀티의 지옥..)

 

⚡ 헷갈리지 않기 위해 알아 가야할 개념!

 

프로그램: 어떤 작업을 하는 실행할 수 있는 파일 (정적인 파일)

프로세서 : 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛( 하나이상의 ALU + Register을 가지고 있는, CPU)

 

동시성 : 동시에 실행되는 것처럼 보이지만 실제로는 한 개씩 돌아가면서 처리하고 있는 것 (직원이 한 명) -> 싱글코어에서 멀티 스레드를 동작시키기 위한 방식(멀티태스킹)

병렬성 : 실제로 동시에 여러 작업이 처리되는 것 (직원이 여러 명) -> 멀티코어에서 멀티 스레드를 동작시키는 방식

 

프로세스 제어블록 (PCB) : 운영체제(OS)가 프로세스를 제어하기 위해 정보를 저장한 곳, 프로세스의 상태를 저장한다.

스레드 제어블록 (TCB) : 운영체제(OS)가 각 스레드를 관리하기 위해 사용하는 데이터 구조로, 스레드의 상태와 관련된 정보를 저장한다.

    콘텍스트 스위치 : 스레드/프로세스가 교체되면서 일어나는 일 (PCB, TCB를 사용)
    언제 일어나는가? => 멀티 태스킹, 인터럽트 핸들링, 사용자 모드와 커널모드 전환 시에 사용된다.

    해당 기능을 사용하여 마치 한번에 여러개가 프로그램이 동시에 실행되는것처럼 보이게 한다.

 

⭐️ 프로세스(Process) : 실행 중인 프로그램, 컴퓨터에서 실행되고 있는 프로그램

프로세스의 개념, 특징

메모리에 올라와 실행되고 있는 프로그램 인스턴스

운영체제로 부터 시스템 자원을 할당받는 단위

기본적으로는 프로세스 1개당 1개의 스레드를 가진다(즉 스레드는 프로세스에 안에서 동작한다)

각 프로세스는 각각의 분리된 메모리 영역(Text(code), Data(Bss segment, Data segment), Heap, Stack)을 가진다.

  • 스택은 높은주소부터 할당되고 힙은 낮은 주소부터 할당된다.
  • 스택과 힙은 동적으로 런탐임 시에 할당된다.

각 프로세스를 PCB(프로세스 제어 블록)에 의해 관리되며 고유한 PID(Process ID)를 가지고 있다.

프로세스의 생성과 종료

프로세스의 상태 : 커널 내에 준비 큐, 대기 큐, 실행 큐 등의 자료구조를 활용하여 프로세스의 상태를 관리한다. (스케쥴링과 밀접한 관련이 있다) [생성 -> 실행 -> 대기 -> 실행과 같은 상태전이]

  1. 생성 (Created): 프로세스가 생성되고 메모리에 할당된 상태, 아직 실행되기 전의 초기 상태이다.
    1. 프로세스 생성은 부모 프로세스가 연산을 통해 자식 프로세스를 만들어낸다.
    2. 부모 프로세스의 작업흐름이 갈래로 나눠지는 경우 여러개의 프로세스로 하나의 작업을 구성할 수 있음
  2. 준비 (Ready): 실행 가능한 상태로, 프로세스가 CPU를 할당받기 위해 대기하고 있는 상태
  3. 실행 (Running): 현재 CPU를 할당받아 실행되고 있는 상태
  4. 대기 (Waiting): 프로세스가 특정 이벤트 발생이나 자원 사용 가능성을 기다리는 상태, 대기 상태에서는 CPU를 사용하지 않는다.
  5. 종료 (Terminated): 프로세스가 완료되어 메모리에서 해제되는 상태

EX ) 프로세스가 생성되면 준비 상태로 전이되고, CPU를 할당받으면 실행 상태로 전이된다. 이벤트 발생이나 I/O 작업 등으로 인해 프로세스가 대기해야 할 경우 대기 상태로 전이된다). 프로세스가 완료되면 종료 상태로 전이된후에, 메모리에서 해제된다.

[참고]Process state

프로세스간 통신, 동기화

다른스레드와 통신하기 위해서 는 IPC(Inter process communication) 방법을 사용해야 한다.

프로세스간 통신방법에는 파이프, 메시지 큐, 공유 메모리, 소켓, 파일 등이 있다. 아래 사이트에서 참고

IPC의 종류와 특징

동기화 : 프로세스 간의 동기화는 여러 프로세스가 동시에 접근하는 공유 자원의 일관성과 상호 배타적인 접근을 보장하기 위해 필요한 기능이다 (데드락 발생을 막기 위해서!)

세마포어, 뮤텍스, 조건 변수 등의 동기화 메커니즘을 사용하여 동기화를 구현할 수 있다.

[운영체제(OS)] 6. 프로세스 동기화(Process Synchronization)

! 오우 프로세스만 양이 이만큼이 나오다니! 갈길이 먼걸!!


⚡ 위에서 잠깐 이야기가 나왔지만 스레드는 프로세스 내에서 동작을 수행하는 주체이다. 이제는 스레드를 알아보자 😏

⭐️ 스레드 : 프로세스 내에서 실제로 작업을 수행하는 주체

스레드의 개념, 특징

  • 모든 프로세스는 한 개 이상의 스레드가 있다.
  • 프로세스가 할당받은 자원을 이용하여 실행되는 독립적인 실행 흐름이다. 한 프로세스 내에서 여러개의 스레드가 같이실행될 수 있다.(동시성)
  • 자신이 속한 프로세스의 메모리(code, data, heap)을 공유한다. stack만 따로 할당받는다.
  • 각 스레드가 프로세스의 메모리를 공유하고 스탭 영역만 context switching 하여 사용하기 때문에 시스템의 낭비가 적어진다.(장점!)

스레드 모델의 종류

단일 스레드 프로세스(싱글스레드) : 하나의 스레드만이 프로세스 내에서 실행되는 모델이다. 순차적으로 작업을 수행하며, 다른 작업이 시작되기 전에 이전 작업이 완료되어야 실행될 수 있다.

멀티 스레드: 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 모델로 각 스레드는 독립적인 작업을 수행하며, 서로 다른 스레드 간에 데이터를 주고받을 수 있다.

스레드의 장점

응답성 향상: 여러 개의 스레드를 사용하면 여러 작업을 동시에 처리하여 빠르게 응답할 수 있다.

자원 공유: 스레드는 프로세스 내의 자원을 공유하므로, 데이터나 메모리 등의 자원에 대한 효율적인 공유가 가능하다 (IPC 보다 빠르다)

경제성: 스레드는 프로세스의 생성과 종료보다 경제적이며, 작업 간의 전환에 소요되는 오버헤드가 적다.

스레드의 단점

동기화와 경쟁 조건: 여러 스레드가 동일한 자원에 접근할 때 동기화와 경쟁 조건에 주의해야 한다.

오류와 디버깅: 여러 스레드가 병렬로 실행되므로, 오류의 발생 및 디버깅이 어려울 수 있다.

병렬성 관리: 여러 스레드 간의 상호작용 및 병렬성을 관리하는 것이 복잡할 수 있다.

즉 스레드는 프로세스 메모리를 공유해서 다른 스레드와의 정보 공유가 쉽지만 한 스레드에 문제가 생기면 다른스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있는 단점이 있음

  • why?
    • 공유된 데이터 접근시의 문제
    • 데드락 문제가 발생할 수 있다 (하나의 스레드의 프로세스의 자원을 사용하고 있으면 다른 스레드가 해당 자원을 계속해서 기다리는 상태가 있을 수 있음)

[✓정리 - 프로세스 vs 스레드 ]

https://www.youtube.com/watch?v=1grtWKqTn50&ab_channel=우아한테크

  • 프로세스: 프로세서에서 실행하고 있는 프로그램, 실행되고 있는 프로그램(상태)으로 독립된 메모리 공간과 자원을 가지고 있다. 프로세스는 생성, 종료, 상태 전이를 통해 작업을 수행하고 프로세스간 통신과 동기화 작업을 통해 협력적으로 동작한다. 스레드 단위 작업을 지원하기 위한 자원 할당의 단위
  • 멀티 프로세스: 여러개의 ‘프로세스’, 즉 멀티 프로세스를 통해 한프로그램 내에서 동시에 두 가지 이상의 일을 수행할 수 있는것을 말한다.
    • 멀티 프로세스의 단점
      • 위에서 부모 프로세스가 여러 작업으로 나눠지는 경우 프로세스가 여러개로 나눠질 수 있다고 했다. 이 경우 프로세스는 모두 각각의 PCB를 가지고, 콘텍스트 스위치시에 모두 다시 올려야하는 시간이 길어 매우 비 효율적이다. 또한 부모 프로세스에서 여러 작업으로 나눠진 경우 서로 통신하기 위해서 IPC 통신 방법을 사용하여야 하는데 이 방법 또한 비효율적이다 → 스레드 출동
  • 스레드 : 프로세스 내에서 실제 작업을 수행하는 주체로 프로세스의 자원을 공유하여 효율적인 작업을 수행합니다. 스레드는 멀티스레딩, 단일 스레드, 다중 스레드 등의 모델로 사용된다
  • 멀티 스레드(멀티 스레딩) : 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업하지만 두 개 이상의 스레드가 동시에 작업하는 것을 의미한다. (한 프로그램 안에서 병렬 처리 하는 것)
    • 장점 : 프로세스를 생성하는 비용보다 싸다, 메모리를 공유해서 효율적이다. 스택 영역만 다시 올리면 된다
    • 단점 : 구현이 어렵다, 동기화 문제가 발생할 수 있다.

 

💡 참고 : 멀티 코어

위에서 말한 멀티 스레드, 멀티 프로세스는 처리방법의 일종으로 소프트웨어 관점으로 바라보아야 한다.

코어는 하드웨어 관점으로 바라보자

단일 코어 → 동시성 : 동시에 일어난게 아니지만 동시에 일어난것 처럼 보이게 만드는것

멀티 코어(병렬처리) → 물리적으로 동시에 여러개 동작 : 코어가 여러개인 경우 L2 캐시를 이용해서 스레드를 적재한다. 하지만 만약 프로그램 설계시에 멀티 스레딩을 미지원하게 코드를 짠 경우 멀티 코어가 있어도 하나의 코어만 사용해서 나머지가 놀고 있다.

따라서 멀티 코어를 고려하면 멀티 스레드를 구성하는 것이 좋다.

하지만 이런경우 위에서 말한것 처럼 한 프로세스안의 스레드 문제가 있을경우 같은 프로레스 내의 스레드도 같이 문제가 발생하고 같은 데이터를 공유하기에 데이터 동기화에 신경을 써야한다.

 

💡 더욱더 참고로 : 스프링에서 다중 유저 요청을 처리하는 방법 (Thread Poll)

스프링 부트는 내장 서블릿 컨테이너로 Tomcat을 사용한다.

Tomcat은 다중 요청을 처리하기위해 ThreadPoll을 생성한다.

HttpServletRequest 가 들어오면 Thread Poll에서 하나씩 Thread를 할당하여 Dispatcher Servlet을 거쳐 유저 요청을 처리한다. 이후에 스레드 풀로 스레드가 반환된다.

스프링부트는 어떻게 다중 유저 요청을 처리할까? (Tomcat9.0 Thread Pool)

 

💡 더더욱더 참고로 : 멀티 프로그래밍, 멀티 태스킹 (진화순서) - 영상을 요약하였습니다

Task는 자주 사용되는 용어는 아니라고 한다.

해당 용어를 여기서 꺼낸 이유는 멀티 테스킹! 과 멀티 프로세싱 멀티 스레딩이 아주 많이 혼동 되기 때문이다.

멀티 태스킹을 멀티 프로세싱, 멀티 스레딩과는 조금 다른 관점으로 봐야한다.

위에서 말했듯이 멀티 프로세싱과 멀티 스레딩은 한 어플리케이션의 동시 처리 작업을 위한 처리 단위이다.

  • 단일 프로세스 
    • IO 작업시간동안 기다리면서 프로세스가 동작함 → 너무 느리고 IO작업 동안 CPU는 쉰다.→ 멀티 프로그래밍 등작
  • 멀티 프로그래밍
    • 하지만 지금도 CPU 사용작업이 길어지면 다른 프로세스 게속 대기해야한다.
    • → 퀀텀단위(작은 시간)로 나눠서 여러개를 동시에 실행되는 것처럼 보이게 하자 → 멀티 태스킹 등장
  • 멀티 태스킹
    • 동시에 여러 프로그램을 실행시킨듯이 보이게 한다.
    • 응답시간을 최소화 시키는데 목적이 있다
    • 시간을 잘못 나누면 컨텍스트 스위칭에 시간을 다 쓴다
    • 하지만 하나의 프로세스가 동시에 여러작업을 하지는 못한다(마치 웹에서 하나의 브라우저만 쓸 수 있는 그런 상태)
      • 프로세스를 자손을 만들어서 하는 방법도 있지만 앞에서 말했듯 process의 컨텍스트 스위칭은 너무 무겁고 프로세스 간 통신(데이터 공유)도 어렵다. 또한 듀얼 코어가 등장해서 잘 쓰고 싶다! → 스레드 등작
  • 스레드 등장
    • 프로세스가 한 개이상의 스레드를 가질 수 있게 한다. cpu에서 실행되는 단위 (unit of execution) → 하나의 프로세스 내에 하나의 스레드
    • 스레드간 컨텍스트 스위칭이 가벼워짐, 자신들이 속한 메모리 영역을 공유한다.
  • 멀티 스레딩
    • 하나의 프로세스가 동시에 여러작업(스레드를 통해) 동작한다
    • 여기서 멀티 태스킹의 개념이 여러 프로세스와 스레드가 아주짧게 쪼개진 cpu 시간을 나눠 갖는것으로 변경됨
  • 멀티 프로세싱
    • 두 개 이상의 프로세서나 코어를 활용하는 시스템, 프로세서!가 멀티
  • 멀티 프로세스
    • 하나의 응용 프로그램을 여러개의 프로세스로 분리하여 실행하는것 프로세스!가 멀티
  • 요즘의 컴퓨터 동작방식

찐막 정리

  • 멀티프로그래밍(동시성): 프로세스를 실행하면서 입출력 작업과 같은 다른 작업을 하는 동한 다른 프로그램을 사용할 수 있게 하는 것. [ 자원을 아낀다, 시간을 효율적으로 사용] 하나의 프로세서
    마치 한번에 여러개 하는것 같지만 각 시간에 바라보면 한가지 일만 하고 있음(마치 내가 강의를 들으면서 유튜브를 보면 동시에 여러개 하는것 같지만 뇌속에 들어와서 보면 하고 있는것은 유튜브를 보고 있는것과 같은) - 프로그램 단위

헷갈리는 것

  • 멀티 프로세스(동시성) : 여러 개의 독립적인 프로세스가 동시에 실행되는 것을 의미한다. - 프로세스 단위
    • 각 프로세스는 자체적인 메모리 공간과 리소스를 가지고 있으며, 운영체제에 의해 관리된다.
    • 멀티 프로세스는 다중 프로세서 또는 다중 코어 시스템에서 병렬로 작업을 처리하는 것을 목적으로 한다.
    • 각 프로세스는 독립적으로 실행되며, 안정성과 격리성을 제공한다
    • 예를 들어, 여러 개의 프로그램이 동시에 실행되거나, 하나의 프로그램에서 여러 개의 서브 프로세스가 동시에 실행되는 경우 멀티 프로세스를 활용할 수 있다.
  • 멀티 프로세싱(병렬성) : 여러개의 프로세서가 협력적으로 하나 이상의 작업을 처리하는 것이다.
    • 다수의 프로세서가 여러 작업을 함께 처리하는, 여러 개의 프로세스를 사용하는경우이다
    • 여러 개의 프로그램들을 병렬적으로 처리한다.
    • 하나 고장 나도 다른 프로세서에서 실행가능, 각각의 독립된 메모리를 할당받아서 변수공유가 어렵다.

 

Reference(이미지, 자료 출처,참고) - 혹시 저작권 문제가 있을경우 바로 내리겠습니다.

[OS] 프로세스와 스레드 (Process VS Thread)

프로그램(Program), 프로세스(Process), 쓰레드(Thread)

 

프로세스

[운영체제] 프로세스가 뭐지?

프로세스 생성과 소멸

[운영체제(OS)] 6. 프로세스 동기화(Process Synchronization)

참고, 추천하는 영상들

이건 꼭 봐주세여

https://www.youtube.com/watch?v=QmtYKZC0lMU&ab_channel=쉬운코드

이건 추천

https://www.youtube.com/watch?v=1grtWKqTn50&ab_channel=우아한테크

https://www.youtube.com/watch?v=ktWcieiNzKs&ab_channel=우아한테크

FIN…

https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3dxemNsc2w2d2RuZ21lM2phb2x6dXJxajJwbGZoMGxrdTNvdmd2YyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26DNc9KWmxRd8nkUU/giphy.gif

728x90

'CS' 카테고리의 다른 글

운영체제, 프로세스와 스레드, 멀티 프로세스와 멀티 스레드  (0) 2023.02.23
DataBase  (0) 2023.01.15
IP와 TCP/UDP  (0) 2022.12.08

댓글