CS 지식

[CS] 프로세스란? 스레드란? 프로세스와 스레드의 차이

개발자엄지희 2023. 6. 5. 16:49
반응형
 

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

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

inpa.tistory.com

(↑ 더 자세하고 그림으로 설명되어있다! 이 글의 출처임을 밝힌다.)


프로세스와 스레드의 개념

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

프로그램은 뭐고 프로세스는 뭔데?

프로그램: 컴퓨터에서 실행할 수 있는 파일, 즉, 실행되어지지 않은 코드 덩어리
프로세스: 프로그램이 돌아가고 있는 상태, 즉, 컴퓨터에서 작업 중인 프로그램

그럼, 스레드란?

스레드: 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위


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

프로세스의 메모리 영역 구성

- 코드 영역(Code / Text)
  : 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장

- 데이터 영역(Data)
  : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여 있음

- 스택 영역(Stack)
  : 지역 변수와 같은 임시적인 자료를 저장하는 독립적인 공간

- 힙 영역(Heap)
  : 생성자, 인스턴스 등 동적 할당 데이터들을 위해 존재하는 공간

스레드의 자원 공유

스레드끼리는 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능하다.

프로세스의 4가지 메모리 영역(Code, Data, Heap, Stack) 중 스레드는 Stack만 할당받아 복사하고, Code, Data, Heap은 프로세스 내의 다른 스레드들과 공유된다. 따라서 스레드는 별도의 Stack을 가지지만, Heap 메모리는 공유하게 된다.

프로세스의 자원 공유

[프로세스 간 정보 공유 방법]
1. IPC(Inter-Process Communication) 사용
2. LPC(Local inert-Process Communication) 사용
3. 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정

다만, 프로세스 자원 공유는 CPU 레지스터 교체뿐만이 아니라 RAM과 CPU 사이의 캐시메모리까지 초기화되기 때문에, 자원 부담이 크다는 단점이 있다. 그래서 다중 작업이 필요한 경우 스레드를 이용하는 것이 훨씬 효율적이다.


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

멀티 코어와 스레드

코어: CPU 코어 유닛, 즉, 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛 (물리적 코어)
쓰레드: 프로세스와 스레드의 스레드와는 조금 다른 개념이다. CPU에서는 하드웨어적 스레드로 구분 (논리적 코어)

하이퍼스레딩 기술: 예를 들어, 4코어 8쓰레드이면 운영체제가 8개의 작업을 동시에 처리할 수 있다는 뜻이다.

CPU의 작업 처리 방식

병렬성(Parallelism): 여러 개의 프로세스, 스레드를 돌려 병렬로 작업들을 동시 수행하는 것
동시성(Concurrency): 둘 이상의 작업이 동시에 실행되는 것

병렬성은 물리적으로 정말로 동시에 실행하는 것이라면, 동시성은 동시에 실행하는 것처럼 보이게 하는 것

동시성(Concurrency)

프로세스를 번갈아가며 작업을 잘게 나누어 아주 조금씩만 작업을 수행, 매우 빠르게 처리하기 때문에 마치 프로그램이 동시에 실행되는 것처럼 보인다.

https://spacebike.tistory.com/22

이렇게 진행 중인 작업이 A -> B -> C -> D로 번갈아 바뀌는 것을 Context Switching 이라고 부른다.

동시성이 필요한 이유

1. 하드웨어적 한계:
물리적으로 코어를 수십 개 탑재할 수는 없고, 그렇다 하더라도 수십수백개의 프로세스를 돌리기 위해선 동시성이 필요

2. 논리적인 효율을 위해:
오래 걸리는 작업 8개, 짧게 걸리는 작업 8개가 있다고 했을 때, 가벼운 작업은 처리하는 데 짧은 시간이 걸리는 데에도 불구하고 현재 처리중인 8개의 작업이 다 끝날 때까지 기다려야 할 것이다. 이러한 비효율을 극복하기 위해 작업을 잘게 나눠 번갈아 가면서 처리하는 동시성 개념을 채택한 것이다.


 

프로세스 스케쥴링

프로세스 스케쥴링(Process Scheduling):
OS에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업

알고리즘 종류
- FCFS(First-Come, First-Served)
- SJF(Shortest-Job-First)
- Priority
- RR(Round-Robin)
- Multilevel Queue

프로세스 상태 전이

프로세스 상태 전이: 프로세스가 실행되는 동안 상태가 OS에 의해 변경되는 것
- Admitted (new -> ready) : 프로세스 생성을 승인 받음
- Dispatch (ready -> running) : 준비 상태에 있는 여러 프로세스들 중 하나가 스케줄러에 의해 실행됨
- Interrupt (running -> reay) :
  Timeout, 예기치 않은 이벤트가 발생하여 현재 실행 중인 프로세스를 준비 상태로 전환하고, 해당 작업을 먼저 처리
- I/O or event wait (running -> waiting) :
  실행 중인 프로세스가 입출력이나 이벤트를 처리해야 하는 경우, 입출력이나 이벤트가 끝날 때까지 대기 상태로 전환
- I/O or event completion (waiting -> ready) :
  입출력이나 이벤트가 모두 끝난 프로세스를 다시 준비 상태로 만들어 스케줄러에 의해 선택될 수 있는 상태로 전환


