동기화 (Synchronization)
여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것
임계 영역 (Critical section)
공유 데이터의 일관성을 보장하기 위해 상호배제 가능한 영역
상호배제 (Mutual exclusion)
하나의 프로세스/스레드만 집입해서 실행
문맥 교환 (Context switch)
이전의 상태(문맥)를 보관하고 새로운 상태를 적재하는 작업
스케쥴링(Scheduling)
문맥 교환이 발생했을 때 어느 상태를 먼저 실행 시킬지 정하는 작업
교착 상태 (Deadlock)
무한 대기 상태
두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 다음 단계로 진행하지 못하는 상태
교착상태 발생조건
상호배제 & 점유대기 & 비선점 & 순환대기
기아 상태 (Starvation)
무한 대기 상태
특정 작업이 우선순위가 낮아서 자원을 할당 받지 못하는 상태
경쟁 상태 (Race condition)
공유 자원에 대해 여러 작업이 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태
데이터의 일관성을 해치는 결과가 나타날 수 있음
상호배제를 유지하는 방법 - lock 사용
스핀락(Spinlock)
락을 가질 수 있을 때까지 반복해서 시도하는 방식
단점: 기다리는 동안 CPU를 낭비
뮤텍스(Mutex)
락을 가질 수 있을 때까지 휴식을 취하는 방식
세마포어(Semaphore)
signal mechanism을 가진, 하나 이상의 프로세스/스레드가 임계 영역에 접근 가능하도록 하는 장치
스핀락이 뮤텍스보다 나은 경우
멀티 코어 환경이고, 임계영역에서의 작업이 문맥 교환보다 더 빨리 끝날 때
뮤텍스와 이진 세마포어(Binary semaphore)
뮤텍스는 락을 가진 자만 락을 해제 할 수 있지만 세마포는 그렇지 않다.
뮤텍스는 priority inheritance 속성을 가지지만 세마포는 이 속성이 없다.
상호 배제만 필요한다면 뮤텍스
작업 간의 실행 순서 동기화가 필요하다면 세마포어
스핀락, 뮤텍스, 세마포의 구체적인 동작 방식은 OS와 프로그래밍 언어에 따라 조금씩 다를 수 있음.
Java
wait()과 notify()
await()과 signal()
'개발 > 일지' 카테고리의 다른 글
[JAVA] volatile (0) | 2023.03.22 |
---|---|
DNS - 국제인터넷주소관리기구(ICANN) (0) | 2023.03.11 |
[Error - SpringSecurity] java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" (0) | 2023.02.20 |
@Valid와 @Validated (0) | 2023.02.02 |
표현식(expression)과 명령문(statement) (0) | 2023.01.29 |