CS
[면접을 위한 CS 전공지식 노트] 3.3. 프로세스와 스레드(3)
yes_truly
2024. 3. 23. 01:12
728x90
🔑 공유자원(shared resource)
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일 등의 자원, 변수
- 경쟁 상태(race condition)
- 공유자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
- 동시에 접근 시도 시 접근 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태
🔑 임계영역(critical section)
- 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
- 해결 할 수 있는 조건
- 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음
- 한정 대기 : 특정 프로세스가 영원히 임계영역에 들어가지 못하면 안 됨
- 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해선 안됨
- 해결 방법
- 뮤텍스(mutex)
- 프로세스가 스레드나 공유자원을 lock()을 통해 잠금 설정하고 사용 후에는 unlock()을 통해 잠금해제하는 객체
- 잠금 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고, 해제는 반대로 접근 가능함
- 잠금과 잠금 해제의 상태만 가짐
- 잠금을 기반으로 상호 배제가 일어나는 잠금 매커니즘
- 세마포어(semaphore)
- 일반화된 뮤텍스
- 간단한 정수값과 두 가지 함수(wait, signal)로 공유 자원에 대한 접근 처리
- wait() : 자신의 차례가 올 때 까지 기다리는 함수
- signal() : 다음 프로세스로 순서를 넘겨주는 함수
- 프로세스/스레드가 공유자원에 접근하면 세마포어에서 wait() 작업을 수행함
- 프로세스/스레드가 공유자원에서 해제되면 세마포어에서 signal() 작업을 수행함
- 세마포어에는 조건 변수가 없음. 프로세스 / 스레드가 세마포어 값을 수정하면 다른 프로세스 / 스레드는 동시에 세마포어 값을 수정할 수 없음
- 신호를 기반으로 상호배제가 일어나는 신호 메커니즘으로 상호배제를 명시적으로 구현해야 함
- 바이너리 세마포어 : 0과 1 두 값만 가지 수 있음
- 카운팅 세마포어 : 여러 개의 값을 가질 수 있는 세마포어로 여러 자원에 대한 접근을 제어하는 데 사용
- 모니터
- 둘 이상의 스레드나 프로세스가 공유자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공
- 모니터 큐를 통해 공유 자원에 대한 작업을 순차적으로 처리
- 세마포어보다 구현하기 쉽고 상호배제는 자동적으로 이뤄짐
- 뮤텍스(mutex)
🔑 교착상태(deadlock)
- 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
- 원인
- 상호배제 : 한 프로세스의 자원 독점, 다른 프로세스들은 접근 불가능
- 점유대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점 : 다른 프로세스의 자원을 강제적으로 가져올 수 없음
- 환형대기 : 서로가 서로의 자원을 요구하는 상황
- 해결 방법
- 자원 할당 시 애초에 조건이 성립되지 않도록 설계
- 교착 상태 가능성이 없을 때만 자원 할당을 하고, 프로세스 당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 묻는 은행원 알고리즘을 사용
- 교착상태 발생 시 사이클이 있는 지 찾아보고 이와 관련된 프로세스를 한 개씩 지움
- 교착상태는 매우 드물게 발생해 처리 비용이 더 크기 때문에 교착상태 발생 시 사용자가 작업을 종료함
728x90