현재 소프트웨어 산업에서 멀티 스레딩이 얼마나 중요합니까? [닫은]


59

필자는 3 년 가까이 MVC 프레임 워크 (예 : 스트럿)를 사용하여 Java로 웹 응용 프로그램을 작성한 경험이 있습니다. 주요 소매 체인 용 코드를 작성했지만 지금까지 멀티 스레드 코드를 작성한 적이 없습니다.

인터뷰 중에 멀티 스레딩에 대한 몇 가지 질문을 받았으며 일반적으로 그 질문에 대답합니다 (대부분 간단한 질문). 현재 업계 시나리오에서 멀티 스레딩이 얼마나 중요한지 궁금해졌습니다.


8
명시 적으로하지 않았을 수도 있지만 장면 뒤에서 분명히 활용할 수 있습니다.
Martin York

1
나도 작업을 위해 멀티 스레드 코드로 작업하는 경우는 거의 없지만 인터뷰를 통해 코드를 읽거나 토론하려고합니다. 스레드를 얻지 못하는 코더와 작업하고 싶지 않으며 다른 코더가 스레드를 얻는 지 상관없는 코더와 작업하고 싶지 않습니다.
Job

1
웹 개발에는 거의 사용하지 않지만 다른 곳에서는 더 일반적이라고 생각합니다. 예를 들어, 최근 안드로이드 응용 프로그램을 작성하고있어 실현 에 필요한 어떤 네트워크 활동을 경우 멀티 스레딩을 사용합니다.
jwegner

4
중요한 것은 멀티 스레딩이 아니라 병렬 컴퓨팅입니다. 웹 응용 프로그램으로 전송되는 단일 요청이 모두 스레드에 있다고 생각하면 담배를 피워야합니다.
user606723

1
"쓰레드 외부에서 생각"하는 기능은 단일 스레드 프로그래밍에서도 매우 좋습니다. 당연한 일로 훨씬 덜 걸리며 코드는 일반적으로 더 강력하고 재사용 가능합니다.
corsiKa

답변:


92

매우 중요합니다.

더 중요한 것은 멀티 스레딩이 비동기 문제를 해결하는 한 가지 방법이라는 것을 이해하는 것입니다. 많은 사람들이 현재 소프트웨어를 작성하고있는 기술 환경은 다음 두 가지 주요 방법으로 역사적 소프트웨어 개발 환경 (일괄 처리 계산을 수행하는 모 놀리 식 응용 프로그램)과 다릅니다.

  • 많은 코어 머신이 이제 일반적입니다. 더 이상 클럭 속도 나 트랜지스터 밀도가 수십 배 증가 할 것으로 예상 할 수 없습니다. 계산 가격은 계속 하락하지만 많은 병렬 처리로 인해 하락할 것입니다. 우리는 그 힘을 활용할 수있는 방법을 찾아야합니다.

  • 컴퓨터는 이제 상당히 네트워크화되어 있으며 최신 응용 프로그램은 다양한 소스에서 풍부한 정보를 가져올 수 있습니다.

계산 관점에서 볼 때,이 두 가지 요소는 본질적으로 동일한 핵심 아이디어로 귀결됩니다. 정보는 점점 비동기 방식으로 제공 될 것 입니다. 필요한 정보가 컴퓨터의 다른 칩에서 계산되는지 아니면 전 세계 칩에서 계산되는지는 중요하지 않습니다. 어느 쪽이든, 프로세서는 유용한 작업을 수행 할 수있을 때 정보를 기다리는 초당 수십억 사이클을 기록 하고 있습니다.

따라서 현재 중요한 것은 미래에 더욱 중요한 것은 멀티 스레딩 그 자체가 아니라 비동기 성을 다루는 것입니다 . 멀티 스레딩은이를 수행하는 한 가지 방법 일뿐입니다. 약한 메모리 모델 칩이보다 널리 사용됨에 따라 복잡하고 오류가 발생하기 쉬운 방식입니다.

도구 공급 업체의 과제는 고객이 향후 사용할 비동기 인프라를 처리 할 수 ​​있도록 멀티 스레딩보다 더 나은 방법을 찾는 것입니다.


5
탁월한 답변을 얻으려면 +1, 내 자신의 겸손한 시도보다 더 많은 크레딧을받을 자격이 있습니다.
Péter Török

2
비동기식으로 정보가 점점 더 많이 제공 될 것입니다. 그것이 진실이 아닌 경우. . .
surfasb

