운영체제

[운영체제] Process와 Thread 의 차이

wjdwwidz 2024. 8. 17. 19:50

https://www.youtube.com/watch?v=x-Lp-h_pf9Q&t=0s


프로세스와 스레드 개요

 
Process 는 단위이다.  어떤 관리의 단위이며, 관리의 주체는 OS이다. 
 

프로세스 라고 하는것은 기본적으로 연산거리(명령어)의 집합 이다. 연산은 연속적이기 때문에 이어져서 하나의 흐름을 만든다.

이 흐름은 프로세스 수준에서 기본적으로 하나 존재하며, 이를 컨텍스트(Context) 또는 플로우(flow)라고 부르기도 한다. 연산은 외부 자극에 의해 변경될 수도 있다.

 

기본적으로 하나의 프로세스에는 반드시 하나의 스레드가 존재한다. 그러나 이 흐름이 하나가 아닌 여러 개로 분리될 수 있다. 한 프로세스 내부에 두 개 이상의 독립적인 실행 흐름이 존재하여, 동시에 또는 각각 작동하는 경우를 멀티스레드라고 한다.

 

프로세스가 여러 개인 경우, 이를 멀티태스킹이라고 부르며, 한 프로세스 내에서 실행 흐름이 여러 개인 경우를 멀티스레딩이라고 한다.


컴퓨터의 세계와 메모리 관리

컴퓨터의 세계는 세 개의 레이어로 이루어져 있다. 

유저(User) 레이어, 커널(Kernel) 레이어, 그리고 하드웨어(Hardware) 레이어이다.

 

하드웨어에는 CPU 같은 전산자원이 존재한다.

이 CPU 내 코어가 4개가 있다고 가정하자. 연산을 수행할 때, 하드디스크는 필요하지 않지만, 주기억장치인 RAM과 같은 1차 메모리는 필수적이다. 이는 아래 그림과 같다. 

 

 

메모리 할당과 가상 메모리

어떤 프로세스가 존재할 때, 그 프로세스는 연산을 수행하기 위해 여러 연산 코드들을 포함하고 있다. 연산을 수행하기 위해서 가장 먼저 필요한 전산자원은 CPU 이다. 운영체제는 프로세스를 관리하고 지원해야 하므로, 예를 들어 "CPU 0번을 사용해!"라는 식으로 명령을 내린다. 이때, CPU는 연산을 수행하기 위해 반드시 RAM과 같은 메모리 자원이 필요하다.

 

 

그러면 메모리를 일정 단위로 잘라(보통 page단위) , 프로세스에게 어느정도 부여한다.

 

중요한 점은, 하드웨어 수준에서 이 메모리가 물리적(피지컬) 영역이라는 것이다. 따라서 운영체제는 프로세스가 물리적 메모리(RAM)에는 직접 접근하지 못하도록 하고, 대신 가상 메모리라는 추상화된 메모리 공간을 제공한다. 프로세스는 이 가상 메모리를 통해 메모리 작업을 수행하게 되며, 실제 물리적 메모리(RAM)나 하드디스크와 같은 2차 메모리에 접근하는 것은 운영체제가 관리한다.

 

그러면 OS는 프로세스가 직접 CPU를 사용하거나,  피지컬 메모리에 접근하는 것들을 허용하지 않는다. 대신, 운영체제는 "너가 사용할 수 있는 메모리는 이만큼이야"라고 가상 메모리 공간을 지정해준다. 가상 메모리 시스템은 물리적 메모리를 기반으로 하지만, 프로세스는 직접 물리적 메모리를 사용하지 않고 가상 메모리 상에서 작업을 수행한다.

 

가상 메모리와 물리적 메모리

가상 메모리는 물리적 메모리(RAM)뿐만 아니라 하드디스크와 같은 2차 메모리도 포함한 메모리 공간을 추상화한 것이다. 이는 1차 메모리와 2차 메모리를 하나의 연속된 메모리 공간으로 인식하게 만든다.

 

 

 

