동시 프로그래밍은 매우 어렵습니다. 기본 슬라이드를 보더라도 나에게는 어려운 것 같습니다. 너무 추상적 인 것 같습니다.
동시 프로그래밍 개념을 잘 알고 있으면 어떤 이점이 있습니까? 정기적이고 순차적 인 프로그래밍에 도움이됩니까? 프로그램이 어떻게 작동하는지 이해하는 데 만족한다는 것을 알고 있습니다.
동시 프로그래밍은 매우 어렵습니다. 기본 슬라이드를 보더라도 나에게는 어려운 것 같습니다. 너무 추상적 인 것 같습니다.
동시 프로그래밍 개념을 잘 알고 있으면 어떤 이점이 있습니까? 정기적이고 순차적 인 프로그래밍에 도움이됩니까? 프로그램이 어떻게 작동하는지 이해하는 데 만족한다는 것을 알고 있습니다.
답변:
여기에 빠르고 쉽게 동기 : 당신은 아무것도에 대한 코드를하지만 작은, 약한 시스템 싶은 경우에, 당신은 것입니다 동시 코드를 작성한다.
클라우드 용으로 쓰고 싶습니까? 클라우드의 컴퓨팅 인스턴스는 작습니다. 당신은 큰 것을 얻지 못하고, 작은 것을 많이 얻습니다. 갑자기 작은 웹 앱은 동시 앱입니다. 잘 설계했다면 고객을 확보하면서 더 많은 서버를 버릴 수 있습니다. 그렇지 않으면 인스턴스의 평균로드가 어떻게 고정되어 있는지 알아야합니다.
좋아, 데스크탑 앱을 작성하고 싶습니까? 모든 것에는 코어 CPU가 2 개 이상 있습니다. 가장 저렴한 기계를 제외하고. 그리고 가장 저렴한 기계를 가진 사람들은 아마도 당신의 비싼 소프트웨어를 위해 갈리 지 않을 것입니다.
모바일 개발을 원하십니까? iPhone 4S에는 듀얼 코어 CPU가 있습니다. 나머지는 그리 멀지 않을 것입니다.
비디오 게임? Xbox 360은 다중 CPU 시스템이며 Sony의 PS3는 기본적으로 다중 코어 시스템입니다.
작고 간단한 문제를 해결하지 않으면 동시 프로그래밍에서 벗어날 수 없습니다.
2016 년 업데이트 : 현재 35 달러짜리 Raspberry Pi는 휴대 전화 용 칩에 쿼드 코어 시스템을 중심으로 구축되었습니다. 병렬 컴퓨팅 엔진으로 고급 그래픽 카드를 사용할 수있게되면서 AI가 대폭 향상되었습니다.
Everything has a dual-or-more-core-CPU. Except the least expensive machines.
, 조금 터무니없는 것 같습니다. 많은 사람들이 저렴한 가격 때문에가 아니라 자신이 가진 것에 만족하고 업그레이드 할 필요가 없기 때문에 단일 코어 머신을 가지고 있습니다. 즉, 어디서나 노력을 낭비되지 않도록 당신이 (이 중, 선점 형 멀티 태스킹을 가정 할 수있다,뿐만 아니라 단일 코어 시스템에서 스케줄러 도움이 될 것 동시성의 관점에서 생각했다 이며 , 대부분의 개발자들이 접촉 할 모든 멀티 태스킹 환경을 요즈음).
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 의 저자이며 앞으로 몇 주 안에 조기 릴리스 될 예정입니다.
동시 프로그래밍의 첫 번째 규칙은 "어려워요"입니다. 동시 프로그래밍의 두 번째 규칙은 "It. Is. Difficult"입니다 .. !!
그러나 동시 프로그래밍, 다중 스레딩 및 다중 처리에 대한 두 가지 일반적인 접근 방식이 있습니다. 멀티 프로세싱은 작업을 수행하기 위해 프로세스의 여러 인스턴스를 실행하는 것을 의미하므로 이해하기가 가장 쉽습니다. 포크 / 조인 호출을 통해 Unix 기반 시스템에서 수행하기는 쉽지만 Windows 시스템에서는 쉽지 않습니다.
멀티 스레딩은 동시성에 대해 이야기 할 때 대부분의 사람들이 생각하는 접근법 일 것입니다. 응용 프로그램 내에서 여러 스레드를 시작하는 것은 어렵지 않지만 악마는 세부 사항에 있습니다. 교착 상태 또는 잘못된 상태의 데이터로 이어질 수있는 스레드 (일반적으로 잠금 사용)간에 데이터 공유를 조정해야합니다. 또한 세마포어, 조건부 변수 등과 같은 개념을 사용하여 스레드간에 통신하는 방법을 이해해야합니다.
이 모든 것의 장점은 일단 이해하면 기본 하드웨어를보다 효과적으로 활용할 수 있다는 것입니다. 요즘에는 프로세서가 여러 개의 코어를 갖는 것이 일반적입니다. 동시 프로그래밍을 사용하면 이러한 코어를 효과적으로 사용할 수 있으며 응용 프로그램의 속도가 향상됩니다.
단점은 애플리케이션을 다른 스레드에서 실행할 수있는 작은 부분으로 분할하는 방법에 대해 생각해야한다는 것입니다. 이것은 소리보다 훨씬 어렵습니다. 또한 실행 순서가 결정적이지 않기 때문에 동시 테스트 솔루션은 단위 테스트에 어색 할 수 있습니다.
요즘 대부분의 언어는 생활을 조금 더 쉽게하기 위해 대부분의 동시 기본 요소에 대한 추상화와 함께 제공됩니다. 예를 들어, .NET 4는 작업 병렬 라이브러리 와 함께 제공되어 삶을 조금 더 쉽게 만듭니다. Java 땅에는 동시성 패키지가 있습니다.
최근에 멀티 프로세싱으로 나를 구할 수있는 매우 흥미로운 작업이있었습니다. 기본적으로 몇 가지 별도의 서버에 많은 요청을 수행하여 매우 적은 양의 데이터를 처리하지만 많은 요청을 처리해야했습니다.
PHP로 작업하면서 구식 방식으로 작업했으며 몇 시간 동안 작업 한 후 얻은 최고의 시간 으로 특정 테스트를 실행하는 데 ~ 120 초가 걸렸 습니다 (많은 요청 + 네트워크 지연 + 비동기 없음)
그러나 그것은 내가 필요한 것에 비해 거의 충분하지 않았으며 PHP 다중 처리로 비참하게 실패한 후 Python으로 전환했습니다.
몇 시간 후 20 초 안에 실행되는 Python 다중 처리 스크립트를 실행했으며 시간 초과와 함께 약간의 혼란을 겪었습니다. 사용할 스레드 수 ~ 10 초로 줄 였습니다.
이것은 100 줄짜리 파이썬 스크립트 하나를 제외하고 PHP로 100 % 작성된 웹 사이트를위한 것입니다. 그리고 모든 것이 완벽하게 작동합니다.
내 결론 은 그것이 매일 당신에게 도움이되지 않더라도 적어도 동시 프로그래밍의 기초를 아는 것이 큰 도움이 될 수있는 상황에 처할 수 있다는 것입니다.
행운과 행복한 코딩!
추신: 나는 PHP를 강타하려고하지는 않지만 PHP는 현재 작업에 적합한 도구가 아니 었습니다.
PS2 : 새로운 기술을 알고 있거나 새로운 일을하는 방법은 완전히 새로운 가능성의 세계를 열어 줄 수 있습니다.
어떤 종류의 웹 개발을 수행한다면 적어도 대부분의 언어에서 동시성이 작동합니다. 예를 들어, 나는 웹 개발에 스프링을 사용하고 각각의 새로운 요청은 자체 스레드로 들어옵니다. 따라서 요청이 공유 객체에 액세스하게되면 변수의 상태를 변경할 수있는 동시성이 매우 중요한 요소이므로 고려해야합니다. 그렇지 않으면 예측할 수없는 방식으로 데이터를 편집 할 수 있으며 데이터가 손상 될 수 있습니다. 동시성에 대한 모든 마지막 세부 사항을 아는 것이 중요하지는 않지만 한 번에 조각을 배우는 것이 웹 응용 프로그램 프로그래밍을 더 잘 이해하는 데 중요합니다. 데스크톱 응용 프로그램에서 작업하는 경우 여러 스레드를 실행하지 않는 한 그렇게 중요하지 않을 수 있습니다.