본문 바로가기
자바와 코틀린

프로세스와 스레드(운영체제 기본)

by pius712 2024. 7. 29.

1. 프로세스와 스레드

프로세스

프로세스란 프로그램의 데이터가 메모리에 올라와 CPU 에 할당되어 실행되는 상태를 말한다.

프로세스는 운영체제로 부터 자원을 할당 받는 단위이고, 프로세스는 독립적으로 메모리를 할당받는다.

프로세스의 메모리 구성

  • stack: 지역변수, 매개변수 등이 저장되는 공간으로 동적할당된다.

=== 아래 영역은 스레드에 의해 공유 ===

  • heap: 객체를 저장하는 공간으로 동적할당된다.
  • data: static 변수와 같은 전역적인 데이터를 저장하는 공간
  • code: .class 파일과 같은 실행될 코드를 저장하는 공간

컨텍스트 스위칭을 하려면 프로세스의 실행정보를 전환해야해서 비용이 크다.

스레드

스레드란 프로세스가 할당 받은 자원을 바탕으로 실행의 단위가 된다.

운영체제의 스케줄러에 의해 CPU 를 할당받아서 실행한다. 따라서, 프로세스가 실행되기 위해서는 최소 하나의 스레드를 가지고 있어야한다.

스레드는 각자의 stack 영역을 가지며, 그 외의 code, data, heap 영역을 공유한다.

따라서, 공유영역에서 동시성 문제가 발생할 수 있다.

참고로 스레드는 사용자 수준 스레드와 커널 수준 스레드로 구분될 수 있으며, 아래에서 이에 대해 추가로 설명하고자 한다.

2. 멀티태스킹과 멀티프로세싱(동시성과 병렬성)

CPU 가 작업을 동시에 처리하는 방식에 관한 내용으로

  • 멀티태스킹은 OS 관점에서 하나의 CPU 에 여러 작업이 실행되는 것을 말하며,
  • 멀티프로세싱은 HW 관점에서 여러 CPU 코어에서 작업이 실행되는 것을 말한다.

멀티태스킹(동시성)

멀티태스킹은 CPU 코어가 여러 작업을 빠르게 번갈아가면서 진행한다.

CPU의 효율성이 목적으로 한다. IO 작업으로 인해 CPU 작업이 블록되어 CPU 가 유휴상태(idle)상태가 되는 문제를 다른 작업을 처리하는 방식으로 해결한다.

CPU가 어떻게 작업을 할당받을지, 그리고 할당받은 작업을 얼만큼 실행하는지는 운영체제의 스케줄러에 의해 결정된다.

멀티프로세싱(병렬성)

멀티프로세싱은 CPU 여러 코어가 각 코어에서 실제로(물리적으로) 동시에 여러 작업을 하는 것을 말한다.

여러 스레드가 CPU에 할당되어 병렬로 작업을 수행한다.

컨텍스트 스위칭

컨텍스트 스위칭은 멀티태스킹(동시성 처리)을 지원하기 위해서 다른 프로세스 혹은 스레드로 전환하는 행위를 말한다.

프로세스 컨텍스트 스위칭

다른 프로세스로 전환하기 위해서는, PCB(Process Control Block) 라고 불리는 운영체제에서 관리하는 실행정보(자료구조)가 필요하다. PCB 는 아래의 역할을 한다.

  • 전환할 프로세스의 실행정보를 로드
  • 전환될 프로세스의 실행정보를 저장

위 역할을 하기 위해서 PCB 는 아래와 같은 내용들이 저장된다.

  • process id
  • process state
  • program counter
  • etc

컨텍스트 스위칭은 언제 발생하는가?

아래의 조건에서 프로세스는 컨텍스트 스위칭된다.

  • I/O 작업이 발생하여 프로세스가 waiting 상태로 전환된 경우
  • 할당된 시간을 모두 사용한 경우, 운영체제가 프로세스의 상태를 ready 상태로 전환한 경우

스레드 컨텍스트 스위칭