2
concurrencyasynchronous 행동 보다 더 중요 합니다. 동시성없이 비동기적일 수 있습니다 (예 : 단일 코어 CPU의 다중 스레드) asynchronous는 의미를 대체하지 않습니다 concurrency.

5
@Jarrod : 동시성 길들이기는 단순히 언급 한 이유 때문에 동시성을 길들이 는 것 보다 중요합니다. 동시성은 특히 어려운 비동기 성입니다. 동시성의 어려운 부분은 "동시에 일어나는 일"측면이 아니며 실제로 동시성은 종종 시간 슬라이싱을 통한 비협조적인 멀티 태스킹과 같은 시뮬레이션 된 동시성 입니다. 어려운 부분에 효율적으로 , 그리고 작성하지 않고, 차단 매달려, 교착없이 리소스를 사용 에서 내부 에 대한 로컬 추론하기 어려운 프로그램.
Eric Lippert

"동시성은 종종 시간 슬라이싱을 통한 비협조적인 멀티 태스킹과 같은 시뮬레이션 된 동시성 일뿐입니다."
Giorgio

46

최신 프로세서에는 점점 더 많은 코어가 있으므로 점점 더 중요 해지고 있습니다. 10 년 전 기존 컴퓨터의 대부분은 단일 프로세서 만 있었으므로 멀티 스레딩은 고급 서버 응용 프로그램에서만 중요했습니다. 오늘날 기본 랩톱에도 멀티 코어 프로세서가 있습니다. 몇 년 동안 모바일 장치에서도 ... 동시성의 잠재적 성능 이점을 사용하고 멀티 스레드 환경에서 올바르게 실행하려면 점점 더 많은 코드가 필요합니다.


3
+1 : 그 어느 때보 다 중요합니다. 또한 시스템 설계에서 더 많은 프로세스가 수행하도록 작업을 분할하는 것만으로도 멀티 스레딩의 이점을 얻을 수 있습니다.
Scott C Wilson

11
상당수의 모바일 장치에는 이미 멀티 코어 프로세서가 있습니다!
Che Jami

3
필자는 최초의 공유 시스템이 구축 된 이후 멀티 스레딩이 중요하다고 주장했다. 여러 개의 프로세서 / 코어를 사용하면 여러 스레드를 사용하는 데 새로운 차원의 효율성이 추가됩니다.
jwernerny

어쩌면 (특히 모바일 장치에서) 스레드는 나쁜 생각입니다. OS는 아마도 버그가있는 사용자 코드가 스레딩을 시도하지 않고 코어 사용 최적화를 처리해야 할 것입니다. 일반 사용자가 그러한 요구에 액세스하거나 많은 사람들에게 혜택을 줄 수있는 응용 프로그램은 거의 없습니다. 유일한 고급 응용 프로그램 (고급 그래픽 응용 프로그램 / 개발자 도구 / 날씨 모델링 / 웹 서버 (및 관련 서비스))은 모든 고급 전문 응용 프로그램입니다.
Martin York

1
@ Tux-D, 하나 이상의 코어를 사용하는 모바일 장치에서 게임을하는 것이 좋습니다. 예외적 인 것은 아닙니다.
whitequark

28

일반적으로 멀티 스레딩은 이미 매우 중요하며, 향후 몇 년 동안 (Péter Török) 지적한 바와 같이 프로세서가 예측 가능한 미래 (높은 MHz 대신 더 많은 코어)로 확장되는 방식입니다. .

그러나 귀하의 경우에는 주로 웹 응용 프로그램을 사용하는 것 같습니다. 웹 응용 프로그램은 본질적으로 웹 서버가 각 사용자에 대한 요청을 처리하는 방식 (즉, 병렬)으로 인해 다중 스레드입니다. 동시성 및 스레드 안전성을 이해하는 것이 중요하지만 (특히 캐시 및 기타 공유 데이터를 처리 할 때) 웹 애플리케이션 코드를 내부적으로 멀티 스레딩하는 것이 유리한 경우가 너무 많습니다 (예 : 여러 작업자). 요청 당 스레드 수). 그런 점에서 웹 개발자에게는 멀티 스레딩 전문가가 될 필요가 없다고 생각합니다. 그것은 종종 까다로운 주제이며 많은 면접관이 당신이 도착하기 10 분 전에 몇 가지 질문을하기 때문에 인터뷰에서 자주 묻는 질문입니다.