간단히 말해, 가상 메모리를 통해 접근하는 메모리 공간은 RAM에 연결될 수도 있고, (노란색 부분을 부여받으면) 하드디스크와 같은 느린 저장 장치에 연결될 수도 있다. 가상 메모리 시스템은 이러한 차이를 감추고, 프로세스가 마치 동일한 메모리를 사용하는 것처럼 작동하게 한다. (둘 다 RAM 인 줄 알고 그냥 쓴다)

 

 

하드인데 좀 느리긴 하지만 그래도 작동이 안 되는 것보단 나으니까 하며 부여한다. 가상메모리는 동작 두 번 단계를 거치게 되어있는데 (1. 프로세스가 직접 참조하는 가상 주소 공간을 물리적 주소로 변환 2. 변환된 물리적 주소를 사용하여 실제 메모리(RAM)에 접근)

이로 인해, 모든 스레드는 가상 메모리 내에서만 작동하며, 운영체제는 이를 통해 스레드 간의 충돌이나 불필요한 메모리 접근을 방지한다.

 

즉 스레드가 여러 개 존재할 때, 각 스레드가 작동할 수 있는 범위가 가상 메모리로 제한된다. 운영체제가 가상 메모리를 통해 메모리 접근을 일관되게 관리하고, 스레드 간의 안전성과 효율성을 보장한다는 것이다. 

 


요약

  • Process라는 작업이 있다면 최소 한 개의 쓰레드(연산)를 가진다. 그래서 우리가 소위 실행을 시켜서 연산한다 라는 것은 쓰레드 단위로 진행된다. 
  • OS는 Process에게 가상메모리를 할당한다.
  • 따라서 Process에 속한 모든 쓰레드는 프로세스의 가상메모리 로 공간이 제약된다. 
  • 쓰레드 라는 것은 실질적인 연산을 하는 주체, 연산은 보통 쓰레드로 제한

 

멀티쓰레딩이 일어나면 "동시성" 이라는 이슈가 따라오는데, 이것은 "동기화" 이슈를 동반한다.

 

비유: 가구와 공간

비유를 들어 설명하자면, "프로세스"는 대한민국의 행정 체계에서 하나의 "가구"와 같다. 각 가구에는 "집"이라는 공간이 주어진다. 집 안에는 여러 "세대원"이 있으며, 이들은 각자 방을 갖고, 거실과 부엌 같은 공용 공간을 함께 사용한다.

  • : 프로세스에 할당된 가상 메모리 공간
  • 세대원: 스레드
  • : 각 스레드의 개인 공간, 즉 Thread Local Storage(TLS)
  • 거실, 부엌: 공용 공간으로, Heap에 해당

각 스레드는 Thread Local Storage(TLS) 라는 개인 공간을 가지며, 프로세스 수준에서 제공된 메모리 범위 내에서 작동한다.

 

 

프로세스 vs. 스레드

그렇다면 왜 프로세스를 여러번 실행시키지 않고, 쓰레드로 나눌까?

만약 일의 양이 어느정도 있고 1,2,3 번으로 나누었다고 치자.

1. 스레드마다 분산하는 경우 : 이 1,2,3번을 공유된 space 안에서 팀으로 묶어 진행하는 것

2. 프로세스를 사용하는 경우 : 따로 재택근무. 재택근무를 하면 가상메모리 라는 것이 각자 부여되는데, 각자의 Stack 과 Heap이 부여된다.

 

둘 중 무엇이 더 효율적이냐 에 대한 논쟁이 있는데 이것은 정책의 차이 이다. 

 

  • 스레드 중심 접근(윈도우 계열): 스레드를 사용하여 자원을 공유하며, 빠른 데이터 접근과 처리를 선호한다.
  • 프로세스 중심 접근(리눅스 계열): 독립적인 프로세스를 사용하여 자원 격리를 중요시하며, 안정성과 보안성을 우선시한다.

 

로 나뉘게 되며 도커 같은 가상환경도 프로세스 단위와 유사하게 작동하지만, 컨테이너마다 독립적인 가상 환경을 제공하여 프로세스와 스레드 간의 차이를 명확히 한다. 스레드와 프로세스의 선택은 다를 수 있으며, 이는 시스템의 요구사항에 따라 달라진다.