Written by coh at home

Process Syncronization & Mutual Exclusive.2.TAS, spinlock 본문

CS/OS

Process Syncronization & Mutual Exclusive.2.TAS, spinlock

och 2022. 4. 6. 15:23

HW solution에서 

TestAndSet instruction인 기계어를 만들어줘서

실행 중 preemption되지 않는 것을 보장해 준다. 

 

핵심 문장은 TAS함수를 이욯하는 건데

while(TAS(lock)) do

에서 초기 lock = false이면 첫 번째 프로세스가 일을 하는 동안

두 번째 프로세스가 도착해도 while문을 계속 돌게 된다. 

첫 번째 프로세스가 일을 끝내고 lock을 false상태로 만들어주면 두 번째 프로세스가 CS에 진입해서 일을 하게 됨.

 

근데... 프로세스가 3개 이상이면 BW조건을 위배하게 된다. 

자.. 1번이 일을 하고있고 2,3번이 뺑뺑 돌고 있다면 

1번이 일을 끝내고 false가 되면 둘 중 3번이 들어온다고 해보자.

4번이 새로 while 루프로 들어와서 2,4번이 뺑뺑 도는데 또 4번이 CS로 들어오게 된다면 

2번은 BW조건에 위배될 수도 있다. 

 

그렇다면 

N개 짜리를 어떻게 풀지.. 

waiting이라는 개념을 도입해서 

탈출할 때

j=(i+1)%n

while((j!=i)&& !waiting[j])

 j=(j+1)%n

을 검사해서 대기중인 프로세스를 찾고 만약 대기 중인 프로세스라면 순차적으로 CS로 진입할 수 있도록 

waiting을 false상태로 만들어 줘서 해결한다. 

 

구현이 엄청 간단해졌지만.. 여전히 Busy Waiting 문제가 남아있습니다. 

이를 해결하기 위한 solution들이 등장하게 됩니다. 

 

OS supported SW solution이 등장하는데 

spinlock에 대해서 우선 알아봅시다. 

 

spinlock은 정수형 변수인데 

초기화, p(), v() 연산만 가능한 변수입니다. 

p와 v를 실행할 때 atomic한 성질을 가지도록 OS가 지원을 해주게 됩니다. 

즉, 끝나는 것을 보장해준다는 것입니다. No preemption인 것이죠.

 

p()는... 물건을 꺼내가는 것 v()는 물건을 반납하는 것으로 생각하면 되는데 

음.. 자물쇠를 거는 것. 푸는 것으로 비유하기도 합니다. 

 

P연산을 해서 자물쇠를 걸고 CS에서 작업을 한 후 V로 자물쇠를 풀어주는 것이 spinlock 입니다. 

매우 간단하죠? 

SW로 솔루션 찾는 거 엄청 힘들었는데 OS가 도와주니까 진짜 간단해졌어요.. 

그래도 SW의 그 과정들이 있었기에 이런 OS supoorted solution이 나올 수 있었던 겁니다. 

 

그러나 여전히 

Busy waitinig을 갖고 있고 

더 큰 문제는 하나의 프로세스가 CS영역에서 preemption된 상태에서 다른 프로세스가 P영역에서 while loop를 돌고 있는 경우를 상상해봅시다.

 

OS가 P와 V의 연산을 preemption하지 않는다고 보장했으므로 후에 들어온 프로세스는 CPU를 할당받은 채로 while loop를 돌고 있을 겁니다. 처음에 CS에서 preemption된 프로세스가 다시 프로세서에 들어갈 방법이 없게 되는 거죠.  

 

그래서 spinlock은 멀티프로세서에서만 사용이 가능 합니다. CPU가 두 개 이상이어야 해요. 

 

'CS > OS' 카테고리의 다른 글

OS supported SW solution -Semaphore  (0) 2022.04.07
Process Syncronization & Mutual Exclusive  (0) 2022.04.05
메모리/프로세스 질문  (0) 2022.04.01
OS. Thread.  (0) 2022.03.25