이 내용은 csapp 12장에서도 나온다.
와! 싱크로!
와! 정크워리어!
동기화는 특정한 작업을 agreement나 commit 하기 위해 여러 프로세스를 handshake와 join up을 통해 조정하는 것이다.(영문위키)
여기서 쓰레드 동기화는
이다.
공유되는 자원에서 하나의 쓰레드만 진입할 수 있는 영역을 의미한다.
임계영역을 지정하는 방법은 다음과 같다.
Lock(mutex) : 하나의 쓰레드 가 접근할 때 다른 프로세스가 접근하지 못하도록 잠그는 방법.
세마포어 : 멀티 프로그래밍 환경에서 프로세스가 임계영역의 사용을 끝냈을때 대기중인 프로세스에게 끝났다는 사실을 알려주는 방식. 멀티쓰레드 상황이 아니더라도 프로세스가 여러개면 세마포어가 필요할 수 있음.(프로세스가 점유했을때 다른 프로세스는 접근x)
접근 최대치를 정할 수 있고, 접근 최대치 만큼 사용자가 접근할 수 있음. 접근 최대치가 1인 세마포어를 binary 세마포어라고 한다.
-> 개발자가 실수하면 큰일나는 방식.
경쟁 상태는 공유자원(ex/ 멀티쓰레딩 상태에서의 힙 영역 공유)에 대해 여러개의 프로세스가 동시에 접근 할 경우 접근 타이밍에 의해 결과값이 계속 변하는 상황이다.
그렇기 때문에 우리는 위의 임계영역을 사용해서 다중 프로세스가 공유자원에 동시에 접근하는 것을 막아야 한다.
둘 이상의 쓰레드가 서로의 작업이 끝나기만을 기다리며 작업을 진행하지 못하는 상태.
상호 배제 : 공유자원은 하나의 쓰레드만 접근하도록 허용해야 한다.
다른 쓰레드가 동시에 사용할 수 없기 때문에 교착상태가 발생할 수 있다.
비선점 : 한 쓰레드가 사용중인 자원은 선점 자원이 아니다. 해당 자원을 빼앗을 수 없다면 공유할 수도 없기에 교착 상태가 발생 할 수 있다.
점유와 대기 : 다른 쓰레드가 필요로 하는 자원을 점유하고 있으면서 또 다른 자원을 기다리는 상태.
즉 다른 쓰레드는 필요한 자원을 할당받지 못하고 , 자신도 필요한 자원이 없어 작업을 진행 할 수 없다.
예방/회피/검출 방법이 있다.
상호배제 예방 : 임계구역 보호를 위해 상호배제를 하는데 문제가 발생.
비선점 예방 : 동기화 자원을 뺏을 수 있다면 다른 문제가 발생.
점유와 대기 예방 : 쓰레드가 자원을 점유한 상태에서 다른 자원을 기다리지 못하도록 막는 방법. 전부 할당하거나 할당하지 않는 방식을 적용.
원형 대기 예방 : 자원을 한 방향으로만 사용하도록 설정해서 원형 대기를 해방.
모든 자원에 숫자를 부여하고 숫자가 큰 방향으로만 자원을 할당.
하지만 숫자 부여를 어떻게 할 것인지 정하는게 힘들다.
교착상태 회피 : 교착상태가 발생하지 않을정도로만 할당한다.
교착 상태 검출 : 자원할당 그래프를 사용해서 교착 상태를 발견
교착 상태 회복 : 교착상태를 검출 후 해결한다.