동시 프로그래밍을 알아야하는 이유는 무엇입니까?


17

동시 프로그래밍은 매우 어렵습니다. 기본 슬라이드를 보더라도 나에게는 어려운 것 같습니다. 너무 추상적 인 것 같습니다.

동시 프로그래밍 개념을 잘 알고 있으면 어떤 이점이 있습니까? 정기적이고 순차적 인 프로그래밍에 도움이됩니까? 프로그램이 어떻게 작동하는지 이해하는 데 만족한다는 것을 알고 있습니다.


3
나는 그것이 주제가 아닌 것이라고 생각하지만, 모든 개인적인 것들을 편집하고 (동시 프로그래밍은 모두에게 매우 어려운 일이지만 ) 개념의 구체적인 기술적 장점을 요구 하면 주제가 될 수 있습니다 .
yannis

1
이점은 분명해야합니다. 동시 프로그래밍이 제공하는 작업 분할을 통해 사용 가능한 모든 성능 향상 기능을 활용할 수있는 프로그램을 작성할 수 있습니다. 누구에게나 쉽지 않습니다. 오늘날 매우 도전적인 개념입니다.
Rig

3
우리는 당신이 무언가를 배우려는 동기를 얻는 데 도움을 줄 수는 없지만 동시성에 대해 알아야 할 일반적인 질문은 충분히 주제입니다.

2
동시 프로그래밍을 알고 있습니다. 제공 한 슬라이드가 이해하는 데 도움이되지 않는다고 말할 수 있습니다. 대신 식사 철학자 와 함께 파티에 가십시오 .
mouviciel

1
가장 큰 어려움조차도 진정하십시오 : informit.com/articles/article.aspx?p=1193856
SK-logic

답변:


32

여기에 빠르고 쉽게 동기 : 당신은 아무것도에 대한 코드를하지만 작은, 약한 시스템 싶은 경우에, 당신은 것입니다 동시 코드를 작성한다.

클라우드 용으로 쓰고 싶습니까? 클라우드의 컴퓨팅 인스턴스는 작습니다. 당신은 큰 것을 얻지 못하고, 작은 것을 많이 얻습니다. 갑자기 작은 웹 앱은 동시 앱입니다. 잘 설계했다면 고객을 확보하면서 더 많은 서버를 버릴 수 있습니다. 그렇지 않으면 인스턴스의 평균로드가 어떻게 고정되어 있는지 알아야합니다.

좋아, 데스크탑 앱을 작성하고 싶습니까? 모든 것에는 코어 CPU가 2 개 이상 있습니다. 가장 저렴한 기계를 제외하고. 그리고 가장 저렴한 기계를 가진 사람들은 아마도 당신의 비싼 소프트웨어를 위해 갈리 지 않을 것입니다.

모바일 개발을 원하십니까? iPhone 4S에는 듀얼 코어 CPU가 있습니다. 나머지는 그리 멀지 않을 것입니다.

비디오 게임? Xbox 360은 다중 CPU 시스템이며 Sony의 PS3는 기본적으로 다중 코어 시스템입니다.

작고 간단한 문제를 해결하지 않으면 동시 프로그래밍에서 벗어날 수 없습니다.

2016 년 업데이트 : 현재 35 달러짜리 Raspberry Pi는 휴대 전화 용 칩에 쿼드 코어 시스템을 중심으로 구축되었습니다. 병렬 컴퓨팅 엔진으로 고급 그래픽 카드를 사용할 수있게되면서 AI가 대폭 향상되었습니다.


1
원칙적으로 동의하지만 Everything has a dual-or-more-core-CPU. Except the least expensive machines., 조금 터무니없는 것 같습니다. 많은 사람들이 저렴한 가격 때문에가 아니라 자신이 가진 것에 만족하고 업그레이드 할 필요가 없기 때문에 단일 코어 머신을 가지고 있습니다. 즉, 어디서나 노력을 낭비되지 않도록 당신이 (이 중, 선점 형 멀티 태스킹을 가정 할 수있다,뿐만 아니라 단일 코어 시스템에서 스케줄러 도움이 될 것 동시성의 관점에서 생각했다 이며 , 대부분의 개발자들이 접촉 할 모든 멀티 태스킹 환경을 요즈음).
CVn

