공유 자원(shared resource)
시스템 안에서 각 프로세스, 스레드가 함꼐 접근할 수 있는 모니터, 프린트, 메모리, 파일, 데이터 등의 자원이나 변수 등을 말한다. 이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태(rac condition)라고 한다. 동시에 접근을 시도할 떄 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태 인것이다.
임계 영역(critical section)
둘 이상의 프로레스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역을 말한다. 임계 영역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어 두 가지가 있으며, 이 방법 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족해야한다.
상호 배제
- 한 프로세스가 임계 영역에 들어갔을 떄 다른 프로세스는 들어갈 수 없다.
한정 대기
- 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다.
융통성
- 한 프로세스가 다른 프로세스의 일을 방해해서는 안 된다.
뮤텍스(mutex)
프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 ulock()을 통해 잠금 해제하는 객체이다. 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고 해체는 그와 반대이다.
세마포어(semaphore)
뮤텍스와 거의 비슷하지만 lock 과 ulock 이 아닌 0 과 1로 신호를 주고 받아서 잠긴 코드 영역에 접근할 수 없고 공유 자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스나 스레드가 공유자원을 해제하면 세마포어에서 signal() 작업을 수행 한다.
세마포어의 종류
바이너리 세미포어
0과 1의 두가지 값만 가질 수 있는 세마포어이다. 이는 신호 메커니즘으로 신호를 기반으로 일어난다.
카운팅 세마포어
이는 여러 개의 값을 가질 수 있는 세마포어이다. 여러 자원에 대한 접근을 제어하는데 사용된다.
모니터
이는 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유자원을 숨기고, 해당 접근에 대해 인터페이스만을 제공한다.
교착상태(deadlock)
두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
교착상태 원인
상호 배제 : 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능하다.
점유 대기 : 특정 프로세스가 점유한 자원을다른 프로세스가 요청하는 상태
비선점 : 다른 프로세스의 자원을 강제적으로 가져올 수 없다.
환형 대기 : 프로세스 A는 프로세스B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황을 말한다.
교착상태의 해결 방법
1. 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계
2. 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘' 을 사용한다.
3. 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지운다.
4. 교착 상태는 드물게 일어나는데 만약 일어나면 사용자가 강제종료 시킨다.(ctrl+ alt + delete)
은행원 알고리즘
총 자원의 양과 현재 할당한 자원의 양을 기준으로 인정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘 이다.
총정리
-----------------------------------------------------------------------------------------------------------
공유자원
여러 프로세스나 스레드가 동시에 사용할 수 있는 자원
예 : 컴퓨터 메모리, 프린터, 데이터베이스 등등
임계영역
여러 프로세스나 스레드가 공유 자원에 접근하는 코드 부분 → 임계 영역은 한 번에 하나의 프로세스만 접근할 수 있어야함, 다른 프로세스가 동시에 접근하면 문제가 발생함
프린터의 예로 들면
- 임계 영역: 실제로 프린터에 인쇄 명령을 보내는 코드 부분
- 만약 두 명의 사용자가 동시에 인쇄 명령을 보내면, 인쇄 결과가 뒤죽박죽이 되거나 서로의 문서가 섞일 수 있다. 이를 방지하기 위해 한 번에 한 명만 프린터를 사용할 수 있도록 해야 함
임계 영역 문제를 해결하기 위해 상호 배제(Mutual Exclusion)라는 개념을 사용함. 이를 위해 다음과 같은 방법을 사용함
- 뮤텍스(Mutex): 하나의 프로세스만 임계 영역에 들어갈 수 있도록 보호하는 도구.
- 세마포어(Semaphore): 동시에 접근할 수 있는 프로세스의 수를 제어하는 신호를 사용.
- 2개의 프로세스가 동시에 임계영역에 접근하면 문제가 발생하는거 아닌가?
- 읽기 작업의 경우, 두개의 프로세스가 동시에 접근해도 문제 없음
- 쓰기 작업의 경우, 두개의 프로세스가 동시에 접근하면 문제가 있기 떄문에 보통, 이진 세마포어를 사용하여 상호 배제를 보장하는 것이 일반적
- 2개의 프로세스가 동시에 임계영역에 접근하면 문제가 발생하는거 아닌가?
- 모니터(Monitor): 모니터는 동기화 코드 작성을 간편하게 해주는 구조적이고 자동화된 접근 방식을 제공하며, 프로그래머는 복잡한 세부 사항을 신경 쓰지 않고 공유 자원에 대한 안전한 접근을 구현할 수 있습 ( 예 : 자바의 synchronized )
뮤텍스와 이진 세마포어의 차이는?
- 뮤텍스: 잠금을 기반으로 상호배제가 일어남
- 이진 세마포어 : 신호를 기반으로 상호 배제가 일어남.
교착상태
여러 프로세스가 서로의 자원을 기다리느라 진행할 수 없는 상태를 말함
- 예시 : 프로세스A가 프로세스B 가 점유하고 있는 자원을 요청할 떄, 프로세스B도 프로세스 A가 점유하고 있는 자원을 요청함. → 서로 무한 대기…
- 교착 상태의 원인
- 상호배제
- 점유대기
- 비선점
- 환형대기
- 해결 방법 → 교착상태 원인을 깨부심.