[Operating System] Critical Section

임수정·2024년 7월 12일
0

📝 Learning Log

목록 보기
39/47
post-thumbnail

📍 Critical Section(크리티컬 섹션)

병렬 처리되는 프로그램에서 동시에 접근해서는 안 되는 공유자원(예 : 변수, 데이터 구조 등)을 다루는 코드 영역을 말한다. 이 영역은 다중 스레드나 프로세스에서 하나의 스레드나 프로세스만 접근할 수 있도록 보호되어야 한다.

한마디로 요약하면, 한 순간에 하나의 쓰레드만 접근이 요구되는 공유 자원에 접근하는 코드 영역을 말한다.

각 쓰레드들은 각자의 stack과 Register만 독립적으로 가지고 있고, 나머지 자원들은 공유하게 되는데 문제는 이것에서 발생한다.


한 번에 한 쓰레드만 접근을 요구하는 공유 자원 A가 있다.
그럼에도 불구하고, Thread 1과 Thread 2가 동시에 이 자원을 사용하려고 든다면?

동기화가 되지 않은 상태라면, 이 A값을 전혀 예측할 수 없다. 왜냐면 Thread끼리 뒤죽박죽 섞여서 값이 불안정해지기 때문!

그러므로 크리티컬 섹션(Critical Section)에는 무조건 한 Thread만 접근을 허용해야 한다.

위의 문제점을 해결해줄 대표적인 방법 두가지가 뮤텍스(Mutex)와 세마포어(Semaphore)이다.


📍 뮤텍스(Mutex)

Mutex는 Mutual exclusion(상호 배제)의 약자로 임계 구역(Critical Section) 문제를 해결할 수 있는 개발 도구 중 하나이다.

뮤텍스는 여러 프로세스의 Thread 사이에서 동기화가 가능하다.
즉, Critical Section의 동기화 기법으로는 불가능한 프로세스 다중 실행 방지에 사용된다고 보면 된다.

피팅룸이 하나 있는 옷가게에서 피팅룸에 여러명이 같이 들어가면 안되고 한명만 들어갈 수 있도록 한다. 문고리가 사용중이면 기다려야하고 차례가 오면 들어갈 수 있다. 밖에서는 1분에 한번씩 문을 두들기고있다.

위의 상황을 예로 들자면 피팅룸이 하나 있는 옷가게, 문고리가 사용중임, 1분에 한번씩 문을 두들김 이 뮤텍스의 특징이다.

📖 뮤텍스(Mutex)의 특징

① 피팅룸이 하나 있는 옷가게

'세마포어는 뮤텍스가 될 수 있다'가 성립되는 근거이다.
왜냐하면 뮤텍스는 1개만 동기화가 가능하지만, 세마포어는 1개 이상의 동기화가 가능하기때문에 세마포어 안에 뮤텍스가 포함되는 형태

② 문고리가 사용중임

이미 Thread 1이 Critical Section을 소유하고있다면 Thread 1은 lock()을 획득했다고 볼 수있다. (피팅룸에서 나올땐 lock()을 반환 == release()를 호출한다 라고 표현)

이 때, Thread 2가 피팅룸을 들어가려고 하지만 들어가지못하면(lock()을 획득 못하면) Thread 2는 Block상태가 된다.

③ 1분에 한번씩 문을 두들김

1분에 한번씩 문을 두들긴다 == 일정 시간을 주기로 계속 acquire()를 반복 호출한다.
왜냐하면 lock()을 얻을 수 있는지 확인하기 위해서!

이를 Busy Waiting(바쁜 대기)을 한다고 표현하는데, 이를 위해선 프로세스가 반복 회전 해야하므로 spinlock이라고 부르기도 한다. 이는 CPU cycle을 계속해서 낭비한다는 단점을 가지고 있다.

📍 세마포어(Semaphore)

세마포어는 뮤텍스를 좀 더 확장한 버전이라고 생각하면 된다.
뮤텍스는 하나의 Thread만 실행되게 하지만, 세마포어는 지정된 수 만큼의 Thread가 동시에 실행되도록 동기화 하는 것이 가능하다 (다시 말하면 피팅룸이 여러개 있는 것)
운영체제에서 자원을 경쟁적으로 사용하는 다중 프로세스에서의 동기화 기법이다.

세마포어는 Binary SemaphoreCounting Semaphore 두가지가 있다.

피팅룸이 10개 있는 옷가게에 갔다. 10개 전부다 사용중이면(다 꽉차면) 들어갈 수 없다.

위의 상황을 예로 들자면 피팅룸이 10개 있는 옷가게, 꽉찬 피팅룸 이 세마포어의 특징이다.

📖 세마포어(Semaphore)의 특징

① 피팅룸이 10개 있는 옷가게

뮤텍스는 임계구역에 한 개의 프로세스 or 스레드를 진입시킬 수 있다면, 세마포어는 2개 이상을 진입 시킬 수 있다.

② 꽉찬 피팅룸

받아 들일 수 있는 프로세스의 수를 세마포어(S)라고 부른다.
if(S<=0) : 뮤텍스에서와 마찬가지로 Busy Waiting을 반복한다. 언제까지? S가 1 이상일 때까지
else : 0 이상이라는 거니까 진입. Wait()이라는 코드 블럭 내부에 모든 로직이 존재한다.

그럼 세마포어는 왜 필요할까?

Dead Lock을 피하기 위해서이다.

Dead Lock

컴퓨터 과학에서 멀티스레드나 멀티프로세스 환경에서 발생할 수 있는 중요한 문제이다. 데드락은 두개 이상의 프로세스나 스레드가 서로 점유한 자원을 기다리며 아무 일도 처리하지 못하는 상태를 의미

profile
언어는 거들 뿐...

0개의 댓글