프로세스 동기화 (1)

강창민·2022년 5월 9일
0

프로세스 동기화?

하나의 자원을 한 순간에 하나의 프로세스(또는 thread)만이 이용하도록 제어하는 것.
그 반대의 경우는 '비동기' 이다.

배경

현대 컴퓨터의 메모리에는 여러 프로세스가 존재하는데, 이러한 프로세스들이 하나의 공유 메모리(공유 자원)나 또 다른 프로세스에 접근할 때는 매우 신중해야 한다. 자칫 원하지 않은 결과값이 나오거나, 프로세스가 더이상 진행되지 않는 상태가 올 수 있기 때문이다.

현대 컴퓨터 환경에서는 한 프로세스가 다른 프로세스에게 영향을 미치는 경우가 훨씬 많이 존재하기때문에 데이터나 프로세스의 진행에 대한 동기화가 매우 중요하다.

목표

프로세스 동기화는 여러 프로세스가 공유하는 자원의 일관성을 유지하는 것을 목표로 한다. 예를 들어, 여러 프로세스가 동시에 하나의 공유 자원에 접근하려 할 때 이 프로세스들의 접근 순서를 정하여 자원의 일관성을 유지시켜주어야 한다.

대표적 예시_은행 계좌 문제

동기화 문제 중에서 대표적인 은행 계좌 문제를 살펴보자.

사용자는 잔고가 10만원인 계좌에 1000원을 입금하고, 다시 1000원을 출금하고 싶다고 가정한다.

다음은 공유자원 balance(계좌 잔고)에 대하여 두개의 코드를 가지는 서로다른 프로세스(쓰레드)가 있다.

아래 그림은 내가 필기를 하며 쓴내용이지만, 그래도 지우면 안될 것 같아서 지우지 않은 채로 같이 업로드 한 모습이다.

그림을 따라서, 한번 해석을 해 보겠다.

  • 처음에 잔고(10만원)를 가져와서, R1에 저장한다.
  • R2에 내가 입금할 1000원을 저장한다.
  • CPU가 p2에 할당된다.
  • 잔고(10만원)을 가져와서 R1에 저장한다.
  • R2에 출금할 1000원을 저장한다.
  • R1에서 R2를 빼고, 그 결과(9만9천원)를 잔고에 저장한다.
  • CPU가 다시 p1에 할당된다.
  • p1은 1.에서 R1에 저장한 10만원에 R2(1000원)를 더한다.
  • 그 결과를 잔고에 저장한다.

그렇다면, 현재 계좌에 남은 잔고는 얼마인가?

정답은 10만 1000원이다. 사용자의 의도에 의하면, 계좌에 10만원이 있어야 한다. 그렇지만, 공유자원에 대한 동기화를 해주지 않았기 때문에 위와 같은 일이 발생하였다.

그렇다면, 위와 같은 문제는 왜 발생하게 될까?


문제의 발생 이유

위와 같은 문제가 발생하는 이유는 공유자원(Critical Section)에 대한 동시접근 때문이다.

위의 예제에서 공유자원은 balance 이다.
우리가 흔히 java나 c언어에서 코딩을 할 때는 아무 문제가 없는 코드이지만, 실제로 이러한 코드가 실행되기 위해 컴파일러가 어셈블리어로 변환을 시키면, 한 줄의 코드는 2번째 그림처럼 여러줄로 표현된다.

여러줄의 코드가 모두 수행 되기 전에 OS가 다른 프로세스에게 CPU를 할당하면, 위와 같은 문제가 발생할 수 있다.

위와 같이 공유자원에 대한 서로 다른 쓰레드 간의 경쟁상태를 Race Condition이라고 하는데, 쓰레드가 적을 때는 경쟁 상대가 줄어들어서 문제가 발생하지 않을 수 있지만, 많아지면 경쟁 상대가 많아져 Critical Section에 대한 문제가 발생할 가능성이 높다.

해결 방법

  • Mutual Exclusion(상호 배제)

    • Race Condition 문제를 해결할 수 있도록 OS에서 제공하는 기능
    • 하나의 Critical Section에 대하여 오직 하나의 쓰레드만이 접근 가능하다.
  • CS에 들어가도록 선정되는 프로세스는 경쟁하는 프로세스들에 의해 결정되어야 한다.(외부 중재자가 없어야함!)

  • CS에 들어가기를 요청하기 전에 대기중이던 다른 프로세스들의 수만큼만 대기(한정된 수)

    • 나 이후에 CS에 온 애들은 나 이후에 지나가야지!

      CS = Critical Section


마치며,,

프로세스 동기화의 내용은 워낙 많아서, 다음 포스팅에서 이어서 작성하도록 하겠습니다~~😁

profile
오늘 그것을 할 수 없다면, 대체 무슨 근거로 내일 그것을 할 수 있다고 생각하는가?

0개의 댓글