포스터는 웹 개발자이며 대부분의 웹 서버 컨테이너는 상당한 양의 멀티 스레딩 작업을 수행합니다. 경우에 따라 필요를 제거하지는 않지만 99 %의 시간 동안 멀티 스레딩 컨트롤러 코드가 MVC 호출의 최대 성능 향상이 아닙니다.
Mufasa

19

멀티 스레딩은 붉은 청어입니다. 멀티 스레딩은 실제 문제인 동시성에 대한 구현 세부 사항 입니다. 잠금으로 인해 모든 스레드 프로그램이 동시에 실행되는 것은 아닙니다.

스레드는 concurrent프로그램 을 구현하기위한 하나의 모델 및 구현 패턴입니다 .

예를 들어 Erlang과 같은 언어로 멀티 스레딩을하지 않고도 확장 성이 뛰어나고 내결함성이있는 소프트웨어를 작성할 수 있습니다.


Erlang은 여전히 ​​멀티 스레드라고 생각하지만 +1입니다. 커뮤니티는 변경 가능한 공유 상태에 따라 "스레드"라는 단어를 재정 의하여 자신과 구별합니다.
Dan

1
Erlang VM은 기본적으로 CPU 당 1 개의 스레드를 사용하지만 Erlang 개발자는 Erlang VM이 제공하는 간단한 프로세스 만 기본 OS 스레드에 액세스 할 수 없습니다.

10

인터뷰 중 멀티 스레딩에 대한 몇 가지 질문이 있습니다 ...

인터뷰를 통과하기 위해서는 멀티 스레딩이 매우 중요 할 수 있습니다. 자기 말을 인용 , "우리 팀을 위해 후보를 인터뷰 할 때, 내가 물어 동시성 질문을하지 이러한 기술은 우리의 프로젝트에 중요하다 (이이기 때문에 없습니다 ) 그러나이 어떻게 든 나를 우리가 사용하는 언어의 일반적인 지식을 평가하는 것이 쉽게 때문에 ..."


2
멀티 스레딩 및 동시 프로그래밍에 대한 아이디어가 있으면 일반적으로 방어 적 접근 방식으로 변환되며 이는 매우 좋은 방법 일 수 있습니다. 프로세스 내에서 전혀 관련이없는 무언가가 하나의 논리적 진술을 선점하거나 다른 모든 것의 중간에서 실행할 수 있다는 점을 고려해야하는 경우, 그 가능성을 계획해야합니다. 멀티 스레드 구현 (다른 형태의 동시 성과는 반대)은 단순히 스레드 로컬이 아닌 모든 상태에서 무언가를 수행 할 수 있다는 추가 부담이 있음을 의미합니다.
CVn

6

스레딩을 활용하여 성능을 향상시키는 방법을 이해하는 것은 오늘날의 소프트웨어 환경에서 대부분의 산업 및 응용 프로그램에있어 중요한 기술입니다.

최소한 동시성과 관련된 문제를 이해해야합니다.

모든 응용 프로그램이나 환경이이를 활용할 수있는 것은 아닙니다 (예 : 많은 임베디드 시스템에 적용). 그러나 Atom 프로세서 (et al)는 그것을 변경하려고 노력하는 것처럼 보입니다 (가벼운 멀티 코어가 더 일반적으로 시작됩니다).


4

이미 멀티 스레드 코드를 작성중인 것 같습니다.

대부분의 Java 웹 응용 프로그램은 동시에 여러 요청을 처리 할 수 ​​있으며 여러 스레드를 사용하여이를 수행합니다.

그러므로 최소한 기본을 아는 것이 중요하다고 말하고 싶습니다.


18
<nitpick> 분명히 멀티 스레드 코드를 작성하지 않고 멀티 스레드 환경에서 실행되는 단일 스레드 코드 만 작성합니다. </ nitpick>
Péter Török

2

필요한 상황에서는 여전히 중요하지만 개발중인 많은 것들과 마찬가지로 올바른 작업에 적합한 도구입니다. 나는 쓰레딩을 만지지 않고 3 년 동안갔습니다. 이제 실질적으로 내가하는 모든 일에는 몇 가지 근거가 있습니다. 멀티 코어 프로세서를 사용하는 경우에도 여전히 스레딩이 필요하지만 기존의 모든 이유는 여전히 유효합니다. 여전히 반응 형 인터페이스를 원하며 동기화를 처리하고 다른 작업을 한 번에 수행 할 수 있기를 원합니다.


2

짧은 대답 : 매우.

