[CS 스터디] 운영체제 6일차 - 동기화

강아람·2023년 1월 1일
0

운영체제

목록 보기
6/11
post-thumbnail

📚 임계 영역 (Critical Section)

경쟁 상태 (Race Condition)

여러 개의 프로세스가 공유 자원에 동시 접근할 때 실행 순서에 따라 결과값이 달라질 수 있는 현상

우리가 컴퓨터 프로그램을 실행하면 항상 같은 코드를 실행하기 때문에 같은 결과를 반환해야 한다. (일관성)
즉, 독립적으로 실행되는 프로세스의 실행 순서가 결과에 영향을 주지 않아야 한다는 뜻이다.

여러 프로세스가 공유 자원에 접근할 때 경쟁 상태로 인해 데이터의 일관성이 깨지는 문제가 생기지 않도록 공유 자원에 대한 프로세스 동기화가 필요하다.


임계 영역

운영체제에서 여러 프로세스가 수행될 때 각 프로세스에서 공유 자원에 접근하는 프로그램 코드 부분

한 프로세스가 공유 자원에 접근(임계 영역에 진입)하면 다른 프로세스는 접근할 수 없도록 제어가 필요하다. (공유 자원의 독점을 보장해야 함)


임계 영역 문제를 해결하기 위한 조건

임계 영역 문제란 임계 영역에서 경쟁 상태가 발생한 것을 말한다. 이 문제(경쟁 상태)를 해결하기 위해 3가지 조건을 만족해야 한다.

1) 상호 배제 (Mutual Exclusion)

한 프로세스가 임계 영역에 진입하면 다른 프로세스는 임계 영역에 진입할 수 없다.

2) 진행 (Progress)

임계 영역 내의 코드를 실행하고 있는 프로세스가 없을 때, 임계 영역에 진입하고자 하는 프로세스가 있다면 해당 프로세스가 임계 영역에 진입할 수 있어야 한다.

3) 한정 대기, 유한 대기 (Bounded Waiting)

프로세스가 임계 영역에 진입하기 위해 무한정으로 기다리는 현상(Starvation)이 발생해서는 안된다.



📚 동기화

앞서 말했듯이 멀티 프로세스(또는 멀티 스레드) 환경에서는 프로세스(또는 스레드)들이 메모리 공간을 공유하는데 이때 발생하는 경쟁 상태의 일관성 문제를 해결하기 위해 프로세스 동기화가 필요하다.

현재는 멀티 스레드 환경의 경우가 많기 때문에 스레드 간 동기화로 더 많이 불린다고 한다.


그렇다면 동기화가 정확히 어떤 뜻일까?

앞에서 실행 순서에 상관없이 항상 같은 결과가 보장되어야 한다고 했는데, 임계 영역에 진입하는 프로세스(또는 스레드)의 순서를 보장하여 서로가 알고있는 정보를 일치시키는 것이다.

동시에 공유 자원에 접근하면 다른 프로세스가 공유 자원의 값을 어떻게 바꾸었는지 알 수 없다.
따라서 공유 자원 독점을 통해 동기화를 유지할 수 있다.


스핀락 (Spinlock)

동시에 공유 자원에 접근하는 것을 막기 위해 lock을 사용하는 방법이다. 임계 영역에 진입하려면 lock을 획득해야 한다. 진입한 후 코드 실행을 완료하고 임계 영역에서 빠져 나올 때 lock을 반납한다.

문제점

Busy Waiting(바쁜 대기) : 임계 영역에 진입하는 프로세스는 lock을 얻을 때까지 진입 코드를 반복 실행해 CPU를 낭비한다. (spin-lock)


뮤텍스 (Mutex)

Lock을 사용하여 임계 영역에 진입하는 프로세스를 제어하는 매커니즘(locking 매커니즘)은 동일하지만 spin-lock의 busy waiting 상태에 머무르지 않고 임계 영역에 진입해있는 프로세스가 lock을 반납할 때까지 sleep 상태로 기다리다가 wakeup 상태가 되면 다시 lock 획득을 시도하는 sleep lock을 시도한다.


세마포어 (Semaphore)

