과제
p. 363의 확인 문제 1번 : 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르시오.
- 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
- 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
- 세마포를 이용해 프로세스 실행 순서를 제어를 위한 동기화도 이룰 수 있습니다.
- 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다. ← 대기 큐를 사용해서 바쁜 대기를 해소한다. signal 함수가 프로세스가 끝났을 때 실행되면 대기 중인 프로세스를 큐에서 제거하고 프로세스 상태를 준비 상태로 변경하여 준비 큐로 옮긴다!
Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기
아래 공부 내용에 정리했습니다 :)
프로세스 동기화
프로세스들 사이의 수행 시기를 맞추는 것. (프로세스 뿐만 아니라 스레드도 동기화 대상)
동시에 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하며 영향을 주고 받는다. 프로세스들은 아무렇게나 동시에 실행되면 안된다.
수행 시기를 맞추는 행위 (동기화)
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행
- 상호 배제 : 동시에 접근해선 안되는 자원에 하나의 프로세스만 접근하게 하기
생산자와 소비자 문제
상호 배제를 위한 동기화가 필요해지는 순간. 비동기처리에서 나오는 무서운 상황들.
같은 자원에 동시에 접근하다보면 예측하지 못한 값이 나올 수 있다.
공유 자원과 임계 구역
그렇다면 동시에 접근하면 안되는 자원은? 공유 자원
동시에 실행하면 문제가 발생할 수 있는 자원에 접근하는 코드 영역을 임계 구역이라고 한다. 임계 구역은 두 개 이상의 프로세스가 동시에 진입하려고 하면 하나는 대기하게 된다. 먼저 시작한 작업이 끝나면 대기 중인 프로세스가 진입한다.
- 레이스 컨디션 : 잘못된 실행으로 여러 프로세스가 동시에 임계 구역의 코드를 실행하여 문제를 발생시킨 경우
임계구역에서의 원칙 (동기화를 위한)
- 상호 배제 : 한 프로세스가 임계 구역에 진입하면 다른 프로세스는 임계 구역에 들어올 수 없다.
- 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야한다.
- 유한 대기 : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가 임계 구역에 들어올 수 있어야한다. 무한 대기 금지
뮤텍스 락
임계 구역에 프로세스가 있는 지 알기 위한 동기화 도구. (마치 탈의실의 자물쇠)
- 전역 변수 lock : 프로세스들이 공유하는 자물쇠 역할
- acquire 함수 : 임계 구역을 잠그기
- 프로세스가 임계 구역에 진입하기 전에 호출하는 함수
- 임계 구역이 열릴 때까지 확인하고 열리면 잠그는 역할을 한다.
- 바쁜 대기 : 임계 구역이 열렸는 지 계속 확인하는 대기 방식
- release 함수 : 임계 구역의 잠금을 해제하기
- 임계 구역에서의 작업이 끝나고 호출하는 함수
세마포
뮤텍스락과 비슷하지만 일반화된 방식의 동기화 도구. 공유 자원이 여러 개 있는 경우. (마치 탈의실이 여러 개)
(이진 세마포, 카운팅 세마포가 있음)
- 전역 변수 S : 임계 구역에 진입할 수 있는 프로세스의 개수 (사용 가능한 공유 자원의 개수)
- wait 함수 : 임계 구역에 들어가도 좋을지, 기다려야할지 알려주는 함수. 멈춤 여부를 알려줌. 계속 확인하는 바쁜 대기가 있을 수 있음.
- signal 함수 : 임계 구역 앞에서 기다리는 프로세스에게 들어가도 좋다는 신호를 주는 함수.
바쁜 대기의 비효율성을 없애기
뮤텍스락, 세마포 둘 다 마찬가지로 바쁜 대기를 반복한다면 CPU는 생산성이 떨어지게 된다. → 세마포는 더 좋은 방법을 사용한다.
- wait 함수는 사용할 수 있는 자원이 없는 경우 해당 프로세스를 대기 상태로 만든다.
- 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어 넣는다.
- 다른 프로세스가 임계 구역에서 작업이 끝나고 signal 함수를 호출한다.
- signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨준다.
모니터
세마포는 훌륭하지만 불편하다. wait와 signal 순서가 헷갈리거나 중복해서 사용되면 복잡한 상황이 나올 수 있다.
→ 모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리한다.
- 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화 제공.
조건 변수
프로세스나 스레드 실행 순서를 제어하기 위한 변수
조건 변수로 wait, signal 연산을 수행할 수 있다.
- 조건 변수
- 조건 변수는 특정 조건이 충족될 때까지 대기해야 하는 프로세스들을 관리하는 데 사용된다. 대기 중인 프로세스들은 조건 변수에서 신호를 기다리며, 신호를 받게 되면 대기 큐에서 모니터에 진입할 수 있다
- Wait 연산
- Wait 연산은 특정 조건이 만족되지 않으면 대기 큐로 프로세스를 이동시키는 연산. 이는 해당 프로세스를 대기 상태로 만들어 다른 프로세스들이 모니터에 진입할 수 있도록 한다.
- Signal 연산
- Signal 연산은 대기 중인 프로세스 중 하나를 깨우는 역할. 조건이 충족되었을 때, Signal을 통해 대기 중인 프로세스 중 하나를 깨워서 모니터에 진입할 수 있도록 한.
교착 상태
식사하는 철학자 문제
원탁에서 철학자 5명이 있고 사이사이에 포크가 있다. 식사는 포크 2개로 해야한다. 모든 철학자가 포크를 집으면 아무도 식사를 못하고 기다리는 교착 상태에 이른다.
자원 할당 그래프
어떤 프로세스가 어떤 자원을 사용하고 있고, 어떤 프로세스가 어떤 자원을 기다리고 있는지 나타내는 그래프.
철학자 문제처럼 교착상태라면 그래프는 루프를 만든다.
교착 상태 발생 조건
- 상호 배제 : 포크 하나를 여러 명이 쓸 수 있었다면 교착 상태는 일어나지 않았다. 다른 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때를 의미한다.
- 점유와 대기 : 자원을 보유한 채 다른 자원을 기다려서 교착 상태가 발생한다. 포크를 하나 들고 양보하지 않고 기다린 상황.
- 비선점 : 철학자가 다른 철학자의 포크를 뺏을 수 없어서 교착 상태가 발생한다.
- 원형 대기 : 자원 할당 그래프가 원형. 루프를 만든다면 교착 상태에 빠진다.
교착 상태 해결 방법
예방법, 회피하는 방법, 검출시 회복하는 방법이 있다.
교착 상태 예방
- 상호 배제를 없애기 → 모든 자원을 공유하는 행위. 현실성이 떨어짐
- 점유와 대기 없애기 → 이론상으로는 교착 상태를 해결할 수 있지만, 사용되지 않으면서 오랫동안 할당되는 자원을 양산하기 때문에 자원 활용률이 낮아짐, 많은 자원을 필요로 하면 계속 양보하게 되어 기아 현상이 발생.
- 비선점 조건 없애기 → 일부 자원에서는 효과적. 한 프로세스의 작업이 끝날 때까지 다른 프로세스가 기다려야하는 자원도 있다. (프린트 중일 때 프린트 자원을 뺏기 힘들다) 따라서 범용성이 떨어진다.
- 원형 대기 조건 없애기 → 원형을 끊어버린다. 비교적 현실적이지만 수많은 자원들 사이에서 관리하기 어렵다. 자원 활용률이 떨어질수도 있다.
교착 상태 회피
교착 상태가 발생하지 않도록 조심조심하자는 방식
교착 상태를 한정된 자원의 무분별한 할당으로 발생하는 문제라고 정의한 경우 → 자원의 양을 고려하여 교착 상태가 발생하지 않을 만큼 자원을 배분하는 방법
- 안전 순서열 : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서.
- 안전 상태 : 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태. 안전 순서열대로 실행하면 안전 상태.
- 불안전 상태 : 교착 상태가 발생할 수 있는 상황. 안전 순서열이 없는 상태.
→ 항상 안전 상태를 유지하도록 할당하는 방식
교착 상태 검출 후 회복
교착 상태 발생을 인정하고 사후 조치하는 방식. 프로세스가 요구할 떄마다 그때그때 모두 할당하며, 교착 상태 여부를 주기적으로 확인한다.
선점을 통한 회복 : 교착 상태 발견시 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식
프로세스 강제 종료를 통한 회복
가장 단순하고 확실한 방식. 교착 상태인 프로세스를 모두 강제 종료하거나 교착 상태가 풀릴 때까지 하나씩 강제 종료.
- 한 번에 종료시 많은 작업 내역을 잃는다.
- 하나씩 종료시 교착 상태 여부를 파악하는 과정에서 오버헤드가 발생한다.
'컴퓨터구조&운영체제' 카테고리의 다른 글
[혼공컴운] 6주차_가상 메모리 & 파일 시스템 (0) | 2024.02.07 |
---|---|
[혼공컴운] 4주차_운영체제 알아가기 (0) | 2024.01.25 |
[혼공컴운] 3주차_컴퓨터의 핵심 부품 (CPU 빼고) (1) | 2024.01.18 |
[혼공컴운] 2주차_CPU 알아가기 (2) | 2024.01.11 |
[혼공컴운] 1주차_컴퓨터 구조 입문하기 (0) | 2024.01.07 |