멀티스레딩

Python SELF KO
레벨 25 , 레슨 0
사용 가능

1.1 역사

인류는 종종 새로운 대규모 프로젝트를 만들려고 합니다. 이집트 기자에 있는 쿠푸 피라미드가 가장 크고, 두바이의 부르즈 할리파가 가장 높으며, 만리장성이 가장 길죠.

하지만 이런 프로젝트를 관리하는 것은 매우 어렵습니다. 새로운 피라미드를 두 배로 높이려면 여덟 배의 돌이 필요합니다. 따라서 채석장의 생산성을 높이거나 더 많은 채석장을 열어야 합니다.

또한, 여덟 배의 엔지니어를 찾아야 하고, 엔지니어링 스쿨을 열거나, 설계도, 기하학, 작문을 표준화해야 할 수도 있죠. 정말 큰 문제네요...

피라미드가 지어진 이후 수천 년 동안 아무것도 변하지 않았습니다. 사람들은 계속해서 어떻게 하면 더 많은 작업을 더 적은 시간에 수행할 수 있을지에 대해 고민하고 있습니다. 그리고 컴퓨터가 발명되었을 때, 인류의 최고의 두뇌들이 이 문제를 해결하려고 노력했죠.

프로그램을 10배 더 빨리 실행하려면 어떻게 해야 할까요? 프로세서가 이미 최대 속도로 작동하고 있는데, 아마도 방법이 없을 것입니다. 하지만 제가 인류의 최고의 두뇌들을 언급한 것은 괜한게 아닙니다. 그들은 모든 프로그램의 작업을 분석하고, 세 가지 주요 성장 방향이 있음을 발견했습니다.

유휴 시간 제거

알고 보니, 프로그램은 대부분의 시간을 유휴 상태로 보냅니다. 프로그램은 항상 무언가를 기다립니다: 데이터가 메모리의 한 곳에서 다른 곳으로 복사되거나, 하드 디스크에서 메모리로 로드되거나, 서버 요청에 대한 응답을 기다리거나, 사용자로부터 데이터를 입력받거나 하는 등의 일들이죠.

이러한 작업은 중앙 처리 장치가 아닌 메모리 컨트롤러, 디스크 컨트롤러 등에 의해 수행됩니다. 이 시간 동안 중앙 처리 장치를 유용한 작업으로 로드할 수 있었습니다. 그래서 탄생한 아이디어가 하나의 프로세서에서 하나의 명령어 실행 스레드 (thread) 대신 여러 개를 실행하는 것이었죠.

예를 들어, 하나의 스레드가 사용자의 데이터 입력을 기다리는 동안 두 번째 스레드는 네트워크에서 무언가를 다운로드하고, 세 번째 스레드는 데이터를 처리하며, 네 번째 스레드는 화면에 이미지를 그려줍니다. 그런 다음 이러한 작업은 비동기 작업과 코루틴으로 진화하지만, 이는 나중에 설명하겠습니다.

더 많은 프로그램

프로그램이 80%의 시간 동안 유휴 상태에 있다면, 이는 확실히 좋지 않습니다. 반면에 모든 프로그램을 새로운 접근 방식에 맞게 다시 작성할 수는 없습니다. 아마도 이 문제는 다른 방법으로 해결될 수 있을 것입니다. 컴퓨터에서 여러 프로그램을 동시에 실행하는 것처럼요.

이 경우 운영 체제는 프로그램의 작업을 감시하며, 프로그램이 유휴 상태에 있으면 그 실행 시간을 다른 프로그램에 전달합니다. 이러한 전환은 초당 수십 번 일어나며, 사용자는 전환을 거의 느끼지 못합니다. 그의 관점에서는 프로그램이 동시에 실행되는 것처럼 보입니다.

더 많은 프로세서

