문제

최근에, 나는 개발중인 응용 프로그램에서 인종 조건에 대해 몇 가지 우려 사항을 작성해야한다는 것을 알았습니다 (나에 의해). 이것은 비 기술적이며 직접적인 의사 소통을하지 않는 이해 관계자들의 관심을 끌 수 있으므로 내 설명은 서면 형식으로되어야합니다.

나는 이미이 글을 시도했다. 나는 가능한 한 최선을 다해 기술적 인 세부 사항을 밝히고, 응용 프로그램에서 레이스 조건이 어떻게 발생하는지에 대한 예를 제시하고 그 영향을 설명합니다. 나는 꽤 잘했다고 생각하지만 완벽하지 않습니다.

문제는 컴퓨터 과학에서 독자를 보호하려고하는 한, 나는 여전히 정확성과 물질을 잃지 않고 "실행 스레드"및 "상호 배제"와 같은 문구를 제거하기가 여전히 어렵다는 것을 알게되었습니다. 위험은 너무 많은 손을 흔들면서 이러한 우려가 Boogeyman으로 만들어 질 수 있다는 것입니다.

어쨌든, 당신에게 내 질문은 이것입니다. 어떻게 비 기술적 인 청중에게 인종 조건을 설명 하시겠습니까? CPU 예약을 감히 설명 하시겠습니까? 당신은 식사 철학자?

당신은 내 상황의 제약 내에서 일할 필요가 없습니다 (그러나 당신이 그렇게한다면 정말 도움이 될 것입니다).

도움이 되었습니까?

해결책

