[OS] 프로세스 동기화

yongkini ·2021년 9월 23일
0

Operating System

목록 보기
5/5

임계영역 (Critical Section)

: 멀티 쓰레딩에서 나온 것과 유사하게 동일한 자원에 동시에 접근을 해서 수정을 가하는 등의 작업을 하면 충돌이 일어날 수 있는데, 이러한 충돌의 위험이 있는 곳 혹은 동일한 자원에 동시에 접근하는 작업을 실행하는 코드 영역을 임계영역이라고 한다.

임계영역 문제의 해결의 기본 조건

: 이러한 임계영역에서는 위에서도 말했듯이 동시에 복수의 프로세스가 접근하게 되면, 씽크가 안맞는 문제가 발생할 수 있는데, 이를 위해서 동기화 작업이 필요하게 된다.

** race condition(경쟁 상황) : 공유 자원에 동시에 접근해서 작업을 할 때 가장 나중에 접근한 명령이 수행돼 잘못된 결과를 내는 것. 예를 들어, A라는 계좌에 동시에 200원 입금, 100원 입금이 실행큐에 쌓였다고 할 때, 200원 입금 => 100원 입금순으로 처리가 돼 결국 100원만 입금되는 현상이 있다.

1) 상호배제 : 프로세스 P1 이 Critical Section 에서 실행중이라면, 다른 프로세스들은 그들이 가진 Critical Section 에서 실행될 수 없도록 한다.
2) Progress(진행) : 임계 영역에 들어간 프로세스가 없다면, 어느 프로세스가 들어갈 것인지 적절히 선택해줘야 한다. 즉, 임계 영역안에 있는 프로세스 외에는, 다른 프로세스가 임계 영역에 진입하는 것을 방해하면 안된다.
3) 한정된 대기 : 프로세스 P1이 임계영역에 들어가기 위해 대기하는 동안 임계영역에 들어가는 프로세스의 수는 제한을 둬야한다. 이는 무한정 대기하는 것을 막기 위함이다.

임계영역 문제의 해결책

1) Lock : DB 부분을 공부할 때 했던 것인데, 상호배제를 위해 임계영역에 들어가는 프로세스에게 lock을 부여하고, 임계영역에서 나오기 전까지는 lock을 계속 보유하도록 하고, 나올 때 반납하게 하여, lock을 가지고 있는 동안 다른 프로세스가 임계영역에 들어오지 못하게 하는 상호배제를 이룰 수 있다. 그러나, 이는 다중처리기 환경에서는 시간적 효율성 때문에 적용할 수 없다는 한계를 가진다.
=> lock, unlock을 이용해서 해결하는 알고리즘으로 MUTEX(Mutual Exclusion)가 있다.
2) Semaphores (세마포) : 임계영역 문제를 해결하기 위한 동기화도구 및 소프트웨어

  • 카운팅 세마포
    가용한 개수를 가진 자원 에 대한 접근 제어용으로 사용되며, 세마포는 그 가용한 자원의 개수 로 초기화 된다. 자원을 사용하면 세마포가 감소, 방출하면 세마포가 증가 한다.

  • 이진 세마포
    MUTEX 라고도 부르며, 상호배제의 (Mutual Exclusion)의 머릿글자를 따서 만들어졌다. 이름 그대로 0 과 1 사이의 값만 가능하며, 다중 프로세스들 사이의 Critical Section 문제를 해결하기 위해 사용한다.

** 세마포의 단점 ? : Busy Waiting : 초기 세마포에서는 임계영역에 진입하고자하는 프로세스는 계속해서 진입코드를 반복 실행해야 했고, 이는 CPU 시간을 낭비했었다. 그러나, 일반적으로는, 진입에 실패한 프로세스에 대해서 처음에는 block을 한 뒤에 먼저 들어간 프로세스가 release 된 뒤에 다시 wakeup 을 통해 깨우는 방식으로 진입하게 한다.

데드락(교착상태)

: 데드락 발생 조건
4가지가 동시에 성립 될 때 발생한다. 즉, 하나라도 성립되지 않는다면 교착 상태를 해결할 수 있다.

1) 상호 배제 (Mutual Exculsion) : 자원은 한 번에 한 프로세스만!
2) 점유 대기 (Hold and Wait) : 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 있는 자원을 추가로 점유하기 위해 대기하는 프로세스 존재!
3) 비선점 (No Preemption) : 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제적으로 빼앗을 수 없다!
4) 순환 대기 (Circular wait) : 프로세스의 집합(P0,P1, ~ ,PN)에서 P0이 P1이 점유한 자원을 대기하고 P1은 P2가 점유한 자원을 대기하고 .. PN-1은 PN이 점유한 자원을 대기하고 PN은 P0이 점유한 자원을 요구해야 한다!
** 참고 블로그

모니터

: 고급 언어의 설계 구조물로서, 개발자의 코드를 상호배제 하게끔 만든 추상화된 데이터 형태이다.
공유자원에 접근하기 위한 키 획득과 자원 사용 후 해제를 모두 처리한다. (세마포어는 직접 키 해제와 공유자원 접근 처리가 필요하다.)

profile
완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

0개의 댓글