-
테스크는 뭘까?Apple🍎/Cocurrency 2025. 2. 7. 21:06
카페 체인점을 차려보자
프로그램 ( Program )
가장 먼저, 프로그램은 카페 체인점의 운영 메뉴얼이라고 생각할 수 있습니다.
실제로 점포를 내고 운영중인 상태는 아니지만 새로운 체인점을 차리게 된다면 필요한 목록과 밟아야하는 절차에 대해서 명시해놓은 책자입니다.
아직 실행되지 않아 메모리 위에 올라오지 않고 디스크에만 저장된 정적인 상태입니다.
메뉴얼에는 다음과 같은 내용이 있을 수 있습니다.
- 카페를 어떻게 운영할지에 대한 전체 계획 ( = 시스템 아키텍쳐 )
- 필요한 장비와 재료 목록 ( = 하드웨어 자원 , 데이터 )
- 직원들이 따라야할 절차와 규칙 ( = 비즈니스 로직 )
- 메뉴 레시피 및 제조 방법 ( = 함수, 메서드 )
프로세스 ( Process )
프로세스는 위 메뉴얼을 바탕으로 실제로 오픈한 카페 지점입니다.
프로그램이 실행되어 메모리에 올라온 상태
각 지점은 다음과 같은 특징을 같습니다.
- 각 지점은 자신만의 공간과 자원을 가집니다.
- 다른 지점과 독립적으로 운영됩니다.
- 문을 열고 닫을 때마다 새로운 공간과 자원을 할당받습니다.
쓰레드 ( Thread )
주문 여러개를 동시에 처리하기 위해서 옆에 새로운 카페를 차리기보다는 하나의 카페에 여러 직원을 두는 것이 효율적입니다. 즉 카페 지점에서 일하는 직원들을 쓰레드로 볼 수 있습니다.
하나의 프로세스내에서 자원을 공유하며 독립적인 실행이 가능한 단위
- 같은 지점의 직원들은 커피머신과 같은 자원을 같이 사용합니다.
- 하나의 카페내에서 직원들은 커피를 내리고 디저트를 만드는 등의 다양한 일을 독립적으로 수행할 수 있습니다.
- 하나의 직원은 커피머신을 작동시켜 놓고 이를 기다리지 않고 손님에게 주문을 받을 수 있습니다.
테스크 ( Task)
"아이스 아메리카노, 헤이즐넛 시럽 추가 1잔"이나 "따뜻한 카페라테 2잔, 호두파이 1조각" 과 같이 개별 고객의 주문을 테스크라고 할 수 있습니다.
실행의 논리적인 단위로, 프로그래밍 수준에서 추상화된 독립적으로 수행될 수 있는 코드 묶음
- 주문서가 완료되기 위해서는 해당 주문서를 맡아 실제로 실행하는 직원이 배정되어야합니다.
- 어떤 직원이 처리하든 같은 결과물이 나와야합니다.
- 주문들 사이에 우선순위를 둘 수 있습니다.
- 하나의 주문서에는 여러 세부 요구사항이 존재할 수 있습니다.
- 하나의 주문서를 완료하기 위해 수행해야하는 작업을 여러 직원이 나누어 할 수 있습니다.
테스크의 실행
현대의 소프트웨어는 여러 기능들이 유기적으로 연결된 복잡한 시스템입니다.
예를 들어 인스타그램에서는 피드 업데이트, 게시물 업로드, 댓글 작성 등의 다양한 기능들이 있고 각 기능들을 수행하기 위한 코드들이 하나이상의 작업으로 묶여 관리됩니다.
이러한 코드들이 실제로 실행되기 위해서는 시스템 차원에서 물리적 자원(CPU시간, 메모리 등)이 필요한데, 이러한 자원은 운영체제가 프로세스와 쓰레드라는 개념을 통해 이 자원들을 효율적으로 할당하고 관리합니다.
따라서 어떤 프로그램의 기능이 실행되기 앞서 반드시 프로세스나 쓰레드 같은 형태로 운영체제에 등록이 되어야 필요한 컴퓨팅 자원을 할당받을 수 있습니다.
즉 테스크는 어떠한 기능을 수행하기 위한 하나의 명세에 불과하고 해당 명세가 실제로 작동하기 위해서는 먼저 쓰레드를 할당받아합니다.
쓰레드 잘 나눠주기
물리적 한계
컴퓨터 시스템의 핵심적인 물리적 제약은 CPU 코어의 수입니다. 예를 들어, 4코어 CPU를 가진 컴퓨터에서는 실제로 동시에 실행할 수 있는 작업은 물리적으로 4개로 제한됩니다.
우리가 프로그래밍에서 100개의 쓰레드를 생성할 수 있어도, 실제로 동시에 100개의 작업이 처리된다는 의미가 아닙니다.
왜냐하면 각 쓰레드가 실행되기 위해서는 반드시 CPU 코어가 필요하기 때문입니다. 결국 100개의 쓰레드는 4개의 CPU 코어를 시분할하여 사용하게 됩니다.
이러한 물리적 제약 때문에, 무작정 많은 쓰레드를 생성하는 것은 오히려 쓰레드간의 컨텍스트 스위칭 비용과 각 쓰레드마다 관리되는 메모리와 시스템 자원을 증가시켜 시스템 성능을 저하시킬 수 있습니다.
따라서 효율적인 Task 실행을 위해서는
1. 시스템의 CPU 코어 수를 고려한 적절한 수의 쓰레드 수를 유지하고
2. 이 제한된 수의 쓰레드들을 각 Task 들에게 효율적으로 할당하는 것이 중요합니다.
쓰레드 풀 ( Thread Pool )
프로그램이 시작될 때 미리 정해진 수의 쓰레드들을 생성하여 대기 상태로 유지합니다. 이렇게 미리 생성된 쓰레드들의 모음을 "풀(Pool)"이라고 부릅니다. 새로운 작업 요청이 들어오면, 풀에서 대기 중인 쓰레드를 하나 할당하여 해당 작업을 수행하게 합니다.
작업이 완료되면 해당 쓰레드는 다시 풀로 반환되어 다른 작업을 위해 대기하게 됩니다.
- 쓰레드의 생성과 소멸은 시스템에 부하를 주는 작업입니다. 따라서 작업마다 새로운 쓰레드를 생성하고 완료되면 이를 정리하는 것보다. 미리 만들어둔 쓰레드 수를 유지하며 재활용하는 방법은 시스템 부하를 크게 줄일 수 있습니다.
- 동시에 실행 될 수 있는 쓰레드 개수를 제한함으로써 시스템 자원을 효율적으로 관리할 수 있습니다.
작업 큐 ( Task Queue )
작업 큐는 쓰레드를 할당받기 위해 기다리는 작업들을 순서대로 보관하는 대기열입니다.
디스패쳐 ( Dispatcher )
디스패쳐는 작업 큐에서 대기 중인 작업들을 적절한 쓰레드에 배정하는 역할을 수행합니다.
쓰레드 풀, 작업큐, 디스패쳐와 같은 개념들의 긴밀한 협력을 통해 , 제한 된 시스템 자원으로도 많은 수에 작업들에 적절하게 쓰레드들을 배정하여 효과적으로 프로그램을 실행할 수 있습니다.
'Apple🍎 > Cocurrency' 카테고리의 다른 글
쓰레드는 뭘까? (0) 2025.01.27 프로세스는 뭘까? (0) 2025.01.27 동시성 이해를 위한 컴퓨터 기본 구조 (0) 2025.01.26