[운영체제] 프레세스 동기화

byeol·2023년 3월 25일
0

오늘은 동기화에 대해서 배웠다.

공동의 목적을 가진 프로세스들이 동시다발적으로 실행될 때
올바르게 서로 협력하며 실행될 수 있도록 프로세스들은 반드시 동기화가 되어 있어야 한다.


동기화의 의미

워드 프로세서
= 사용자로부터 입력을 받는 프로세스
+ 입력한 내용의 맞춤법을 검사하는 프로세스
+ 입력한 내용을 화면에 출력해 주는 프로세스
등의 프로세스가 공동의 목적(워드 프로세서)을 가지고 서로 협력하는 독립적인 프로세스들이다.

하지만 위와 같은 프로세스들이 동시에 실행되어서는 안된다.

프로세스들 간의 순서가 필요할 수도 있고
동시에 접근해서는 안되는 자원을 동시에 접근할 수도 있다.

이는 동기화를 통해서 해결된다.

따라서

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

크게 두 가지를 일컫는다

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

예시

실행 순서 제어 동기화

book.txt 읽는 프로세스
book.txt 파일을 저장하는 프로세스

이 둘 사이에는 실행 순서가 존재한다.
저장하는 프로세스 ➡️ 읽는 프로세스

상호 배제를 위한 동기화

  • 전역변수 : 계좌잔액 = 10만원
  • 프로세스A : 계좌잔액에서 +2
    -> 이를 코드로 표현하면 더 구체적이다.
      1. 계좌에 잔액을 읽어 들이기
      1. 읽어들인 잔액에 +2
      1. 저장
  • 프로세스B : 계좌잔액 -4
    -> 이를 코드로 표현하면 더 구체적이다.
      1. 계좌에 잔액을 읽어 들인다.
      1. 읽어들인 잔액에 -4
      1. 저장

공유하는 자원에 대해서 상호 배제가 이루어지지 않는다면

프로세스A가 2번 과정에서 끝나면 계좌잔액은 여전히 10만원이다.
다음 프로세스B가 마찬가지로 2번 과정에서 끝나면 계좌잔액은 여전히 10만원이다.

다시 프로세스A의 3번 과정으로 계좌잔액은 12만원
프로세스B의 3번 과정으로 계좌잔액 6만원이된다

즉 최종 값은 6만원이 된다.
처음에 생각하기를 8만원이 될거 같지만

공유하는 자원인 전역변수를 상호배제하지 않았기 때문에 6만원이라는 결과가 나왔다.

공유하는 자원에 대해서 상호 배제가 이루어진다면

프로세스A가 2번 과정에서 끝나고 프로세스B가 접근한다면 계좌잔액을 저장하기 전까지 기다리게 하는 것이다.

따라서 이와 같이 공유하는 자원이 전역 변수에 동시에 접근하지 못하도록 상호배체를 해는 동기화가 필요하다.

생산자와 소비자 문제

가장 대표전이 상호 배제를 위한 동기화의 고전적인 문제이다.
생산자 : 계속해서 생산 +1
소비자 : 계속해서 소비 -1

전역변수 총합=10
생산자 10,000번, 소비자 10,000번 동시에 실행

우리가 아는 결과 10
그러나 10이 나오지 않는다.
그 이유는 공유하는 자원인 전역변수에 대해서 상호 배제를 위한 동기화를 하지 않았기 때문이다.

공유 자원과 임계 구역

공유 자원(shared resource)은 전역변수, 파일, 입출력장치, 보조기억 장치가 될 수 있다.

공유 자원 중에서 두 개 이상의 프로세스를 동시에 실행하면 문제가 되는 자원이 있다. 그 자원을 접근하게 만드는 코드 영역을 임계 구역(critical section)이라고 한다.

동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 것은 레이스 컨디션(race condition)이라고 한다.

레이스 컨디션 발생 원인

고급 언어 : 총합을 1을 증가 시킨다
⬇️
저급 언어

//전역변수 총합
int r1=총합;
rl=rl+1;
총합 = r1;

하나의 고급언어는 여러 줄의 저급언어로 변환된다.
따라서 저급 언어를 실행하는 도중에 문맥 교환이 발생할 수 있기 때문에 레이스 컨디션이 발생할 수 있다.

해결방안

레이스 컨디션이 발생하지 않도록 하기 위해서 세 가지 원칙을 반드시 지켜야 한다.

  • 상호 배제
    한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
  • 진행
    임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  • 유한 대기
    한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언제가는 임계 구역에 들어올 수 있어야 한다.(임계 구역에 들어오기 위해 무한정 대기해서는 안된다.)
profile
꾸준하게 Ready, Set, Go!

0개의 댓글