경쟁 상태 예방의 필요성

원래벌레·2022년 9월 27일
0

🌞 잘못된 설계

Mutex : YES

Progress : NO ( P1 프로세스가 임계영역을 차지하고 나서, 나온 이후 프로세스 P2가 락을 잡지 않으면 P1 프로세스는 자리가 비어 있어도 들어가지 못한다. )

Bounded Waiting : NO ( 위의 상황이 발생을 하면 P1 프로세스는 임계구역을 차지하기 위해서 영원히 대기를 할 것이다. )

🌞 경쟁 상태

  • 여러 프로세스들이 동시에 공유 자원에 접근하여 잘못된 결과가 나오는 상황

  • 여러 프로세스들이 동시에 공유 데이터에 대해 접근하여 데이터 일관성을 해칠 수 있는 상황

  • 둘 이상의 입력이나 조작이 동시에 일어나서 의도하지 않은 결과를 가져오는 상황

🌼 경쟁 상태 문제의 발생

ANSWER : counter++, counter-- 가 하나의 기계어로 일이 일어나지 않는다. 이것은 병행 프로세스에서 공유하는 데이터를 의미없는 값으로 만든다.

  • 따라서 위를 해결하기 위해서는 임계영역을 통해서 counter 변수를 상호배제적으로 값이 리드/라이트 되도록 해야한다.

임계 영역(상호배제 해결책), 병행 프로세스 동기화

  • 공유 변수를 연산하는 코드를 임계 영역으로 설정한 후 상호배제

  • Busy wating과 Deadlock 없이 프로세스가 대기하는 메커니즘 제공

cf) Busy Waiting : Spin Lock처럼 계속 서서기다리는 것

병행 프로세스를 위한 바른 코딩 체크리스트

1) 공유 데이터를 확인하여 임계영역을 확인하라 ( 공유 데이터의 갯수는 몇 개인가?, 상호배제가 잘 되는가?)

2) 하나의 프로세스가 두번 실행 하여도 잘 돌아가는지 확인해라 (동기화 문제가 없는지)

3) 임계영역에 들어가기 위해 사용되는 lock 변수가 무엇인지 그리고 그 lock변수를 unlock 하는지를 확인하라

4) 두개의 프로세스가 번갈아 가면서 실행하는지 확인하라 ( 한쪽만 계속 우선권을 가지고 독점적으로 임계영역을 차지하지는 않는지 확인)

5) 거의 동시에 시작될 것 같은 코드들을 뭉쳐서 생각해봐라

이론 : Mutex, Progress, Bounded Waiting 세개의 조건이 맞는지 본다.
Mutex(상호배제) : 임계영역은 꼭 하나의 프로세스만 들어 갈 수 있다.
Progress(진행) : 임계영역이 비어 있을 때, 임계영역에 들어가고 싶은 프로세스가 있다면 들어갈 수 있어야 한다.
Bounded Waiting(한정대기) : 여러 프로세스가 임계영역에 들어가려 할 때, 하나의 프로세스가 계속해서 임계영역을 차지해서는 안된다.

profile
학습한 내용을 담은 블로그 입니다.

0개의 댓글