운영체제

프로세스(Process) vs 스레드(Thread)

rnrwk0502 2024. 8. 16. 23:42

프로그램(Program)이란

- 사전적 의미 : 어떤 작업을 위해 실행할 수 있는 파일

- 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태

 

프로세스(Process)란

- 사전적 의미 : 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램

  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 ( 독립적인 개체 )
  • 운영체제로부터 시스템 자원을 할당받는 작업의 단위 
  • 즉, 동적인 개념으로는 실행된 프로그램을 의미한다.

 - 할당핟는 시스템 자원의 예

   : CPU시간, 운영에 필요한 주소공간, Code, Data, Stack, Heap의 구조로 된 독립된 메모리 영역

프로세스 특징

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
    • Code 영역 : 프로그래머가 작성한 프로그램이 저장되는 영역
    • Data 영역 : 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들이 모여있다.
    • Stack 영역 : 호출한 함수가 종료되면 되돌아올 메모리의 주소나 지역변수 등이 저장된다.
    • Heap 영역 : 동적으로 할당되는 데이터를 위해 존재한다.
  • 기본적으로 프로세스당 최소 1개의 스레드를 가지고 있다.
  • 각 프로세스는 별도의 주소공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신을 사용해야 한다.

 

스레드(Thread)란

- 사전적 의미 : 프로세스 내에서 실행되는 여러 흐름의 단위

- 프로세스의 특정한 수행 경로

- 프로세스가 할당받은 자원을 이용하는 실행의 단위

스레드 특징

  • 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드도 그 변경 결과를 즉시 볼 수 있다.

스레드의 장점과 단점

- 장점

  • 반응성 : 특정 스레드가 I/O작업을 처리중이거나(blocked) 긴 작업을 수행중이어도 다른 스레드는 본인의 일을 계속할 수 있다.
  • 자원 공유 : 프로세스는 Shared Memory나 message passing과 같은 기법을 이용해서 자원 공유가 가능하지만, 스레드끼리는 프로세스의 자원을 서로 공유한다.
  • 경제적 : 프로세스의 자원을 공유하기 때문에 새로운 주소공간을 할당받을 필요가 없어 생성에 자원이 적게 들어간다. 스레드 간 컨텍스트 스위칭을 할 때 캐시 메모리를 안비워도 된다. 오버헤드가 적다.
  • 확장 가능성

- 단점

  • 공유자원을 사용하기 때문에 동기화 문제를 고려해야 한다.
    • lock을 하므로써 공유자원에 대한 동기화를 해결할 수 있는데, 병목현상이 생길 수 있다.

 

CPU의 작업 처리 방식

병렬성 (Parallelism)

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

 

동시성 (Concurrency)

- 동시성은 둘 이상의 작업이 동시에 실행되는 것을 의미한다. 이 '동시'라는 의미에서 병렬성과 동시성의 한글의미가 헷갈릴 수 있다. Parallelism가 물리적으로 정말로 동시에 실행하는 것이라고 하면, Concurrency는 동시에 실행하는 것처럼 보이게 하는 것으로 이해하면 된다.

 즉, 1개의 코어가 있고 4개의 작업이 있다고 가정하면, 하나의 코어가 프로세스들을 계속 번갈아가면서 조금씩 처리함으로써 마치 프로그램이 동시에 실행되는 것처럼 보이는 것이다.

 단, 이때 작업들을 번갈아가면서 실행할때 작업들을 잘게 나누어 조금씩 작업을 수행하고 다음 작업으로 넘어가는 식으로 동작된다. 이는 여러 작업을 동시에 처리하는 것처럼 보이게 만들어 사용자에게 더 빠른 반응성을 제공하기 위해서다.

이렇게 진행중인 작업들을 번갈아 바꾸는 것을 Context Switching이라고 부른다.

 

동시성이 필요한 이유

