본문 바로가기

CS/운영체제

동기화 문제

- 동기 vs 비동기

1) 동기(synchronous)

동시에 일어난다는 뜻(요청과 결과가 동시에 일어남)

바로 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 함

요청과 결과가 한 자리에서 동시에 일어남

A노드와 B노드 사이의 작업 처리 단위(transaction)를 동시에 맞춤

설계가 매우 간단, 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야 함

-> 실행되었을 때 값이 반환되기 전까지 blocking

 

2) 비동기(asynchronous)

동시에 일어나지 않는다는 뜻(요청과 결과가 동시에 일어나지 않음)

요청한 그 자리에서 결과가 주어지지 않음

노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 됨

설계가 복잡하지만, 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있어 자원을 효율적으로 사용 가능

-> blocking 되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task를 위임하고 바로 다음 코드를 실행

 

- 임계 영역(Critical Section)

멀티 스레딩 문제점에서 나오듯, 동일한 자원을 동시에 접근하는 작업(공유하는 변수 사용, 동일 파일 사용 등)을 실행하는 코드 영역

(둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원을 접근하는 코드의 일부)

임계영역 문제란? 프로세스들이 임계영역을 함께 사용할 수 있는 프로토콜을 설계하는 것(동기화 필요)

 

=> Requirements(해결을 위한 기본 조건)

1) 상호 배제(Mutual Exclution) : 프로세스 P1이 임계영역에서 실행중이면, 다른 프로세스들은 그들이 가진 임계영역에서 실행 불가

2) 진행(Progress) : 임계영역에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 임계영역 진입 후보로 참여 가능

3) 한정된 대기(Bounded Waiting) : P1이 임계영역에 진입 신청 후부터 받아들여질 때까지 다른 프로세스들이 임계영역에 진입하는 횟수는 제한적

 

- 동기화란?

한정적인 시스템 자원에 여러 스레드가 동시에 접근해서 사용하면 문제가 발생할 수 있음

이 문제를 방지하기 위해 여러 스레드에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법

 

스레드 동기화

1) 실행 순서의 동기화 : 스레드의 실행 순서를 정의하고 이 순서를 반드시 따르도록 하는 것

2) 메모리 접근에 대한 동기화 : 메모리 접근에 있어서 동시 접근을 막는 것, 한 순간에 하나의 스레드만 해당 자원에 접근하도록 하는 것

 

- 동기화 기법

유저 모드의 동기화

커널의 힘을 빌리지 않는 동기화 기법(커널 코드가 실행되지 않음)

성능상 이점이 있으나 기능상의 제한점이 존재

 

1. 임계 구역 기반의 동기화

열쇠를 얻은 프로세스만 임계 구역에 들어갈 수 있음(한 번에 하나의 스레드만 접근 가능)

임계 구역 진입을 위해 critical section object를 얻음

다른 스레드가 열쇠를 가지고 있을 시 반환할 때까지 blocking -> 열쇠가 반환되면 blocking 해제, 열쇠를 얻고 임계 영역에 접근

 

2. 인터락 함수 기반의 동기화

함수 내부적으로 한 순간에 하나의 스레드에 의해서만 실행되도록 동기화

임계 영역 기반의 동기화도 내부적으로 인터락 함수를 기반으로 구현

유저 모드 기반으로 동작해서 속도가 빠름

 

커널 모드의 동기화

커널에서 제공하는 동기화 기능을 이용하는 방법

커널 모드로의 변경이 필요해서 성능 저하, 그러나 다양한 기능 활용 가능

 

1. 세마포어(Semaphore)

공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는 것

동시에 접근할 수 있는 '허용 가능한 갯수'를 가지고 있는 Counter(공유 자원에 접근 가능한 스레드 or 프로세스 수를 나타내는 값)

세마포어 Counter 개수에 따라 나뉘어짐(1개 : Binary Semaphore(= Mutex) / 2개 이상 : Counting Semaphore)

세마포어는 소유 불가능(세마포어를 소유하지 않은 스레드가 세마포어를 해제할 수 있는 문제 발생)

 

2. 뮤텍스(Mutual Exclusion)

공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는 것

임계 영역을 가진 스레드들의 Running time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술

뮤텍스 객체를 두 스레드가 동시에 사용 불가

일종의 Locking 매커니즘으로 공유 자원에 대한 접근을 조율하기 위해 locking과 unlocking을 사용

Lock에 대한 소유권이 있으며 Lock을 가진 경우만 공유 자원 접근 가능, Lock을 가진 사람만 반납 가능

뮤텍스는 무조건 1개의 열쇠만 가질 수 있음

 

3. 모니터(Monitor)

Mutex(Lock)와 Condition Variables를 가지고 있는 Synchronization 매커니즘

 

=> 뮤텍스와 모니터는 상호 배제를 함으로써 임계 영역에 하나의 스레드만 들어갈 수 있음

     세마포어는 하나의 스레드만 들어가거나 혹은 여러 개의 스레드가 들어가게 할 수도 있음

 

Q. 세마포어와 뮤텍스의 차이는?

세마포어 : 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두어 상호 배제

뮤텍스 : 한 스레드, 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호 배제

세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없음

세마포어는 소유할 수 없으며 뮤텍스는 소유할 수 있고 소유주가 그 책임을 짐

뮤텍스는 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제 가능, 세마포어는 소유하지 않고 있는 다른 스레드가 세마포어를 해제 가능

뮤텍스는 동기화 대상이 1개일 때 사용, 세마포어는 동기화 대상이 여러 개일 때 사용

 

Q. 세마포어와 모니터의 차이는?

자바에서는 모니터를 모든 객체에게 기본적으로 제공하지만 C에서는 사용 불가

세마포어는 카운터라는 변수 값으로 프로그래머가 상호 배제나 정렬의 목적으로 사용 시 매번 값을 따로 지정해줘야 함(번거로움)

모니터는 이러한 일들이 캡슐화 되어 있어서 개발자는 카운터 값을 0 or 1로 주어야 하는 고민할 필요가 없음

(synchronized, wait(), notify() 등의 키워드를 이용해 좀 더 편하게 동기화 가능)

 

Q. 뮤텍스와 모니터의 차이는?

뮤텍스는 다른 프로세스나 스레드 간에 동기화를 위해 사용

모니터는 하나의 프로세스 내에서 다른 스레드 간 동기화할 때 사용

뮤텍스는 운영체제 커널에 의해 제공(무겁고 느림), 모니터는 프레임워크나 라이브러리 그 자체에서 제공(가볍고 빠름)

'CS > 운영체제' 카테고리의 다른 글

Paging vs Segmentation  (0) 2021.03.08
교착상태(DeadLock)  (0) 2021.03.04
CPU 스케줄링  (0) 2021.03.02
스케줄러(Scheduler) 종류  (0) 2021.03.02
스레드(Thread)  (0) 2021.02.25