동기화?
한정적인 시스템 자원에 여러 스레드가 동시에 접근해서 사용시 문제가 발생
여러 스레드에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법
스레드 동기화
스레드의 실행 순서를 정의
메모리 접근에 있어서 동시 접근을 막음
실행 순서보다는 한 순간 하나의 스레드만 해당 자원에 접근
동기화 기법
유저 모드(User mode)의 동기화
1. 임계 구역 기반의 동기화
- 열쇠를 얻은 프로세스만 임계 구역에 들어갈 수 있다. 한번에 하나의 스레드만이 접근
- 임계 구역 진입을 위해 임계 구역 오브젝트(key)를 얻는다.
- 다른 스레드가 열쇠를 갖고 있을 경우, 열쇠 반환전까지 블로킹(blocking)
- 열쇠가 반환되면 블로킹 상태에서 빠져나와 열쇠를 얻고 임계구역에 접근
2. 인터락 함수 기반 동기화
- 함수 내부적으로 한 순간에 하나의 스레드에 의해서만 실행되도록 동기화
- 임계 구역 기반의 동기화도 내부적으로 인터락 기반으로 구현된다.
- 유저 모드 기반으로 동작해 속도가 빠르다.
커널 모드(Kernal mode)의 동기화
1. Mutex(뮤텍스)
한 스레드, 프로세스에 의해 소유될 수 있는 키(key)를 기반으로 한 상호배제 방식
- 공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는것
- 오직 하나의 프로세스,스레드만이 동일한 시점에 뮤텍스를 얻어 들어옴
- 뮤텍스를 얻은 프로세스,스레드만이 임계영역에서 나갈때 뮤텍스 해제가 가능하다.
- 임계 구역을 가진 스레드들의 러닝타임(running time)이 서로 겹치지 않게 단독으로 실행되게 한다.
2. Semaphore(세마포어)
현재 공유 자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두는 상호배제 방식
- 공유자원에 대한 접근을 제한하는 방법, 여러 프로세스,스레드가 접근하는 것을 막는 것
- 공유자원을 안전하게 관리한다.
- 소유할 수 없다.
- 세마포어를 소유하지 않은 스레드가 세마포어를 해제할 수 있는 문제가 발생한다.
(????)
- 세마포어를 소유하지 않은 스레드가 세마포어를 해제할 수 있는 문제가 발생한다.
- 세마포어 Counter의 갯수에 따라 이름이 나뉜다.
- 1개 : Binary Semaphore(Mutex)
- 2개 : Counting Semaphore
3. Monitor(모니터)
- 뮤텍스와 모니터는 상호 배제를 함으로써 임계 구역에 하나의 스레드만 들어갈 수 있지만 세마포어는 하나의 스레드만 들어가거나 혹은 여러개의 스레드가 들어가게 할 수 있다.
뮤텍스와 세마포어의 목적
특정 동기화 대상이 이미 특정 스레드나 프로세스에 의해 사용중일 경우, 다른 스레드가 해당 동기화 대상에 접근하는 것을 제한하는 것으로 동일하지만, 관리하는 동기화 대상이 몇개인가에 따라 차이가 생긴다.
예상 질문
임계영역(Critical Section)이 무엇인가요?
둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드의 일부입니다.
임계 영역에서 문제 해결 방법은?
- 상호배제(Mutual Exclusion) : 프로세스 1이 공유 자원을 접근하는 임계 영역 코드를 수행하고 있으면, 다른 프로세스들은 공유 자원을 접근하는 임계 영역 코드를 실행할 수 없게 해야한다.
- 진행(Progress) : 임계 영역에서 실행중인 프로세스가 없고 별도의 동작이 없는 프로세스들만 임계 영역 진입 후보로 참여한다.
- 한정된 대기(Bounded Waiting) : 프로세스 1이 임계 영역에 진입 신청 후 허락까지, 다른 프로세스들이 임계 영역에 진입하는 횟수 제한이 있어야 한다.
뮤텍스와 모니터의 차이는?
뮤텍스는 다른 프로세스나 스레드 간에 동기화를 위해 사용하며, 모니터는 하나의 프로세스 내에서 다른 스레드 간에 동기화 할때 사용합니다.
세마포어와 모니터의 차이는?
세마포어는 카운터라는 변수값으로 프로그래머가 상호 배제나 정렬의 목적으로 사용시 매번 값을 따로 지정해줘야 하는 등 조금 번거로운 반면, 모니터는 이러한 일들이 캡슐화되어 있어서 개발자는 카운터 값을 0 또는 1으로 주어야 하는 고민을 할 필요가 없이 synchronized, wait(), notify() 등의 키워드를 이용해 좀 더 편하게 동기화할 수 있다.
세마포어와 뮤텍스의 차이는?
- 세마포어는 뮤텍스가 될 수 있지만(binray semaphore), 뮤텍스는 세마포어가 될 수 없다.
- 세마포어는 소유할 수 없으며, 뮤텍스는 소유할 수 있고 소유주가 그 책임을 진다.
- 뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제할 수 있다. 하지만 세마포어는 소유하지 않고 있는 다른 스레드가 세마포어를 해제할 수 있다.(세마포어를 소유하면 문제가 되는 점)
- 뮤텍스는 동기화 대상이 1개일 때 사용하고 세마포어는 동기화 대상이 여러 개일때 사용한다.
'CS > 운영체제' 카테고리의 다른 글
교착상태(Dead Lock)란???(feat.기아상태) (0) | 2022.01.17 |
---|---|
시스템 콜(System Call)이 뭐야? (0) | 2022.01.15 |
Context Switching(문맥교환)이란? (0) | 2022.01.13 |
Multi Process & Multi Thread ??! (0) | 2022.01.11 |
프로그램(Program) & 프로세스(Process) & 스레드(Thread) (0) | 2022.01.10 |