- 첫번째는 하드웨어적 한계때문이라고 할 수 있다. 코어의 개수 증가에는 한계가 있기 때문에 수십수백개의 프로세스를 돌리기 위해서 결국 동시성이 필요한 것이다.

- 두번째는 보다 논리적인 효율을 위해서다. 예를 들어, 4코어 8스레드의 CPU환경에서 현재 총 16개의 작업이 있다고 하자. 그중 8개는 오래 걸리는 작업이고, 8개는 필요한 시간이 짧은 작업이라고 하자. 8개의 코어로 최대 8개까지 동시에 실행할 수 있을텐데, 만약 최악의 경우 8개의 오래걸리는 작업이 먼저 처리되기 시작했다면, 나머지 가벼운 8개의 작업을 처리하는데 짧은 시간이 걸리는데 불구하고 현재 처리중인 작업이 다 끝날 때까지 기다려야 할 것이다. 따라서 이러한 비효율적인 면을 극복하기 위해 작업을 잘게 나눠 번갈아가면서 처리하는 동시성 개념을 채택한 것이다.

 

멀티 프로세스 vs 멀티 스레드

멀티 프로세스 (Multi Process)

  • 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
  • 장점
    • 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 해당 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다. ( 안정성 )
  • 단점
    • Context Switcing에서의 오버헤드 - 프로세스는 각 독립된 메모리 영역을 할당받았기 때문에 공유하는 메모리가 없다. 따라서 캐시 메모리 초기화 등의 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생할 문제가 있다.
    • 프로세스 간 통신 기법 IPC - 프로세스는 각 독립된 메모리 영역을 할당받았기 때문에 프로세스들 사이에서 변수나 자료구조를 공유할 수 없다. 따라서 IPC라는 방법을 사용해야 하며, 이는 어렵고 복잡한 통신방법이다.

멀티 스레드 (Multi Thread)

  • 하나의 응용 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것
  • 윈도우, 리눅스 등 많은 OS들이 멀티 프로세싱을 지원하고 있지만, 멀티 스레딩을 기본으로 하고 있다.
  • 장점
    • 메모리 공간과 시스템 자원 소모가 줄어들게 된다.
    • 스레드 간 통신시, 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap영역을 이용해 데이터를 주고 받으므로 통신 방법이 간단하다.
    • Context Switching 시, 캐시 메모리를 비울 필요가 없기 때문에 비용이 적고 더 빠르다. 따라서 시스템의 처리량이 향상되고 자원 소모가 줄어들며, 자연스레 프로그램의 응답시간이 단축된다.
  • 단점
    • 서로 다른 스레드가 Data, Heap 영역 등을 공유하기 때문에 자원 공유에서 동기화 문제가 발생할 수 있다.
    • 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
    • 주의 깊은 설계가 필요하며, 디버깅이 까다롭다.

멀티 프로세스 대신 멀티 스레드를 사용하는 이유?

  • 멀티 프로세스 대신 멀티 스레드를 사용하는 것의 의미?
    • 쉽게 설명하면, 프로그램을 여러개 켜는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.
  • 멀티 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 여러 스레드로 나눠서 하는 이유?
    • 자원의 효율성 증대 - 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다. 
    • 처리 비용 감소 및 응답 시간 단축 - 프로세스 간의 통신(IPC)보다 스레드 간 통신의 비용이 적으므로 작업들 간의 통신의 부탐이 줄어든다. 

 

프로세스의 상태

- 생성 상태 ( new ) : 메모리에 적재되어 프로세스로 변환될 준비가 된 상태

- 준비 상태 ( ready ) : CPU점유를 위해 기다리는 상태

- 실행 상태 ( running ) : CPU를 점유한 상태

- 대기 상태 ( wainting ) : CPU를 점유해도 Process 자신이 요청한 event가 즉시 만족되지 않아, 이를 기다리는 상태

- 완료 상태 ( Terminated ) : Process가 종료된 상태, PCB가 삭제된다.

