[혼공학습단] 컴퓨터 구조 + 운영체제 5주차 (chapter 12~13)

royalmilktea·2023년 8월 21일
0
post-thumbnail

Chapter 12. 프로세스 동기화

12-1. 동기화란

동기화의 의미

협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화(synchronization)되어야 한다.

프로세스 동기화란 프로세스들 사이의 수행시기를 맞추는 것을 의미한다.

  • 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
  • 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

공유 자원과 임계 구역

계좌 잔액 문제와 생산자 소비자 문제의 예시에서 동시에 실행되는 프로세스들은 전역 변수 '잔액', '총합'이라는 공동의 자원을 두고 작업을 했다. 이러한 자원을 공유 자원(shared resource)이라고 합니다. 공유 자원은 파일이 될 수도 있고, 입출력 장치, 보조기억장치가 될 수도 있다.
이 공유 자원 중에는 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원이 있다. 앞서 보여준 계좌 잔액 문제에서 '잔액' 변수, 그리고 생산자 소비자 문제에서 '총합' 변수가 이런 자원에 해당한다.
이렇게 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section)이라고 한다.
여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있다. 이를 레이스 컨디션(race condition)이라고 한다.

운영체제는 이러한 임계 구역 문제를 아래 세 가지 원칙 하에 해결한다.
1. 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 드어올 수 없다.
2. 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고 하는 프로세스는 들어갈 수 있어야 한다.
3. 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.

12-2. 동기화 기법

뮤텍스 락

뮤텍스 락은 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구, 다시 말해 상호 배제를 위한 동기화 도구이다.

뮤텍스 락의 매우 단순한 형태는 하나의 전역 변수와 두 개의 함수로 구현할 수 있다.

  • 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock

  • 임계 구역을 잠그는 역할: acquire 함수
    - 프로세스가 임계 구역에 진입하기 전에 호출하는 함수이다. 만일 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지(lock이 false가 될 때 까지) 임계 구역을 반복적으로 확인하고, 임계 구역이 열려 있다면 임계 구역을 잠그는(lock을 true로 바꾸는) 함수이다.

  • 임계 구역의 잠금을 해제하는 역할: release 함수
    - 임계 구역에서의 작업이 끝나고 호출하는 함수이다. 현재 잠긴 임계 구역을 열어주는(lock을 false로 바꾸는) 함수이다.

세마포

세마포는 뮤텍스 락과 비슷하지만, 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다.

  • 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
  • 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
  • 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 주는 signal 함수

모니터

매번 임계 구역 앞뒤로 일일이 wait과 signal 함수를 명시해야 하는 세마포 방식에 비해 사용자가 사용하기에 훨씬 편리한 도구이며 조건 변수를 사용한다.

[혼공컴운] 동기화 기법 동영상 강의
솔직히 이해가 완벽히 안돼서... 보고 또 봐야 할 것 같습니다.
영상 자료를 참고하면 좋을 듯 하여 링크를 올려봅니다^^
이 부분에서 못 넘어가고 있으니
이해한 뒤에 다시 적어보도록 하겠습니다!!

Chapter 13. 교착 상태

13-1. 교착 상태란

일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상을 교착 상태라고 한다.
이러한 교착 상태를 해결하기 위해서는 첫째, 교착 상태가 발생했을 때의 상황을 정확히 표현해 보고, 둘째, 교착 상태가 일어나는 근본적인 이유에 대해 알아야 한다. 그렇다면 우선 교착 상태가 발생했을 때의 상황을 한 눈에 보기 쉽게 그래프로 표현하는 방법부터 알아보도록 하자.

자원 할당 그래프

교착 상태는 자원 할당 그래프를 통해 단순하게 표현할 수 있다. 자원 할당 그래프는 어떤 프로세스가 어던 자원을 사용하고 있고, 또 어떤 프로세스가 어떤 자원을 기다리고 있는 지를 표현하는 간단한 그래프이다.

자원 할당 그래프는 아래와 같은 규칙으로 그려진다.

첫째, 프로세스는 원으로, 자원의 종류는 사각형으로 표현한다.
둘째, 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현한다.

교착 상태 발생 조건

교착 상태가 발생할 조건에는 네 가지가 있습니다. 바로 상호 배제, 점유와 대기, 비선점, 원형 대기이다. 즉 아래 조건 중 하나라도 만족하지 않는다면 교착 상태가 발생하지 않지만, 아래 조건이 모두 만족될 때 교착 상태가 발생할 가능성이 생긴다고 보면 된다.

상호 배제

한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때, 즉 상호 배제 상황에서 교착 상태가 발생할 수 있다.

점유와 대기

프로세스가 어떠한 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다린다면 교착 상태가 발새할 수 있다.

비선점

