잠금을 사용하면 알고리즘에 여전히 잠금이 해제 될 수 있습니까?


10

잠금 해제의 일반적인 정의는 하나 이상의 프로세스가 진행된다는 것입니다. 1

잠금으로 보호되는 큐와 같은 간단한 데이터 구조가있는 경우 한 프로세스가 잠금을 획득하고 원하는 작업을 수행하고 해제 할 수 있으므로 한 프로세스가 항상 진행될 수 있습니다.

그래서 그것은 잠금없는 정의를 충족합니까?


1 예를 들어 M. Herlihy, V. Luchangco 및 M. Moir를 참조하십시오. 방해없는 동기화 : 예를 들어 더블 엔드 큐. Distributed Computing, 2003. "일부 스레드 만 항상 진행되도록하려면 잠금이 없습니다."


3
필자는 잠금을 사용하지 않는 데이터 구조와 알고리즘, 즉 정의 된 작은 원자 메모리 연산 집합을 설명하는 "자유 잠금"을 항상 이해했습니다. 예 : drdobbs.com/parallel/writing-lock-free-code-a-corrected-queue/…
Paul Johnson

답변:


16

그것은 잠금이없는 것에 대한 정의가 아닙니다.

진행 상황을 보장 할 수있는 경우 교착 상태가없고 모든 요청이 최종 완료되면 기아 상태 는 없지만 잠금 상태는 아닙니다.

나는 당신의 간단한 예제가 실제로 이것을 제공하는지에 의문을 제기합니다. 여러 잠금이 포함 된 경우 실제로 진행 상태를 보장하려면 잠금 계층 구조 등이 필요합니다.


1
나는 M. Herlihy의 정의를 사용하고 있습니다. 동시성이 높은 데이터 객체를 구현하는 방법론. 프로그래밍 언어 및 시스템에 대한 트랜잭션, 1993. "잠금이없는 상태는 일부 프로세스가 임의의 중지 실패 또는 다른 프로세스에 의한 지연에도 불구하고 항상 진전을 보장합니다"
Joe Pension

12
@ 조 : 그것은 정의가 아니며, 의미를 설명합니다. 역의 논리 오류를 조심하십시오.
Ben Voigt

2
M. Herlihy, V. Luchangco 및 M. Moir도 인용 할 수 있습니다. 방해없는 동기화 : 예를 들어 더블 엔드 큐. Distributed Computing, 2003. "일부 스레드 만 항상 진행되도록하려면 잠금이 없습니다."
Joe Pension

1
또한 (모든 프로세스가 할 어떤 다른 프로세스에 상관없이 갈 얻는다) 참고 CA는 루프 (원자 프리미티브 기준) 아니라는 것을 무료로 교착 상태보다 더 구체적입니다 무료로 기아가
래칫 괴물

5
@Joe : 세계의 다른 지역이 그 속성을 deadlock-free 라고 부르면 , 그 용어를 사용할 것입니다. 아니요, 간단한 예는 교착 상태가 아닙니다. 교착 상태가없는 것을 보장하기 위해 동기화가 필요할뿐만 아니라 잠금을 유지하는 동안 스레드가 차단 작업을 수행하지 않도록 보장합니다. "원하는 것을하십시오"는 매우 모호하며이 보증을 제공하지 않는 것 같습니다.
Ben Voigt

11

나는 다중 프로세서 프로그래밍 1 의 예술을 연구했으며 그 텍스트는 당신이 참조하는 책과 같이 명확성이 부족합니다. TAMPP의 인용문은 다음과 같습니다.

견적 1 (자유없는 정의)

메소드 호출이 유한 한 단계로 무한정 완료되는 것을 보장하는 경우 메소드는 잠금이 없습니다.

견적 2 (비 차단의 정의)

다른 보류중인 호출이 완료 될 때까지 기다릴 필요가없는 total 메소드의 보류중인 호출이 필요하지 않습니다.

견적 3 (자물쇠가 비 차단임을 주장)

대기 및 잠금이없는 비 차단 진행 조건은 시스템이 스레드를 예약하는 방식에 관계없이 전체적으로 계산이 진행되도록합니다.

문제는 인용문 3의 주장이 인용문 1의 정의를 분명히 따르지 않는다는 것입니다. 이미 언급했듯이 동기화 된 대기열은 인용문 1을 만족시키는 것처럼 보입니다.

인용문 3에서 "시스템이 스레드를 예약하는 방법과 무관하게"매우 모호한 문구에 주목하십시오. 여기에는 "스레드 스케줄링 시스템"에 대한 공식적인 설명이 나오지 않으므로 정의의 의미 에 대한 선입견을 바탕으로 속성을 재구성 해야 합니다.

  1. 시스템은 항상 일부 스레드의 명령을 실행 합니다.
  2. 주어진 스레드의 명령을 절대 실행할 수 없습니다 .
  3. 모든 스레드는 고려중인 메소드를 호출합니다.

