컴퓨터 과학에 대한 지식을 습득하고 정리하는 기록용 포스팅입니다.
예외를 판단하는 사고를 기르고, 효율적인 코드를 작성하기 위해
컴퓨터 과학 지식을 활용하는 것을 목표로 합니다.
공유 자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일, 데이터 등의 자원이나 변수를 의미한다.
이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태(race condition)라고 한다.
임계 구역(critical section)이란 공유 자원의 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 말한다. 즉, 임계 구역은 둘 이상의 프로세스가 동시에 접근해서는 안 되는 공유 자원(자료 구조 또는 장치)에 접근하는 코드의 일부를 말한다. 임계 구역이 영어로는 critical section인 이유는 '앞으로의 상황에 영향을 미친다는 점에서 대단히 중요한'이라는 뜻이다.
생산자가 데이터를 생성하여 버퍼에 저장하고, 소비자가 버퍼에서 데이터를 가져와 소비하는 과정에서 공유변수에 두개 이상의 프로세스가 동시에 참여해서 공유변수의 값이 꼬이게 되는 문제를 뜻한다.
뮤텍스는 자원에 대한 접근을 동기화하기 위해 사용되는 상호 배제 기술이다.
뮤텍스는 Locking 메커니즘으로 락을 걸은 쓰레드만이 임계 영역을 나갈 때 락을 해제할 수 있습니다. 뮤텍스는 wait와 signal이라는 원자적 연산을 사용합니다.
뮤텍스 구현 알고리즘으로는 데커, 피터슨 알고리즘이 존재한다.
기본적으로 뮤텍스와 동일하나, 임계 구역에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킨다. 임계 구역 진입 전까지 루프를 계속 돌고 있기 때문에 busy waiting이 발생한다.
세마 포어란 카운팅 변수로 접근 가능한 공유 자원을 표기(시그널링 기법)하여 공유 자원이 1개 이상인 경우 상호 배제 원리를 보장하는 접근 제어 알고리즘이다.
세마포어는 공유 자원에 1개 이상의 스레드가 접근할 수 있으며 접근 스레드의 수에 한계를 두는 방식을 사용한다.
다음 3가지 함수가 필수적으로 사용된다.
1. Semaphore(n): 전역 변수 RS를 n으로 초기화한다. RS에는 현재 사용 가능한 자원의 수가 저장된다.
2. P() : 잠금을 수행하는 코드로, RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고, 임계구역에 진입한다. 만약 RS가 0보다 작으면(사용 가능한 자원이 없으면) 0보다 커질 때까지 기다린다.
3. V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 기다리고 있는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보낸다.
도서 : 쉽게 배우는 운영체제
https://yoongrammer.tistory.com/63
https://murphymoon.tistory.com/m/entry/%EC%9E%84%EA%B3%84%EA%B5%AC%EC%97%AD%EC%9D%84-%EB%B3%B4%ED%98%B8%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%EA%B8%B0%EB%B2%95-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8-6
https://chelseashin.tistory.com/40