프로그램을 동시에 실행하는 것은 멋지지만, 프로그램이 많고 유휴 상태가 거의 없다면 어떨까요? 유휴 상태가 없어지면 효과적인 사용도 불가능해집니다. 예컨대, 10개의 프로그램이 무언가를 계산 중이거나 대규모의 게임과 다른 작업을 동시에 실행하고 있을 때 말이죠.

이 문제의 해결책은 프로세서에 여러 프로세서를 추가하는 것입니다. 혼동을 피하기 위해 이들을 코어라고 부르기 시작했습니다. 이제 여러 코어(하위 프로세서)가 있는 프로세서가 있으며, 여기서 여러 프로그램이 동시에 실행됩니다.

흥미로운 정보! 프로세서의 코어 수

오늘날 서버 프로세서는 64개에서 256개의 코어를 가질 수 있고, 일부 특수한 경우에는 더 많을 수도 있습니다. 예를 들어, AMD EPYC 4세대 프로세서는 최대 96개의 코어를 제공하며, IBM POWER10은 칩당 최대 240개의 코어를 가질 수 있습니다. 사용자 프로세서 또한 상당히 발전했습니다: 고성능 데스크탑 CPU인 AMD Threadripper는 최대 64개의 코어를 가질 수 있고, 더 일반적인 모델은 보통 6개에서 16개의 코어를 가집니다.

그 다음이 어디일까요? 아직 갈 길이 많이 남아있습니다! 첫째, 하나의 서버 메인보드에 두 개 또는 심지어 네 개의 프로세서를 장착할 수 있습니다. 둘째, 서버를 10~20대씩 랙에 결합할 수 있습니다. 세 번째로, 이러한 서버 랙을 수천 개로 구성된 데이터센터에 연결할 수 있습니다.

분산 시스템 및 마이크로서비스 아키텍처는 현대 소프트웨어 개발에서 널리 사용되는 관행이 되었습니다. Google, Amazon, Netflix와 같은 대규모 회사 및 더 작은 기업들까지도 대량의 데이터를 처리하고 서비스를 고가용성과 확장성을 제공할 수 있도록 분산 시스템을 사용합니다. 이러한 시스템은 여러 서버가 하나의 전체처럼 함께 작동하여 애플리케이션의 성능과 내성도 크게 향상시킵니다.

1.2 장점

멀티스레딩, 즉 프로그램 내에서 동시에 작업을 수행하는 것은 소프트웨어의 성능과 효율성을 크게 향상시킬 수 있는 몇 가지 핵심 장점을 제공합니다. 멀티스레딩의 주요 장점을 살펴보겠습니다.

1. 성능 및 실행 속도 향상

작업 병렬 처리: 멀티스레딩은 여러 작업을 동시에 수행할 수 있게 하여, 특히 많은 독립적인 작업을 수행해야 하는 프로그램에 유용합니다. 이렇게 하면 모든 가용 자원을 사용하여 프로그램의 실행 속도가 빨라집니다.

멀티코어 프로세서 사용: 현대의 프로세서는 여러 코어를 가지고 있으며, 멀티스레딩은 각 코어에 스레드를 배치하여 작업을 병렬로 수행함으로써 그 성능을 완전히 활용할 수 있게 합니다.

2. 사용자와의 상호작용 및 응답성 개선

백그라운드 작업: 멀티스레딩은 긴 시간이나 많은 자원을 소모하는 작업을 백그라운드에서 수행하면서 사용자 인터페이스를 담당하는 메인 스레드는 응답성을 유지하게 해줍니다. 이렇게 하면 무거운 작업을 수행할 때 인터페이스가 차단되지 않아 사용자 경험이 향상됩니다.

비동기 작업: 사용자의 상호작용과 이벤트 처리도 메인 작업과 병행하여 진행되어 애플리케이션이 보다 응답성이 좋아지고 효율적이 됩니다.

3. 시스템 자원의 효율적인 사용