이러한 시스템에서는 블로킹 방법에 잠금이 없어야합니다. 잠금을 보유한 스레드가 다시 실행되도록 예약되지 않은 경우, 한정된 단계로 메소드 호출을 완료 할 수있는 다른 스레드가 없습니다. 메소드의 단계를 실행하는 일부 스레드. 보다 현실적인 시스템의 경우, 각 스레드에 CPU 시간을 제공한다는 보장은 비 블로킹 속성을 명시 적으로 포함해야합니다.

잠금없는 정의 수정

메소드는 비 블로킹 인 경우 잠금이 없으며 추가로 일부 메소드 호출이 유한 한 수의 단계로 완료되는 것을 보장합니다.

1 Maurice Herlihy, Nir Shavit, 멀티 프로세서 프로그래밍 기술, Elsevier 2008, 58-60 페이지


1
인용문 1의 문구는 정말 이상합니다. "무한하게 자주"라는 것은 무엇을 의미합니까? 분명히 "항상"과 다른 점이 있으므로 "일부"경우에는 메소드가 절대 반환되지 않는 것이 좋습니다.
헐크

예, 부정확 한 언어가 풍부합니다. 어쨌든 "종종"은 무엇입니까? 나는 그것이 "무한한 실행 역사에서,이 특정한 사건은 무한히 여러 번 일어난다"는 것을 의미한다고 생각합니다.
Marko Topolnik

5

용어가 항상 일관된 것은 아니지만 중요한 것은 제안 된 알고리즘이나 시스템에 대해 다음과 같은 질문을하는 것입니다.

  1. 모든 스레드가 사용할 수있는 모든 CPU 시간이 허용 된 경우에도 스레드가 서로를 기다리면서 멈출 수있는 일련의 이벤트가 있습니까?
  2. 한 스레드가 임의의 오랜 시간 동안 차단 된 경우 다른 스레드가 중단되거나 시스템 작동이 임의로 오랜 시간 동안 손상 될 수 있습니다 (그렇다면 차단되지 않음).
  3. 이론적으로 가능한 스레드 스케줄링의 조합이 있습니까? 누구나 진행하지 않아도 서로의 작업을 무효화하면서 모든 스레드가 동일한 작업을 반복적으로 재 시도하게 할 수 있습니까?
  4. 일부 스레드에 다른 스레드에 비해 충분한 CPU 시간이 주어지면 후자의 스레드가 작업을 무기한으로 다시 시도하도록 강제 할 수 있습니다 [그렇다면 대기하지 않습니다].

잠금이없는 알고리즘의 중요성은 잠금이없는 알고리즘보다 빠르다는 것이 아니라 스레드가 길을 잃을 경우 죽지 않는 사실입니다. 알고리즘은 비 차단이지만 모든 잠금없는 알고리즘은]입니다. 잠금없는 알고리즘이 잠금을 사용하는 것이 가능하지만 잠금 획득 시도에 알고리즘과 함께 시간 초과가 포함되어 누군가가 항상 진행할 수 있도록하는 경우에만 가능합니다 (예 : 알고리즘이 CompareExchange루프를 기본으로 사용할 수 있음) 중재 방법이지만 경합이 높을 때 액세스를 중재하기 위해 잠금을 사용하십시오. 잠금이 너무 오래 유지되는 것처럼 보일 경우 다른 스레드는 해당 잠금을 사용하려는 노력을 포기하고 대신 새로운 스레드를 만들 수 있습니다.CompareExchange고객이 잠금을 포기한다고해서 시스템 일관성이 위태로워지지는 않지만 이전 잠금을 유지하고 있던 코드는 이전 잠금을 포기하고 새 잠금에 맞춰질 때까지 어떤 작업도 수행하지 않을 수 있습니다.


이는 표준 용어와 다릅니다. 2. 비 차단의 표준 의미를 나타내는 반면 3. 자물쇠 자유를 의미합니다.
Marko Topolnik

일관성없는 용어 사용법을 보았으며 "공식적인"표준을 모릅니다. 가장 중요한 것은 알고리즘이 제공 할 수있는 보증이 다르고 응용 프로그램 요구 사항을 충족시키기에 충분한 보장을 제공하는 알고리즘을 사용하는 것이 중요하다는 것입니다. 많은 논문이 위의 보증 중 일부만 다루고 있지만 각 요구 사항을 충족하는 다른 보증보다 더 쉽게 응용 프로그램 요구 사항을 충족시킬 수있는 경우가 있습니다.
supercat

멀티 프로세서 프로그래밍 기술에 제시된 용어가 "표준"이라는 의견이 일치한다고 생각합니다.
Marko Topolnik

@MarkoTopolnik : 그때에 맞게 게시물을 편집하겠습니다. 새 버전이 마음에 드십니까?
supercat

