임계 영역(Critical Section)
하나의 프로세스가 자신의 임계 영역에서 작업하는 동안에, 다른 프로세스가 그 임계 영역에 들어오지 못하도록 경쟁 상황을 막는 것
임계 영역은 프로세스 영역 중 'Code'에 해당
코드 영역은 다음과 같이 나누어짐
[잔류 영역]
[진입 영역]
[임계 영역]
[출구 영역]
진입 영역과 출구 영역에서 임계 영역 처리 중일 때 다른 프로세스가 끼어들지 못하게 처리
Linux에서는 이러한 처리를 뮤텍스와 세마포어를 이용
진입 영역에서 뮤텍스 lock을 통해 다른 프로세스 접근을 막아줌
프로세스의 임계 영역 처리가 끝나면 뮤텍스 unlock을 통해 다른 프로세스 접근 허용
임계 영역이 중단되지 않도록 하기 위해선 3가지 조건을 만족해야 함
-
상호 배제 (Mutual Exclustion)
사람 A(프로세스)가 1인용 식탁(공용 자원)에서 식사를 함 (식사 : 임계영역에 있는 것으로 가정) 모르는 사람인 B가 맞은 편 자리에 앉아 식사를 하면 A는 불편함을 느낌 이런 상황을 방지하기 위해 내 맞은 편 자리에 사람이 못 앉게 미리 조치를 취함 (의자에 가방 올려놓기...?) 아무도 못들어오게 뮤텍스 lock을 걸어둠. B가 가방 치우고 앉아도 되냐고 물어보도록 함
이처럼 진입 영역과 출구 영역에서 임계 영역에 동시에 여러 프로세스가 접근하지 못하도록 조취를 취해 결정성을 보장할 수 있음
-
진행(Progress)
임계 영역 안에서 실행하고 있는 프로세스가 없을 때, 임계 영역을 실행하고자 하는 프로세스는 반드시 임계 영역을 실행할 수 있어야 함
-
한정된 대기 (Bounded waiting)
임계 영역을 요청한 프로세스는 무한히 대기하면 안됨
제한된 대기 시간을 가져야 함
임계 영역 문제 해결책
하드웨어 해결책 : TestAndSet, Swap 등
소프트웨어 해결책 : 세마포어, 모니터, 조건 변수 등
뮤텍스 락(Mutex Lock)
프로세스는 임계 구역에 들어가기 전에 lock을 획득하고, 나올 때는 lock을 반환해야 함
뮤텍스 락에서는 available라는 이름의 변수를 갖고 있으며, 이 역할은 lock의 가용 여부를 판단함
lock이 가용되면?
: acquire() 호출 후 lock 획득 (다른 프로세스 접근 불가)
lock을 반환할 때는 release() 호출
단점
바쁜 대기(Busy Waiting)을 해야 함
임계 구역에 들어가기 위해 acquire()을 호출하는 반복문을 실행
lock이 가용되길 기다리면서 프로세스가 계속 반복 회전 함 → 스핀 락(spin lock)
결국, 바쁜 대기(busy waiting)은 CPU Cycle 낭비를 초래
뮤텍스 락과 비슷하지만, 더욱 정교하게 동기화 할 수 있는 것이 바로 세마포어(Semaphore)!!
세마포어(Semaphore)
소프트웨어적 프로세스 동기화 기법
세마포어 변수 값에는 wait, signal로만 접근 가능
공유된 자원 속 하나의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한두는 것
리소스 상태를 나타내는 간단한 카운터임
보통 비교적 긴 시간을 확보하는 자원에 대해 이용하고, 유닉스 시스템 프로그래밍에서 OS의 자원을 경쟁적으로 사용하는 다중 프로세스에서 동기화 시키는 기술로 활용됨
뮤텍스 | 세마포어 |
---|---|
공유된 자원의 데이터를 여러 스레드가 접근하는 걸 막는 것 | 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것 |
상태가 0,1 두개 (이진 세마포어) | 세마포어는 뮤텍스가 될 수 있음 |
뮤텍스 소유 중인 스레드가 뮤텍스 해제 | 세마포어를 소유하지 않는 스레드가 세마포어 해제 |
프로세스 범위를 가지고 종료 될때 자동 Clean | 파일 시스템 상의 파일 형태로 존재 |
동기화 대상이 오직 하나일 때 | 동기화 대상이 하나 이상일 때 |
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 페이지 교체 알고리즘(Page Replacement Algorithm) (0) | 2019.04.21 |
---|---|
[운영체제] Deadlock (0) | 2019.03.31 |
[운영체제] CPU 스케줄링 (1) | 2019.03.03 |
[운영체제] 스케줄러 (0) | 2019.02.23 |
[운영체제] 프로세스/스레드 (0) | 2019.02.16 |