본문 바로가기

운영체제

프로세스 동기화 ( Process Synchronization)

프로세스 동기화 : 공유 데이터에 대한 엑세스가 제어되지 않으면 경쟁 조건이 존재하여 데이터 값이 손상될 수 있습니다. 프로세스 동기화는 경쟁 조건을 피하고자 공유 데이터에 대한 엑세스를 제어하는 도구를 사용합니다. 이러한 도구를 잘못 사용하면 교착 상태를 포함한 시스템 성능이 저하될 수 있으므로 주의해야 합니다.

 

경쟁 상황 : 동시에 여러 프로세스가 데이터에 접근하여 조작하고, 그 실행 결과가 접근이 발생한 특정 순서에 의존하는 상황을 말합니다.

 

임계 구역 : 다중 프로세스 또는 스레드 환경에서 공유 자원에 접근하는 코드 영역을 말합니다. 각 프로세스는 자신의 임계구역으로 진입하려면 진입 허라를 요청해야 한다. 이러한 요청을 구현하는 코드 부분을 진입 구역 (entry section)이라고 부르고, 임계 구역 뒤에는 퇴출 구역 (exit section)이 따라올 수 있습니다. 코드의 나머지 부분들은 총칭하여 나머지 구역(remainder section)이라고 부릅니다.

 

임계 구역 문제 해결에 대한 3가지 요구 조건

   1. 상호 배제 : 프로세스가 자기의 임계구역에서 실행된다면, 다른 프로세스들은 그들 자신의 임계구역에서 실행될 수 없다.

   2. 진행 : 자기의 임계구역에서 실행되는 프로세스가 없고 그들 자신의 임계구역으로 진입하려고 하는 프로세스들이 있다면, 나머지 구역에서 실행 중이지 않은 프로세스들만 다음에 누가 그 임계구역에 진입할 수 있는지를 결정하는데 참여할 수 있으며, 이 선택은 무한정 연기될 수 없다.

   3. 한전된 대기 : 프로세스가 자기의 임계구역에 진입하려는 요청을 한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 그들 자신의 임게구역에 진입하도록 허용되는 획수에 한계가 있어야 한다.

 

Peterson의 해결안 :  두 개의 프로세스(또는 스레드)가 공유 자원에 접근할 때 발생할 수 있는 경쟁 조건(race condition)을 해결하기 위한 간단하고 전통적인 방법 중 하나입니다. 이 방법은 상호 배제 문제를 해결하고, 데드락을 방지하며, 프로세스들이 공정하게 자원을 사용할 수 있도록 보장합니다. 하지만 현대 컴퓨터 구조가 load와 store같은 기본적인 기계어를 수행하는 방식 때문에 Peterson해결안이 올바르게 실행된다고 보장할 수는 없습니다. 하지만 임계구역 문제를 해결하기 위한 좋은 알고리즘입니다.

 

 메모리 장벽

 

Atomic variables (원자적 변수) : 원자 변수는 연산이 원자적(atomic)으로 수행되어야 한다는 특성을 가집니다. 이는 해당 변수의 연산이 일련의 단일 단계로 간주되어, 다른 스레드가 동시에 접근해도 중간에 다른 스레드의 연산이 끼어들 수 없다는 것을 의미합니다.

 

Mutex Locks :  Mutual Exclusion(상호 배제)의 줄임말로, 여러 스레드가 동시에 공유된 자원에 접근하는 것을 제어하기 위한 동기화 메커니즘입니다. 주로 멀티스레드 환경에서 공유 데이터나 리소스에 대한 접근을 제어하기 위해 사용됩니다.

 

  • 상호 배제(Mutual Exclusion):
    • 뮤텍스는 오직 하나의 스레드만이 잠금을 획득하고 임계 구역(critical section)에서 작업을 수행할 수 있도록 합니다. 다른 스레드들은 뮤텍스가 잠금 해제될 때까지 대기하게 됩니다.
    • 이를 통해 여러 스레드가 동시에 공유 자원에 접근할 때 발생할 수 있는 경쟁 조건(race condition)을 방지하고 데이터 일관성을 유지할 수 있습니다.
  • 동기화(Synchronization):
    • 뮤텍스는 스레드 간에 동기화를 가능하게 하며, 동시 접근으로 인한 예기치 않은 결과를 방지합니다.
    • 잠금을 획득하려는 스레드는 잠금이 해제될 때까지 기다리며, 잠금이 해제되면 임계 구역에 접근하여 작업을 수행합니다.
  • 데드락 방지(Deadlock Prevention):
    • 좋은 구현 방법을 사용할 경우, 뮤텍스는 데드락(deadlock)을 방지할 수 있습니다. 데드락은 두 개 이상의 스레드가 서로의 자원을 기다리며 상호 블록되는 상황을 말합니다. 뮤텍스는 보통 FIFO(First-In-First-Out) 방식으로 스레드를 대기시키며, 이를 통해 데드락 가능성을 낮출 수 있습니다.
  • 유형:
    • Mutex: 기본적인 뮤텍스로, 단일 스레드가 잠금을 획득할 수 있습니다.
    • Recursive Mutex: 같은 스레드가 여러 번 잠금을 재진입할 수 있도록 허용하는 뮤텍스입니다.
    • Timed Mutex: 일정 시간 동안 잠금을 얻지 못하면 실패하는 뮤텍스입니다.
    • Spinlock: 바쁜 대기(busy-waiting)를 사용하여 잠금을 획득하려는 뮤텍스입니다

세마포어(Semaphores) : 는 프로세스 또는 스레드 간의 동기화를 달성하기 위한 동기화 기법 중 하나입니다. 세마포어는 뮤텍스와 마찬가지로 임계 구역(critical section)에서의 접근을 제어하며, 여러 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 도와줍니다.

  1. 카운터 기반 동기화: 세마포어는 정수형 변수로, 초기에 설정된 값에 따라 여러 스레드나 프로세스가 임계 구역에 접근할 수 있는 허용 개수를 제어합니다.
  2. 두 가지 주요 연산:
    • P(Operation): 세마포어 값을 감소시키고, 임계 구역에 진입하려는 스레드나 프로세스를 기다리게 만듭니다. 만약 세마포어 값이 0 이하이면 기다리게 됩니다.
    • V(Operation): 세마포어 값을 증가시키고, 임계 구역을 빠져나오는 스레드나 프로세스를 깨워줍니다. 이는 다른 스레드나 프로세스가 임계 구역에 접근할 수 있게 해줍니다.
  3. 데드락 방지: 세마포어는 데드락(deadlock)을 방지하기 위해 적절히 사용되어야 합니다. 예를 들어, 세마포어를 잘못 사용하면 모든 자원이 사용 중일 때 무한히 기다리는 데드락 상황이 발생할 수 있습니다.
  4. 유형:
    • 바이너리 세마포어(Binary Semaphore): 0 또는 1의 값만 가질 수 있는 세마포어로, 뮤텍스와 비슷한 역할을 합니다.
    • 카운팅 세마포어(Counting Semaphore): 여러 개의 값 중 하나를 가질 수 있는 세마포어로, 한정된 자원에 접근을 제어하는 데 유용합니다.

 

'운영체제' 카테고리의 다른 글

메인 메모리  (0) 2024.07.21
데드락  (0) 2024.07.21
프로세스 스케줄링  (2) 2024.07.14
Thread - 쓰레드  (0) 2024.07.08
프로세스 (2)  (0) 2024.07.03