더 긴 대답 : 전자 (트랜지스터 기반) 컴퓨터는 기술의 물리적 한계에 빠르게 접근하고 있습니다. 열 발생과 미세 회로의 양자 효과를 관리하면서 각 코어에서 더 많은 클럭을 짜는 것이 점점 더 어려워지고 있습니다 (회로 경로는 이미 현대 칩에 너무 가깝게 배치되어 "양자 터널링"이라는 효과가 전자를 만들 수 있습니다) 전통적인 전기 아크에 대한 적절한 조건을 필요로하지 않고 한 회로에서 다른 회로로 "트랙을 점프"; 따라서 사실상 모든 칩 제조업체는 각 CPU에 더 많은 "실행 단위"를 추가하여 각 시계가 더 많은 작업을 수행 할 수 있도록하는 데 주력하고 있습니다. 그런 다음 컴퓨터가 시계 당 한 가지 작업 만 수행하는 대신 2 또는 4 또는 8을 수행 할 수 있습니다. 인텔에는 "하이퍼 스레딩"이 있습니다. 기본적으로 하나의 CPU 코어를 두 개의 논리 프로세서로 분할합니다 (일부 제한 사항 있음). 사실상 모든 제조업체는 하나 이상의 CPU 칩에 최소 두 개의 개별 CPU 코어를 배치하고 있으며 데스크탑 CPU의 현재 표준은 칩당 4 개의 코어입니다. 두 개의 CPU 칩을 사용하는 경우 8 개가 가능하며 "쿼드 쿼드 코어"프로세서 (16 EU 및 HT (옵션))를 위해 설계된 서버 메인 보드가 있으며 차세대 CPU는 칩당 6 또는 8 개를 가질 것입니다.

이 모든 결론은 컴퓨터가 컴퓨팅 성능을 얻는 방식을 최대한 활용하려면 컴퓨터가 프로그램을 "분류하고 정복"할 수 있어야한다는 것입니다. 관리되는 언어에는 프로그램과 별도로 메모리 관리를 처리하는 최소한 GC 스레드가 있습니다. 일부에는 COM / OLE interop을 처리하는 "전환"스레드도 있습니다 (관리되는 "샌드 박스"를 보호하기위한 성능만큼). 그러나 그 외에도 프로그램이 동시에 여러 작업을 수행 할 수있는 방법에 대해 생각하고 프로그램 조각을 비동기 적으로 처리 할 수 ​​있도록 설계된 기능으로 프로그램을 설계해야합니다. Windows 및 Windows 사용자는 실제로 프로그램이 백그라운드 스레드에서 길고 복잡한 작업을 수행 할 것으로 기대합니다. 프로그램의 메인 스레드에서 실행되는 프로그램의 UI를 Windows 메시지 루프에 "응답"상태로 유지합니다. 분명히, 병렬화 솔루션 (예 : 정렬)이있는 문제는 당연한 후보이지만, 병렬화의 혜택을받는 유한 한 유형의 문제가 있습니다.


1

멀티 스레딩에 대한 경고 : 더 많은 스레드가 더 나은 효율성을 의미하지는 않습니다. 제대로 관리하지 않으면 시스템 속도가 느려질 수 있습니다. 스칼라의 행위자는 Java의 스레딩을 개선하고 시스템 사용량을 최대화합니다 (Java 개발자라고 언급).

편집 : 다음은 멀티 스레딩의 단점에 대해 명심해야 할 사항입니다.

  • 하드웨어 리소스를 공유 할 때 스레드 간 간섭
  • 하나의 스레드 만 실행하더라도 단일 스레드의 실행 시간은 향상되지 않지만 성능이 저하 될 수 있습니다. 이는 스레드 전환 하드웨어를 수용하는 데 필요한 느린 주파수 및 / 또는 추가 파이프 라인 단계 때문입니다.
  • 멀티 스레딩에 대한 하드웨어 지원은 소프트웨어에 더 잘 보이기 때문에 멀티 프로세싱보다 응용 프로그램과 운영 체제 모두에서 더 많은 변경이 필요합니다.
  • 동시성 관리의 어려움.
  • 테스트의 어려움.

또한 이 링크 는 그에 대한 도움이 될 수 있습니다.


2
이것은 OP의 질문에 대답하지 않는 것 같습니다 :-/
Péter Török

그래도 스레딩에 대한 최상위 레벨 뷰를 제공합니다. 멀티 스레딩을 탐구하기 전에 고려해야 할 사항.
c0da

