컴퓨터 구조 & 운영체제/운영체제

[운영체제] 스레드(Thread), 멀티 프로세스와 멀티 스레드

ReBugs 2023. 6. 27.

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


스레드

이 글에서 다루는 내용은 소프트웨어적 스레드이며, 스레드는 실행의 단위이다.

  • 스레드란 프로세스를 구성하는 실행의 흐름 단위
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.

 


 

프로세스와 스레드

단일 스레드 프로세스

  • 하나의 프로세스는 한 번에 하나의 일만 처리
  • 실행의 흐름 단위가 하나라는 점에서 이렇게 실행되는 프로세스를 단일 스레드 프로세스라고 부른다.

 

멀티 스레드 프로세스

  • 실행 흐름이 여러 개인 프로세스
  • 프로세스를 이루는 여러 명령어 동시 실행 가능

 

스레드의 구성요소

스레드는 프로세스 내에서 각기 다른 아래의 값을 가지고 있다.

  • 스레드 ID
  • 프로그램 카운터 값을 비롯한 레지스터 값
  • 스택

각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있다.
 
여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다는 점이다.
프로세스의 자원을 공유한다는 것이 스레드의 핵심이다.

위 그림을 보면 스레드 1만의 코드/데이터/힙 영역이 있는 게 아니고 스레드 1,2,3은 모두 같은 코드/데이터/힙 영역을 공유한다는 것이다.
 
정리하면 아래와 같다.

  • 스레드는 프로세스를 구성하는 실행의 흐름단위
  • 최근 많은 운영체제는 CPU에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달
  • 스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행

 


 

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

  • 멀티 프로세스 : 여러 프로세스를 동시에 실행
  • 멀티 스레드 : 한 프로세스에서 여러 스레드를 실행하는 것

 

동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 VS 하나의 프로세스를 여러 스레드로 실행

예를 들어, "hello, os"를 화면에 출력하는 프로그램이 있다고 가정

  • 이 프로그램을 3번 fork(복제)하여 실행하면 화면에는 "hello, os"가 3번 출력
  • 이 프로그램 내에 스레드를 세 개 만들어 실행하면 화면에는 "hello, os"가 3번 출력
  • 결과는 같다.

하지만 여기에는 큰 차이점이 있다.
프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점이다.
 
멀티 프로세스

  • 프로세스를 fork(복제)하면 코드 /데이터 / 힙 영역 등 모든 자원이 복제되어 저장됨
  • 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재
  • fork(복제)를 세 번, 네 번하면 메모리에는 같은 프로세스가 통째로 세 개, 네 개 적재
  • 프로세스끼리는 자원을 공유하지 않는다 -> 남남처럼 독립적으로 실행된다.
쓰기 시 복사(copy on write)
fork를 한 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하는 방법을 쓰기 시 복사 기법이라고 한다.
하지만 여기서는 이 기법을 쓰지 않는다고 가정
프로세스 간 통신
프로세스끼리는 기본적으로 자원을 공유하지 않지만, 프로세스끼리도 충분히 자원을 공유하고 데이터를 주고 받을 수 있다.
프로세스 간의 자원을 공유하고 데이터를 주고 받는 것을 프로세스 간 통신(IPC:Inter-Process Communication)이라고 부른다.
IPC에는 아래의 두가지 방법이 있다.
-파일을 통한 프로세스 간 통신
-공유 메모리

 
멀티 스레드

  • 스레드들은 프로세스 자원(코드/ 데이터/ 파일/ 힙 영역)을 공유
  • 실행에 필요한 각기 다른 최소한의 정보(프로그램 카운터 값을 포함한 레지스터 값, 스택)만으로 실행
  • 스레드는 프로세스의 자원을 공유한다 -> 협력과 통신에 유리하다.
프로세스의 자원을 공유한다는 특성은 때론 단점이 된다.
멀티 스레드 환경에서 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.
모든 스레드는 프로세스의 자원을 공유하고, 하나의 스레드에 문제가 생기면 다른 스레드도 영향을 받기 때문

댓글