동기화
Centralized system(a single machine system) 에서의 시간은 모호하지 않았다. 프로세스가 시간을 알고싶다면 시스템콜을 통하여 커널로부터 답을 들을 수 있었다. 만일, A라는 프로세스가 시간을 묻고, 조금 뒤에 B라는 프로세스가 시간을 물었다면, B의 시간 값은 A의 시간 값보다 클 것이다. (B>=A)
그렇다면 분산 시스템 환경(Multi-computer system)에서는 어떨까?
1. Clock Synchronization
1-1. Physical Clocks
Timer: 높은 진동수의 진동자 (quartz crystal)
하나의 컴퓨터라면 각각의 프로세스는 같은 클락을 사용하기에 문제가 되지 않는다.
하지만 네트워크 상에서는 클락이 다를것이기 때문에 시간의 오차(clock skew)가 존재한다. 클락은 아주 미세하지만 다른 속도(rate)로 왕복운동(oscillate)한다.
이 때 두 가지 문제가 있는데,
1. 서로 어떻게 동기화 할 것인가?
2. 다수의 클락과 실제 시간을 어떻게 동기화 할 것인가?
간단히 실제 시간을 알고 싶을 때
Universal Coordinated Time (UTC): 인공 위성은 각자의 원자 시계를 가지고 있다. UTC는 GPS 위성과 동기화되어 시간을 방송한다.
1-2. GPS
Global Positioning System
인공 위성 기반 분산 시스템
31개의 인공 위성은 대략 20,000km 높이의 궤도를 돌고있다.
각각의 인공위성은 3개의 원자 시계를 가지고 있다.(매우 정확함)
메시지를 지속적으로 방송한다
- 위치(position)
- 타임 스탬프
Time-of-Arribal (ToA)
인공 위성으로부터 GPS receiver까지의 거리는 어떻게 구할까?
신호를 보냈을 때 시간과 받았을 때 시간차를 이용해 거리를 구할 수 있다.
- 신호의 속도 c: 빛의 속도 (3x10^8m/s)
- 인공 위성에서의 타임 스탬프: Ti
- GPS receiver 에서 받았을 때 타임 스탬프: Tnow
- 인공위성 i 에서부터 여기까지의 거리
- di=c * (Tnow-Ti)
Trilatertation
3개의 인공위치의 위치를 알고 타임스탬프를 안다면 우리의 실제 위치를 구할 수 있다.
- 문제점: 모든 시계가 정확하고 동기화되어 있다는 가정이 필요하다.
- receiver의 시계는 보통 위성과 동기화 되어있지 않다.
- 신호가 receiver에 도달하는데 시간이 걸린다.
- 해결방법: Unsynchronized clock at receiver
Unsynchronized clock at receiver
Δdelay i= ( Tnow + Δr ) − Ti= ( Tnow − Ti) + Δr
Δr: receiver의 clock skew (아직 모름)
Ti: 인공위성 i에서의 타임 스탬프
c * Δdelay i (정확한 거리) = c( Tnow − Ti) + cΔr (clock skew로 인해 잘못 구한 거리)
c: 빛의 속도
즉, 정확한 위치를 구하기 위해서는 오차를 빼줘야한다.
di=c Δdelay Δdelay i− c Δr = `sqrt(a)` (a: (xi−xr)2+(yi−yr)2)
이 때 , xr, yr은 receiver의 2D 좌표이다. (아직 모름)
3개의 인공위성: Trilateration을 이용해 pinpoint (x,y)를 특정하여 receiver의 정확한 시각을 구할 수 있다.
4개의 인공위성: clock skew를 구하기 위한 식을 하나 더 가져올 수 잇다.
1-3. Clock Synchronization Algorithms
지상에 있는 서버가 정확한 시간을 알려줘 동기화 하는 방식
NTP(Network Time Protocol)
timer server로 부터 클라이언트가 현재 시간을 가져온다.
- Timer server는 원자 시계 등을 통해 정확한 시계를 가지고 있다.
- 문제점: propogation delay (서버에서 클라이언트로 전송될 때 걸리는 시간)
- 클라이언트가 아는 정보: 요청 send(T1)/receive(T2), 응답 요청 send(T3)/receive(T4)
A 라는 시계가 B 시계보다 θ만큼 느릴때 CB(t) = CA(t) + θ 가 성립하며 양 측을 오가는 propogation delay는 동일하다.
T2 – (T 1+ θ) = (T 4+ θ) -T3
따라서 clock skew θ = [(T 2-T1) + (T 3– T4)]/2
Review Question 추가 필요
2. Logical Clocks
Lamport's Logical Clocks
Happen-Before (HB) Relation
내용 추가 필요
3. Distributed Mutual Exclusion
~OS 복습~ Centralized System
Mutual Exclusion
동시에 실행되는 프로그램에서 critical section(CS)은 하나 이상의 스레드가 실행되면서 공유된 리소스에 접근할 때 동시에 접근하지 못하게 하는 코드이다. 공유된 리소스는 하나의 스레드만 사용할 수 있게 한다.
Mutual exclusion (ME, mutex) algorithm 은 global 변수, critical section에 포함되는 코드 조각 같은 공통된 리소스에 동시 다발적인 접근을 박는다.
Distributed Mutual Exclusion
3-1. Centralized Algorithm
Coordinator가 각각의 프로세서 시스템에게 뭘 해야할지 지시함. (coordinator는 election algorithm으로 결정)
Step1: 프로세스1이 coordinator에게 공유된 리소스에 접근할 수 있을지 허락을 구한다. queue가 비었기 때문에 승인된다.
Step2: 프로세스2가 같은 리소스에 접근할 수 있는지 물어본다. coordinator는 답(reply)를 보내지 않음. (다른 방법으로는 사용하지 못한다(no)는 답을 보낼 수 있다. 이 경우, 기다리라는 건지 single point failure인지 구분하여 해결할 수 있음.)
Step3: 프로세스1이 리소스를 다 쓰고 해제하면 coordinator에게 말해주고, 이 때 프로세스2는 써도 된다는 답을 받게 된다.
- 장점: ME(mutual exclusion) 보장, 공평하다 (no starvation), 구현이 쉽다.
- 단점: single-point failure(coordinator가 죽어버린 경우, permission이 거절될 경우), coordinator의 퍼포먼스가 병목(bottleneck)될 수 있다.
- ME entry/exit 당 메시지 수 : 3 (request/OK/release)
- entry이전의 딜레이: 2 (request/OK)
3-2. Token Ring
- 링이 만들어지면 프로세스0에게 토큰을 준다.
- 토큰은 point-to-point 메시지를 통해 링을 돌게된다.
- 프로세스가 CS(critical section)에 입장하고 싶다면 토큰을 가질 때 까지 기다린다. 사용할 땐 토큰을 가지고 있다가 다 썼으면 토큰을 패스한다.
- Mutual Exclusion? 지켜진다.
- Starvation? 발생하지 않는다. 언젠가 토큰을 가질 수 있게되는 구조이기 때문
- Lost tocken? 여기서 토큰이란, 특수한 토큰인데 전달 과정에서 잃어버리게 된다면 어떤 프로세스가 토큰을 새로 생성해야한다는 문제가 발생한다.
Token-based
Token: 프로세스 사이를 넘나드는 특수한 메시지
하나의 토큰만 이용할 수 있다.
토큰을 가진 프로세스만이 공유된 리소스에 접근 가능하다.
장점: starvation, deadlocks 발생하지 않음
단점: 토큰을 잃어버리게 되면 새로 토큰을 생성해야 한다.
ME entry/exit 당 메시지 수: 1 에서 무한대 (예시의 경우 최대 8)
entry 딜레이: 0(마침 내가 들고 있을 때) 에서 n-1(방금 전에 지나갔을 때)
평균 딜레이: (n-1)/2
3-3. Distributed Algorithm
모든 프로세스가 다 coordinator라고 할 수 있다. 모든 프로세스가 허락 해줘야 사용할 수 있음.
- 프로세스가 리소스를 사용하길 원할 때, 리소스의 이름, 해당 프로세스의 넘버, 현재 logical time를 쓴 메시지를 만든다.
- 모든 프로세스에게 메시지를 보내고 모든 프로세스로부터 OK 메시지를 받을 때 까지 기다린다.
- 각 프로세스가 메시지를 받았을 때:
- receiver 프로세스가 리소스에 접근하지도 않고, 접근하려고 시도하지도 않을 때 OK 메시지를 sender 프로세스에게 보낸다. "너 그 리소스 써도된다!"
- receiver 프로세스가 리소스를 이미 가지고 있을 때, 답(reply)를 보내지 않는다. 그 대신, 그 프로세스의 큐에 리퀘스트를 쌓는다. "지금 쓰고 있기 때문에, 일이 다 끝나면 OK 라고 알려줄게!"
- receiver 프로세스도 해당 리소스를 사용하고 싶지만 아직 사용하고있지 않을 경우, 메시지에 적힌 타임스탬프를 비교해서 더 빨리 온 것(수가 적은 쪽)을 보낸다. (타임스탬프는 logical time이라 정확하진 않지만 사용에 무리없다.)
- 허락을 얻기 위한 요청 메시지를 보낸 후에는 모든 프로세스로부터 허락(OK 메시지)받을 때 까지 기다린다. 허락을 받은 후에는 리소스를 사용하고 다 사용하고 난 후에는 OK 메시지를 큐에 있는 모든 프로세스에게 보낸다.
| Centralized Algorithm | Distributed Algorithm |
| Single point of failure |
n points of failure : n개 중에서 아무나 하나가 문제가 생기면 동작을 안한다.(;;)
centralized algorithm에 비해 최소 n 배의 메시지가 필요하다.(계속 실패할 경우) |
ME entry/exit 당 메시지 수: 2(n-1)
entry 딜레이: 2(n-1)
3-4. Decentralized(Voting) Algorithm
- 각각의 리소스는 n개의 coordinator를 갖는다.
- 클라이언트는 n개의 coordinator에게 리퀘스트를 보내 허락을 구한다.
- 만일 m(>n/2)개의 coordinator로부터 승인(grant)으로 받으면 리소스를 얻을 수 있다.
- 과반수 이하일 경우 승인은 거절(deny)된다. (쓰고 싶으면 또 요청해야함)
- Voting algorithm
- 클라이언트는 n개의 리퀘스트를 보내고 n개의 응답을 받는다. (승인 혹은 거절)
- 클라이언트는 리소스를 다 사용하고 나서 n 개의 release 메시지를 보낸다.
Reliability: coordinator가 fail 되어도 상관없이 다른 coordinator가 아직 동작하고 있기 때문에 역할을 대신해줄 수 있다.
단점: 많은 노드가 같은 리소스에 접근하려할 때, 어떤 노드도 허락을 얻지 못할 수 있다. (이 경우, 2N 개의 메시지가 낭비된다.), 그러면 노드들이 계속 리소스를 얻지 못하므로 starvation이 발생함.
3-5. Comparision of four ME algorithms
| Algorithm | Total message per ME entry/exit | Delay before entry (in message times) | Problems |
| Centralized | 3 | 2 | Coordinator crash (single-point failure) |
|
Decentralized (m coordinators, k failures) |
2mk(failure)+m(permission) | 2mk | Starvation |
|
Distributed (N nodes) |
2(N-1) | 2(N-1) | N points of failure |
|
Token Ring (N nodes) |
1 to infinite | 0 to N-1 | Lost token, process crash |
4. Election Algorithms
4-1. The Bully Algorithm
프로세스 중에서 coordinator를 선정하는 방법
- 미리 정해진 순서 (initial state)
- 현재 coordinator가 fail 일때 등
참고: 많은 시스템에서 coordinator는 수기로 정해진다.(서버 파일) 이 경우 centalied solution(single point of failure의 솔루션) 이 될 수 있다.
각각의 프로세스는 우선순위(weight)가 있다. 높은 우선순위를 가진 프로세스가 coordinator로 선출된다.
어떻게 우선순위 높은 프로세스를 찾을 수 있을까?
어떤 프로세스 k 가 coordinator가 제 역할을 못한다고 판단하면, election message를 다른 프로세스들에게 보낸다.
Election by Bullying
Bully: 큰 놈만 맨날 이겨서...
- Pk : ELECTION 메시지 전송. 이 때, k 보다 높은 우선 순위를 가진 프로세스에게 보낸다. (Pk+1, Pk+2, ... , Pn-1)
- 아무에게도 응답에 오지 않으면, Pk의 우선순위가 가장 높다는 말이기 때문에 coordinator가 된다. (더 높은 우선순위의 프로세스는 크래쉬 등의 이유로 될 수 없나보다.)
- 응답이 온다면 Pk의 일은 끝난다.
(a) 프로세스4는 7번에 문제가 생겼음을 발견하고 ELECTION 메시지를 보낸다. 4보다 우선순위가 높은 5,6,7에게 전송
(b) 프로세스5와 프로세스6는 프로세스4에게 OK 메시지를 보낸다. "넌 안해도 된다!" 이 때, 프로세스 7은 크래쉬되었기 때문에 OK 메시지를 보낼 수 없다.
프로세스5는 프로세스6,7에게 ELECTION 메시지를 보내 프로세스6에게 응답을 받음.
프로세스6은 프로세스7에게 ELECTION 메시지를 보내지면 응답 받지 못하므로 coordinator가 된다.
(c) coordinator가 선출 된 후 Coordinator 메시지를 다른 프로세스에게 보낸다. (?? 이 경우 브로드캐스트 아니면 우선순위가 낮은 노드에게만?)
- 정리
- heavy 프로세스가 lighter 프로세스에게 election 메시지를 받으면 Ok 메시지를 보낸다.( lighter는 race에서 제외됨)
- 프로세스가 Ok 메시지를 받지 못하면 coordinator가 되고 다른 프로세스에게 coordinator 메시지를 보낸다.
Review Question 있음
Subscribe to Mem Learning
Get the latest posts delivered right to your inbox