스레드의 경우도 컨텍스트 스위칭이 되며, TCB(Thread Control Block) 을 통해 스레드 실행정보를 보관한다.

프로세스와 달리, 스레드는 많은 데이터를 공유하기 때문에 스레드간 컨텍스트 스위칭은 비용이 적다.

3. CPU-Bounded vs I/O Bounded

CPU Bounded 작업은 주로 계산과 관련된 작업으로 CPU 작업을 많이 소모하는 것을 말한다.

반면, I/O Bounded 작업은 db, 네트워크 작업 등 CPU 가 아닌 입출력 장치에 의해서 데이터를 읽고 쓰는 작업을 의미한다. 입출력 장치에 의해 데이터를 읽고, 쓰는 것은 CPU 가 아닌 하드웨어 장치에 의해 이루어지므로 CPU 가 유휴상태(idle) 상태에 빠지게 된다.

일반적인 운영체제 책에는 CPU 코어 개수와 스레드 개수가 비슷할 때, 가장 좋은 성능을 낸다고 설명한다.

하지만, 일반적인 web application 서버의 경우 DB나 네트워크 작업이 많은 비중을 차지한다. 즉 I/O 작업의 비중이 높기 때문에 코어 개수보다 많은 스레드를 설정해두는 것이 일반적이다.

4. 사용자모드와 커널모드

OS 는 application이 H/W 에 직접 접근하지 못하게 한다. 그래서 사용자 application 은 OS 를 통해 H/W 에 접근하게 된다. CPU 는 명령어를 수행할 때, 2가지 모드로 구분될 수 있다.

  • 사용자모드: 유저영역(사용자의 application 메모리 영역)에만 접근 가능
  • 커널모드: 유저영역과 커널 영역 모두 접근 가능. 하드웨어에 대한 제어가 가능

이러한 전환은 스레드의 모드가 변경되는 것으로, 별도의 스레드로 변경되는 것은 아니다.

어떻게 application 은 H/W 에 접근하는가?

application 코드 작성시 OS나 파일 입출력 같은 라이브러리를 제공하기도 하는데,

이러한 I/O 작업을 할 때 application 은 내장 라이브러리를 통해서 system call 을 하게 된다.

그러면, 실행중이던 스레드가 커널모드로 전환한다.

5. 멀티스레딩 모델 (User Level Thread와 Kernel Level Thread)

User Level Thread

  • 유저 영역에서 사용되는 스레드로, 운영체제에서는 알지 못하는 스레드이다. JVM 의 스레드와 같은 어플리케이션 레벨의 스레드를 지칭한다.

Kernel Level Thread

  • 운영체제가 관리하는 스레드로 OS의 스케줄러에 의해서 관리된다.
  • CPU 는 커널 수준의 스레드를 실행한다.

CPU 는 커널 수준의 스레드만 알고 있기 때문에, 멀티스레딩 모델의 프로세스를 실행하려면 커널 수준 스레드와 유저 수준 스레드의 매핑이 필요하다. 이 매핑은 아래와 같은 방식으로 구현이 가능하다.

  • 다대일 스레드 매핑
  • 일대일 스레드 매핑
  • 다대다 스레드 매핑

다대일 스레드 매핑 모델

유저 수준의 스레드 여러개가 커널 수준 스레드 하나에 매핑되는 모델이다.

스레드 실행에 대한 정보를 application 내에서 관리한다.

이 경우 멀티프로세싱(병렬처리)이 불가능하다.

왜냐하면, 하나의 스레드가 I/O 작업시 커널 수준 스레드도 블락되기 때문에, 다른 유저 수준 스레드도 블락된다.

일대일 스레드 매핑 모델

유저 수준 스레드와 커널 수준 스레드가 1:1로 매핑되는 모델이다.

스레드 실행 정보(TCB)와 프로세스 실행 정보(PCB)를 모두 커널에서 관리한다.

자바의 Thread 가 이 모델을 사용한다.

이 경우 멀티프로세싱(병렬성)이 가능하다.

즉, 프로세스가 여러 코어에 의해 실행될 수 있다.