1
오케이-그것은 약간의 과장이지만 새로운 하드웨어는 압도적으로 멀티 코어 인 경향이 있습니다. 나는 그것이 사라지는 것을 보지 못했다. 따라서 현재 작업에 대해 생각하는 학생이라면 앞으로 전문적으로 수행 할 멀티 코어 시스템에서 작업 할 것이라고 가정하는 것이 안전합니다.
ObscureRobot

내 의견에 동의하지 않는 한 귀하의 답변에 동의하지

1
내가 읽는 방식에는 @ acidzombie24와 비슷합니다. 나는 개발자가 동시성을 다루는 방법을 알아야한다고 말하고 있습니다. 동시 시스템의 함정을 피하는 한 동시 프로그래밍에 능숙하지 않아도된다는 말이 있습니다. :)
ObscureRobot

나는 동시성에 대해 아는 것이 매우 유용하지만, "작고 간단한 문제"에 대해서만 접근 할 수 없다는 데 동의합니다. 예를 들어 기존 프레임 워크 및 응용 프로그램 서버에 의존하는 경우와 같이 사소한 시스템에서도 동시성을 피할 수 있습니다. 인프라가 구축되면 웹 앱을위한 새로운 서비스를 작성하는 중급 개발자가 될 수 있으며 동시성 또는 병렬 처리에 대해서는 거의 아무것도 알 수 없습니다.
Andres F.

21

1970 년부터 2002 년까지 약 18 개월마다 프로세서 속도가 두 배로 증가했습니다. 프로그래머로서 당신이해야 할 일은 기다렸다가 프로그램이 더 빨라질 것입니다. 문제는 2002 년경 규칙이 바뀌 었다는 것입니다. 이제 그들은 더 빠른 프로세서를 만들지 않고 더 느린 프로세서를 만들지 않고 그룹으로 나눕니다. 현재 작업중 인 컴퓨터에는 4 개의 코어가 있으며 최대 8 개의 코어 (및 코어 당 4 개의 스레드)를 가진 칩이 있습니다. 머지 않아 더 많은 코어를 가진 칩을 갖게 될 것입니다.

따라서 전혀 동시 적이 지 않은 프로그램을 작성하면 1 코어 또는 스레드를 사용하고 있지만 나머지 CPU는 아무것도하지 않습니다. 따라서 16 개의 코어가 있다면 1 개가 프로그램을 실행하고 다른 15 개는 거기에 앉아 있습니다!

동시성의 문제는 결정적이지 않다는 것입니다. 즉, 다른 스레드가 어떤 순서로 작업을 수행하는지 정확히 알 수 없습니다. 전통적으로 프로그래머는 잠금 장치 등을 사용하여이를 해결하려고 시도했습니다. 이것은 많은 고통으로 이어졌습니다. 둘 이상의 스레드가 자유롭게 액세스 할 수있는 어떤 형태의 변경 가능한 상태를 갖는 것은 종종 통증과 헤이즈 버그에 대한 공식입니다!

최근 트렌드는 가변 상태를 엄격하게 제어하는 ​​기능적 언어로 이동하는 추세입니다. 기능적 언어가 동시성을 처리하는 두 가지 기본 방법이 있습니다. 첫 번째는 메시지 전달을 사용하는 것입니다. 이것은 Erlang이 가장 잘 보여줍니다. Erlang에는 일반적으로 프로세스간에 공유 상태가 없습니다. 그들은 메모리를 공유하는 것이 아니라 전달하는 메시지로 통신합니다. 우리가 지금하고있는 것처럼 이것은 당신에게 의미가 있습니다. 나는 당신이 내 뇌에서 그것을 기억하는 것이 아니라 메시지를 보내서이 정보를 당신에게 보내고 있습니다! 대부분의 잠금 버그를 전달하는 메시지로 전환하면 간단히 사라집니다. 또한 메시지는 하나의 노드 내뿐만 아니라 네트워크를 통해 전달 될 수 있습니다.