@ c0da Stack Exchange는 토론 게시판이 아닙니다. 답변은 질문에 직접 답변해야합니다. 당신은 대답을 확장 시켜서 질문을 찾는 사람에게 다시 돌려 줄 수 있습니까?

1

현재 업계 시나리오에서 멀티 스레딩이 얼마나 중요한지 궁금해졌습니다.

퍼포먼스를 수행하는 타사 코드에서 성능이 나오지 않지만 자체적으로 성능이 중요한 성능 핵심 분야에서는 CPU 관점에서 중요도가 높은 순서로 고려하는 경향이 있습니다 (GPU는 내가 얻은 와일드 카드입니다) 들어 가지 않음) :

  1. 메모리 효율성 (예 : 참조 지역).
  2. 알고리즘
  3. 멀티 스레딩
  4. SIMD
  5. 기타 최적화 (예 : 정적 분기 예측 힌트)

이 목록은 전적으로 중요도에 근거한 것이 아니라 유지 관리에 미치는 영향, 얼마나 직접적인지 (사전 더 고려할 가치가있는 경우), 목록에있는 다른 사람과의 상호 작용 등과 같은 많은 다른 역학에 근거합니다.

메모리 효율

알고리즘보다 메모리 효율성 선택에 놀랐을 것입니다. 메모리 효율성이이 목록에있는 4 개의 다른 모든 항목과 상호 작용하기 때문이며,이를 고려하면 종종 "구현"범주가 아닌 "디자인"범주에 있기 때문입니다. 기억력 효율성을 이해하려면 종종 목록에있는 4 가지 항목을 모두 고려해야하고 다른 4 가지 항목 모두도 메모리 효율성을 고려해야하기 때문에 약간의 닭고기 나 달걀 문제가 있습니다. 그러나 그것은 모든 것의 중심에 있습니다.

예를 들어, 선형 시간 순차 액세스 및 등 시간에 일정한 시간 삽입을 제공하는 데이터 구조가 필요하고 작은 요소에 대해서는 그 밖의 어떤 것도 필요하지 않은 경우, 여기서 도달하려는 순진한 선택은 링크 된 목록이됩니다. 그것은 메모리 효율성을 무시하고 있습니다. 혼합에서 메모리 효율성을 고려할 때,이 시나리오에서는 확장 가능한 배열 기반 구조 또는 연속 된 노드 (예 : 노드에 128 개의 요소를 저장하는 노드)와 같이 또는 서로 연결된 것과 같이보다 연속적인 구조를 선택하게됩니다. 풀 할당자가 지원하는 링크 된 목록 이들은 알고리즘 복잡성이 동일하지만 극적인 이점을 가지고 있습니다. 마찬가지로, 우리는 종종 메모리 효율성 때문에 열등한 알고리즘 복잡성에도 불구하고 병합 정렬보다 배열의 빠른 정렬을 종종 선택합니다.

마찬가지로 메모리 액세스 패턴이 너무 세분화되고 흩어져서 가장 세밀한 수준의 코드로 잠금을 설정하는 동안 허위 공유의 양을 최대화하면 효율적인 멀티 스레딩을 가질 수 없습니다. 따라서 메모리 효율성은 효율성 멀티 스레딩을 배가시킵니다. 스레드를 최대한 활용하기위한 전제 조건입니다.

목록의 위의 모든 단일 항목은 데이터와 복잡한 상호 작용을하며 데이터가 표현되는 방식에 초점을 맞추는 것은 궁극적으로 메모리 효율성의 맥락에 있습니다. 위의 모든 하나는 부적절한 데이터 표현 또는 액세스 방법으로 병목 현상이 발생할 수 있습니다.

메모리 효율성이 중요한 또 다른 이유는 전체 코드베이스에 적용 할 수 있기 때문 입니다. 일반적으로 사람들이 여기저기서 약간의 작업에서 비효율이 축적된다고 생각할 때 프로파일 러를 가져와야한다는 신호입니다. 그러나 지연 시간이 짧은 필드 나 매우 제한된 하드웨어를 다루는 필드는 프로파일 링 후에도 할당, 복사 및 할당 방식에있어 비효율적 인 코드베이스에서 명확한 핫스팟 (시간이 어디에나 분산되어 있음)을 나타내지 않는 세션을 실제로 찾을 수 있습니다. 메모리에 액세스합니다. 일반적으로 이것은 전체 코드베이스가 코드베이스 전체에 적용되는 완전히 새로운 표준 세트로 이어질 수있는 성능 문제에 취약 할 수있는 유일한시기이며, 메모리 효율성은 종종 그 중심에 있습니다.

