[CS-운영체제] 세마포어 semaphore

sing sang song·2024년 1월 1일
0

CS

목록 보기
8/8

세마포어(Semaphore)

운영체제에서 다중 프로세스 또는 스레드 간의 동기화를 위해 사용되는 방법 중 하나
주로 공유 자원에 대한 접근을 제어하는 데 사용되며, 다음 두 가지 주요 기능을 제공한다:

  1. 상호 배제(Mutual Exclusion):
    한 시점에 하나의 프로세스만이 특정 자원을 사용할 수 있게 함으로써, 데이터의 일관성과 무결성을 보장. 예를 들어, 두 개의 프로세스가 동시에 같은 파일을 수정하려 할 때, 세마포어를 사용하여 한 번에 하나의 프로세스만이 파일을 수정할 수 있도록 제한할 수 있다.

  2. 동기화(Synchronization): 특정 프로세스들 사이의 실행 순서를 조절. 예를 들어, 한 프로세스가 특정 작업을 완료한 후에 다른 프로세스가 실행되어야 할 때, 세마포어를 사용하여 이러한 종속성을 관리할 수 있다.

세마포어는 내부적으로 정수 값을 가지며, 주로 두 가지 기본 연산, 즉 wait() (또는 P() 연산)과 signal() (또는 V() 연산)을 사용합니다. wait() 연산은 세마포어 값을 감소시키며, 값이 0 이하가 되면 프로세스는 대기 상태가 됩니다. signal() 연산은 세마포어 값을 증가시키며, 대기 중인 프로세스가 있으면 하나를 깨웁니다.

세마포어는 두 종류가 있다

  1. 바이너리 세마포어(Binary Semaphore): 값이 0 또는 1만을 가질 수 있는 세마포어로, 상호 배제를 위해 주로 사용.

  2. 카운팅 세마포어(Counting Semaphore): 최대값이 1보다 큰 세마포어로, 한 번에 여러 개의 리소스를 관리하는 데 사용될 수 있다.

세마포어는 공유 자원의 동시 접근을 효과적으로 제어하여 데드락(Deadlock)이나 레이스 컨디션(Race Condition) 같은 문제를 방지하는 데 중요한 역할을 한다.

연산 V와 P

세마포어에서 사용되는 연산 V와 P는 세마포어의 값을 조작하여 프로세스 간의 동기화를 달성하는 데 사용
이들 연산은 세마포어의 가장 기본적인 작동 원리를 나타낸다.

P 연산 (Wait, Proberen, or Passeren):

P 연산은 세마포어 값을 감소시키는 연산이다. 프로세스가 P 연산을 수행할 때, 세마포어의 값이 0보다 크면 1 감소시키고 계속 진행한다.
만약 세마포어의 값이 0이면, 이는 해당 자원이 이미 다른 프로세스에 의해 사용 중임을 의미하며, P 연산을 호출한 프로세스는 대기 상태로 전환된다.

P 연산은 자원을 요청하거나 점유하기 위해 사용되며, 세마포어 값이 0이 되면 해당 자원에 대한 접근이 차단됨

V 연산 (Signal, Verhogen, or Vrijgeven):

V 연산은 세마포어 값을 증가시키는 연산이다. 연산을 수행할 때, 세마포어의 값을 1 증가시킨다.
만약 세마포어의 값이 1 이상으로 증가하고, 대기 중인 프로세스가 있다면, 하나의 대기 중인 프로세스가 깨어나 자원을 사용할 수 있게 된다.

V연산은 자원의 사용이 끝났음을 알리고, 다른 프로세스가 해당 자원을 사용할 수 있도록 하는 데 사용

  • P 연산과 V 연산은 함께 사용되어, 여러 프로세스 간에 공유 자원에 대한 접근을 안전하게 동기화한다. 이러한 방식으로, 세마포어는 동시에 하나의 프로세스만이 특정 자원을 사용할 수 있도록 보장하며, 데이터의 일관성과 무결성을 유지하는 데 기여한다.

뮤텍스(Mutex, Mutual Exclusion Object)

운영체제에서 동기화를 위해 사용되는 프로그래밍 개념입니다. 뮤텍스는 특정 자원이나 데이터에 한 번에 하나의 스레드만 접근할 수 있도록 제어하는 데 사용되며, 이를 통해 동시성 관리 및 데이터의 무결성을 보장합니다. 세마포어와 유사하지만, 주로 락(locking)과 언락(unlocking) 연산에 초점을 맞춘 더 간단한 동기화 메커니즘입니다.

뮤텍스의 기본 연산들은 다음과 같습니다:

  1. Lock (또는 Acquire):
    lock은 뮤텍스를 획득하려고 시도합니다. 뮤텍스가 이미 다른 스레드에 의해 잠겨 있다면, 이 연산을 호출한 스레드는 뮤텍스가 사용 가능해질 때까지 대기합니다.
    뮤텍스가 사용 가능한 상태라면, 이 연산은 뮤텍스를 잠그고 호출한 스레드가 자원에 접근할 수 있게 합니다.

  2. Unlock (또는 Release):
    unlock은 뮤텍스의 잠금을 해제합니다. 잠금을 해제하면 다른 스레드들이 자원에 접근할 수 있는 기회를 갖게 됩니다.
    뮤텍스를 잠금 해제하는 것은 해당 스레드가 자원 사용을 완료했음을 나타냅니다.
    뮤텍스는 바이너리 세마포어와 유사하게 작동할 수 있지만, 주요 차이점은 소유권입니다. 뮤텍스는 특정 스레드에 의해 소유될 수 있으며, 일반적으로 그 스레드만이 뮤텍스를 잠금 해제할 수 있습니다. 이는 뮤텍스를 사용하는 스레드가 뮤텍스의 상태를 더 명확하게 관리할 수 있게 해주어, 보다 안전한 동기화를 가능하게 합니다.

  • 뮤텍스는 주로 공유 자원에 대한 상호 배타적 접근을 관리하는 데 사용되며, 데이터 경쟁 조건(race conditions)과 같은 복잡한 동시성 문제를 방지하는 데 중요한 역할을 합니다.
profile
세상을 선명하게

0개의 댓글