하나의 자원을 한 순간에 하나의 프로세스(또는 thread)만이 이용하도록 제어하는 것.
그 반대의 경우는 '비동기' 이다.
현대 컴퓨터의 메모리에는 여러 프로세스가 존재하는데, 이러한 프로세스들이 하나의 공유 메모리(공유 자원)나 또 다른 프로세스에 접근할 때는 매우 신중해야 한다. 자칫 원하지 않은 결과값이 나오거나, 프로세스가 더이상 진행되지 않는 상태가 올 수 있기 때문이다.
현대 컴퓨터 환경에서는 한 프로세스가 다른 프로세스에게 영향을 미치는 경우가 훨씬 많이 존재하기때문에 데이터나 프로세스의 진행에 대한 동기화가 매우 중요하다.
프로세스 동기화는 여러 프로세스가 공유하는 자원의 일관성을 유지하는 것을 목표로 한다. 예를 들어, 여러 프로세스가 동시에 하나의 공유 자원에 접근하려 할 때 이 프로세스들의 접근 순서를 정하여 자원의 일관성을 유지시켜주어야 한다.
동기화 문제 중에서 대표적인 은행 계좌 문제를 살펴보자.
사용자는 잔고가 10만원인 계좌에 1000원을 입금하고, 다시 1000원을 출금하고 싶다고 가정한다.
다음은 공유자원 balance(계좌 잔고)에 대하여 두개의 코드를 가지는 서로다른 프로세스(쓰레드)가 있다.
아래 그림은 내가 필기를 하며 쓴내용이지만, 그래도 지우면 안될 것 같아서 지우지 않은 채로 같이 업로드 한 모습이다.
그림을 따라서, 한번 해석을 해 보겠다.
그렇다면, 현재 계좌에 남은 잔고는 얼마인가?
정답은 10만 1000원이다. 사용자의 의도에 의하면, 계좌에 10만원이 있어야 한다. 그렇지만, 공유자원에 대한 동기화를 해주지 않았기 때문에 위와 같은 일이 발생하였다.
그렇다면, 위와 같은 문제는 왜 발생하게 될까?
위와 같은 문제가 발생하는 이유는 공유자원(Critical Section)에 대한 동시접근 때문이다.
위의 예제에서 공유자원은 balance 이다.
우리가 흔히 java나 c언어에서 코딩을 할 때는 아무 문제가 없는 코드이지만, 실제로 이러한 코드가 실행되기 위해 컴파일러가 어셈블리어로 변환을 시키면, 한 줄의 코드는 2번째 그림처럼 여러줄로 표현된다.
여러줄의 코드가 모두 수행 되기 전에 OS가 다른 프로세스에게 CPU를 할당하면, 위와 같은 문제가 발생할 수 있다.
위와 같이 공유자원에 대한 서로 다른 쓰레드 간의 경쟁상태를 Race Condition이라고 하는데, 쓰레드가 적을 때는 경쟁 상대가 줄어들어서 문제가 발생하지 않을 수 있지만, 많아지면 경쟁 상대가 많아져 Critical Section에 대한 문제가 발생할 가능성이 높다.
Mutual Exclusion(상호 배제)
CS에 들어가도록 선정되는 프로세스는 경쟁하는 프로세스들에 의해 결정되어야 한다.(외부 중재자가 없어야함!)
CS에 들어가기를 요청하기 전에 대기중이던 다른 프로세스들의 수만큼만 대기(한정된 수)
나 이후에 CS에 온 애들은 나 이후에 지나가야지!
CS = Critical Section
프로세스 동기화의 내용은 워낙 많아서, 다음 포스팅에서 이어서 작성하도록 하겠습니다~~😁