혼공족 재용님의 근황 토크를 보고 저도 근황에 대해 몇자 적어봅니다. 스터디 활동이 다음주면 마지막이네요. 6주는 길지만 어떻게 보면 짧은 것 같아요. 저는 8기부터 참여하고 있지만 10기, 11기까지 혼공시리즈를 다 정복하고 싶은 마음입니다 ㅎㅎ (혼공스프링도 내주세요 ㅋㅋ)
저는 혼공컴운 외에도 스프링부트, 알고리즘을 공부하고 있습니다. 혼공족 덕분에 velog도 개설하고, 꾸준히 뭐라도 작성하기 위해 머리를 쥐어 짜고 있어요 ㅋㅋㅋ 위 사진은 최근 펀딩을 통해 산 양파쿵야 티셔츠입니다. 취미가 이런 반팔 모으기예요 ^^

활동 내용

Chapter 12 ~ 13, 프로세스 동기화부터 교착 상태까지

  • 기본 미션: p. 363의 확인 문제 1번 풀고 인증하기
  • 선택 미션: Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기

정리

동기화

정보통신 분야에서의 동기화(synchronization)란 작업들 사이의 수행 시기를 맞추는 것을 의미한다. 다시 말해 프로세스 동기화란 프로세스들 사이의 수행 시기를 맞추는 것을 의미한다. 여기서 프로세스 사이의 수행 시기를 맞추는 것은 크게 아래 두 가지를 일컫는다.

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

공유 자원과 임계 구역

공유 자원(shared resource)은 공동으로 사용하는 자원이며, 전역 변수가 될 수도 있고, 파일이 될 수도 있고, 입출력장치, 보조기억장치가 될 수 있다. 임계 구역(critical section)은 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역을 의미한다. 임계 구역에 진입한 프로세스가 있다면 다른 프로세스는 임계 구역 밖에서 기다려야 한다.
그러나 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하는 문제가 발생할 수 있는데, 이를 레이스 컨디션(race condition)이라고 한다. 운영체제는 이러한 임계 구역 문제를 아래 세 가지 원칙 하에 해결한다.

  • 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
  • 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  • 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다. (무한정 대기 X)

동기화 기법

프로세스의 동기화 기법에는 대표적인 도구인 뮤텍스 락, 세마포, 모니터가 있다.

뮤텍스 락

뮤텍스 락(Mutex lock: MUTual Exclusion lock)은 상호 배제를 위한 동기화 도구이며, 임계 구역에 진입한 프로세스가 '내가 지금 임계 구역에 있음'을 알리기 위해 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸 수 있는 방식이다. 뮤텍스 락의 단순한 형태로는 하나의 전역 변수와 두 개의 함수로 구현할 수 있다.

  • 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
  • 임계 구역을 잠그는 역할: 프로세스가 임계 구역에 진입하기 전에 호출하는 acquire 함수
  • 임계 구역의 잠금을 해제하는 역할: 임계 구역에서의 작업이 끝나고 호출하는 release 함수

여기서 acquire 함수는 임계 구역이 잠겨 있을 경우 프로세스를 반복적으로 lock을 확인한다. 이런 대기 방식을 바쁜 대기(busy wait)라고 한다.

세마포

세마포(semaphore)는 뮤텍스 락과 비슷하지만, 공유 자원이 여러 개있는 상황에서도 적용이 가능한 동기화 도구이다. 세마포의 종류에는 이진 세마포카운팅 세마포가 있지만, 본 책에서는 카운팅 세마포만 다룬다.

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

세마포도 뮤텍스 락과 같이 공유 자원이 없는 경우 바쁜 대기를 반복한다. 이는 CPU 주기를 낭비한다는 단점이 있는데, 이를 해결하기 위해 세마포는 대기큐를 사용한다. 무한히 반복하며 사용할 수 있는 자원이 있는지 확인하는 것이 아닌 자원이 없으면 해당 프로세스를 대기큐에 넣고, 다른 프로세스가 임계 구역에서의 작업이 끝난 뒤 signal 함수를 호출하면 signal 함수가 대기 중인 프로세스를 대기 큐에서 제거하며, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨놓는 방식이다.

모니터

모니터(monitor)는 앞서 소개된 방식들보다도 더 사용자가 사용하기에 편리한 도구이다. 모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다. 그리고 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 하며, 모니터를 통해 공유 자원에 접근하고자 하는 프로세스는 큐를 통해 순서대로 하나씩 공유 자원을 이용하도록 한다.
이때, 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수(condition variable)를 사용한다. 조건 변수로는 아래와 같은 연산을 수행할 수 있다.

  • wait 연산: 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산이다. 이때, 모니터에 진입하기 위해 삽입되는 큐와는 별개의 큐이다.
  • signal 연산: wait를 호출하여 큐에 삽입된 프로세스의 실행을 재개하는 연산이다.

이 외에도 모니터는 아래와 같은 프로세스 실행 순서 제어를 위한 동기화를 제공한다.

  • 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
  • 특정 프로세스가 실행될 조건이 충족되었을 때는 signal을 통해 실행을 재개한다.

교착 상태