자원 최적화: 멀티스레딩은 프로세서 시간과 메모리와 같은 시스템 자원을 보다 효율적으로 사용할 수 있게 해줍니다. 이는 특히 많은 요청과 작업을 동시에 처리해야 하는 서버나 고성능 계산 시스템에서 중요합니다.

입출력 관리: 멀티스레딩은 입출력 작업(예: 네트워크 작업, 파일 읽기 및 쓰기)을 효과적으로 관리할 수 있으며, 한 작업이 입출력 작업 완료를 기다리는 동안 다른 작업을 수행할 수 있습니다.

4. 멀티태스킹 지원

멀티태스킹: 멀티스레딩은 하나의 프로세스 내에서 여러 작업을 동시에 수행할 수 있게 해주어 웹 서버, 데이터베이스, 실시간 애플리케이션과 같은 멀티태스킹이 필요한 응용 프로그램 개발을 쉽게 만들어 줍니다.

데이터 병렬 처리: 대량의 데이터 처리와 관련된 작업에서 멀티스레딩은 데이터를 부분으로 나누어 병렬로 처리하여 작업 수행 속도를 크게 향상시킵니다.

멀티스레딩의 예

웹 서버: 멀티스레딩은 웹 서버가 클라이언트 요청을 동시에 처리할 수 있게 하여 서버의 성능과 확장성을 높여 줍니다.

그래픽 사용자 인터페이스 (GUI): 그래픽 인터페이스가 있는 애플리케이션에서 멀티스레딩은 긴 계산을 백그라운드에서 수행하면서 인터페이스를 응답성 있게 유지합니다.

과학 계산: 과학 계산에서 멀티스레딩은 데이터를 병렬로 처리하여 복잡한 계산 작업의 수행 속도를 크게 향상시킵니다.

게임과 시뮬레이션: 게임에서 멀티스레딩은 물리, 그래픽, 사운드, 사용자 동작을 동시에 처리하여 성능과 현실성을 향상시킵니다.

1.3 올바른 명칭

"멀티스레딩"이라는 용어에는 몇 가지 문제가 있습니다. "멀티"와 "스레드"로 구성되어 있으며, 프로그램 내에 명령어 실행 흐름이 많이 있다는 것을 암시합니다.

멋진 비유이지만, 영어(원어) 문헌에서는 여러 병렬 작업을 수행하는 것을 "thread"라는 용어로 표현합니다. 따라서 멀티스레딩은 영어로 multi-threading이라고 부릅니다.

이는 작은 오해로 간주될 수 있을 것입니다. 프로그래밍에서 "stream"이라는 것을 적극적으로 사용하기 시작하지 않았다면 어떻게 "stream"이라는 용어를 다른 언어로 번역하느냐는 문제가 될 것이죠. 단어를 "전송"이라는 의미로 번역하는 것 외에는 달리 번역할 수 없습니다. 따라서 현재 러시아어 용어에는 약간의 혼란이 있으며, 이는 두 가지 방식으로 해결됩니다:

  • Thread (스레드)는 "명령 실행 흐름"으로 번역합니다.
  • Stream (스트림)은 "데이터 흐름"으로 번역합니다.

반면, 많은 프로그래머는 그냥 영어 용어를 번역하지 않고 사용하기 시작했습니다:

  • Thread (스레드)는 "쓰레드"라고 부르고 "multi-threading"을 "멀티-쓰레딩"이라고 합니다.
  • Stream (스트림)은 "스트림"이라고 합니다.

스레드는 종종 "실"이라고 부르지만, "다중-실"이라는 용어는 사용되지 않습니다. 따라서 대화에서 "실"과 "멀티스레딩"을 함께 사용합니다.

많은 수의 외래 용어 사용은 언어를 더욱 풍부하게 만들고, 단어에 새로운 의미를 부여하며, 다른 나라의 동료들과의 커뮤니케이션을 단순화합니다. 저는 이 접근 방식을 전적으로 지지합니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION