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.
{복습 필요}