비선점 자원은 그 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 이용할 수 있다. 즉, 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못했기 때문에 교착 상태가 발생했다.

원형 대기

프로세스들과 프로세스가 요청 및 할당받은 자원이 원의 형태를 이루었기 때문이다. 다시 말해 자원 할당 그래프가 원의 형태로 그렺미녀 교착 상태가 발생할 수 있다. 이렇게 프로세스들이 원의 형태로 자원을 대기하는 것을 원형 대기라고 한다.

13-2 교착 상태 해결 방법

교착 상태 예방

교착 상태를 예방하는 방법은 교착 상태 발생 필요 조건 네 가지 중 하나를 충족하지 못하게 하는 방법과 같다. 즉, 프로세스들에 자원을 할당할 때 상호 배제, 점유와 대기, 비선점, 원형 대기 중 하나의 조건이라도 만족시키지 않게 할당하면 교착 상태는 발생하지 않는다.

상호배제

-> 모든 자원을 공유 가능하게 만든다. 현실적으로 모든 자원의 상호 배제를 없애기는 어렵기에 이 방식을 현실에서 사용하기에는 다소 무리가 있다.

점유와 대기

-> 자원의 활용률이 낮아질 우려가 있다. 점유와 대기를 금지하면 한 프로세스에 필요한 자원을 몰아주고, 그 다음에 다른 프로세스에 필요한 자원들을 몰아줘야 한다. 이는 당장 자원이 필요해도 기다릴 수 밖에 없는 프로세스와 사용되지 않으면서 오랫동안 할당되는 자원을 다수 양산하기 때문에 자원의 활용률이 낮아진다.

비선점 조건

-> 이 방식은 선점하여 사용할 수 있는 일부 자원에 대해서는 효과적이다. 가령 CPU는 프로세스들이 선점할 수 있는 대표적인 자원이다. 한 프로세스가 CPU를 이용하다가 일정 시간이 지나면 아직 작업이 모두 끝나지 않았다고 할지라도 다른 프로세스가 CPU를 할당받아 사용할 수 있기 때문이다.
하지만 모든 자원이 이렇게 선점 가능한 것은 아니다. 예를 들어 한번에 하나의 프로세스만 이용 가능한 프린터 자원이 있다고 생각해 보자. 한 프로세스가 이 프린터를 이용하는 도중에 다른 프로세스가 프린터 자원을 빼앗아 사용하긴 어렵지 않은가? 그렇기에 비선점 조건을 없애 모든 자원을 빼앗을 수 있도록 하여 교착 상태를 예방하는 방법은 다소 범용성이 떨어진다.

원형 대기 조건

-> 원형 대기를 없애는 방법은 간단하다. 모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하면 원형 대기는 발생하지 않는다. 원형 대기를 없앰으로써 교착 상태를 예방하는 방식은 앞선 세 방식에 비하면 비교적 현실적이고 실용적인 방식이지만, 역시 단점은 있다. 모든 컴퓨터 시스탬 내에 존재하는 수많은 자원에 번호를 붙이는 일이 그리 간단한 작업이 아니거니와 각 자원에 어떤 번호를 붙이는지에 따라 특정 자원의 활용률이 떨어질 수 있다.

이렇듯 교착 상태의 발생 조건을 원천적으로 제거하여 교착 상태를 사전에 방지하는 예방 방식은 교착 상태가 발생하지 않음을 보장할 수는 있지만 여러 부작용이 따른다.

교착 상태 회피

교착 상태 회피는 교착 상태가 발생하지 않을 정도로만 조심 조심 자원을 할당하는 방식이다. 교착 상태를 회피하는 방법을 학습하기 위해서는 안전 상태와 불안전 상태, 그리고 안전 순서열이라는 용여를 알아야한다.

  • 안전 상태 : 교착 상태가 발생하지 않고 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태
  • 불안전 상태 : 교착 상태가 발생할 수 도 있는 상황
  • 안전 순서열 : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서를 의미

이렇게 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서를 안전 순서열이라고 하고 안전 순서열대로 프로세스들에 자원을 배분하여 교착 상태가 발생하지 않는 상태를 안전 상태라고 한다.
반면, 불안전 상태는 안전 순서열이 없는 상황이다. 시스템이 불안전 상태에 놓이면 교착 상태가 발생할 수 있는 위험이 있다.

교착 상태 검출 후 회복

선점을 통한 회복

교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식이다. 교착 상태가 해결될 때까지 다른 프로세스로부터 자원을 강제로 빼앗고 한 프로세스에 할당하는 방식이다.

프로세스 강제 종료를 통한 회복

운영체제는 교착 상태에 놓인 프로세스를 모두 강제 종료할 수도 있고, 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료할 수도 있다.

📌기본 미션:P. 363 확인 문제 1번 풀고 인증하기

0개의 댓글