malloc()을 하는 중 이 프로세스가 signal에 의해 interrupt를 당하고, signal handler가 또 memory allocation을 하면 서로 꼬이는 문제가 발생 + Lock을 건다면 deadlock이 발생할 수 있음unlock()을 try ... catch 블럭에서 finally블럭에 두어야 한다.일반적인 lock-free algorithm을 구상하는 것은 어렵다.
네 가지 패턴





(이런 문제가 발생할 수 있기에)

Optimistic과 거의 비슷하나, validation 과정에서 전체 리스트를 순회하지 않는다.
노드 삭제는 문제가 될 수 있으니 실제로 삭제하지 않고, 일단은 logical하게만 삭제하는 것이다.

이는 Validation 과정에서 이전 노드와 현재 노드가 mark되어있는지만 확인하면 된다.

Serializability, Linearizability
compareAndSet() instruction만 사용한다.CAS(X, old_value, new_value):
if(X == old_value):
X = new_value
return true
else
return ERR

여러개의 Thread가 b를 업데이트하려고 할 떄 CAS 연산에 의해 단 하나만 성공하게 된다.
c.invalid = true로 바꾸고, CAS(b.next, &c, &e)를 수행한다.if(c.invalid == false)인지 확인하고, CAS(c.next, &e, &d)를 수행한다.만약 d를 추가하는 Thread가 c.invalid == false를 확인한 뒤 suspend되면, 아래와 같은 현상이 발생한다.

이를 해결하기 위해 mark-bit와 pointer를 결합한다.
pointer는 64bits이지만, 실제로는 48bits만 주소를 나타내기 위해 사용된다. 따라서 mark-bit를 나머지 16bits 중 하나로 넣어줄 수 있다.
이렇게 하면 if(c.invalid == false) 를 생ㄴ략할 수 있고, 하나의 CAS 연산으로 d를 추가할 수 있게 되면서 문제가 해결된다.
이렇게 mark-bit와 address가 결합된 형태를 AtomicMarkableReference라고 부른다.
읽기 비율이 높을 때

읽기 비율이 낮을 떄

읽기 비율에 따른 성능

In computer programming, a sentinel node is a specifically designated node used with linked lists and trees as a traversal path terminator. This type of node does not hold or reference any data managed by the data structure.

{복습 필요}