PCB ( Process Control Block )

  • PCB는 Process Control Block의 약자로 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태정보를 담고 있는 자료구조를 말한다.
  • 프로세스가 생성되면 메모리에 해당 프로세스의 PCB가 함께 생성되고, 종료 시 삭제된다.

따라서 운영체제는 PCB에 담긴 프로세스 고유 정보를 통해 프로세스를 관리하며, 프로세스의 실행 상태를 파악하고, 우선 순위를 조정하며, 스케줄링을 수행하고, 다른 프로세스와의 동기화를 제어한다.

  • PCB가 저장중인 정보
    • 프로세스 식별자(Process ID) : 프로세스를 구분하는 식별자
    • 포인터 (Pointer) : 부모 프로세스에 대한 포인터, 자식 프로세스에 대한 포인더, 프로세스가 위치한 메모리 주소에 대한 포인터 등
    • 프로세스 상태 (Process State) : 생성, 준비, 실행, 대기, 종료 등의 상태가 존재한다.
    • 프로그램 계수기 (Program Counter) : 프로세스가 다음에 실행할 명령어의 주소를 가르킨다.
    • 레지스터(Register) : Accumulator, CPU Register, General Register 등 범용 레지스터를 포함하는 CPU레지스터에 있는 정보가 있다.
    • 메모리 제한(Memory Limits) : 운영체제에서 사용하는 메모리 관리 시스템에 대한 정보가 존재한다.
    • 열린 파일 목록(List of open file) : 프로세스를 위해 열린 파일목록이 담겨있다.

 

스레드 상태 

 

TCB

 

Context Switching이란?

- CPU는 한번에 하나의 프로세스만 처리할 수 있다. 여러 프로세스를 처리해야 하는 상황에서 현재 진행중인 Task(프로세스, 스레드)의 상태를 PCB에 저장하고 다음에 진행할 Task의 상태값을 읽어 적용하는 과정을 말한다. (다른 프로세스에게 CPU를 할당해 작업을 수행하는 과정을 말한다.)

  • 과정
    • Task의 대부분 정보는 레지스터에 저장되고 PCB로 관리된다.
    • 현재 실행하고 있는 Task의 PCB정보를 저장한다.
    • 다음 실행할 Task의 PCB정보를 읽어 레지스터에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행할 수 있다.
  • Context Switching은 많은 비용이 소모된다.
    • Cache 초기화
    • 메모리 Mapping 초기화
    • 커널은 항상 실행되어야 한다.
  • Context Switching의 비용은 프로세스가 스레드보다 많이 든다. - 이유 : 스레드는 Stack영역을 제외한 모든 메모리를 공유하기 때문에 Stack 영역만 변경하면 되기 때문이다.

 

출처

https://gilssang97.tistory.com/59

 

프로세스(Process), 스레드(Thread)

시작하기에 앞서 우리는 자바 프로그래밍을 진행하다보면 멀티 쓰레딩을 마주치곤 한다. 나에게 프로세스가 무엇인가, 스레드가 무엇인가, 멀티 프로세싱과 멀티 쓰레딩의 차이가 무엇인가에

gilssang97.tistory.com

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://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Operating%20System/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80%20%EC%8A%A4%EB%A0%88%EB%93%9C.md

 

Ready-For-Tech-Interview/Operating System/프로세스와 스레드.md at master · WooVictory/Ready-For-Tech-Interview

💻 신입 개발자로서 지식을 쌓기 위해 공부하는 공간 👨‍💻. Contribute to WooVictory/Ready-For-Tech-Interview development by creating an account on GitHub.

github.com

 

'운영체제' 카테고리의 다른 글

Docker & 가상화  (0) 2024.09.13
Sync/Async & Blocking/Non-Blocking  (0) 2024.09.01
상호 배제 / 동기화 (Mutex, Semaphore, Monitor)  (0) 2024.09.01
교착상태 / 기아상태  (0) 2024.08.17
경쟁상태(Race Condition)  (0) 2024.08.17