다른 방법은 STM (Software Transcriptional Memory)을 나타내며 클로저와 하스켈 (및 기타)에 있습니다. STM에서 메모리는 공유되지만 트랜잭션을 통해서만 변경할 수 있습니다. 데이터베이스 사람들이 1970 년대에이 모든 것들을 알아 냈을 때 우리가 올바르게 처리하는 것은 매우 쉽습니다.

실제로 Clojure와 Haskell은 메시지 전달을 할 수 있으며 Erlang은 STM을 수행 할 수 있습니다.

면책 조항 저는 Erlang을 사용한 Programming Web Services 의 저자이며 앞으로 몇 주 안에 조기 릴리스 될 예정입니다.


1
@Zachary K : 계산 집약적 인 부분이 모국어로 구현되도록 기능 언어를 모국어와 혼합하는 접근법이 있습니까? 그러나 기능 언어로 작성된 서버가 사용할 수있는 인터페이스를 제공합니까?
rwong

100 % 확실하지는 않지만 Clojure와 Scala가 JVM에 존재하므로 시작해야합니다. Akka 프레임 워크를 살펴보십시오. 나는 그것을 사용하지 않았지만 Akka에 대한 이야기를 잠시 들었고 꽤 멋질 것 같습니다. 현재 저는 Erlang과 Javascript를 사용하고 있습니다.
Zachary K

1
@rwong : .NET을 사용하면 프로그래머가 앱의 일부에 C # 또는 다른 비 기능적 언어를 사용하고 다른 언어에는 F # (기능적 언어)을 사용할 수 있습니다.
케빈

5

당신이 그것을 가장 적게 기대할 때 동시성이 당신의 얼굴에 날려 버릴 수 있기 때문에 ...


4
+10000000000000000000000000000000000000000

8
동시성은 새로운 스페인어
인퀴 지션입니다

1
@ObscureRobot이 두 배 이상 재미있다! (설명은 필요하지 않았다 :-p)
fortran

4

동시 프로그래밍의 첫 번째 규칙은 "어려워요"입니다. 동시 프로그래밍의 두 번째 규칙은 "It. Is. Difficult"입니다 .. !!

그러나 동시 프로그래밍, 다중 스레딩 및 다중 처리에 대한 두 가지 일반적인 접근 방식이 있습니다. 멀티 프로세싱은 작업을 수행하기 위해 프로세스의 여러 인스턴스를 실행하는 것을 의미하므로 이해하기가 가장 쉽습니다. 포크 / 조인 호출을 통해 Unix 기반 시스템에서 수행하기는 쉽지만 Windows 시스템에서는 쉽지 않습니다.

멀티 스레딩은 동시성에 대해 이야기 할 때 대부분의 사람들이 생각하는 접근법 일 것입니다. 응용 프로그램 내에서 여러 스레드를 시작하는 것은 어렵지 않지만 악마는 세부 사항에 있습니다. 교착 상태 또는 잘못된 상태의 데이터로 이어질 수있는 스레드 (일반적으로 잠금 사용)간에 데이터 공유를 조정해야합니다. 또한 세마포어, 조건부 변수 등과 같은 개념을 사용하여 스레드간에 통신하는 방법을 이해해야합니다.

이 모든 것의 장점은 일단 이해하면 기본 하드웨어를보다 효과적으로 활용할 수 있다는 것입니다. 요즘에는 프로세서가 여러 개의 코어를 갖는 것이 일반적입니다. 동시 프로그래밍을 사용하면 이러한 코어를 효과적으로 사용할 수 있으며 응용 프로그램의 속도가 향상됩니다.

단점은 애플리케이션을 다른 스레드에서 실행할 수있는 작은 부분으로 분할하는 방법에 대해 생각해야한다는 것입니다. 이것은 소리보다 훨씬 어렵습니다. 또한 실행 순서가 결정적이지 않기 때문에 동시 테스트 솔루션은 단위 테스트에 어색 할 수 있습니다.

요즘 대부분의 언어는 생활을 조금 더 쉽게하기 위해 대부분의 동시 기본 요소에 대한 추상화와 함께 제공됩니다. 예를 들어, .NET 4는 작업 병렬 라이브러리 와 함께 제공되어 삶을 조금 더 쉽게 만듭니다. Java 땅에는 동시성 패키지가 있습니다.


