gyoogle.dev 블로그 와 IRE Days 블로그를 참고하여 작성하였습니다.
이미지를 누르면 이미지의 출처로 이동합니다.
경쟁상태
공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태
1. 발생하는 경우
1) 커널 작업 수행 중
- 데이터를 가지고 있는 커널레벨에서 데이터를 로드하여 작업 수행 중 인터럽트가 발생하여 같은 데이터를 조작하는 경우
- 커널모드에서 작업할 때, 인터럽트를 disable하도록 잠궈놓는다.
2) 프로세스의 커널 모드 진입 중
- 프로세스가 시스템콜을 통해 커널모드에서 데이터를 사용하는 도중 시간초과로 cpu제어권이 다른 프로세스로 넘어가 같은 데이터 조작할 때
- 커널모드에서 프로세스가 작업 시 시간초과상황에도 cpu제어권 넘어가지 않도록 한다.
3)멀티 프로세서 환경에서
- 멀티 프로세서 환경에서 cpu 여러개가 동시에 공유데이터에 접근해 조작하는경우
- 공유 데이터 접근에 따른 데이터 잠금/해제 이용
2. 제어문제
1) Mutual exclusion(상호배제)
- 두개 이상의 프로세스가 공용 데이터에 동시접근을 막아 해결한다.
2) Deadlock

- 상호배제를 이용하면 교착상태 발생할 수 있다.
- 프로세스가 두 자원을 필요로 할때 새로운 것을 사용할 수 있을때까지 지금 사용한 것을 해제하지 않는 것이다.
- 두개가 자기것을 놓지않고있어 교착상태가 발생한다.
3) Starvation
- 프로세스들이 더 이상 진행을 하지 못하고 영구적으로 블록되어 있는 상태
- 경쟁에 밀려서 발생
- race condition연 경우 스레드 실행순서 조절이 필요
3. 예방방법
임계구역(critical section)
여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분
1) Semaphore

- 멀티 프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법
- 리소스의 상태를 나타내는 간단한 카운터
- 비교적 긴 시간을 확보하는 리소스에 대해 이용
- 단점: Busy Waiting
- 임계영역에 진입하기 위해 프로세서는 진입코드를 반복실행해 cpu낭비가 일어난다.
- 임계영역 진입 시도했지만 실패한 경우 블록-> 자리가 날때 깨우는 방식으로 문제해결
2) Mutax

- Running time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술
- 공유 리소스에 대한 접근을 조율하기 위해 locking과 unloking을 사용
- semaphore 와의 차이는 칸 수이다.
semaphore & mutax알고리즘 참고 자료