[OS] 공유 자원
1. 공유 자원
- 공유 자원이란?
- 하나를 두고 여럿이 쓰는 것
- 다중 프로그래밍에서는 CPU도 공유 자원임
- 여러 프로세스/스레드가 공동으로 이용하는 변수, 메모리, 파일 등
- 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있음
- 하나를 두고 여럿이 쓰는 것
1.1. 공유 자원 접근의 문제점
- 다중 프로그래밍에서 이처럼 공유 자원에 접근하면 연산이 잘못될 수 있음(최종 결과는 25만원이 되어야 하는데 20만원이 되어버림)
1.2. 문제점의 발생 원인
- 명령어 처리 중에 스케줄링(ex: timeout 등)이 되면 부득이하게 명령어가 분리됨
- 예: 두 스레드가 공유자원 ‘sum’에다가 10을 더하는 경우
1.3. Race condition(경쟁 상태)
- 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
- 경쟁 조건이 발생하면 공유 자원 접근 순서에 따라 실행 결과가 달라질 수 있음
- 데이터가 오염됨 (Corrupted)
- 밀티스레드 환경에서 매우매우 자주 발생함 (심지어 커널에서도)
2. Synchronization(동기화)
- 공유 자원 접근시 발생하는 문제점(공유데이터의 훼손)에 대한 해결책
- 공유 데이터에 접근하고자 하는 다수의 프로세스 또는 스레드가 충돌없이 공유 데이터에 접근하기 위해 상호 협력하는 것
- 한 프로세스/스레드가 공유 데이터를 배타적 독점적으로 접근한다.
- 동시에 접근하는 것이 아닌 차례대로, 순서대로 접근
- 좁은 의미의 스케줄링
2.1. 상호 배제
- 위와 같이 다른 프로세스의 접근을 막는 작업
- 임계영역: 상호배제가 필요한/적용된 구간
2.1.1. Critical section
- 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
- == 공유 자원에 접근하는 프로그램 코드 영역
- == Shared data가 있는 영역
- Shared data == Critical data
2.1.2. Mutual exclusion
- 임계구역이 오직 한 프로세스만 배타적 독점적으로 사용되도록 하는 기술
- 임계구역에 먼저 진입한 스레드가 임계구역의 실행을 끝낼 때까지 다른 프로세스가 진입하지 못하도록 보장
- 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며 임계구역의 프로세스가 나와야 들어갈 수 있음
2.2. Thread-safe
- 상호 배제, Mutual exclusion과 같은 작업이 잘 적용된 함수를 thread-safe하다고 표현한다.
이 포스팅은 작성자의 CC BY-NC 4.0 라이선스를 준수합니다.