[OS] 프로세스 (4) - 스레드

doongidoong·2024년 1월 18일
0

운영체제

목록 보기
5/8

✅ 스레드(Thread)란?


스레드는 프로그램 내에서 실행되는 최소 단위로, 프로세스의 자원을 공유하여 작업을 수행한다.

  • 프로세스는 컴퓨터 내 작업을 의미하고 스레드는 그 작업 내 존재하는 작은 흐름이다.

  • 스레드는 기본적으로 프로세스의 코드 영역, 데이터 영역, 힙 영역을 공유한다.

  • 반면 스택과 레지스터는 스레드별로 가진다.

💡 별도의 스택을 갖는 이유
독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을저장하기 위해 사용되는 메모리 공간이다.
따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 가능하게 한다.

💡 PC Resister를 쓰레드마다 독립적으로 할당하는 이유
PC 값은 쓰레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.
스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다.
그렇기 때문에 명령어가 연속적으로 수행되지 못하고어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다

✔️ 프로세스의 단점

  • 프로세스는 효율적이지 않다.
    • 프로세스별로 PCB를 갖고 있으며 운영체제의 자원을 소모한다.
    • 한 개의 PCB 구조체가 1.7KB를 차지한다.
    • 따라서 프로세스 생성이나 컨텍스트 스위칭이 비효율적이다.
  • 프로세스는 메모리를 공유하지 않는다.
    • IPC를 사용하지만 효율적이지 않은 경우가 있다. (스레드만큼 효율적이지 못하다.)


✅ 멀티 스레딩

프로세스와 스레드의 차이점은 멀티 프로세싱과 멀티 스레딩 환경에서 극명해진다. 이 두 가지를 비교하기 전에 멀티 프로그래밍, 멀티 태스킹에 대한 이해가 필요하다.

✔️ 멀티 프로그래밍

  • 과거에는 하나의 프로세스 처리가 끝나면 다음 프로세스를 진행했다. 이럴 경우 동시에 여러 프로세스를 실행시킬 수 없었고 무엇보다 프로세스 처리 속도와 입출력 속도 간의 차이로 입출력이 끝날 때까지 프로세서가 IDLE한 상태로 남았다.
  • 따라서 입출력의 작업을 대기할 동안 다른 프로세서의 일을 처리하는 것을 멀티 프로그래밍이라 한다.
    • 즉, 컨텍스트 스위칭을 수행하는 것
  • 이를 통해, CPU는 쉬는 시간 없이 항상 바쁘게 움직일 수 있다.

✔️ 멀티 태스킹

  • 태스크(운영 체제의 작업 단위, 프로세스보다 조금 확장된 개념)를 번갈아가면서 수행하는 것
  • 멀티프로그래밍에 시분할 개념(작업 시간을 정해두고 번갈아가면서 작업)을 도입한 개념이다.
  • 따라서 항상 바쁘게 움직이지만 매우 빠른 전환 속도로 전환해 마치 동시에 진행되는 것처럼 보이게 한다.(일루젼임. 실제로 동시에 되는 것은 아님)
  • 이를 위해 우리는 어떠한 프로세스를 다음에 처리할지 정하는 프로세스 스케줄링을 배우게 된다.

✔️ 멀티 프로세싱

  • 하나의 프로그램을 실행하기 위해 여러 개의 프로세스로 구성하여 다수의 프로세서(CPU)가 서로 협력적으로 일을 처리하는 것을 말한다.
  • 멀티태스킹과 다르게 정말로 병렬적으로 실행되는 개념이다.
    • 즉 여러 개의 프로세스가 동시에 실행된다.
  • 이를 위해서는 당연히 동시에 여러 개의 CPU가 돌아가야 하므로 멀티 프로세서이거나 멀티 코어 시스템이어야 한다.

✔️ 멀티 스레딩

  • 멀티 프로세스와 달리 쓰레드를 여러 개를 만들어 작업을 수행하는 방법
  • 프로세스는 여러 개의 쓰레드를 가질 수 있으므로 하나의 프로세스를 위해 여러 개의 쓰레드를 만들어 작업 단위별로 처리하는 방식이다.

💡 병렬성과 동시성

  • 프로세서가 여러 개인 경우 멀티 스레드를 통해 병렬성(Parallelism)을 높일 수 있다. 즉, 여러 작업이 동시에 수행될 수 있다.
  • 만약 프로세서가 하나인 경우엔 멀티 스레드를 통해 동시성(Concurrency)을 높일 수 있다.
    • 실제로는 각각의 시간에 한 작업만 수행되지만, 병렬적으로 수행되는 것처럼 보이는 것이다.
    • 한 개의 코어에서의 멀티스레딩은 진정한 멀티스레딩이라기보다는 시분할이라고 부르는 게 맞음.

➕ 멀티 프로세싱 vs 멀티 스레딩

스레드는 레지스터, 스택 이외는 공유하고 있기 때문에 생성 시 사용되는 비용이 적다. 또한 같은 프로세스 내 스레드끼리의 컨텍스트 스위칭 비용 또한 낮다.

이렇게 보면 멀티 프로세스에 비해 멀티 스레드가 확실히 유리해보인다.
하지만 멀티 프로그래밍, 멀티 스레딩 환경에서는 하나 더 고려해야할 점이 있다.

그것은 바로 동시에 같은 데이터를 참조할 경우이다. 동시에 같은 데이터를 참조하면서 서로 다른 연산을 수행할 경우 의도치 않은 결과가 일어날 수 있다.
스레드는 프로세스에 종속되어 있고 서로 같은 자원을 공유하기 때문에 하나의 스레드가 죽으면 다른 스레드에도 영향이 간다. 반면 프로세스는 각각 독립적인 공간을 가지고 있기 때문에 서로 영향이 없다.

이와 관련된 개념이 Critical Section이고 다음 챕터에서 다루도록 하겠다.

profile
안녕하세요! 신입 개발자입니다.

0개의 댓글