운영체제에서 다중 프로세스 또는 스레드 간의 동기화를 위해 사용되는 방법 중 하나
주로 공유 자원에 대한 접근을 제어하는 데 사용되며, 다음 두 가지 주요 기능을 제공한다:
상호 배제(Mutual Exclusion):
한 시점에 하나의 프로세스만이 특정 자원을 사용할 수 있게 함으로써, 데이터의 일관성과 무결성을 보장. 예를 들어, 두 개의 프로세스가 동시에 같은 파일을 수정하려 할 때, 세마포어를 사용하여 한 번에 하나의 프로세스만이 파일을 수정할 수 있도록 제한할 수 있다.
동기화(Synchronization): 특정 프로세스들 사이의 실행 순서를 조절. 예를 들어, 한 프로세스가 특정 작업을 완료한 후에 다른 프로세스가 실행되어야 할 때, 세마포어를 사용하여 이러한 종속성을 관리할 수 있다.
세마포어는 내부적으로 정수 값을 가지며, 주로 두 가지 기본 연산, 즉 wait() (또는 P() 연산)과 signal() (또는 V() 연산)을 사용합니다. wait() 연산은 세마포어 값을 감소시키며, 값이 0 이하가 되면 프로세스는 대기 상태가 됩니다. signal() 연산은 세마포어 값을 증가시키며, 대기 중인 프로세스가 있으면 하나를 깨웁니다.
바이너리 세마포어(Binary Semaphore): 값이 0 또는 1만을 가질 수 있는 세마포어로, 상호 배제를 위해 주로 사용.
카운팅 세마포어(Counting Semaphore): 최대값이 1보다 큰 세마포어로, 한 번에 여러 개의 리소스를 관리하는 데 사용될 수 있다.
세마포어는 공유 자원의 동시 접근을 효과적으로 제어하여 데드락(Deadlock)이나 레이스 컨디션(Race Condition) 같은 문제를 방지하는 데 중요한 역할을 한다.
세마포어에서 사용되는 연산 V와 P는 세마포어의 값을 조작하여 프로세스 간의 동기화를 달성하는 데 사용
이들 연산은 세마포어의 가장 기본적인 작동 원리를 나타낸다.
P 연산은 세마포어 값을 감소시키는 연산이다. 프로세스가 P 연산을 수행할 때, 세마포어의 값이 0보다 크면 1 감소시키고 계속 진행한다.
만약 세마포어의 값이 0이면, 이는 해당 자원이 이미 다른 프로세스에 의해 사용 중임을 의미하며, P 연산을 호출한 프로세스는 대기 상태로 전환된다.
P 연산은 자원을 요청하거나 점유하기 위해 사용되며, 세마포어 값이 0이 되면 해당 자원에 대한 접근이 차단됨
V 연산은 세마포어 값을 증가시키는 연산이다. 연산을 수행할 때, 세마포어의 값을 1 증가시킨다.
만약 세마포어의 값이 1 이상으로 증가하고, 대기 중인 프로세스가 있다면, 하나의 대기 중인 프로세스가 깨어나 자원을 사용할 수 있게 된다.
V연산은 자원의 사용이 끝났음을 알리고, 다른 프로세스가 해당 자원을 사용할 수 있도록 하는 데 사용
운영체제에서 동기화를 위해 사용되는 프로그래밍 개념입니다. 뮤텍스는 특정 자원이나 데이터에 한 번에 하나의 스레드만 접근할 수 있도록 제어하는 데 사용되며, 이를 통해 동시성 관리 및 데이터의 무결성을 보장합니다. 세마포어와 유사하지만, 주로 락(locking)과 언락(unlocking) 연산에 초점을 맞춘 더 간단한 동기화 메커니즘입니다.
뮤텍스의 기본 연산들은 다음과 같습니다:
Lock (또는 Acquire):
lock은 뮤텍스를 획득하려고 시도합니다. 뮤텍스가 이미 다른 스레드에 의해 잠겨 있다면, 이 연산을 호출한 스레드는 뮤텍스가 사용 가능해질 때까지 대기합니다.
뮤텍스가 사용 가능한 상태라면, 이 연산은 뮤텍스를 잠그고 호출한 스레드가 자원에 접근할 수 있게 합니다.
Unlock (또는 Release):
unlock은 뮤텍스의 잠금을 해제합니다. 잠금을 해제하면 다른 스레드들이 자원에 접근할 수 있는 기회를 갖게 됩니다.
뮤텍스를 잠금 해제하는 것은 해당 스레드가 자원 사용을 완료했음을 나타냅니다.
뮤텍스는 바이너리 세마포어와 유사하게 작동할 수 있지만, 주요 차이점은 소유권입니다. 뮤텍스는 특정 스레드에 의해 소유될 수 있으며, 일반적으로 그 스레드만이 뮤텍스를 잠금 해제할 수 있습니다. 이는 뮤텍스를 사용하는 스레드가 뮤텍스의 상태를 더 명확하게 관리할 수 있게 해주어, 보다 안전한 동기화를 가능하게 합니다.