시스템과 자원
모든 시스템은 자원을 가지고 있으며, 이는 다수의 인스턴스로 구성된다.
- 인스턴스 : 컴퓨터 메모리(Ram)에 적재될 대상.
- 자바에서의 그 인스턴스가 의미하는 것과 같다.
자원의 예시
- CPU 4개 = 4개의 인스턴스
- 네트워크 = 2개의 인스턴스
만일 1개의 쓰레드가 특정 자원 중 인스턴스 1개를 요청하면, 임의의 인스턴스 1개를 할당해 요구를 충족한다.
쓰레드는 지정된 task에 필요한 만큼 자원을 요청할 수 있다. 이때, 요청할 자원이 전체 자원 수를 초과해선 안된다.
프로세스의 자원 사용방식
- 요청 : 쓰레드는 자원을 요청한다. 요청이 즉시 허용되지 않으면(뮤택스 락을 다른 쓰레드가 가진 경우) 요청 쓰레드는 자원을 얻을 때까지 대기한다.
- 사용 : 쓰레드는 자원에 대해 작업을 수행한다.
- 방출 : 쓰레드가 자원을 방출한다.
이러한 자원의 요청, 방출은 시스템 콜로 이뤄진다.
쓰레드가 커널이 관리하는 자원을 쓸 때마다 OS는 쓰레드의 자원 요청 기록과 할당 여부를 확인한다.
교착상태란?
운영체제 또는 소프트웨어 의 잘못된 자원 관리로 인하여 둘 이상의 프로세스 또는 스레드들이 아무것도 진행하지 않는 상태로 서로 영원히 대기하는 상황으로, 멀티스레딩, 병렬 프로그래밍, 분산 컴퓨팅에서 흔히 발생하는 문제이다.
주로 한정된 자원을 여러 프로세스에서 동시에 사용하는 환경에서 서로 상대방이 사용 중인 자원을 쓰기 위해 대기하는 상황, 그러니까 A가 B를 기다리고 B가 A를 기다릴 때 발생한다.
식사하는 철학자 문제에서 모든 철학자들이 젓가락을 1개씩 들고 있는 상황이 대표적이다.
다중쓰레드로 만든 앱은 반드시 이 교착상태의 가능성을 파악해야 한다.
락킹 도구들로 경쟁 조건(=데이터 레이스)를 회피하려고 하면, 이러한 교착상태가 생길 수도 있기 때문이다.