관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

프로세스 동기화 1 - 동기화란? 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

프로세스 동기화 1 - 동기화란?

huenuri 2024. 10. 17. 23:56

12장 프로세스 동기화에 대해서 학습해보려고 한다. 동시다발적으로 실행되는 수많은 프로세스는 서로 협력하기도 하고, 자원을 두고 경쟁하기도 한다. 이번 장에서는 프로세스가 동시에 실행될 때 반드시 거쳐야 할 동기화에 대해 학습해 보겠다. 그리고 동시에 실행되는 프로세스들을 올바르게 실행하기 위해서는 무엇을 고려해야 하는지도 알아볼 것이다.

운영체제의 프로세스 관리 서비스 중 가장 중요한 두 가지를 꼽자면 스케줄링과 동기화이다.

 

이를 동기화라고 한다. 이번 절에서는 동기화란 무엇인지 개념을 정리하고, 프로세스를 동기화하지 않을 경우 발생할 수 있는 문제들을 통해 동기화가 왜 필요한지 알아보게 될 것이다.


 

 

 

 

동기화의 의미

동시다발적으로 실행되는 많은 프로세스는 서로 데이터를 주고받으며 협력하며 실행될 수 있다.

 

 

 

프로세스뿐 아니라 스레드도 동기화 대상이다. 정확히 말하면 실행의 흐름을 갖는 모든 것은 동기화의 대상이다. 동기화란 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는 것을 의미한다.

 

 

 

동기화의 두 가지 종류

Writer라는 프로세스와 Reader라는 프로세스가 동시에 실행 중이라고 가정해보자. 

 

 

Reader 프로세스는 Writer 프로세스 실행이 끝나야 비로소 실행할 수 있기 때문이다.


 

 

 

실행 결과 17만원이 계좌에 남을 것으로 기대할 것이다. 하지만 동기화가 제대로 이루어지지 않은 경우 아래와 같이 전혀 엉뚱한 결과가 나올 수 있다.

 

동기화가 이루어지지 않은 경우

 

왜 이런 일이 발생했을까? A와 B는 '잔액'이라는 데이터를 동시에 사용하는데, A가 끝나기도 전에 B가 잔액을 읽어버렸기 때문에 엉뚱한 결과가 나온 것이다.

A와 B를 올바르게 실행하기 위해서는 한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 한다.

 

 

동기화가 이루어진 경우

동시에 접근해서는 안 되는 자원과 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화이다.


 

 

 

 

생산자와 소비자 문제

상호 배제를 위한 동기화와 관련된 고전적이고 유명한 문제가 있다.

생산자는 버퍼에 물건을 넣은 후, 물건의 총합에 해당하는 변수를 1 증가시키고, 소비자는 버퍼에 물을 빼낸 후 물건의 총합에 해당하는 변수를 1 감소시킨다.

 

 

물건이 처음에 10이 있었다고 가정해 보자. 다시 말해 물건의 총합 변수를 10으로 초기화해 보자.

 

 

 

우리는 총합 변수가 계속 10개로 머물러 있을 것으로 기대할 것이다. 하지만 막상 생산자와 소비자를 동시에 실행해 보면 예상치 못한 결과를 받게 된다. 총합이 10이 아닌 다른 수가 되거나 실행 중 오류가 나기도 한다.

 

 

생산자와 소비자 문제 추가 코드

 

self-learning-cs/producer_consumer/producer_consumer.md at main · kangtegong/self-learning-cs

『혼자 공부하는 컴퓨터구조 & 운영체제』 (한빛미디어) 심화자료. Contribute to kangtegong/self-learning-cs development by creating an account on GitHub.

github.com

 

생산자와 소비자는 '총합'이라는 데이터를 동시에 사용하는데, 앞선 예제에서는 소비자가 생산자의 작업이 끝나기도 전에 총합을 수정했다. 또한 생산자가 소비자의 작업이 끝나기도 전에 총합을 수정했기 때문에 엉뚱한 결과가 발생한 것이다.


 

 

 

공유 자원과 임계 구역

동시에 접근해서는 안 되는 자원이란 무엇일까?

 

 

 

 

잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있다. 

계좌 잔액 문제와 생산자와 소비자 문제는 레이스 컨디션의 사례로 볼 수 있다.

 

레이스 컨디션이 발생하는 근본적인 이유를 따져보자. 이전 장에서 '고급 언어는 실행 과정에서 저급 언어로 변환되어 실행된다'라고 했었다. 가령 생산자 소비자 문제에서 '총합을 1 증가시킨다' 혹은 '총합을 1 감소시킨다'라는 코드는 고급 언어 한 줄로 작성할 수 있지만,  이는 컴퓨터 내부에서 다음과 같이 여러 줄의 저급 언어로 변환되어 실행된다.

 

 

컴퓨터는 고급 언어가 아닌 저급 언어를 실행하기 때문에 여러 줄의 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정에서 문맥 교환이 일어날 수 있다. 저급 언어를 실행하는 과정에서 문맥 교환이 일어난다면 아래와 같은 문제가 발생한다.

 

이때 상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것을 의미한다.

 


 

 

 

 

단원 마무리하기

 

 

1번 문제는 틀렸다. 상호배제를 위한 동기화가 아니라 실행 순서 제어이다. 상호 배제를 위한 동기화는 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하는 동기화이다. 임계 구역을 위한 동기화는 없다. 임계 구역에 진입한 프로세스가 있다면 다른 프로세스는 염계 구역 밖에서 기다려야 하는 것을 말한다.

 


 

 

 

학습을 마치고

동기화에 대해 그동안 수없이 들어봤고 일상 중에 가장 자주 사용하는 용어 중에 하나였다. 이 단원을 학습하며 동기화가 무엇인지 어떤 상태일 때 동기화가 일어나고 동기화가 잘못 일어날 때 발생하는 문제에 대해서 배울 수 있었다.

생산자와 소비자 문제는 여러 코드로 작성되는데 나중에 이 부분을 다시 학습해보려고 한다.