멀티코어와 멀티 스레드의 차이점, 싱글코어에서의 멀티 스레드
멀티코어와 멀티 스레드의 정확한 차이점이 뭔가요?
그리고 멀티코어를 지원하지는 않는 프로그램 즉, 싱글코어만 지원하는 프로그램에서도 멀티 스레드 프로그래밍이 사용될 수 있나요? 궁금합니다.
비슷한 여러 용어가 많아서 혼동되실 것 같습니다.
우선, 핵심적인 답변만 드리면 Core는 하드웨어(H/W) 개념이고 Thread는 소프트웨어(S/W) 개념입니다. 그래서 싱글코어 지원하는 곳에서도 멀티 쓰레드 프로그래밍이 가능합니다.
추가 정보 드리겠습니다. 멀티 코어와 멀티 프로세싱는 또 다른 개념입니다. 멀티 프로세싱도 멀티 쓰레드와 같이 S/W 개념입니다. 이해하기 쉽도록 예로 들면, 브라우저 창을 여러개 여는 것과 탭을 여러개 여는 것의 차이로 보시면 됩니다. 탭을 여러개 열었을 때 오류가 나서 창이 닫힌다면 같은 탭에 있는 것은 모두 닫힙니다. 왜냐면 thread 이기 때문입니다. thread는 하나의 process입니다. 그러나 브라우저 창이 분리 되어 있다면 두 개의 process 이기 때문에 오류가 나서 브라우저가 죽었다고 하더라도 다른 창은 살아 있습니다. 윈도우의 경우 작업 관리자에서 process를 확인할 수 있습니다.
프로세스는 프로그램을 실행해서 메모리에 올라가면 프로세스라고 부릅니다. 그래서 여러개의 프로그램을 실행시키면 작업 관리자에서 여러개의 프로세스가 보이는 것입니다. 탭을 많이 열었다고 작업 관리자의 프로세스가 늘어나지는 않습니다.
왜 이렇게 이 부분에 대해서 설명드렸냐 하면,
이 프로세스를 또 컴퓨터의 프로세서와 혼동해서 S/W 개념, H/W 개념을 혼동하는 경우가 있기 때문입니다.
컴퓨터 세계에서 용어의 명확하를 할 때는 H/W 개념인지 S/W 개념인지 확실히 분리를 해야 합니다.
멀티코어 : 하나의 작업을 위해 여러개의 cpu 코어를 사용하도록 하는 것
멀티코어를 사용하기 위한 방법? 기법
1. 멀티 프로스세스 : 여러개 CPU가 협력하여 프로그램을 처리
2. 멀티 스레드 : 하나의 프로세스에서 여러 스레드를 생성하여 여러 CPU코어를 사용하도록 함사실 이런 부분은 운영체제(Operating System)에서 담당하는 경우가 많지만,
프로그램을 개발할때 강제적으로 스레드를 태우는 방법이 있습니다.
예를들어서 동시에 반복문이 여러개 돈다면 병렬처리 하는 것이 유리하므로, 별도 스레드를 만들어서 동시 태우도록 코딩하는 정도를 일반적으로 사용합니다.
병렬 프로그래밍에 대한 충분한 사전지식과 이해엇이 코드를 작성하면 싱글 프로스세스 응답속도보다 느려지는 경우가 다반사입니다.
1. 멀티코어와 멀티 스레드의 정확한 차이점이 뭔가요?
멀티 코어 프로세서는 여러 개의 작업을 보다 효율적으로 한 번에 처리하기 위해 2개 이상의 프로세서가 붙어있는 집적회로를 말합니다.
그러니깐 '회로'를 의미합니다. 그래서 우리가 흔히 말하는 듀얼코어 프로세서가 싱글코어 프로세서보다 보다 강력한 성능을 가집니다.
프로세서가 1개에서 2개로 늘어났으니깐 성능향상도 2배일까요?
그렇지 않습니다. 약 1.5배 정도 성능향상이 있다고 합니다.
그렇다면 멀티 프로세싱은 뭐였죠?
멀티 프로세싱은 복수개의 프로세서들이 협력하여 작업을 처리하는 방식을 의미합니다. 그러니깐 '처리방식'을 의미합니다.
포인트를 아시겠나요? 멀티 코어 프로세서는 '회로'이고, 멀티 프로세싱은 '처리방식' 입니다.
그렇다고해서 멀티 코어 프로세서의 처리방식이 멀티 프로세싱이고, 멀티 프로세싱의 회로가 멀티 코어 프로세서가 되는 걸까요?
엄밀히 말해서 그렇지 않습니다.
왜냐하면 멀티 코어 프로세서(예를 들면 듀얼코어)라고 해서 멀티 프로세싱 방식으로만 처리하는 건 아니기 때문입니다.
2. 싱글코어만 지원하는 프로그램에서도 멀티 스레드 프로그래밍이 사용될 수 있나요?
작업은 스레드단위로 처리하는데 멀티스레드일수록 부하큰 작업을 동시에 여러스레드로 처리할수 있게 설계해야합니다.
여러작업이 있어도 순차적으로 작업하거나 부하큰 작업이 한두개에 집중되면 남는 코어가 생기게 되는데 나눌수 없는 작업도 있습니다.
멀티코어(Multi-Core)는 여러개의 CPU가 하나의 칩(chip)에 들어 있는 칩 레벨 멀티프로세서(Chip Level Multi-Processor)를 말합니다. 즉 CPU의 물리적인 구조적 특성을 말하는 것입니다.
그리고 하나의 프로그램이 여러개의 코어를 동시에 사용할 수 있느냐 아니냐는 운영체제 또는 멀티코어를 가진 CPU의 여러 코어를 동시에사용할 수 있도록 제공되는 멀티코어 프로그래밍 라이브러리를 사용하여 프로그램이 개발되었는가 아닌가에 의해 결정됩니다. 즉 프로그램의 개발시에 멀티코어를 동시에 사용하도록 할 것인가 아닌가에 따라 결정된다고 보면 됩니다.
그리고 멀티스레드(Multi-thread)의 경우 하드웨어가 아닌 소프트웨어적인 용어입니다. CPU의 하이퍼스레딩 과는 또 다른 개념입니다. 하이퍼스레딩은 싱글코어를 멀티코어처럼 사용할 수 있도록 해주는 기능이라고 생각하시면 이해하기 쉽습니다. 일반적으로 멀티코어든 싱글코어든 요즘 운영체제는 별개로 실행된 여러개의 프로그램이 동시에 실행됩니다. 하지만 매우 짧은 시간동안 여러개의 프로그램을 스위칭하며 실행해주기 때문에 마치 동시에 실행되는 것 처럼 보일 뿐 실제로는 CPU가 실행중인 여러 프로그램을 스위칭하며 실행시켜 줍니다. 이 때 프로그램을 스위칭하는 것을 운영체제에서는 컨텍스트 스위칭(Context Switching)이라고 부릅니다.
하지만 프로그램을 스위칭하는 것은 CPU 입장에서는 부하가 크게 걸립니다. 그래서 하나의 프로그램을 작성할 때 스레드(thread)라는 여러개의 서로 다른 실행로직으로 분리하고 각 컨텍스트 스위칭 대신에 스레드를 스위칭하며 하나의 프로그램에서 여려 기능을 동시에 실행하는 기법입니다.
컨텍스트 스위칭이든 스레드 스위칭이든 모두 프로그램을 어떻게 작성하느냐에 따라 운영체제와 CPU에서 알아서 해주는 것이기 때문에 싱글코어, 멀티코어 심지어 멀티코어 CPU가 여러개 장착된 경우에도 문제없이 동작합니다. 실제로 4 코어 CPU가 32개 이상 장착된 즉 128 코어 서버도 있습니다만 코어의 수나 CPU의 수를 개발자가 고려할 필요는 없습니다.
일단 멀티코어와 멀티스레드 라는 개념을 비교하는 것에 대해 잘 이해가 안가는데요, 멀티코어 같은 경우에는 하드웨어적인 물리적인 부분을 말씀하시는 것이고 CPU가 2개 이상의 코어를 하나로 통합한 것으로 말씀하시는 멀티쓰레딩과 같은 기능을 독립적으로 수행할 수 있습니다. 쓰레드는 프로세스 내에서 하나의 작업 단위로서 멀티쓰레딩 라는 개념으로 멀티 프로세스와 비교되는 개념입니다.
따라서 이 부분에 대해서 추가적으로 말을 하자면, 스레드는 프로세스(현재 돌아가고 있는 프로그램이라고 이해)의 실행 단위라고 할 수 있습니다. 한 프로세스 내에서 동작되는 여러 실행 흐름으로 이해하시면 되는데요. 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 대폭 향상시키는 것을 멀티쓰레딩이라고 합니다.
따라서 주로 멀티프로세스와 멀티스레드 간의 차이점을 많이들 비교하곤 하는데.. 싱글 코어만 지원하는 프로그램이라는건 저도 잘 이해가 안가네요,,
안녕하세요. A-HA 프로그래밍 전문가입니다.
멀티 코어의 싱글 스레드는 하나의 작업을 여러 cpu가 동시에 처리해 빠르게 처리가 가능합니다.
싱글 코어의 멀티 스레드는 하나의 cpu가 여러 작업을 동시에 실행 하는 것이죠.
멀티 스레드는 프로그래밍으로 쉽게 설정할 수 있습니다. 각 스레드간의 메모리 간섭만 잘 조절하시면 됩니다.