728x90
동기화가 필요한 이유
여러 쓰레드가 공유하는 자원에 쓰레드가 동시에 접근하는 경우에 데이터의 일관성이 깨질 수 있다.
bank account problem 예시
공유하는 자원: 계좌 잔액10만원
쓰레드A, B: 계좌에 입금을 하는 쓰레드
동기화를 안 한 경우
- A쓰레드가 입금을 하려고 계좌 잔액을 확인(잔액 10만원) 이때 A쓰레드에 타임아웃이 발생
- B쓰레드가 잔액을 확인 -> 5만원 입금 -> 잔액 저장 후 B쓰레드 종료
- A쓰레드는 잔액 10만원을 확인하고 타임아웃이 발생했기 때문에, A쓰레드의 잔액은 여전히 10만원 A쓰레드가 계좌에 10만원을 입금하면 25만원이 아니라 20만원이 된다. 즉 B쓰레드의 값이 없어짐
임계 구역
멀티 쓰레드 환경에서 동시에 실행될 때 쓰레드 실행 순서에 따라 결과가 달라질 수 있는 코드 영역
임계 구역 문제 해결을 위한 기본 조건 3가지
- 상호 배제(Mutual Exclusion): 어떤 쓰레드가 임계 구역에서 실행 중일 때, 다른 어떤 쓰레드도 그 임계 구역에 들어갈 수 없다.
- 진행(Progress): 임계 구역에 어떤 쓰레드도 진입하지 않았다면, 진입하고자 하는 쓰레드는 들어갈 수 있어야 한다.
- 한정 대기(Bounded Waiting): 어떤 쓰레드가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다.
뮤텍스 락
임계 구역에 하나의 쓰레드만 접근할 수 있게 한다.
뮤텍스 락 원리
- 쓰레드가 임계 구역에 진입하기전에 락을 잠근다. 만약 다른 쓰레드가 이미 락을 잠갔다면 락이 풀릴 때까지 대기한다.
- 임계 구역의 실행이 끝나면 쓰레드는 락을 해제한다.
뮤텍스 락의 문제
- busy waiting: 락이 True/False 인가 반복적으로 확인 (CPU를 의미 없이 계속 사용)
세마포어(Semaphore)
뮤텍스와 비슷하지만 세마포어는 한 번에 여러 쓰레드가 임계 구역에 접근할 수 있다.
세마포어 값이 3이면 최대 3개의 쓰레드가 동시에 임계 구역에 접근할 수 있다.
세마포어 원리
- P연산: 쓰레드가 임계 구역에 진입하기 전 세마포어의 값을 1 감소시킨다. 세마포어의 값이 0 이상인경우 쓰레드는 임계 구역에 진입 할 수 있다.
- V연산: 쓰레드가 임계 구역에서 작업을 마치고 나가면 세마포어의 값을 증가시킨다.
세마포어 값이 0인경우: 추가적으로 접근하려는 쓰레드는 대기 상태에 들어가, 다른 쓰레드가 V연산을 할 때까지 기다린다.
모니터
개발자가 다루기 편한 동기화 도구, 상호 배제, 실행 순서 제어를 위한 동기화를 제공한다.
세마포어 방식에서는 세마포어 값을 누락하거나 P연산, V연산 순서를 헷갈린 경우, 같은 연산을 2번 사용한 경우 프로그램에 문제가 생기고 디버깅하기 까다로움
공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공해 자원을 보호하고 쓰레드 간 동기화를 한다.
쓰레드의 실행 순서 제어를 위해 조건 변수(wait(), signal() )를 사용한다. 각각의 조건 변수에 대한 큐가 있다.
모니터 원리
- 공유 자원에 접근하고자 하는 쓰레드를 큐에 삽입
- 큐에 삽입된 순서대로 한 번에 하나의 프로세스만 공유 자원 이용
- 특정 쓰레드가 실행 조건이 되지 않았을 경우 wait를 통해 대기 상태로 만든다.
- 특정 쓰레드가 실행될 조건이 됐을 경우 signal을 통해 실행을 재개한다.
'운영체제' 카테고리의 다른 글
프로세스 스케줄링 방식 (0) | 2024.04.11 |
---|---|
휘발성 메모리, 비휘발성 메모리, 메모리 보호 방식 (0) | 2024.04.08 |
프로세스 라이프 사이클 (0) | 2024.04.04 |
운영 체제, 부팅 (0) | 2024.03.27 |
커널 (0) | 2024.03.20 |