알고리즘

정렬 알고리즘의 선택은 정렬하는 데 몇 개월이 걸리고 정렬하는 데 몇 초가 걸리는 거대한 입력 사이의 차이를 만들 수 있기 때문에 이것은 상당히 주어진 것입니다. 적어도 1,000,000 개의 코어 머신 (어떤 경우에는 메모리가 효율성이 더욱 중요해질 것입니다).

그러나 내 개인 목록의 최상위에 있지는 않습니다. 분야에서 유능한 사람은 절두체 컬링을 위해 가속 구조를 사용하는 것을 알고 있기 때문에 알고 있습니다. 예를 들어 알고리즘 지식에 포화되어 있으며 접두사 기반 검색을위한 기수 트리는 유아용 물건입니다. 우리가 작업하는 분야에 대한 이런 종류의 기본 지식이 없기 때문에 알고리즘 효율은 확실히 최고가 될 것입니다. 그러나 종종 알고리즘 효율은 사소합니다.

또한 일부 분야에서는 새로운 알고리즘을 개발해야 할 수도 있습니다 (예 : 메시 처리에서는 이전에는 없었거나 다른 제품의 유사한 기능 구현이 독점적 인 비밀이며 종이로 출판되지 않았기 때문에 수백 개를 발명해야했습니다) ). 그러나 문제 해결 부분을 지나서 올바른 결과를 얻을 수있는 방법을 찾고 효율성이 목표가되면 실제로 얻는 유일한 방법은 데이터 (메모리)와의 상호 작용 방식을 고려하는 것입니다. 메모리 효율성을 이해하지 못하면 새로운 알고리즘은 더 빠른 속도로 만들기위한 불필요한 노력으로 불필요하게 복잡해질 수 있습니다. 단순하고 우아한 알고리즘을 생성하기 위해 메모리 효율성을 조금 더 고려하는 것이 필요할 때였습니다.

마지막으로, 알고리즘은 메모리 효율보다 "구현"범주에 더 많은 경향이 있습니다. 초기에 사용 된 차선책 알고리즘을 사용하더라도 후시를 개선하기가 더 쉽습니다. 예를 들어, 열등한 이미지 처리 알고리즘은 종종 코드베이스의 한 곳에서 구현됩니다. 나중에 더 좋은 것으로 바꿀 수 있습니다. 그러나 모든 이미지 처리 알고리즘이 Pixel차선의 메모리 표현 을 가진 인터페이스에 연결되어 있지만이를 해결하는 유일한 방법은 여러 픽셀이 표시되는 방식 (단 하나가 아님)을 변경하는 것입니다. SOL을 위해 코드베이스를 완전히 다시 작성해야합니다.Image인터페이스. 정렬 알고리즘을 대체 할 때도 같은 종류의 작업이 필요합니다. 일반적으로 구현 세부 사항이며 정렬되는 데이터의 기본 표현을 완전히 변경하거나 메시지를 전달하는 방식에 따라 인터페이스를 다시 디자인해야 할 수도 있습니다.

멀티 스레딩

멀티 스레딩은 하드웨어 특성에 따라 마이크로 레벨 최적화를 수행하기 때문에 성능 측면에서 어려운 문제이지만 하드웨어는 실제로 그 방향으로 확장되고 있습니다. 이미 32 개의 코어를 가진 피어가 있습니다 (4 개만 있습니다).

그러나 뮬리 스레딩은 소프트웨어 속도를 높이기 위해 목적을 사용하는 경우 전문가에게 알려진 가장 위험한 마이크로 최적화 중 하나입니다. 경쟁 조건은 본질적으로 매우 결정적이지 않기 때문에 가능한 가장 치명적인 버그입니다. (아마도 디버깅 컨텍스트 외부에서 가장 불편한 시간에 개발자의 컴퓨터에서 몇 개월에 한 번만 나타날 수 있습니다). 따라서 멀티 스레딩과 관련된 버그는 가장 신중한 테스트조차도 쉽게 레이더 할 수 있기 때문에 유지 보수성 및 코드의 잠재적 정확성에 대한 부정적인 부정적인 영향을 미쳤습니다.

