7월 1일 - 동기화 문제

Yullgiii·2024년 7월 1일
0
post-thumbnail

동기화 문제

동기화란 한정적인 시스템 자원에 여러 스레드가 동시에 접근하여 사용하면서 발생할 수 있는 문제를 방지하기 위해 여러 스레드에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법이다.

스레드 동기화

실행 순서의 동기화

스레드의 실행 순서를 정의하고, 이 순서를 반드시 따르도록 한다.

메모리 접근에 대한 동기화

메모리 접근에 있어서 동시 접근을 막는 것으로, 한 순간에 하나의 스레드만 해당 자원에 접근하도록 한다.

동기화 기법

유저 모드의 동기화

커널의 힘을 빌리지 않는 동기화 기법으로, 커널의 코드가 실행되지 않기 때문에 성능상 이점이 있으나 기능상의 제한점이 있다. 주로 임계 구역 기반의 동기화와 인터락 함수 기반의 동기화가 있다.

커널 모드의 동기화

커널에서 제공하는 동기화 기능을 이용하는 방법으로, 커널 모드로의 변경이 필요하기 때문에 성능 저하가 있을 수 있으나 다양한 기능을 활용할 수 있다. 주요 기법으로는 세마포어, 뮤텍스, 모니터 등이 있다.

유저 모드의 동기화

임계 구역 기반의 동기화

임계 구역에 들어가기 위해 크리티컬 섹션 오브젝트를 얻어야 하며, 다른 스레드가 열쇠를 가지고 있을 경우 반환할 때까지 블로킹된다.

인터락 함수 기반의 동기화

한 순간에 하나의 스레드에 의해 실행되도록 동기화되며, 임계 구역 기반의 동기화도 내부적으로 인터락 함수를 사용해 구현된다.

커널 모드의 동기화

세마포어 (Semaphore)

공유된 자원의 데이터를 여러 프로세스나 스레드가 접근하는 것을 막으며, 동시에 접근할 수 있는 허용 가능한 갯수를 가지고 있는 카운터를 사용한다.

예제

화장실을 예로 들어보자. 세마포어는 1개 이상의 열쇠로, 화장실 칸이 4개이고 열쇠가 4개라면 4명까지는 대기 없이 사용할 수 있다. 이후에는 대기해야 한다.

뮤텍스 (Mutual Exclusion)

임계 구역을 가진 스레드들이 겹치지 않게 각각 단독으로 실행되게 하며, Locking과 Unlocking을 통해 접근을 조율한다. Lock을 가진 스레드만 공유 자원에 접근할 수 있다.

예제

화장실에 가기 위해서는 1개의 열쇠가 필요하며, 열쇠를 가진 사람만이 화장실을 사용할 수 있다.

모니터 (Monitor)

뮤텍스와 Condition Variables를 가지고 있는 동기화 매커니즘이다. 임계 구역에 하나의 스레드만 들어갈 수 있도록 상호 배제를 한다.

임계영역

둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드의 일부를 말한다. 동기화를 진행하지 않으면 치명적인 문제가 발생할 수 있다.

임계 구역 문제 해결을 위한 3가지 필수 조건

  • 상호 배제 (Mutual Exclusion): 한 순간에 하나의 스레드만 임계 구역 코드를 실행할 수 있다.
  • 진행 (Progress): 임계 구역에서 실행 중인 프로세스가 없고 별도의 동작이 없는 프로세스들만 임계 구역 진입 후보로서 참여될 수 있다.
  • 한정된 대기 (Bounded Waiting): P1이 임계 구역에 진입 신청 후 받아들여질 때까지, 다른 프로세스들이 임계 구역에 진입하는 횟수는 제한되어야 한다.

뮤텍스와 모니터의 차이

  • 뮤텍스는 다른 프로세스나 스레드 간에 동기화를 위해 사용하며, 운영체제 커널에 의해 제공된다. 무겁고 느리다.
  • 모니터는 하나의 프로세스 내에서 다른 스레드 간에 동기화할 때 사용하며, 프레임워크나 라이브러리 자체에서 제공된다. 가볍고 빠르다.

세마포어와 모니터의 차이

  • 자바에서는 모니터를 모든 객체에 기본적으로 제공하지만, C에서는 사용할 수 없다.
  • 세마포어는 카운터를 이용해 프로그래머가 값을 지정해야 하지만, 모니터는 동기화 기능이 캡슐화되어 있어 사용이 편리하다.

세마포어와 뮤텍스의 차이

  • 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
  • 세마포어는 소유할 수 없으며, 뮤텍스는 소유할 수 있고 소유주가 그 책임을 진다.
  • 뮤텍스는 동기화 대상이 1개일 때 사용하고, 세마포어는 동기화 대상이 여러 개일 때 사용한다.

So...

동기화 문제는 여러 스레드가 동시에 자원에 접근할 때 발생하는 문제로, 이를 방지하기 위해 여러 동기화 기법이 사용된다. 동기화 기법은 유저 모드와 커널 모드로 나뉘며, 각각의 기법은 특정 상황에서 적합하게 사용될 수 있다. 동기화 문제를 효과적으로 해결하기 위해서는 각각의 기법의 특징과 차이를 이해하고 적절하게 활용하는 것이 중요하다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글