프로세스 컨텍스트 스위칭

컨텍스트 스위칭 (Context Switching): CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정

좀 더 자세히 설명하자면, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스상태복구하는 작업을 말한다.

PCB (Process Control Block)

프로세스 제어 블록:
  OS에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료 구조,
  즉, 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 저장하는 임시 저장소

컨텍스트 스위칭 (Context Switching) 과정

1) Executing Process P1
2) Interrupt or System Call (CPU is IDLE, 사용X 상태)
3) Process P1 상태 PCB 1에 저장
4) 다음 실행할 Process P2 선택
5) Reload Process P2 상태 from PCB 2
6) Executing Process P2
7) Interrupt or System Call (CPU is IDLE, 사용X 상태)
8) Process P2 상태 PCB 2에 저장
9) 다음 실행할 Process P1 차례가 됨
10) Reload Process P1 상태 from PCB 1
11) Executing Process P1 (아까 저장된 시점부터)

컨텍스트 스위칭 오버헤드 (Overhead)

- PCB 저장 및 복원 비용
- CPU 캐시 메모리 무효화에 따른 비용
- 프로세스 스케줄링 비용

보통 멀티 스레드라고 하면 여러개의 스레드가 동시에 돌아가니 프로그램 성능이 무조건 상승할거라 예상하지만, 이는 정확하지 않다. 컨텍스트 스위칭 오버헤드라는 변수 때문에 스레드 교체 과정에서 과하게 오버헤드가 발생하면 오히려 멀티 스레드가 싱글 스레드보다 성능이 떨어지는 현상이 나타날수 있기 때문이다.

스레드 스케쥴링

스레드 스케줄링(Thread Scheduling):
운영체제에서 다중 스레드를 관리하며, CPU를 사용할 수 있는 스레드를 선택하고, CPU를 할당하는 작업을 말한다.

- Roud Robin
- Priority-based scheduling
- Multi-level Queue scheduling

스레드 스케줄링은 프로세스 스케줄링과 다르게, 하나의 프로세스 내에서 다수의 스레드가 동작하는 형태이기 때문에, 스레드 간의 상호작용과 동기화 문제를 고려해야 한다.

스레드 컨텍스트 스위칭

스레드 컨텍스트 스위칭(thread context switching): 멀티 스레딩 환경에서 스레드 간의 실행을 전환하는 기술

프로세스 컨텍스트 스위칭과 다른점은 스레드 컨텍스트 스위칭은 하나의 프로내스 내의 스레드들을 교환한다는 점이다.

TCB (Thread Control Block)

TCB(스레드 제어 블록): 각 스레드마다 운영 체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조

스레드 간의 자원 공유와 동기화 기법
- 뮤텍스 (mutual exclusion): 임계 구역에 1개의 스레드만 들어갈 수 있는 동기화 기법
- 세마포어 (semaphore): 임계 구역에 여러 스레드가 들어갈 수 있고, counter를 두어 허용 가능한 스레드를 제한하는 기법 


프로세스 컨텍스트 스위칭 vs 스레드 컨텍스트 스위칭

1. TCB가 PCB보다 가볍다

결론부터 말하자면, 스레드 컨텍스트 스위칭이 프로세스 컨텍스트 스위칭보다 더 빠르다.

위에서 프로세스와 스레드의 메모리 섹션에서 다뤘듯이, 프로세스 내의 스레드들은 text, data, heap 영역 메모리를 공유하기 때문에 TCB에는 stack 및 간단한 register 포인터 정보만을 저장하기 때문에 PCB보다 TCB가 가벼워 더 빨리 읽고 쓸수 있다.

2. 캐시 메모리 초기화 여부

프로세스 컨텍스트 스위칭이 일어날 경우, 다른 프로세스의 실행으로 인해 CPU가 새로운 명령어와 데이터를 로드해야 하기 때문에 CPU 캐시 메모리를 초기화 하여야 한다. 이것이 프로세스 컨텍스트 스위칭에 부담이 되는 요소이다.

스레드 컨텍스트 스위칭일 경우, 프로세스 내 스레드 간에 스택과 레지스터 값 등 일부 컨텍스트 정보만 변경되므로 CPU 캐시 메모리는 초기화되지 않는다. 다만 스레드가 다른 CPU 코어에서 실행될 때는 해당 코어의 캐시 메모리에 스레드 컨텍스트 정보가 로드되어야 하므로 초기화될 수 있다.

3. 자원 동기화 문제

경쟁 조건 (race condition): 스레드 컨텍스트 스위칭이 발생해 다른 스레드가 heap 영역의 공유 데이터에 접근할때, 이전 스레드가 이미 공유 자원을 사용하고 있는 경우 동기화 문제가 발생


멀티 프로세싱과 멀티 스레딩

 

 

👩‍💻 멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리

멀티 프로세스와 멀티 스레드는 한 어플리케이션에 대한 처리방식 이라고 보면 된다. 단순히 프로그램을 여러개 띄워놓는 것이 멀티 프로세스가 아니라 이 둘은 언제 어느때에 어떤 방식으로

inpa.tistory.com

 

반응형