동기화 객체
동기화 객체 : 커널에서 제공하는 객체로서 쓰레드 사용시 문제되는 자원의 공유시 충돌에 대한 해법을 제시!!
1. 쓰레드 동기화 방법
-> 실행순서의 동기화 ( 쓰레드 실행순서를 정의하고 반드시 따르도록 하는 것 )
-> 메모리 접근에 대한 동기화 ( 동시접근을 철저히 막는 방법 )
2. 동기화 기법 종류
2-1. 유저 모드 동기화
-> 커널 코드가 실행되지 않는 동기화 기법
-> 성능상 이점이 있으나 기능상의 제한
ex) Critical Section 기반 동기화, 인터락 함수 기반 동기화
2-2. 커널 모드 동기화
-> 커널에서 제공하는 동기화 기능을 활용하는 방법
-> 커널 모드로 변경 필요, 성능 저하 대신 다양한 기능 활용 가능
ex) 뮤텍스 기반 동기화, 세마포어 기반 동기화
뮤텍스와 세마포어의 차이
뮤텍스 ( Mutex )
- 공유된 자원의 데이터를 여러 "쓰레드" 가 접근하는 걸 막는 것!
- 상호배제라고 하며, Critical Section을 가진 쓰레드의 Running time이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술
- 다중 프로세스들의 공유 리소스 접근을 막기 위해 synchronized 또는 lock을 사용
- 동기화 제한 시간 설정 가능(기본값 = 무한대) -> Lock에서 UnLock이 안 되면 다른 쓰레드가 접근 못해서 데드락 가능 ( 데드락 방지를 위해 제한 시간 설정 )
- 뮤텍스 객체를 두 쓰레드가 동시 사용 불가!
세마포어 ( Semaphore )
- 공유된 자원의 데이터를 여러 "프로세스" 가 접근하는 걸 막는 것!
- 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용
- 공유 리소스에 접근 가능한 프로세스의 최대 허용치만큼 사용자가 접근 가능
- 각 프로세스는 세마포어 값을 확인하고 변경 가능 ( 사용 X 자원 = 즉시 사용 가능, 이미 다른 프로세스에 의해 사용 중 = 일정 시간 대기 )
- 이진수 ( 0 또는 1 )를 사용하거나 추가 값 가능
차이점
- 관리 동기화 대상의 개수
- Semaphore -> Mutex (가능), Mutex -> Semaphore (불가능)
- Semaphore 소유 불가, Mutex 소유 가능 ( 소유자가 책임 )
- Semaphore는 소유하지 않는 쓰레드가 해제 가능, Mutex는 소유하고 있는 쓰레드가 해제 가능
- Semaphore는 시스템 범위에 걸쳐있고, Mutex는 프로세스 범위를 가짐.
- Semaphore는 파일시스템의 파일 형태로 존재, Mutex는 프로세스가 종료될 때 자동으로 clean up
참고자료 : https://landwhale2.github.io/os/69/
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=brosvaby&logNo=168498270