일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 동기화
- 뮤텍스
- 프록시서버
- Proxy
- 세마포어란?
- 세마포어
- Dijkstra Algorithm
- 세마포어와 뮤텍스의 차이
- 클라우드 서버
- SSAFY
- 프록시
- 호스팅이란?
- 싸피
- Proxy Server
- 서버 호스팅
- 세마포어와 뮤텍스
- 최단 경로
- 웹 호스팅
- Synchronization
- floyd-warshall
- 플로이드 워셜
- 뮤텍스란?
- 플로이드 와샬
- 삼성 청년 SW 아카데미
- 다익스트라
- 싸피 합격
- 호스팅
- 싸피 면접 후기
- 다익스트라 알고리즘
- Today
- Total
어제의 나보다 성장한 오늘의 나
[운영체제] 동기화 Synchronization , Race condition 본문
운영체제에서 Synchronization 동기화란?
- 두 개의 프로세스 A, B가 공유 메모리를 이용해 데이터를 주고받는데 A가 쓰면 B가 읽어 가야 된다.
- 하지만 A가 쓰고 난 뒤인지 전인지 알 수 있는 방법이 없다. 또는 동기화가 없을 때 발생하는 문제들도 존재한다.
- 따라서 프로세스 또는 스레드들이 수행되는 시점을 조절하는 것을 Synchronization이라고 한다.
또한 동기화가 없다면?
- 데이터 일관성이 깨짐
- 즉, 한순 순간 하나의 데이터의 값이 여러 개일 수도 있게 됨
- 여러 개의 스레드가 하나의 변수에 대한 값이 제각각일 수 있게 됨
간단한 예시로 동기화 문제를 이해해보자
친구 A와 친구B가 은행계좌를 공유한다고 가정하자, 현재 잔액은 100만원이 있다. 친구A와 친구 B는 우연히 동시에 다른 ATM기기에서 돈을 찾고 있다. 둘 다 10만 원을 인출하는 거래가 동시에 은행으로 가게 된다. 그러면 이 거래를 처리할 프로세스 스레드가 생길 것이다.
int bank(account, amount) //해당 account에서 amount만큼 인출하는 함수
{
balance = get_balance(account); //계좌에서 현재 잔액을 가져옴
balance = balance -amount; //남은 잔액은 기존 잔액에서 amount만큼 뺀 금액
put_balance(account, balance); //account에 변경된 잔액을 갱신함
return balance;
}
e 그럼 bank라는 함수를 수행하는 스레드가 동기에 두 개가 생성된다. 그럼 여기서 친구 A 인출을 먼저 시작하는데 3번째 줄을 시행 했을 때 balance는 100만원일 것이다. 그리고 4번째 줄에서 실제 인출이 일어나므로 잔액은 90만원이 된다. 근데 4번째 줄까지 수행하고 잔액을 업데이트 하기 전에 interrupt가 걸렸다고 생각해보자.
인터럽트가 걸리면 인터럽트 핸들러가 수행되고 운영체제가 수행된다. 운영체제가 자기 할 일을 다 처리한 후에 CPU에 프로세스를 다시 올리려고 스케줄링을 한다. 딱 봤는데 프로세스가 2개가 존재하고 친구A 프로세스는 4번째 줄까지 처리를 조금 했고, 친구 B의 것이 스케줄링이 된다. get_balance를 하면 90만 원이 나와야 하는데 아까 친구A의 balance가 아직 업데이트가 안된 상태이기 때문에 100만원이 현재 잔액으로 나오게 된다. 그 다음 친구B가 인출을 20만원을 했고, 친구A가 마저 실행되고 잔액이 90만원이 되어 버린다.
즉, multi-threaded program이 되었던, multi-process program이 되었든 간에 어떤 shared data를 접근하는 경우에 그들의 순서를 조절하는 것을 SYNCHRONIZATION이라고 한다.
Race Condition이란?
- 두 개 이상의 concurrent 한 스레드들이 공유된 자원에 접근하려고 할 때 동기화 메커니즘 없이 접근하려고 하는 상황을 Race Condition이라고 한다.
이런 race condition인 경우에는 스레드의 실행 순서를 잘 조절해주지 않으면 이상한 상태, 비정상적인 상태가 나오게 된다. 하지만 이 문제는 항상 발생하는 게 아니라 특정한 순서로 수행되었을 때만 발생하게 되는 거라 더 골치가 아프다. 위의 예시처럼 친구 A와 친구 B가 동시에 인출 요청하고 인터럽트가 걸리는 것처럼 말이다.
다르게 말하면 동시 인출을 안 하고 인터럽트가 안 걸렸으면 문제가 없었을 것이라는 것이다. 때문에 프로그램 개발 시 디버깅 시에는 문제점이 전혀 보이지 않기에 골치가 아프다. 그래서 제대로 개발했다고 착각하고 우연히 문제가 발생하면 큰일이 된다. 이미 상용돼서 많은 사용자들이 사용하고 있을 경우 더욱더 그럴 것이다. 그래서 멀티스레드 프로그래밍을 할 경우에는 특히 동기화 문제를 꼭 고려해야 된다.
출처
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 세마포어와 뮤텍스 (0) | 2021.04.30 |
---|---|
임계영역(critical section) (0) | 2021.04.25 |
스케줄러의 종류(장기스케줄러, 중기스케줄러, 단기스케줄러) (0) | 2021.04.24 |
교착상태(DeadLock)가 무엇인가? (0) | 2021.04.23 |
운영체제의 CPU 스케줄링 (0) | 2021.04.22 |