그럼에도 불구하고 그렇게 중요 해지고 있습니다. 현재 보유하고있는 코어 수를 고려할 때 메모리 효율성 (때로는 수백 배 더 빨라질 수 있음)과 같은 것을 능가하는 것은 아니지만, 점점 더 많은 코어를보고 있습니다. 물론 100 코어 머신을 사용하더라도 스레드 효율성은 일반적으로 불가능하기 때문에 메모리 효율성을 목록의 최상위에두고 있습니다. 프로그램은 이러한 머신에서 수백 개의 스레드를 사용할 수 있지만 효율적인 메모리 표현 및 액세스 패턴 (잠금 패턴과 연결됨)이 여전히 부족합니다.

SIMD

SIMD는 레지스터가 실제로 더 넓어지고 더 넓어 질 계획이기 때문에 조금 어색합니다. 원래 64 비트 MMX 레지스터와 4 개의 SPFP 연산을 동시에 병렬 처리 할 수있는 128 비트 XMM 레지스터가있었습니다. 이제 우리는 병렬로 8 개가 가능한 256 비트 YMM 레지스터를보고 있습니다. 그리고 16 비트를 병렬로 허용하는 512 비트 레지스터에 대한 계획이 이미 마련되어 있습니다.

이것들은 멀티 스레딩의 효율성과 상호 작용하고 증가 할 것입니다. 그러나 SIMD는 멀티 스레딩만큼 유지 관리 성을 떨어 뜨릴 수 있습니다. 이와 관련된 버그가 교착 상태 또는 경쟁 조건만큼 재생산 및 수정이 반드시 어려운 것은 아니지만 이식성이 어려우며 모든 사람의 컴퓨터에서 코드를 실행할 수 있는지 (및 하드웨어 기능에 따라 적절한 지침을 사용하여) 어색한.

또 다른 것은 오늘날 컴파일러가 일반적으로 전문가가 작성한 SIMD 코드를이기는 것은 아니지만 순진한 시도를 쉽게이기는 것입니다. 그것들은 우리가 더 이상 수동으로 할 필요가 없거나 적어도 본질적으로 또는 직접 어셈블리 코드를 작성하는 것에 대해 수동으로하지 않아도 될 정도로 향상 될 수 있습니다 (아마도 약간의 사람의 안내).

그러나 벡터화 처리에 효율적인 메모리 레이아웃이 없으면 SIMD는 쓸모가 없습니다. 우리는 하나의 스칼라 필드를 와이드 레지스터에로드하여 하나의 연산 만 수행합니다. 이러한 모든 항목의 핵심은 메모리 레이아웃에 대한 의존성이 진정 효율적입니다.

다른 최적화

이것들은 종종 단어가 알고리즘 중심을 넘어서 성능에 미미한 영향을 미치는 변화를 제안한다면, 우리가 요즘 "마이크로"라고 부르기를 제안하는 것입니다.

분기 예측을 최적화하기 위해 종종 알고리즘 또는 메모리 효율의 변화가 필요합니다. 예를 들어 정적 예측을위한 힌트 및 코드 재 배열을 통해서만 시도되는 경우, 그러한 코드의 최초 실행 만 향상시키는 경향이있어 효과가 의심스러운 경우 종종 무시할 만하지 않습니다.

성능을 위해 멀티 스레딩으로 돌아 가기

어쨌든 성능 컨텍스트에서 멀티 스레딩이 얼마나 중요합니까? 내 4 코어 머신에서는 이상적으로 5 배 더 빨라질 수 있습니다 (하이퍼 스레딩으로 얻을 수있는 것). 코어가 32 개인 동료에게 훨씬 더 중요합니다. 그리고 앞으로 몇 년 동안 점점 더 중요해질 것입니다.

매우 중요합니다. 그러나 메모리 효율성이 부족하여 잠금을 거의 사용하지 않고 허위 공유 등을 줄이기 위해 문제가 발생하는 경우 많은 스레드를 던지는 것은 쓸모가 없습니다.

성능 이외의 멀티 스레딩

멀티 스레딩이 단순한 처리량의 의미에서 항상 성능을 향상시키는 것은 아닙니다. 때로는 가능한 처리량 비용으로도로드 밸런싱을 통해 사용자의 응답 성을 향상 시키거나 사용자가 완료 될 때까지 기다리지 않고 더 많은 멀티 태스킹을 수행 할 수 있습니다 (예 : 파일을 다운로드하는 동안 계속 탐색).

이러한 경우, 멀티 스레딩은 하드웨어를 최대한 활용하는 것이 아니라 사용자 엔드 디자인에 관한 것이기 때문에 메모리 효율이 더 높은 최고 수준으로 올라갈 것을 제안합니다. 인터페이스 디자인과 그러한 시나리오에서 전체 코드베이스를 구성하는 방식을 지배하는 경우가 많습니다.

