[OS] 11. Process Synchronization and Mutual Exclusion 4
💻CS/OS

[OS] 11. Process Synchronization and Mutual Exclusion 4

728x90
반응형

SW와 HW적인 여러 해결책들이 등장함에도 Busy waiting 문제가 해결되지 않았던 것을 볼 수 있다.

이제는 OS차원에서의 해결방법을 살펴보자. 

 

먼저 스핀락(spinlock)에 대해 먼저 알아보자. 

 

스핀락은 정수형 변수로서 초기화, P(), V() 연산으로만 접근 가능하다. 이러한 연산들은 atomic한 연산이며 OS에서 preemption이 발생하지 않도록 보장해준다. 

 

swift 코드로 한 번 봐보자. (임의로 짬..!)

// P 연산 - S라는 물건을 계속 빼내는 것
func P(S: inout Int) {    
    while S <= 0 {
    	// Busy Waiting 여전함
    }
    S -= 1
}

// V 연산 - S라는 물건을 반납하는 것
func V(S: inout Int) {
    S += 1
}

Spinlock

Pi가 먼저 임계 영역에 들어가려한다고 가정해보자. 그렇다면 Pi는 먼저 P연산을 통해 active를 0을로 바꿔준다. 그러므로 Pj가 들어오려고 해도 active가 0이기 때문에 while문을 계속 돌게 되고, Pi가 작업을 마치고 V연산을 통해 active를 1롤 되돌려줘야 Pj에 작업을 수행할 수 있다. 

 

즉 들어갈 때 P 연산을 통해 잠구고, V 연산을 통해 잠금을 해제하는 것이라고 생각해도 된다. 

 

하지만 Spinlock은 멀티 프로세서 시스템(CPU 2개 이상) 에서만 사용 가능하다고 한다. 하나의 CPU의 환경이라고 가정해보자.

만약 Pi가 먼저 작업을 수행하기 위해 P연산을 수행하고 임계 영역에 들어갔을 때 Pj가 도착하여 CPU를 차지하고 있는 상황이라고 해보자. 그렇다면 현재 Pj는 P연산 중에 있는 상태이며, 이 경우 OS 차원에서 preemption을 방지해준다고 했었다. 즉 Pi가 작업을 마치고 V연산을 하여야 되는데, Pj의 P연산이 실행중에 있어 V연산을 수행하지 못하게 되어 일종의 데드락(deadlock) 현상을 불러일으키기도 한다. 

 

그렇기에 spinlock은 멀티 프로세서 시스템에서 Pi Pj가 동시에 돈다고 가정해야 정상적으로 작동된다. 

위에 코드에서 봤다싶이 busy waiting이 아직 존재하고 있는 것을 알 수 있고, 이는 이어서 볼 세마포어에서 해결될 수 있다. 

 


Ref : https://www.youtube.com/watch?v=33OqgesF-mM&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=15&t=42s 

728x90
반응형