하나 이상의 프로세스(또는 스레드)가 공유 자원에 접근하도록 할 수 있다. 세마포어(S)라는 변수로 자원의 개수 또는 진입 가능한 프로세스 수를 표현한다.

S = Semaphore = 자원 개수 = 진입 가능한 프로세스 수
P = Proberen(test) = wait = acquire
V = Verhogen(increment) = signal = release

이진 세마포어 (Binary Semaphore)

  • S가 0과 1 중 하나의 값만 가짐
  • 상호배제나 프로세스 동기화의 목적으로 사용
  • Mutex라고 할 수 있음

카운팅 세마포어 (Counting Semaphore)

  • S가 0 이상의 정수 값을 가질 수 있음
  • Producer-Consumer 문제 등을 해결하기 위해 사용

뮤텍스와 세마포어는 모두 완벽한 기법은 아니므로, 데이터 무결성을 보장할 수 없으며 모든 교착 상태를 해결하지는 못한다.

하지만, 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 매커니즘을 적용해 개선된 성능을 가질 수 있도록 하는 것이 중요하다.


뮤텍스와 세마포어의 차이점

  • 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없음

  • 세마포어는 소유권이 없지만 뮤텍스는 lock의 소유가 가능하며 소유한 프로세스가 책임을 짐

  • 현재 수행중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있지만 뮤텍스는 lock을 소유한 프로세스가 반드시 lock을 해제해야 함

    다른 프로세스가 세마포어를 해제할 수 있는 이유

    세마포어의 원리는 세마포어 변수를 wait(), signal() 함수로 제어하는 것이다.
    세마포어 변수마다 대기 큐를 가지고 있는데 프로세스가 wait() 함수를 호출했을 때 세마포어 변수가 0이라면 -1로 만들 수 있다. 즉, wait() 함수를 실행하면 자원을 소유하지 않은 프로세스라도 세마포어 변수를 ...아ㅏ아아아아아아아아아아아아아ㅏ아ㅏㅏㅏㅏ아ㅏㅇ아아ㅏ아앙ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ아아아ㅏ아악
    모르겠다..........

  • 세마포어는 시스템 범위에 걸쳐있고 파일 시스템 상의 파일 형태로 존재하지만 뮤텍스는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 clean up 된다.

  • 세마포어는 자원의 수만큼 프로세스가 임계영역에 접근할 수 있지만 뮤텍스는 오직 1개의 프로세스만 접근 가능

추가로 공부할 내용

  • 세마포어 구현 방법, 원리


질문 1

멀티 프로세스, 멀티 스레드 환경에서 동기화 방법에 대해 간단하게 설명하세요.

동기화 방법에는 뮤텍스, 세마포어가 있습니다.
뮤텍스는 락킹 메커니즘을 이용한 방법으로, 임계 영역에 진입하기 위해 락을 획득하고 임계 영역에서 나갈 때 락을 반납하는 방식으로 하나의 프로세스만 임계 영역에 진입할 수 있도록 공유 자원 독점을 보장합니다.
세마포어는 시그널링 메커니즘을 이용한 방법으로, signal을 통해 공유 자원에 접근할 수 있다는 신호를 받아 임계 영역에 접근할 수 있습니다.


질문 2

임계 영역 문제를 해결하기 위한 조건에 대해 설명하세요.

세 가지 조건이 존재합니다.
상호 배제란 한 프로세스가 임계 영역에 진입해있으면 다른 프로세스는 진입할 수 없는 것입니다.
진행(progress)이란 임계 영역에 진입한 프로세스가 없을 때 진입을 원하는 프로세스가 존재하면 진입이 가능해야 하는 것입니다.
유한 대기란 유한 시간 내에 프로세스가 임계 영역에 진입하지 못하는 기아 현상(Starvation)이 바랭하지 않아야 하는 것입니다.


질문 3

임계 영역에서의 경쟁 상태에 대해 간단히 설명하세요.

임계 영역이란 공유 자원에 접근하는 코드 영역을 말합니다. 이 코드 영역에 여러 프로세스가 접근할 때 실행 순서에 따라 실행 결과가 달라지는 문제 입니다.

0개의 댓글