• 혼자 공부하는 컴퓨터 구조 + 운영체제 : Ch.12 ~ Ch.13

    2023. 2. 12.

    by. 옛슬

    개요

    오늘은 프로세스 동기화와 교착 상태에 대해서 공부를 하였다,

    사실 항상 유튜브에서 말하는 기본기를 갖춘 개발자에 대한 이야기 때문에

    나는 컴퓨터구조와 운영체제에 대해서 공부하기 시작했는데

    이게 뭔가 도움이 되나? 라는 의구심으로 그냥 뭔가 고3이 된 기분으로 ㅋㅋ 공부를 했었다.

    사실 나는 공부를 해야하는 뚜렷한 이유가 없으면 흥미를 잘 못느끼는 타입이어서

    끝으로 가서 루즈해진 감도 있었던거 같다.

    근데 이번주에 서버가 안열려서 개발자 분에게 메시지를 보내니

    PID를 확인해보시라고 하는것! 사실 별 거 아닌데 그냥 운영체제 책에서 나온 

    개념 하나를 알아듣고 이해하는 내 자신이 신기했다 🍈😎


    Chapter 12. 프로세스 동기화

    1️⃣ 동기화란

    실행되는 프로세스들은 실행순서와 자원의 일관성을 보장해야하기 때문에 동기화되어야 한다.

     

    프로세스 동기화

    - 프로세스 동기화란 프로세스들 사이의 수행시기를 맞추는 것

    - 프로세스들 사이의 수행시기를 맞추는 것

       ◾ 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기.

       ◾ 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

     

    실행 순서 제어를 위한 동기화

    예시 :

    - Book.txt에는 두가지 프로세스가 있다. (1) 읽는 프로세스 (2) 쓰는 프로세스

    - 읽는 프로세스는 쓰기 전에 읽으면 올바른 텍스트를 읽을 수 있기 때문에 쓰는 프로세스가 반드시 먼저 실행이 되어야 함.

     

    상호 배제를 위한 동기화

    예시 :

    - 계좌에는 두가지 프로세스가 있음. (1) 2만원을 더하는 프로세스 (2) 5만원을 더하는 프로세스

    - 이들은 잔액을 읽은 다음에 각 프로세스를 실행 후 더한 값을 저장함

    - 이 때 잔액이라는 데이터는 공유자원인데 동시에 접근하게 되면서 엉뚱한 결과를 초대할 수 있음.

     

    ❗ 공유자원이란
    - 동시에 접근해서는 안되는 공동의 자원.
    - 전역변수, 파일, 입출력장치, 보조기억장치가 될 수 있음
    - 이때 공유자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드영역을 임계구역이라 함.
    - 그리고 임계구역을 잘못된 실행으로 여러 프로세스가 동시 다발적으로 실행하여 문제가 발생하는 경우
      → 레이스 컨디션

    ❓ 레이스 컨디션이 발생하는 이유는
    - 고급언어는 실행과정에서 저급 언어로 변환된다.

    - 즉, 짧은 코드라도 저급 언어로 변환되면 그 길이가 길어질 수 있고, 이를 실행하는 과정에서 문맥 교환이 일어날 수 있기 때문이다.

    - 상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리함.

    - 운영체제는 임계 구역 문제를 아래 3가지 원칙 하에 해결함.

       1. 상호 배제 : 한 프로세스가 임계 구역 진입 시, 다른 프로세스는 들어올 수 없음.

       2. 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았을 시, 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있게 함.

       3. 유한 대기 : 한 프로세스가 임계 구역에 진입을 원할 시, 그 프로세스는 언젠가는 임계 구역에 들어 올 수 있어야 함. (무한정 대기X)

     


    2️⃣ 동기화 기법

    임계 구역에 오직 하나의 프로세스만 진입하게 하고, 올바른 실행순서를 보장할 수 있는 동기화의 대표적인 도구

    = 뮤텍스 락, 세마포, 모니터

     

    뮤텍스 락

    - 자물쇠 기능을 코드로 구현

    - 상호배제를 위한 동기화 도구

     

    예시 :

    매우 단순한 형태 - 하나의 전역 변수와 두개의 함수로 구현

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

    2, 임계 구역을 잠그는 역할 :  acquire 함수

    - 프로세스가 임계구역에 진입 전 호출하는 함수

    - 임계 구역이 잠겨 있는 경우 임계 구역을 반복적으로 확인

    - 임계 구역이 열려 있다면 임계 구역을 잠구는 함수

    ❓ 쉴 새 없이 반복하며 확인해 보는 것 = 바쁜 대기라고 함.

    3. 임계 구역의 잠금을 해제하는 역할 :  release 함수

    - 임계 구역 작업이 끝나고 호출하는 함수

    - 잠긴 임계 구역을 열어주는 함수

     

    세마포

    - 뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식

    - 공유자원이 여러개 있는 상황에서도 적용이 가능한 동기화 도구

    - 세마포는 이진 세마포와 카운팅 세마포가 있으며 이진 세마포는 뮤텍스락과 비슷한 개념

     

    카운팅 세마포의 예시1 (상호 배제를 위한 동기화 기법) :

    * 세마포 변수와 함수의 이름은 전공서마다 다름.

    1. 임계 구역에 진입할 수 있는 프로세스의 개수 : 전역 변수 S

    2. 임계 구역에 들어가도 좋은지 기다려야되는지 알려줌 : wait 함수

    - 사용할 수 있는 프로세스가 0개 이하면 바쁜 대기 방식

    - 사용할 수 있는 프로세스가 1개 이상일 시 전역변수 1을 감소 후 임계 구역에 진입

    3. 임계 구역 앞에서 기다리는 프로세스에 가도 좋다는 신호를 줌 : signal 함수

    - 임계 구역 작업을 마친 뒤 전역변수 1을 증가.

     

    뮤텍스 락과 세마포의 문제점

    - 바쁜 대기를 반복하며 확인 → CPU 주기를 낭비함 →  세마포는 다른 더 좋은 방법을 사용함.

     

    * 더 좋은 방법

    - wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만든다음

      그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어 넣음.

    - signal 함수가 호출되면 대기 큐에서 해당 프로세스를 제거 후, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨줌.

     

    예시 2 (프로세스의 순서를 제어하는 방법) :

    - 세마포의 변수 S를 0으로 두고 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 됨.

    - 이 경우 wait 함수가 없는 프로세스가 먼저 실행하게 되기 때문에 순서가 제어됨.

     

    모니터

    - 공유자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리

      - 이를 통해, 세마포의 잘못된 사용방식을 개선할 수 있음.

      - 세마포는 wait와 signal 함수를 명시하는 것이 번거로움 → 잘못된 코드로 예기치 못한 결과를 얻을 수 있음.

     

    예시 1 (상호배제를 위한 동기화 기법) :

    - 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐 (모니터 진입하기 위한 큐)를 만들고,

      모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공

       ◾ 모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입

       ◾ 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 함.

     

    예시 2 (실행 순서 제어를 위한 동기화 제공)

    - 조건 변수를 사용 : 특정 조건을 바탕으로 실행하고 일시 중단하기 위해

    - 조건 변수로 연산을 수행하는 함수 : wait, signal 함수

       ◾ 특정 프로세스가 실행될 조건이 충족 되지 않았을 경우 : wait을 통해 실행을 중단  → 조건 변수에 대한 큐에서 대기

       ◾ 실행 조건이 충족 되었을 경우 : signal 함수 호출  → 대기 상태였던 프로세스가 깨어나 모니터 안으로 들어옴

     


    Chapter 13. 교착상태

    1️⃣ 교착 상태란

    프로세스를 실행하기 위해서는 자원이 필요한데, 두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작정 기다린다면 어떤 프로세스도 더이상 진행할 수 없는 교착 상태가 됨.

     

    - 일어나지 않을 사건을 기다리며 진행이 멈춰버리는 현상 = 교착 상태

     

    자원 할당 그래프

    - 교착 상태가 발생했을 때의 상황을 한눈에 보기 쉽게 그래프로 표현하는 방법

     

    자원 할당 그래프를 그리는 규칙

    1. 프로세스는 원, 자원의 종류는 사각형으로 표시

    2. 사용할 수 있는 자원의 개수:  자원 사각형 내에 점으로 표현

    3. 프로세스가 사용하고 있는 자원 : 자원에서 프로세스 방향으로 화살표를 표시

    4. 프로세스가 기다리고 있는 자원 : 프로세스에서 자원으로 화살표를 표시

     

    교착 상태 발생 조건

    1. 상호배제 : 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때 교착 상태 발생

    2. 점유와 대기 : 자원을 할당받은 상태에서 다른 자원을 할당 받기를 기다리는 상태

    3. 비선점 : 비선점 자원은 그 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 이용 가능. 즉, 강제로 빼앗지 못하기 때문에 교착 상태 발생.

    4. 원형 대기 : 비선점 자원은 그 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 이용 가능. 즉, 강제로 빼앗지 못하기 때문에 교착 상태 발생.

     


    2️⃣ 교착 상태 해결 방법

    교착 상태를 해결하는 세 가지 방법 : 예방, 회피, 검출 후 회복

     

    교착 상태 예방

    - 교착 상태 필요조건 4가지 중 하나를 충족하지 못하게 하는 방법

     

    1. 상호 배제를 없애는 방법 :

       - 모든 자원을 공유가능 하게 만든다는 말 → 현실에서 사용하기에는 다소 무리가 있음.

    2. 점유와 대기를 없애는 방법 :

       - 운영체제가 특정 프로세스에 자원을 모두 할당, 아예 할당하지 않는 방식으로 배분  → 자원의 활용률이 낮아질 우려가 있음.

       - 이는 당장 자원이 필요해도 기다릴 수 밖에 없는 프로세스와, 사용되지 않으면서 오랫동안 할당되는 자원을 다수 양산할 수 있음.

       - 기아 현상을 야기할 우려가 있음

    3. 비선점 조건을 없애는 방법 :

       - 자원을 이용 중인 프로세스로부터 해당 자원을 뺏을 수 있음.

       - 이는 한 프로세스의 작업이 끝날 때까지 다른 프로세스가 기다려야하는 자원도 얼마든지 있음. 예시 ) 프린터

    4. 원형 대기 조건을 없애는 방법 :

       - 모든 자원에 번호를 붙이고 오름차순으로 자원을 할당하면 원형대기는 발생하지 않음. (가장 높은 번호는 작은 번호에 접근이 어려움)

       -  비교적 현실적이고 실용적인 방식

       - 단점 : 모든 컴퓨터 시스템 내에 존재하는 수많은 자원에 번호를 붙이는 일은 간단한 작업이 아니며 각 자원에 어떤 번호를 붙이는 지에

          따라 특정 자원의 활용률이 떨어질 수 있음.

     

    교착 상태 회피

    - 교착 상태가 발생하지 않을 정도로만 조심 조심 자원을 할당하는 방식 ( = 안전 상태를 유지하도록 자원을 할당하는 방식)

    - 프로세스들에 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 정도의 양만큼만 자원을 배분하는 방법

    - 교착 상태가 발생하지 않는 상황 : 안전 상태이며 안전 순서열이 있는 상황

    - 교착 상태가 발생할 수도 있는 상황 : 불안전 상태이며 안전 순서열이 없는 상황

     

    ❓ 안전 순서열이란

    - 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서

     

    예시 1 (안전상태, 안전 순서열이 있는 상황)

    프로세스 최대 요구량 현재 사용량
    P1 10 5
    P2 4 2
    P3 9 2

    - 할당 가능 자원 : 12

    - 할당한 자원 ( 현재 사용량의 총합 ) : 9

    - 남은 자원 : 12 - 9 = 3

     

    만약에 프로세스 모두 최대로 자원을 요구한 최악의 상황을 가정했을 시

    - 안전 순서열이 있는 안전상태라면 최악의 상황에서도 문제없이 작동함.

    - 안전 순서열 : P2 → P1 → P3

     

    1. P2가 필요한 자원은 2이고, 남은 자원은 3

    - 요구한 자원을 할당 받는 P2는 정상적으로 작업을 완료 후 가지고 있던 자원 반환 (총 4개)

    - 할당 가능 자원 : 12

    - 할당한 자원 ( 현재 사용량의 총합 ) : 9

    - 남은 자원 : 3 - 2 + 4 = 5

     

    2. P1은 총 5개가 필요하고, 남은 자원은 5이기 때문에 마찬가지로 작업 완료 후 자원 반환

    - 할당 가능 자원 : 12

    - 할당한 자원 ( 현재 사용량의 총합 ) : 9

    - 남은 자원 : 5 - 5 + 10 = 10

     

    3. 남은 자원 10개로 P3 작업을 완료함.

     

    예시 2 (불안전상태)

    프로세스 최대 요구량 현재 사용량
    P1 10 5
    P2 4 2
    P3 9 3

    - 할당 가능 자원 : 12

    - 할당한 자원 ( 현재 사용량의 총합 ) : 10

    - 남은 자원 : 12 - 10 = 2

     

    ❗ 만약에 프로세스 모두 최대로 자원을 요구한 최악의 상황을 가정했을 시

    - 이 경우 P2 작업을 올바르게 끝낸다고 해도 남은 자원은 4이기 때문에 P1, P3의 작업을 할 수 없기 때문에 무한정

      기다릴 수 밖에 없음

    - 불안전 상태로 교착 상태가 발생

     

    교착 상태 검출 후 회복

    상태 발생을 인정하고 사후에 조치하는 방식

     

    1. 선점을 통한 회복

    - 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식

     

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

    - 운영체제는 교착 상태에 놓은 모든 프로세스를 강제 종료할 수 있음 :

       ◾ 한 번에 교착 상태 해결 but 프로세스들의 작업 내역을 읽게 될 가능성 ↑

    - 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료 할 수 있음 :

       ◾ 작업 내역을 읽는 프로세스는 최대한 줄일 수 있음 but 교착 상태가 없어졌는지 여부를 확인하는 과정에서 오버헤드를 야기


    혼공단 미션

    기본미션

    p.363 (1번 문제)

    뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것은? 4번

     

    - 반드시 바쁜 대기를 할 필요없음

    - wait함수를 이용해 확인 후 대기큐에 넣고, signal 함수 호출 시 대기 큐에 있던 프로세스를 준비 큐에 넣고 임계 구역에

      들어갈 수 있도록 함.

    선택미션

    Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기

     

    - 공유자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드영역을 임계구역이라 함.

    - 임계 구역 문제를 해결하는 3가지 원칙 중 하나가 바로 상호 배제이다. 상호 배제는 한 프로세스가 임계 구역 진입 시,

       다른 프로세스는 들어올 수 없음.

     

    댓글