동기화
: 프로세스들 사이의 수행 시기를 맞추는 것
실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장하기 위해 동기화 필요
<aside> 💡
프로세스뿐만 아니라 실행의 흐름을 갖는 모든 것은 동기화의 대상
</aside>
공유 자원
: 공동으로 이용하는 변수, 파일, 장치 등의 자원
임계 구역
: 동시에 실행하면 문제가 발생하는 코드 영역
레이스 컨디션 : 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우
→ 즉, 데이터의 일관성이 깨지는 문제가 발생하는 것
정의 : 임계 구역을 잠궈서 프로세스 간의 상호 배제를 이루는 동기화 도구
(상호배제를 위한) 간단 구현
lock: bool = False
def acquire():
global lock
while lock:
pass
lock = True
def release():
global lock
lock = False
lock
: 프로세스들이 공유하는 전역 변수 → 자물쇠 역할acquire()
함수 : 프로세스가 임계 구역에 진입하기 전에 호출 → 임계 구역 확인 및 잠그는 역할
release()
함수 : 임계 구역에서의 작업이 끝나고 호출 → 임계 구역을 여는 역할acquire() # 1) 자물쇠 확인 및 잠금
# 2) 임계구역 진입하여 프로세스 진행
release() # 3) 자물쇠 반환
<aside> 💡
이진 세마포와 카운팅 세마포가 있지만 여기서는 ‘세마포 = 카운팅 세마포’로 다룸
</aside>
정의 : 공유 자원이 여러 개 있는 임계 구역 문제도 해결할 수 있는 일반화된 동기화 도구
(상호배제를 위한) 간단 구현
s: int = 3
def wait():
global s
while s <= 0:
pass
s -= 1
return True
def signal():
global s
s += 1
S
: 임계 구역에 진입할 수 있는 프로세스의 개수(=사용 가능한 공유 자원의 수)wait()
함수 : 프로세스가 임계 구역에 진입하기 전에 호출 → 임계 구역 확인 및 자원 감소 역할signa()
함수 : 임계 구역에서의 작업이 끝나고 호출 → 자원 반환 역할wait() # 1) S 확인 및 S 감소
# 2) 임계구역 진입하여 프로세스 진행
release() # 3) S 반환
s: int = 3
wait_queue = []
def wait(process):
global s, wait_queue
s -= 1
if s < 0: # (s=0)은 내가 방금 전 사용한 것
wait_queue.append(process)
# process state = sleep (실제로는 프로세스 블로킹 필요)
def signal():
global s, wait_queue
s += 1
if s <= 0:
if len(wait_queue) >= 1:
wait_queue.pop(0)
# process state = ready