교착 상태(deadlock)란 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상이다. 프로세스를 실행하기 위해서는 자원이 필요한데, 만약에 두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작정 기다린다면 그 어떤 프로세스도 더 이상 진행할 수 없는 교착 상태가 된다.
이러한 교착 상태를 해결하기 위해서는 첫째, 교착 상태가 발생했을 때의 상황을 정확히 표현해 보고, 둘째, 교착 상태가 일어나는 근본적인 이유에 대해 알아야 한다.

자원 할당 그래프

교착 상태 해결법의 첫 번째로 교착 상태가 발생했을 때의 상황을 정확히 표현해 보아야 한다. 이때, 자원 할당 그래프(resource-allocation graph)를 통해 단순하게 표현할 수 있다. 자원 할당 그래프는 어떤 프로세스가 어떤 자원을 사용하고 있고, 또 어떤 프로세스가 어떤 자원을 기다리고 있는지를 표현한 그래프이다. 아래 그림은 예시이다.

해당 자원 할당 그래프는 원의 형태로 게임 프로세스는 자원 A를 할당받은 채 웹 브라우저 프로세스가 할당받은 자원 B의 사용이 끝나길 기다리고 있고, 웹 브라우저 프로세스는 자원 B를 할당받은 채 게임 프로세스가 할당받은 자원 A의 사용이 끝나길 기다리는 상황이다. 이러한 상황을 교착 상태라고 한다.

교착 상태 발생 조건

  • 상호 배제(mutual exclusion): 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때 교착 상태가 발생한다.
  • 점유와 대기(hold and wait): 프로세스가 어떠한 자원을 할당받은 상태에서 다른 자원 할당을 할당받기를 기다린다면 교착 상태가 발생한다.
  • 비선점(nonpreemptive): 비선점 자원은 그 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 이용할 수 있다. 즉, 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못했기에 교착 상태가 발생한다.
  • 원형 대기(circular wait): 자원 할당 그래프가 원의 형태로 그려지면 교착 상태가 발생할 수 있다. 그러나 원의 형태를 띈다고 해서 반드시 교착 상태가 발생하는 것은 아니다.

교착 상태 해결 방법

운영체제는 교착 상태를 예방, 회피, 검출 후 회복의 방법으로 해결하고 있다. 그러나 교착 상태를 아예 무시하는 방법도 있다. 드물게 발생하는 문제를 무시로 대처하는 방식으로 타조 알고리즘(ostrich algorithm)이라고 한다.

교착 상태 예방

교착 상태를 예방하는 방법은 교착 상태 발생 조건 네 가지 중 하나를 충족하지 못하게 하는 방법이다. 그러나 깊게 들어가보면 자원의 상호 배제, 점유와 대기는 이론적으로 없앨 수 있지만, 현실적으로는 없애기 어렵다. 또한, 비선점 조건을 없앤다면 일부 자원에 대해서는 효과적일지라도 다소 범용성이 떨어지는 방안이다. 마지막으로 원형 대기 조건을 없애고 모든 자원에 번호를 붙인 뒤 오름차순으로 자원을 할당한다면 앞선 세 방식에 비해 비교적 현실적이고 실용적인 방안일 것이다. 그러나 역시 단점은 있다. 모든 컴퓨터 시스템 내에 존재하는 수많은 자원에 번호를 붙이는 일은 그리 간단한 작업이 아니며, 각 자원에 어떤 번호를 붙이는지에 따라 특정 자원의 활용률이 떨어질 수 있다.
이렇듯 교착 상태의 발생 조건은 원천적으로 제거하여 교착 상태를 사전에 방지하는 예방 방식은 교착 상태가 발생하지 않음을 보장할 수 있지만 여러 부작용이 따른다.

교착 상태 회피

교착 상태 회피에서는 교착 상태를 한정된 자원의 무분별한 할당으로 인해 발생하는 문제로 간주한다. 즉, 교착 상태가 발생하지 않고 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태인 안전 상태(safe state)를 유지하며, 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서인 안전 순서열(safe sequence)대로 프로세스들에 자원을 배분한다. 이때, 안전 순서열이 없다면 불안전 상태(unsafe state)가 되고 교착 상태가 발생할 수 있는 위험이 있으니 운영체제가 교착 상태를 회피하기 위해 시스템 상태가 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당하도록 한다.

교착 상태 검출 후 회복

교착 상태 예방과 회피는 교착 상태 발생을 막기 위한 노력이라면, 교착 상태 검출 후 회복은 교착 상태 발생을 인정하고 사후에 조치하는 방식이다.

  • 선점을 위한 회복: 교착 상태가 해결될 때까지 다른 프로세스로부터 자원을 강제로 빼앗고 한 프로세스씩 자원을 몰아주는 방식이다.
  • 프로세스 강제 종료를 통한 회복: 운영체제는 교착 상태에 놓인 프로세스를 모두 강제 종료할 수도 있고, 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료할 수 있는 방식이다.

기본 미션

p. 363의 확인 문제 1번 풀고 인증하기


1. 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.

(1)

선택 미션

임계 구역, 상호 배제 개념을 정리하기


우측 목차에서 공유 자원과 임계 구역을 참조하시길 바랍니다.
profile
안녕하세요.

0개의 댓글