회사 X는 은행에 $ 1,000를 가지고 있습니다. X는 $ 2,000의 임대료를 지불하고 회사 Y에게 제공되는 서비스에 대해 $ 10,000의 지불을 받았습니다. 그러나 인종 조건으로 인해 X는 $ 1,000의 적자이며 현재 파산 신청을하고 있습니다. = (

은행이 이런 방식으로 회사 X의 계정을 처리하는 방법을 설명 할 수 있습니다. 은행 직원 A는 현재 가치를 $ 1,000로, $ 10,000를 추가합니다. 은행 직원 B는 현재 가치 $ 1,000를 가져 와서 $ 2,000를 빼냅니다. 은행 직원은 가치를 $ 11,000으로 업데이트합니다. 은행 직원 B는 가치를 $ 1,000으로 업데이트합니다.

다른 팁

은행 거래가 좋은 예일 수 있다고 생각합니다. 두 가지 결과가 잘못 되었기 때문입니다. 나쁜 그리고 그러한 환경에서 인종 조건이 쉽게 만들 수 있기 때문입니다.

내 계정에 $ 500가 있습니다. 누군가가 $ 50를 철회하는 동시에 나에게 200 달러를 옮깁니다.

이제 은행이 인종 조건을 제대로 처리하지 않으면 다음을 수행합니다 (물론 거래가 수동으로 처리되었다고 가정하십시오. 물론) 서기 A는 내 잔액에 200 달러를 추가하라는 요청을보고 현재 잔액은 $ 500입니다. . 서기 B는 잔액에서 $ 50를 빼라는 요청을보고, 내 잔액은 현재 $ 500입니다 (서기 A는 아직 돈을 이체하지 않았습니다).

서기 A는 서류 작업을 마치고 내 계정 잔액을 $ 700 (500 +가 추가해야 할 200 개 이상)으로 설정합니다. 그리고 1 분 후 (사무원 B가 커피 한 잔을 마셔야했기 때문에), 서기 B는 다른 거래를 마치고 잔액을 450 달러로 설정했습니다 (그가 확인했을 때 500 명을 뺀 것을 뺀 500 ).

내 잔액은 이제 경주 상태로 인해 $ 650이었을 때 450 달러입니다. 결과는 두 거래의 다른 부분이 수행 된 순서에 달려있었습니다.

그것이 인종 조건이 어떻게 나쁜지에 대한 일반적인 설명입니다. 이제 서기 대신, 우리는 신청서가 두 가지 별도의 작업을 동시에 처리하고 있다고 말하면서 (즉, '실행의 스레드') 위와 마찬가지로 값을 읽고 값을 수정합니다. 그들 읽은 다음 다시 쓰십시오. 그런 다음 위에 표시된 순서대로이 경우 수정 중 하나가 손실 될 수 있습니다. 이를 앱의 특정 문제와 관련시켜야합니다.

나는 식당 철학자의 esque 접근법을 위해 갈 것이지만, 청중에 따라, 나는 그것을 청중의 맥락과 유사하게하려고 노력할 것입니다. 비즈니스 경영진과 대화하고 있습니까? 그런 다음 회의실이나 회사 차량을 할당하거나 호텔 방을 예약하는 것과 같은 것과 유사하십시오. 평범한 사람들과 이야기하고 있습니까? 그런 다음 식당 철학자의 모범은 괜찮거나 농장 동물을 돌보거나 의자에 앉아있는 비슷한 상황을 생각할 수 있습니다.

식당 철학자의 모범을 가로 채 든 자신의 모범을 보이든 은유를 사용하십시오.

기술이 아닌 청중에게 편지를 쓰고 있다면 설명을 단순화하고 이해할 수있는 것과 관련이 있습니다. 경험이없는 프로그래머에게 병렬 컴퓨팅을 가르치기위한 논문 유사체에서 가져온 한 가지 설명 (http://portal.acm.org/citation.cfm?doid=1189136.1189172) 펜 게임 측면에서 설명합니다.

우리는 펜 게임이라는 게임을 할 것입니다. 규칙은 간단합니다 : 나는 내 손에 펜을 잡고“하나, 둘, 셋, 가라”라고 말할 것입니다. 내가“가”라고 말할 때, 내 손에서 펜을 가져 가십시오. 펜을 얻는 사람은 누구나 승리합니다. 준비가 된? 하나, 둘, 셋,가.

그런 다음이 게임의 결과를 미리 예측할 수 있는지 묻습니다. 예측할 수 없다면 올바른 결과를 보장 할 수 있습니까? 이로 인해 동시에 동시에 쓰기에 대한 잘못된 결과를 얻을 수 있다는 실현으로 이어질 것입니다.

나는 식당 철학자들을 추천하려고했지만, 당신이 이미 그것을 발견 한 것을 본다. 그렇다면 대안으로 Gridlock을 비유로 사용하는 것은 어떻습니까?

단일 도시 블록 (North Ave, South Ave, East Street 및 West Street) 옆에있는 4 개의 거리를 따라 정상적인 교통 운전을 상상해보십시오. 도로에 하나 또는 두 대의 자동차 만 있으면 모든 것이 매끄럽게 움직입니다. 꾸준한 교통량이 있으면 일부 자동차는 다른 자동차가 지나가기를 멈추고 기다려야하지만 이것은 관리 가능한 문제입니다. 한 차량은 다른 차가 지나가기를 기다린 다음 메리 방식으로 계속됩니다.

이제 같은 위치의 러시 시간 트래픽. 웨스트 스트리트에서 남쪽으로 운전하는 한 자동차가 우리 도시 블록의 북서쪽 코너에있는 교차로를 통해 완전히 만들 수는 없다고 가정 해 봅시다. 그 차는 이제 North Ave의 모든 서쪽 크로스 트래픽을 차단합니다. 서쪽으로 향하는 자동차가 북동쪽 코너 교차로를 통과하려고 시도하고 이스트 스트리트의 모든 북쪽 트래픽을 차단하기까지는 오래 걸리지 않습니다. 이 상황이 4 개의 교차로 주변에서 끝날 때, 어떤 자동차도 움직일 수 없습니다! 각각은 차가 앞에 나아갈 때까지 기다리고 있지만, 차를 뒤로 끌어 당기지 않고 그리드 락을 할 수있는 방법은 없습니다.

컴퓨팅과의 비교는 간단해야합니다. 자동차는 실 또는 프로세스, 거리 및 길은 프로세서, 버퍼 또는 코어입니다. 차단의 개념은 신호등이나 정지 신호를 사용하여 설명 할 수 있으며, 모든 것이 비 프로그램 자조차도 직관적 인 의미가되기 시작합니다.

프로그램 작성 :

  1. 급여를 기다리십시오.
  2. 가게에 가다.
  3. 음식을 사다.
  4. 플레이트를 켭니다.
  5. 접시에 음식을 넣으십시오.
  6. 20 분 동안 플레이트를 보관하십시오.
  7. 먹다.
  8. 잠자리에 든다.

이제 두 개의 스레드 (귀하, 아내)가 Syncronization없이 실행하도록하십시오.

  • 당신 : 급여를 기다리십시오.
  • 아내 : 돈없이 가게에 가서 충돌

  • 당신 : 접시를 켜십시오.

  • 당신 : 20 분 동안 플레이트를 유지하십시오.
  • 너 자러가.

  • 아내 : 다른 사람의 장소에서 식사.

  • 아내 : 잠자리에 든다.

베드로는 차도에서 철수하고 싶어합니다. 그는 자신의 차를 방해하는 것이 없다는 것을 확인한 다음 들어갑니다. 그의 아들 프랭크는 차 뒤에 숨어 있습니다. 베드로는 그를 볼 수없고 그를 넘어 섰습니다.

여기서 중요한 것은 컴퓨터의 경우 "검사"및 "수정"이 두 가지 별도의 동작 인 경향이 있다는 것입니다. 따라서 수정할 때 무언가를 확인할 수없는 예는 좋은 것입니다.

평범한 분명은 어떻습니까?

인종 조건은 말 그대로 두 사람 사이의 인종입니다.

회사는 프로젝트에 입찰하고 있습니다. 입찰에 대해 독립적으로 일하는 두 명의 직원이 고객에게 제출하지만 직원 중 한 명은 구식 정보를 가지고 있습니다. 어느 직원도 다른 사람이 입찰을 제출하는 과정에 있다는 것을 알지 못하므로 누가 더 빠른지에 따라 첫 번째 입찰은 느린 직원으로 대체 될 수 있습니다. 이로 인해 입찰이 시간이 지남에 따라 변경 될 수 있으므로 혼란이 발생합니다.

함께 일하거나 그 중 하나를 중지하려면 두 직원 사이에 의사 소통이 필요합니다.

일반적인 개념을 설명하는 데있어 한 가지 어려움은 인종 조건이 다양한 상황에서 나타난다는 것입니다. 당신의 목표가 당신의 비 기술적 인 청중에게 이것이 일반적인 문제 유형이라는 의미를 부여한다면, 당신은 하나 이상의 예를 제공해야합니다.

사진은 1000 단어의 가치가 있습니다. 그 사실. 타임 라인을 그리고 일부 엔티티를 작성하고 시간이 진행됨에 따라 상태 변경을 보여 주면 한 가지 다이어그램에서 경주 조건을 쉽게 보여줄 수 있습니다. 사진을 바로 얻는 데 몇 가지 다시도 필요한 것이 필요할 수 있지만, 나는 항상 그것을 뽑는 것이 내 요점을 설명하는 것보다 더 빨리 내려 가야한다는 것을 알았습니다.

동시성에 대한 생각은 본질적으로 어렵 기 때문에 이것을 간단한 방식으로 설명하기가 어렵다고 생각합니다. 금융 거래의 기본 아이디어는 사람들이 실생활에서 그들에 대해 친숙 할 것이기 때문에 시작하기에 좋은 곳이 될 수 있습니다.

모든 종류의 거래에서는 두 곳에서 동시 출품작 (차감과 크레딧)을 만들어야합니다. 다른 거래를 수행하려는 다른 사람에 의해 거래가 중간에 중단되면 계정의 하나 또는 다른 계정에서 잘못된 잔액이 표시됩니다.

좋은 예가 있습니다 운영 체제 애플리케이션을 통한 구조적 동시 프로그래밍 (내가 기억하는대로)

빈곤 한 베 조르크스탄 국가에서는 두 줄이 터널의 단일 트랙으로 합쳐집니다. 충돌이 있었고 판결 junta에는 해결책이 필요합니다.

문제는 산이이고 엔지니어는 눈이 멀다는 것입니다. 터널에서 충돌하려는 두 열차에 대한 사전 경고는 거의 없습니다.

다음은 계획입니다.

  1. 시점에 큰 그릇을 넣으십시오.

  2. 각 엔지니어에게 작은 황동 원숭이를 제공하십시오.

터널에 들어가려고 할 때는 기차를 멈 춥니 다. 당신은 그릇에 두드려서 놋쇠 원숭이가 그릇에 있는지 확인합니다.

원숭이가 있다면 다른 사람이 터널을 사용하고 있으므로 기차가 터널에 완전히있을 때까지 기다려야합니다. 이때 지휘자는 카부 로스에서 나와 그릇에서 원숭이를 잡습니다.

원숭이가 없다면 다른 사람은 터널을 사용하지 않습니다. 따라서 엔진 실에서 원숭이를 잡고 그릇에 넣고 터널을 통해 운전하여 트랙에 대한 독점적 인 액세스를 인수했음을 알 수 있습니다. 물론, 당신은 지휘자가 황동 원숭이를 회수 할 수 있도록 간단히 멈 춥니 다.

뭔지 맞춰봐?

그들 아직 충돌이 있었다!

왜요? 이것이 실패하게하는 상황이나 일련의 행동은 무엇입니까?


그것은 인종 조건입니다.

서면 문서에서는 인종 조건이 어떻게 사고로 이어지는 지 설명 할 수 있습니다.

프레젠테이션에서는 동시성과 잠금에 대한 추론을 통해 청중을지도 할 수 있습니다.

데이터 레이스 조건의 공유 메모리 은행 계정 예를 사용합니다.

컴퓨터는 다음과 같은 작업을 수행한다고 설명합니다.로드 밸런스; 추가 1; 저장 잔액;. 은행 계좌 잔고를 수정하는 두 개의 스레드를 고려하십시오 (귀하와 아내는 동시에 1 달러를 입금합니다).

다음 스레드가 모두 다음과 같은 후에 개단 된 경우로드 밸런스; 그런 다음 재개하면 1 달러를 잃을 수 있습니다.

보다: http://wasp.cs.washington.edu/atomeclipse/handouts.pdf

당신이 언급했듯이, 당신은 종종 은유로도 인종 조건을 정확하게 설명하기 위해 다른 개념 (상호 배제, 실행 스레드)을 소개해야합니다. 따라서 은유를 사용 하여이 용어를 정의 (또는 최소한 아이디어를 얻는 것)를 먼저 시도하십시오.

간단한 예로, 4 방향 교차로 (오른쪽으로 운전하는 국가에 설정)를 사용해 봅시다. 교차로를 북서쪽, 북동쪽, 남동부 및 남서쪽의 4 개의 사분면으로 나눕니다. 이제 각 사분면을 자원으로 호출하고 각 차를 실행 스레드라고 부릅니다. 이 자동차는 교통 시스템 만 존중하며,이 교차로에는 정지 신호 나 신호등이 없기 때문에 자동차는 트래픽 속도를 늦추거나 고려하지 않고 바로 통과합니다.

하나 이상의 자동차 로이 사분면 중 하나를 동시에 사용하는 것이 나쁘고 자동차 충돌이 발생한다는 것을 쉽게 보여줄 수 있습니다. 명백한 해결책 중 하나는 트래픽 시스템을 설치하는 것입니다. 이 시스템은 하나 이상의 자동차가 동시에 사분면을 통과하지 않도록합니다. 모든 자원을 묶지 않고 복잡하게 할 수 있습니다. 예를 들어, 남쪽에서 나오는 자동차가 서쪽으로 좌회전 할 수있게하는 동시에 서쪽과 북서쪽 사분면을 사용하여 서쪽에서 오는 자동차가 남쪽으로 향하는 오른쪽으로 향합니다 (남서쪽 사분면 사용) . 트래픽 시스템은 상호 배제를 제공하거나 공통 자원 (교차로의 도로의 사분면)을 동시에 사용하는 것을 방지하고 있습니다.

이것은 적어도 이러한 정의의 배후에있는 아이디어, 공유 리소스에 동시에 액세스하는 아이디어를 제공합니다. ~할 수 있다 나쁘고 상호 배제는이 문제를 해결할 수 있습니다. 이것이 확립 된 후에, 인종 조건이 무엇인지, 그리고 공통 자원에 대한 상호 배제가 부족한 결과로 인해 어떻게 나쁜 것들 중 하나인지 보여주기 위해 이것을보다 적절한 은유에 매핑해야합니다.

시간이 조금 더 걸리지 만 더 복잡한 은유로 드릴링하기 전에 용어와 큰 그림에 대해 친숙하게 부여합니다.

이해 관계자에게 돈에 대해 이야기하면 특히 이로 인해 실제 돈을 잃고 있다고 가정하면 공황 모드로 보낼 수 있습니다. 문제가 구체적으로 순이익 손실을 초래하지 않는 경우 정확히 이상적이지 않으므로 재정적으로 덜 지향적입니다. 누구에게나 인종 조건을 설명 할 수있는 방법에 대한 이야기.

이 이야기 교착 상태의 개념을 다루지 않습니다, 그러나 더 전통적인 인종 조건 시나리오와 결과.

스토리는 여기에서 시작됩니다 :

설정: 철도 네트워크로 연결된 3 개 도시가 있습니다. 열차에는 3 개 도시와 철도 네트워크 사이에 사용되고 있기 때문에 어떤 도시에서 왔는지, 어떤 도시가 갈 것인지를 나타내는 표시가 없습니다. 시각. 네트워크가 작기 때문에 열차가 도착하여 떠날 때 구체적인 일정이 없습니다. 스테이션 감독관은 기차가 출발했을 때 다른 시티 스테이션 감독관으로부터 전화를받습니다. 감독관은 떠날 때와 모든 열차가 동일한 모델이기 때문에 동일한 속도로 운전하므로 감독관이받을 때 다른 도시들의 전화는 역의 사람들에게 다음과 같이 발표했다. 그래서 City C로 여행하고자하는 사람들은 기차를 기다리고 City C로 갈라지고 즐겁게 타십시오.

문제 : 그러나 어느 날 열차가 A에서 B 로의 경로를 계획함에 따라 A와 B 사이의 반쯤 끊어졌습니다. 운 좋게도 기술자들은 매우 숙련되어 잠시 동안 열차를 수리 할 수있을 것입니다. 그러나 같은 날에 또 다른 열차는 C에서 B 로의 다른 노선을 계획하고있었습니다. B의 감독관은 A로부터 열차가오고 있다는 전화를 받았으며, C로부터 다른 열차도 다가오고 있다는 또 다른 전화를받은 직후에 전화를 받았습니다. 스테이션 감독관은 역에서 기다리고있는 승객들에게 발표했다. 승객이 수하물을 모아서 각 플랫폼으로 갔다. 감독관은 기차가 오는 것을 보았고 사람들이 City C로 향할 계획이있는 플랫폼으로 레일을 리디렉션했습니다. 그들은 열차가 실제로 도시 A로 가고 있다는 것을 거의 알지 못했습니다. 다른 열차는 '기계적 문제가 역에 도착한 후 감독관은 그것을 도시 A로 가고 싶은 승객을 포함하는 승객을 포함한 플랫폼으로 행복하게 지시했다. 감독관은 평소와 같이 순서대로 도착할 것이라고 가정했습니다.

인종 조건과 많은 컴퓨터 과학 구조의 문제는 사람들이 컴퓨터가 아니라는 것입니다. 학생들에게 알고리즘을 설명 할 때마다 "컴퓨터는 상식이없고, 지시 사항"이라고 대답하는 대답합니다. 그 외에도, 당신은 인종 조건을 레이스로 설명해야하며, 사람들이 실제로 가능하다면 실제로 레이스를 시도하게하는 것이 가장 합리적입니다. 그렇게하면 상황이 어떻게 잘못되는지 볼 수 있습니다. 그러나 ... 그들은 상식을 사용할 수 없습니다.

그래서 우리는 두 사람이 빨간색, 주황색, 노란색 순서대로 컬러 블록을 채우는 게임이 있다고 가정 해 봅시다. 그들은 빨간색, 주황색 및 노란색 블록이 많습니다. 모든 스택은 정확히 3 블럭 높이 여야합니다.

첫 번째 게임에서 둘 다 가능한 빨리이 작업을 시도하지만 자체 스택에서만 작동합니다.

두 번째 게임에서 그들은 서로의 스택에 블록을 쌓을 수있게함으로써 함께 일하려고합니다. 그러나 그들은 손에있는 블록을 변경할 수 없으며 계획된 블록을 배치해야합니다.

이와 같은 상황이 Stack 1에서 발생한다고 상상할 수 있습니다.

player 1 grabs a red block
player 1 places red block         - player 2 grabs an orange block
player 1 grabs an orange block    - player 2 places an orange block
player 1 places an orange block

이제 우리는 두 개의 주황색 블록이있는 스택이 있습니다. 사람들이 상식을 가지고 있기 때문에 인간 게임에서는 결코 일어나지 않을 것이라는 점은 분명합니다. 오렌지 블록이 이미 배치 된 것을보고 오렌지 블록을 배치하기로 결정합니다.

또한이 비디오를 보여줄 수 있습니다. https://www.youtube.com/watch?v=tcgwndbsabc

화이트 보드를 사용하여 사소한 회계 작업을 수행합시다. 우리는 손에 $ 100를 얻었습니다 - 화이트 보드에 쓰십시오.

Alice는 최대 $ 100를 추가하는 수십 개의 송장을 보유하고 있으므로 100 달러를 주목하고, 가서 목록을 추가하여 5 분 안에 돌아와서 보드에 200 달러를 썼습니다.

밥은 쇼핑을 해왔다. 그는 화이트 보드에서 그 숫자를 가져 와서 가서 50 달러 상당의 구매를 빼고, 보드에 50 달러를 쓸 것입니다.

Bob이 먼저 돌아 오면 Alice가 그녀의 결과를 쓴 후 200 달러를 볼 것입니다. 앨리스가 먼저 돌아 오면 우리는 50 달러를 볼 수 있습니다. 우리가 뭐야 원하다 보는 것은 $ 150이며, 우리는 그 일을하기 위해 몇 가지 예방 조치를 추가해야합니다.

그것은 합리적인 직관으로 기술 솔루션에 대한 토론을 발판하기에 충분해야합니다.

예를 들어, 뮤텍스는 화이트 보드가있는 방에 문을 잠그고 그곳에서 일을하게한다는 것을 의미합니다. 낙관적 인 솔루션은 숫자가 떨어져있는 동안 숫자가 변경되면 확인하고 다시 시작하도록하는 것을 의미합니다. 교착 상태에 대해 이야기하고 싶다면 밥이 잠긴 방 안에서 앨리스에게 전화하여 서두르라고 요청하는 것에 대해 웃을 수 있습니다.

보내십시오 경쟁 조건 Wikipedia에서.

첫 번째 부분은 어떤 의미가 있으며, 나머지는 (아래 표시되지 않음) 당신이 그것을 이해한다고 가정하기 때문에 똑똑해 보이게합니다.

"레이스 조건 또는 인종 위험은 시스템 또는 프로세스의 결함으로, 프로세스의 출력 및/또는 결과가 다른 사건의 시퀀스 또는 타이밍에 예기치 않게 크고 비판적으로 의존합니다.이 용어는 각각 각각 경주하는 두 신호의 아이디어로 시작됩니다. 다른 결과는 출력에 먼저 영향을 미칩니다. "

나는 타이밍이 때때로 다르기 때문에 예측할 수없는 타이밍 문제가 가장 자주 발생할 수 있다는 점이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top