프로세스의 특징
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
프로세스 제어 블록은 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영체제 커널의 자료구조이다
BCB가 필요한 이유는 ContextSwitching 문맥교환 때문이다. CPU가 여러 프로세스를 빠르게 번갈아가면서 작업하기 위해서는 프로세스에 대한 정보 및 상태를 저장/복원할 필요가 있다.
- new : 프로세스가 생성되는 상태
- ready : 프로세스가 CPU에 할당되어, 처리되기를 기다리는 상태
- running: 프로세스가 CPU에 할당되어, 명령어들이 실행 되는 상태
- waiting: 어떤 이벤트의 발생으로 인해 프로세스가 기다리는 상태
- terminated: 프로세스가 종료되는 상태
프로세스나 스레드가 결코 일어날 수 없는 특정 이벤트를 기다리는 상태
데드락이란 둘 이상의 프로세스 혹은 스레드가 서로 상대방의 작업이 끝나기를 기다려 결국 이러지도 저러지도 못하고 무한정 기다리고만 있는 상태를 말한다. 동시에 접근하면 안되는 공유자원에 접근할때 스레드는 Lock 기법을 이용한다.
EX) 영상편집자와 개발자가 각각 개발과 영상편집을 하려고 노트북과 충전기를 점유하고 있을때 개발자는 노트북을 점유하고 있고, 영상편집자는 배터리를 점유하고 있다. 서로 일을 해야하기 때문에 각자가지고 있는 자원을 놓아줄 수 없는 상태
- 상호 배제 (Mutual Exclusion)
- 공유 자원에 여러 프로세스가 동시에 접근할 수 없다.
- 한 번에 한 프로세스만 공유 자원을 사용할 수 있다.
좀 더 정확하게는, 공유 자원에 대한 접근 권한이 제한된다. 자원의 양이 제한되어 있더라도 교착상태는 발생할 수 있다- 점유 상태로 대기 (Hold and Wait)
- 자원을 가지고 있는 상태에서 다음 자원의 획득을 위해 대기한다.
- 공유 자원에 대한 접근 권한을 갖고 있는 프로세스가, 그 접근 권한을 양보하지 않은 상태에서 다른 자원에 대한 접근 권한을 요구할 수 있다
- 선점 불가 (Non Preemptive)
- 다른 프로세스가 점유 중인 자원을 강제로 가져올 수 없다(취소할 수 없다)
- 순환성 대기 (Circle wait)
- 둘 이상의 프로세스가 자원에 접근하기 위해 기다리는데, 이 관계에 사이클이 존재한다.
- 예방 (Prevention)
- 데드락이 발생하기 위해선 위의 발생 조건 4가지를 모두 만족해야 한다. 다른 말로, 위 4가지 조건 중 하나라도 만족하지 않으면 발생하지 않는다.
즉, 발생 조건 4가지 중 1가지를 불만족시킴으로써 데드락을 미리 예방하는 방법이다.
위의 4가지 방법을 피해 코드를 구현해야함- 회피 (Avoidance)
- 프로세스가 자원을 요청하면 OS는 이 자원을 줬을 때 데드락이 발생하는지 여부를 확인한 후, 괜찮을 경우만 자원을 할당시킴으로써 문제 발생을 회피하는 전략입니다. 자원할당 그래프 알고리즘, 은행원 알고리즘 두 가지가 대표적이다.
- 은행원 알고리즘 : 시스템을 안전상태/ 불안전 상태로 구분하고 불안전상태일때는 대기시킴
- 할당할 자원수, 프로세스 수 고정, 제한된 시간안에 자원반납등 많은 조건이 필요하다
- 회복 (Recovery)
- OS는 프로세스가 달라는 자원을 그냥 다 주고, 주기적으로 데드락에 걸렸는지 검사한다. 이때, 데드락에 걸렸다면 이전 상태로 회복시키는 방법이다. 데드락에 걸린 프로세스를 모두 중지하거나, 데드락이 해결될 때까지 프로세스를 하나씩 중지한다.
희생자 선택의 원칙: 최소 비용으로 프로세스를 중지시키는 방법을 찾기- 무시 (Ignore)
- 데드락을 해결하기 위한 비용이 데드락에 의해 발생하는 비용보다 더 클 때 무시해버리는 방법이다.(해결 비용>데드락에 의한 비용)
현대의 OS는 이 방법을 채택하기 때문에 개발자가 Prevention 방법을 통해 데드락이 발생하지 않도록 코드를 짜야한다.
참고자료
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-os.html
https://pangtrue.tistory.com/234
https://mangkyu.tistory.com/92
https://dev-coco.tistory.com/162