방대한 데이터 구조에 액세스하는 타이트한 루프를 단순히 병렬화하지 않을 경우 멀티 스레딩은 실제로 하드 코어 "디자인"범주로 이동하고 디자인은 항상 구현보다 우선합니다.

따라서 이러한 경우 멀티 스레딩을 미리 고려하는 것이 메모리 표현 및 액세스보다 훨씬 중요하다고 말하고 싶습니다.


0

동시 및 병렬 프로그래밍이 중요 해지고 있습니다. 스레드는 동시에 여러 작업을 수행하는 하나의 프로그래밍 모델입니다 (멀티 코어 프로세서가 등장하기 전의 의사 병렬 방식은 아님). 멀티 스레딩은 스레드가 많은 리소스를 공유하고 프로그래머가 스레드를 협력 할 책임이 있기 때문에 복잡하고 위험한 것으로 비난받습니다. 그렇지 않으면 디버그하기 어려운 교착 상태가 발생합니다.


0

많은 외부 응용 프로그램에 문의해야하므로 외부 시스템 상호 작용에 더 많은 시간이 걸리고 최종 사용자가 프로세스가 완료 될 때까지 기다릴 수없는 백그라운드 프로세스가 발생할 수 있습니다. 멀티 스레딩이 중요합니다.

우리는 우리의 응용 프로그램에서 사용하고 있습니다. 우리는 먼저 외부 시스템이 다운 된 경우 연결을 시도한 다음 요청을 데이터베이스에 저장하고 스레드를 스팬하여 backgound에서 프로세스를 완료합니다. 배치 작업에도 필요할 수 있습니다.


0

역사적으로 사람들은 다중 스레드 프로그래밍을 직접 수행하여 어려움을 겪어야했습니다. 모든 핵심 구성 요소 (스레드, 세마포어, 뮤텍스, 잠금 장치 등)와 직접 작업해야했습니다.

이러한 모든 노력으로 단일 시스템에 CPU를 추가하여 확장 할 수있는 응용 프로그램이 만들어졌습니다. 이 수직적 확장 성은 "내가 구입할 수있는 가장 큰 서버"에 의해 제한됩니다.

요즘에는 소프트웨어 디자인에 더 많은 프레임 워크와 다른 디자인 모델을 사용하는 방향으로 전환하고 있습니다. MapReduce는 일괄 처리에 중점을 둔 모델 중 하나입니다.

목표는 수평 확장입니다. 더 큰 서버를 구매하는 대신 표준 서버를 추가하십시오.

다중 스레드 프로그래밍을 이해하는 것이 매우 중요하다는 사실은 여전히 ​​남아 있습니다. 나는 누군가 경쟁 조건을 만들었고 테스트 중에 이상한 오류가 나타날 때까지 경쟁 조건이 무엇인지조차 알지 못하는 상황에 처해 있습니다.


-1

내 기계에는 8 개의 코어가 있습니다. 작업 관리자에서 60 개의 프로세스가 실행 중입니다. VS와 같은 일부는 최대 98 개의 스레드를 사용합니다. Outlook은 26을 사용합니다. 대부분의 메모리 사용량은 이러한 유휴 스레드 각각에 할당 된 스택입니다.

개인적으로 300 코어 컴퓨터가 나올 때까지 기다리고 있기 때문에 Outlook이 응답 할 때까지 기다릴 필요가 없습니다. 물론 그때까지 Outlook은 301 스레드를 사용합니다.

멀티 스레딩은 특정 시간에 컴퓨터에서 유일하게 중요한 프로세스가 될 시스템 (예 : 계산 엔진)을 구축하는 경우에만 중요합니다. 데스크톱 앱은 사용 가능한 코어를 모두 사용 하지 않으면 서 사용자에게 유리할 것입니다 . 요청 / 응답 모델을 사용하는 웹 앱은 본질적으로 다중 스레드입니다.

프레임 워크 및 언어 디자이너와 백엔드 시스템 프로그래머에게는 중요하지만 응용 프로그램 제작자에게는 그다지 중요하지 않습니다. 비동기 코드 잠금 및 작성과 같은 일부 기본 개념을 이해하는 것이 좋습니다.


나는 종종 긴 DB 부하로 백그라운드 스레드에 뭔가를 구타하지만 매우 드문 나는 (아마 결코 실제로) 경쟁 조건 또는 잠금 장치 등을 처리 할 필요가 없습니다 그
아란 멀홀랜드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.