나는 직렬화 가능성 과 선형화 가능성 의 차이점에 대해 읽었 으며 , 이는 복제 데이터베이스와 같은 복제 시스템의 일관성 기준입니다. 그러나 직렬화 가능성보다 강하더라도 선형화가 필요한 경우는 모르겠습니다.
그러한 강력한 재산이 실제로 필요한 시나리오를 생각해 낼 수 있습니까?
나는 직렬화 가능성 과 선형화 가능성 의 차이점에 대해 읽었 으며 , 이는 복제 데이터베이스와 같은 복제 시스템의 일관성 기준입니다. 그러나 직렬화 가능성보다 강하더라도 선형화가 필요한 경우는 모르겠습니다.
그러한 강력한 재산이 실제로 필요한 시나리오를 생각해 낼 수 있습니까?
답변:
동시 대기없는 (또는 잠금이없는 약한) 데이터 구조의 설계를 고려하십시오. 이 시나리오에서는 일반적으로 선형성이 필요하지만 경우에 따라 정확성이 약한 조건을 충족하여 성능과 확장 성을 향상시킬 수 있습니다. 이러한 약한 조건을 만족하는 구현이 유용한 지 여부는 일반적으로 응용 프로그램에 따라 다릅니다. 반대로, 선형화 구현은 디자이너가 원자로 볼 수 있기 때문에 항상 사용할 수 있습니다.
또한 선형화 기능은 비 차단 속성입니다. 모든 객체 상태에 대해 정의 된 전체 작업이 차단에 필요하지 않습니다. 대신, 직렬화 가능성은 비 차단 속성이 아닙니다. 따라서 동시성의 수준을 높이기 위해 동시 데이터 구조의 설계자는 항상 선형성에 의존합니다.
지난 15 년 동안 Herlihy와 Wing을 여러 번 다시 읽었습니다. 매우 어려운 읽기입니다. 가장자리에는 미묘한 부분이 있지만 기본 아이디어는 실제로 매우 합리적입니다.
간단히 말해 선형화는 직렬화와 유사하지만 직렬화가 트랜잭션 간의 추가 순서 제약 조건을 준수해야한다는 추가 요구 사항이 있습니다. 목표는 전체 시스템을 한 번에 추론 할 필요없이 개별 원자 데이터 구조에 대해 엄격하게 추론 할 수있게하는 것입니다.
선형화도 쉽게 달성 할 수 있습니다. 선형화하려는 객체와 뮤텍스를 연결하기 만하면됩니다. 해당 오브젝트의 모든 트랜잭션은 뮤텍스를 잠금으로 시작하고 뮤텍스를 잠금 해제하여 완료합니다.
사용할 정의는 다음과 같습니다.
시스템은 serializabile 데이터 집합에 대해 트랜잭션 세트를 소정의 경우처럼, 트랜잭션을 실행하는 모든 결과가 동일한 트랜잭션이 어떤 순서로 실행하고, 각각의 트랜잭션 내 동작을 위해 그들의 트랜잭션 내에 포함 트랜잭션 코드에 의해 지정됩니다.
직렬화 가능성은 서로 다른 트랜잭션 간 작업 인터리빙의 출현을 허용하지 않으며 선택한 트랜잭션 순서가 인과성을 만족해야합니다 (트랜잭션 A가 값 x를 쓰고 트랜잭션 B가 값 x를 읽은 경우 트랜잭션 A는 트랜잭션 B보다 우선해야 함) 그러나 일련의 트랜잭션 순서에 대한 다른 제약 조건에 대해서는 아무 것도 언급하지 않습니다 (특히 프로세스 및 이벤트를 인식하는 순서에 대해서는 언급하지 않습니다 ).
프로세스가 실행되는 작업 순서에 대한 제약 조건을 추가하는 또 다른 관련 아이디어가 있습니다 (단, 개별 읽기 / 쓰기 작업에만 트랜잭션에 대해서는 이야기하지 않습니다).
실행 결과가 모든 프로세스의 작업이 순차적 인 순서로 실행 된 것과 동일한 경우 시스템은 순차적으로 일관성 이 있으며 각 개별 프로세스의 작업은 해당 프로그램에서 지정한 순서대로이 순서로 나타납니다. ( Lamport, "멀티 프로세스 프로그램을 올바르게 실행하는 멀티 프로세서 컴퓨터를 만드는 방법", IEEE T Comp 28 : 9 (690-691), 1979 ).
순차 일관성의 정의에는 각 메모리 위치 (오브젝트)에 대해 유도 된 순차 작업 순서 가 각 읽기 작업에서 위치로 반환 된 x
값이 x
순차 순서대로 위치 에 대한 직전의 쓰기 조작 .
선형화는 (a) 트랜잭션 개념 (직렬화)을 프로세스가 순서대로 일관성있게 수행하는 작업이 순서대로 완료 될 것으로 예상하는 개념과 (b) 각각에 대해 이야기하는 정확성 기준을 좁히는 개념 시스템 전체에 대한 추론을 강요하기보다는 고립 된 객체. (선형화 할 수없는 다른 객체가있는 시스템에서도 객체의 구현이 정확하다고 말하고 싶습니다.) Herlihy와 Wing이 모니터 를 엄격하게 정의하려고했을 수도 있습니다 .
(a) 부분은 "쉽다": 순차적 프로세스와 유사한 요구 사항은 각 프로세스에서 발행 한 객체의 트랜잭션이 프로그램에서 지정한 순서대로 결과 순서대로 표시되어야한다는 것입니다. 직렬화와 같은 요구 사항은 개체의 트랜잭션이 모두 상호 배타적이어야한다는 것입니다 (직렬화 가능).
복잡성은 목표 (b)에서 비롯됩니다 (각 오브젝트에 대해 다른 오브젝트와 독립적으로 대화 할 수 있음).
여러 개체가있는 시스템에서 개체 B에 대한 작업은 개체 A에서 작업이 호출 된 것으로 생각되는 순서에 제약을 둘 수 있습니다. 전체 시스템 기록을보고있는 경우 특정 순차 순서로 제한됩니다. 다른 사람을 거부해야합니다. 그러나 우리는 우리가 단독으로 사용할 수있는 정확성 기준을 원했습니다 (전세계 시스템 히스토리에 어필하지 않고 객체 A에 어떤 일이 일어나는지 추론).
예를 들어 : 대기열 인 객체 A의 정확성에 대해 논쟁하고 객체 B가 메모리 위치라고 가정하고 다음 실행 기록이 있다고 가정합니다. 스레드 1 : A.enqueue (x), A. dequeue () (y를 반환) 스레드 2 : A. 대기열 (y), A.dequeue () (x를 반환) 이 큐 구현이 올바른 이벤트 인터리빙이 있습니까? 예:
Thread 1 Thread 2
A.enqueue(x) ...
... A.enqueue(y)
... A.dequeue() (returns x)
A.dequeue(y) (returns y) ...
그러나 히스토리 ( 객체 B 포함 )가 다음과 같은 경우 : B는 값 0으로 시작합니다. 스레드 1 : A.enqueue (x), A.dequeue () (y를 반환), B.write (1). 스레드 2 : B.read () (1을 리턴) A.que (y), A.dequeue () (x를 리턴)
Thread 1 Thread 2
A.enqueue(x) ...
A.dequeue() (returns y) ... (uh oh!)
B.write(1) ...
... B.read() (returns 1)
... A.enqueue(y)
... A.dequeue() (returns x)
이제 우리는 "정확성"에 대한 우리의 정의가이 역사가 A의 구현이 버그가 있거나 B의 구현이 버그가 있음을 나타내기를 원합니다. 왜냐하면 "이해가되는"직렬화가 없기 때문입니다. 아직 작성되지 않은 B의 값 또는 스레드 1은 아직 대기열에없는 A의 값을 대기열에서 제외해야합니다.) 따라서 A의 트랜잭션에 대한 원래 직렬화는 합리적인 경우처럼 보입니다. 두 번째와 같은 기록을 허용하면 분명히 올바르지 않습니다.
따라서 선형화가 추가하는 제약 조건은 상당히 합리적이며 FIFO 대기열과 같은 간단한 데이터 구조에도 필요합니다. 미래." 선형화는 달성하기 매우 쉽고 자연 스럽습니다. 뮤텍스를 객체와 연결하면 각 트랜잭션은 잠금으로 시작하고 잠금 해제로 끝납니다. 간단한 뮤텍스 대신 비 차단 또는 잠금 또는 대기없는 기술로 원 자성을 구현하려고 할 때 선형성에 대한 추론이 까다로워지기 시작합니다.
당신이 문학에 어떤 포인터에 관심이 있다면, 내가 찾은 다음 (I는 "실시간"에 대한 토론이 필요한 것보다 더 어려운 메이크업의 linearizabilty가 될 것을 붉은 청어의 하나라고 생각하지만.) https : //로 stackoverflow.com/questions/4179587/linearizability-and-serializeability의 차이
wait()
과 notify()
. 선형화는 훨씬 더 복잡하고 최적화 된 모니터 구현의 정확성에 대해 이야기하는 방법을 제공합니다.
Related Work
Herlihy and Wing 논문의 일부를 읽었습니다 . 그들은 monitor
그들의 주장을 설명하는 것으로 언급 했다 Our notion of linearizability generalizes and unifies similar notions found in specific examples in the literature
. 그러나 일반적인 질문 : 선형성 개념이 멀티 프로세서 시스템 (예 : 하드웨어, 컴파일러, 프로그래밍 언어 및 동시 데이터 구조)에서 널리 채택 되었습니까? (근시안적이어서 모니터와 같은 것만 알고 있습니다.) 그렇지 않은 경우 장애물은 무엇입니까? 예술의 상태는 무엇입니까?
첫째, 선형성과 직렬 성은 직접 비교할 수 없습니다. 아래 표에서 알 수 있듯이 왼쪽의 주요 차이점은 모든 개별 작업이 원자 적이라는 것입니다 ( synchronized
각 op 주위 에 Java가있는 것과 같습니다 . 오른쪽의 원자 단위는 트랜잭션이며 개별 작업은 원자가 아님) 그렇기 때문에 Serializeability는 항상 데이터베이스 문학의 일부였으며 왼쪽은 프로세서 메모리 문학의 주제였습니다 (읽기 / 쓰기 op는 원 자성). 원래 키-값 저장소 (예 : dbm 및 memcached)가 왼쪽에서 시작되었지만 (get / put은 원자적임) 새로운 트랜잭션은 점차 Google의 스패너와 같은 트랜잭션을 지원하고 있습니다.
obj. 작업은 원자 적이다 | 거래는 원자 적이다 -------------------------------- + ----------------- ---------------- 선형화 | 순차 일관성 | 직렬화 인과 적 일관성 | 캐시 일관성 |
선형화를 위해서는 동시 설정의 개체 시스템이 병렬 유니버스에서 한 번에 하나의 작업 (요청 / 응답 쌍)을 처리하는 순차적 시스템과 동일하게 동작해야합니다. 두 우주 모두에서 정확히 동일한 반응을 볼 수있다.
순차 일관성과 같은 직렬화 가능성의 정의에는 첫 번째 기준 만 필요합니다.
임시 순서 보존은 다음을 의미합니다. 다른 작업 B : y.op2 ()가 시작되기 전에 A : x.op1 () (A는 클라이언트, x는 개체, op1은 작업) 인 경우 순차 유니버스에서 요청은 동일한 순서로 처리됩니다. SC (Sequential Consistency)에서는 필요하지 않습니다. 객체는 클라이언트의 요청을 대기열에 넣고 클라이언트에 응답 한 다음 나중에 평가할 수 있습니다. 또한, 객체는 다른 클라이언트의 후속 요청을 차례대로 처리하여 첫 번째 요청에 도달하기 전에 평가할 수 있습니다.
시간적 질서의 비 보존은 문제이다. A : x.op1 () 다음에 A가 전화를 들고 B에게 전화를했다고 가정하면 B는 x.op2 () 호출이라고합니다. 두 번째 단계는 시스템에 의해 추적되지 않은 메시지를 포함하기 때문에 시스템이이 인과 관계에 대한 사건을 알 수있는 방법은 없습니다. 많은 경우에, A가 x가 응답하면 B의 호출이 업데이트 된 상태에 의존 할 수 있다고 A가 가정하는 것은 부당하지 않습니다. 시간적 순서가 유지되지 않으면 A와 B는 놀랍습니다. 이것은 선형화 가능 시스템에서는 발생하지 않습니다.
시간적 순서 보존의 두 번째로 좋은 특성은 선형성과 객체로 구성된 시스템 자체가 선형화 가능하다는 지역 성과 구성 성입니다. 따라서 하나의 모 놀리 식 키-값 저장소를 갖지 않고 자체 KV 저장소 서버에서 각각 관리하는 여러 개의 개별 파티션으로 분할 할 수 있습니다. 각각이 선형화 가능한 경우 전체 데이터베이스는 별도의 노력없이 하나의 선형화 가능한 모 놀리 식 KV 저장소로 작동합니다.