1
가능한 한 빨리 자물쇠에서 도망 치면 크기가 커집니다. STM 또는 배우와 말한 내용을 모두 사용하십시오. 물론 그것은 Java에서 Scala, Erlang 또는 Clojure와 같은 언어로 옮겨가는 것을 의미합니다. (나는 이것이 또한 좋은 것이라고 주장 하겠지만)
Zachary K

@Zachary : 좋은 일이지만 .NET 상점에서 일하는 경우 실용적이지 않습니다. STM은 향후에 옵션이 될 수 있지만 현재는 주류 언어의 옵션이 아닙니다.
Sean

Clojure는 .net에서 실행되며 F #이 있습니다. C #에 대한 STM 구현도 있다고 확신합니다.
Zachary K

3

최근에 멀티 프로세싱으로 나를 구할 수있는 매우 흥미로운 작업이있었습니다. 기본적으로 몇 가지 별도의 서버에 많은 요청을 수행하여 매우 적은 양의 데이터를 처리하지만 많은 요청을 처리해야했습니다.

PHP로 작업하면서 구식 방식으로 작업했으며 몇 시간 동안 작업 한 후 얻은 최고의 시간 으로 특정 테스트를 실행하는 데 ~ 120 초가 걸렸 습니다 (많은 요청 + 네트워크 지연 + 비동기 없음)

그러나 그것은 내가 필요한 것에 비해 거의 충분하지 않았으며 PHP 다중 처리로 비참하게 실패한 후 Python으로 전환했습니다.

몇 시간 후 20 초 안에 실행되는 Python 다중 처리 스크립트를 실행했으며 시간 초과와 함께 약간의 혼란을 겪었습니다. 사용할 스레드 수 ~ 10 초로 줄 였습니다.

이것은 100 줄짜리 파이썬 스크립트 하나를 제외하고 PHP로 100 % 작성된 웹 사이트를위한 것입니다. 그리고 모든 것이 완벽하게 작동합니다.

내 결론 은 그것이 매일 당신에게 도움이되지 않더라도 적어도 동시 프로그래밍의 기초를 아는 것이 큰 도움이 될 수있는 상황에 처할 수 있다는 것입니다.

행운과 행복한 코딩!

추신: 나는 PHP를 강타하려고하지는 않지만 PHP는 현재 작업에 적합한 도구가 아니 었습니다.

PS2 : 새로운 기술을 알고 있거나 새로운 일을하는 방법은 완전히 새로운 가능성의 세계를 열어 줄 수 있습니다.


2

어떤 종류의 웹 개발을 수행한다면 적어도 대부분의 언어에서 동시성이 작동합니다. 예를 들어, 나는 웹 개발에 스프링을 사용하고 각각의 새로운 요청은 자체 스레드로 들어옵니다. 따라서 요청이 공유 객체에 액세스하게되면 변수의 상태를 변경할 수있는 동시성이 매우 중요한 요소이므로 고려해야합니다. 그렇지 않으면 예측할 수없는 방식으로 데이터를 편집 할 수 있으며 데이터가 손상 될 수 있습니다. 동시성에 대한 모든 마지막 세부 사항을 아는 것이 중요하지는 않지만 한 번에 조각을 배우는 것이 웹 응용 프로그램 프로그래밍을 더 잘 이해하는 데 중요합니다. 데스크톱 응용 프로그램에서 작업하는 경우 여러 스레드를 실행하지 않는 한 그렇게 중요하지 않을 수 있습니다.


-1

운영 체제에 대한 통찰력을 배웁니다. 스케줄러 및 장치 드라이버의 소스 코드를 읽으면 도움이됩니다. 그들은 분명히 동시 적입니다.


2
프로그래머의 동시성은 일반적으로 여러 인스턴스에서 실행되는 자체 프로그램을 사용합니다.

나는 OS 커널의 스케줄링 알고리즘의 세부 사항을 알지 못하면 자신의 동시 프로그램을 작성할 수 없다는 것을 강조하려고 노력했다.
jj1bdx

왜 안돼? 잠금 메커니즘을 올바르게 사용하면 OS 스케줄링 알고리즘이 중요하지 않습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.