시원하고 아주 좋아요
Marko Topolnik

4

문맥 에서 인용 한 "정의"를 살펴 봐야합니다 .

공유 데이터 구조를 구현하는 기존의 방법은 상호 배제 (잠금)를 사용하여 동시 작업이 서로 방해하지 않도록하는 것입니다. 잠금은 소프트웨어 엔지니어링, 내결함성 및 확장 성과 관련하여 여러 가지 단점이 있습니다 ([8] 참조). 이에 대해 연구원 들은 상호 배제를 사용하지 않는 다양한 대안적인 동기화 기술을 조사했습니다 . 동기화 기법은 모든 스레드가 다른 스레드의 임의 지연 (또는 오류)에도 불구하고 계속 진행되도록 보장하는 경우 대기하지 않습니다. 일부 스레드가 항상 진행되도록 보장하는 경우 잠금이 없습니다.

상호 배제를 위해 잠금을 사용하고 있으므로 잠금이없는 기술이 아닙니다.


2

잠금을 사용하면 알고리즘에 여전히 잠금이 해제 될 수 있습니까?

가능하지만 알고리즘에 따라 다릅니다.

잠금으로 보호되는 큐와 같은 간단한 데이터 구조가있는 경우 한 프로세스가 잠금을 획득하고 원하는 작업을 수행하고 해제 할 수 있으므로 한 프로세스가 항상 진행될 수 있습니다.

그래서 그것은 잠금없는 정의를 충족합니까?

그 자체를 참고하십시오 .

(가) 경우 "가 원하는 것을 할" 단계는 다른 잠금을 획득 포함하지 않으며, 유한 한 시간에 완료 보장, 다음 알고리즘의 특정 부분은 무료 교착됩니다.

그러나 이러한 전제 조건이 충족되지 않으면 교착 상태가 발생할 가능성이 적어도 있습니다 ...


멀티 프로세서 프로그래밍 기술 (Art of Multiprocessor Programming)에있는 텍스트를 연구 한 후, 뮤텍스가 정의의 철자가 정확할 때 뮤텍스가 잠금이없는 정의를 확실히 무효화한다는 결론에 도달했습니다. 이를 명확하게하기 위해이 페이지에 대한 답변을 추가했습니다.
Marko Topolnik

1

당신이 제공하는 예제는 다음과 같은 이유로 잠금이 아닙니다.

하나의 스레드가 잠금을 획득하고 OS 스케줄러가 무한 외로운 기간 동안 스레드를 일시 중단하도록 지원하면 일시 중단 된 스레드가 획득 한 잠금을 획득 할 수 없으므로 모든 스레드가 진행될 수 없습니다.

일반적으로 잠금을 사용하는 알고리즘에는 잠금이 없습니다.

교착 상태 및 잠금이없는 것은 서로 다른 개념입니다. 교착 상태 없음은 교착 상태 가능성이 없지만 전체 시스템이 진행되지 못하게하는 라이브 록이있을 수 있음을 의미합니다. 잠금 자유는 시스템의 일부 스레드가 항상 제한된 수의 단계로 진행됨을 의미하기 때문에 그보다 강력합니다.


Wikipedia에 대한보다 신중한 정의를보십시오. "프로그램 스레드가 충분히 오래 실행될 때 스레드 중 하나 이상이 진행되는 알고리즘을 만족하면 알고리즘에 잠금이 없습니다." 스레드 정지의 경우는 제외됩니다. 또한 정지중인 진전은 자유잠그는 것이 아니라 방해의 자유에 의해 보호됩니다 .
Marko Topolnik

@MarkoTopolnik 댓글이 이해가되지 않습니다. 잠금 자유는 방해 자유를 커버합니다. 잠금이없는 것은 장애물이 없어야합니다. 그리고 당신이 준 정의는 정지 스레드를 배제하지 않습니다.
Chaoran

"감각"과 "정확함"을 구별하도록주의하십시오. 다음 답변에서 볼 수 있듯이 내 의견이 잘못되었습니다. 그러나 Wikipedia 정의도 잘못되었거나 적어도 모호합니다.
Marko Topolnik 2016 년

@MarkoTopolnik 댓글이 올바르지 않다는 것을 인정하기 때문에 다른 독자를 혼동하지 않도록 해당 댓글을 삭제해야합니다. 위키 백과는 종종 부정확하거나 모호합니다. cs.rochester.edu/~scott/papers/2006_PPoPP_synch_queues.pdf 와 같은 학술 논문에서 "자유 ​​잠금"과 같은 미묘한 정의를 찾아야합니다 (자유없는 정의는 섹션 2.1에 있음)
Chaoran

예, 잠금 해제 정의의 일부로 비 차단 속성을 포함시키는 것이 한 가지 방법입니다. 그것은 내 대답의 이전 개정판에서 언급되었습니다.
Marko Topolnik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.