ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쓰레드는 뭘까?
    Apple🍎/Cocurrency 2025. 1. 27. 21:36

    프로세스의 도입으로 하나의 CPU 코어를 여러 프로그램이 시분할(time-sharing) 방식으로 공유할 수 있게 되었습니다.

    운영체제는 각 프로세스에 CPU 시간을 조금씩 할당하여 마치 여러 프로그램이 동시에 실행되는 것처럼 보이게 합니다.

     

    메모장, 웹브라우저, 유튜브를 동시에 실행하는 상황을 예로 들어보겠습니다.

    메모장에서 파일 저장과 같은 I/O 작업이 발생하면, 해당 프로세스는 I/O 작업이 완료되기를 기다리는 'blocked' 상태로 전환됩니다.

    이때 운영체제는 CPU 자원을 웹브라우저나 유튜브와 같은 다른 실행 가능한('ready') 상태의 프로세스들에게만 할당합니다.

     

    그렇지만 메모장 프로그램이 파일을 디스크에 저장하는 동안에도 사용자는 계속해서 텍스트를 입력하거나, 맞춤법 검사 결과를 확인하거나, 자동 저장등의 다른 기능들이 동작하기를 기대합니다. 하지만 프로세스가 I/O 작업으로 인해 blocked 상태가 되면 CPU 자원을 할당받지 못하므로 이러한 작업들을 수행할 수 없게 됩니다.

     

    이것은 단일 프로세스로는 해결하기 어려운 문제입니다.

    하나의 프로세스는 I/O 작업을 수행하는 동안 다른 모든 작업도 함께 중단될 수밖에 없기 때문입니다.

     

    그렇다고 하나의 프로그램 안에서 여러 작업이 가능하게 하기 위해서 여러 프로세스를 만들면 다음 문제들이 발생합니다. 

    메모장 프로그램을 여러 프로세스로 만든다고 가정해봅시다.

    입력 처리를 위한 프로세스, 파일 저장을 위한 프로세스, 맞춤법 검사를 위한 프로세스로 나눈다면 다음과 같은 문제들이 발생합니다.

     

    1. 메모리 사용량이 크게 증가합니다.

    예를 들어 메모장에서 작성 중인 문서 내용은 모든 프로세스가 접근해야 하는 데이터입니다.

    하지만 각 프로세스는 독립된 메모리 공간을 가지므로, 같은 문서 내용을 각각의 프로세스가 따로 저장해야 합니다. 만약 1MB 크기의 문서를 편집한다면, 세 개의 프로세스에서 총 3MB의 메모리가 필요하게 됩니다.

     

    2. 프로세스 간 통신(IPC)의 오버헤드가 매우 큽니다.

    사용자가 텍스트를 입력할 때마다 입력 처리 프로세스는 새로운 내용을 맞춤법 검사 프로세스와 파일 저장 프로세스에 전달해야 합니다.

    이러한 프로세스 간 통신은 파이프나 공유 메모리 같은 IPC 메커니즘을 사용해야 하는데, 이는 단순한 메모리 접근에 비해 매우 큰 비용이 듭니다.

     

    3. 프로세스 생성과 관리에 많은 시스템 자원이 필요합니다.

    각 프로세스는 자신만의 프로세스 제어 블록(PCB)을 가지며, 컨텍스트 스위칭 시에도 더 많은 정보를 저장하고 복원해야 합니다.

    이는 시스템의 전반적인 성능 저하로 이어질 수 있습니다.

     

    결국 하나의 프로그램을 여러 프로세스로 분할하는 것은 자원 낭비가 심하고 비효율적인 해결책이 됩니다.

    우리는 하나의 프로세스 안에서 여러 작업을 동시에 처리할 수 있는 더 효율적인 방법이 필요했습니다. 

     

    쓰레드는 "프로세스 내에서 실행되는 작업의 흐름" 단위입니다.

    하나의 프로세스가 여러 개의 쓰레드를 가질 수 있으며, 이들은 프로세스의 자원을 공유합니다.

     

    1. 메모리 효율성

    앞서 본 것처럼 여러 프로세스를 사용할 때는 각 프로세스마다 메모리 공간이 중복되었습니다.

    하지만 쓰레드는 프로세스의 메모리 공간을 공유합니다. 프로그램 코드, 전역 변수, 힙 메모리 등을 모든 쓰레드가 함께 사용할 수 있어 메모리 사용이 효율적입니다. 각 쓰레드는 자신만의 스택과 레지스터만 가집니다.

     

    2. 빠른 문맥 교환(Context Switching)

    프로세스 간 전환할 때는 메모리 맵, 파일 디스크립터 등 많은 정보를 저장하고 복원해야 합니다.

    반면 쓰레드 간 전환은 스택과 레지스터만 바꾸면 되므로 훨씬 빠릅니다. 이는 실시간 작업이 필요한 상황에서 큰 장점이 됩니다.

     

    3. 효율적인 통신

    앞서 프로세스들 간에는 IPC라는 복잡한 메커니즘이 필요했습니다.

    하지만 쓰레드들은 같은 메모리 공간을 공유하므로, 간단히 공유 변수를 통해 데이터를 주고받을 수 있습니다.

     

    구체적인 예시를 통해 살펴보면

    1. 사용자가 텍스트를 입력하면 입력 처리 쓰레드가 이를 공유 메모리에 저장합니다.

    2. 맞춤법 검사 쓰레드는  공유 메모리를 직접 읽어 검사를 수행합니다.

    3. 동시에 자동 저장 쓰레드는 주기적으로 같은 데이터를 파일로 저장할  있습니다.

     

    하나의 메모장 프로세스내에서 여러 쓰레드를 활용하기 때문에 하나의 쓰레드가 I / O 작업 등으로 Block 되어도 다른 쓰레드를 통해 프로그램 작동에 필요한 다른 일들에 CPU 자원을 할당 받아 작업을 수행할 수 있습니다. 

     

    이처럼 쓰레드는 프로세스의 장점(독립적인 실행 단위)은 유지하면서, 동시에 여러 작업을 효율적으로 처리할  있게 해줍니다. 

    'Apple🍎 > Cocurrency' 카테고리의 다른 글

    프로세스는 뭘까?  (0) 2025.01.27
    동시성 이해를 위한 컴퓨터 기본 구조  (0) 2025.01.26

    댓글

Designed by Tistory.