os - 동기화가 왜 중요할까?

박경현·2023년 9월 1일
0

우리는 흔히 개발을 하면서 동기화, 비동기화에 대해서 자주 듣고 접하게 된다
하지만 cpu레벨에서 이게 왜 중요하고 어떻게 실행을 방해하는지 제대로 모르기 때문에
이번에 공부를 한 내용을 작성해보려고 한다!

동기화가 왜 중요할까? -> 가정을 해서 알아보자

간단한 가정을 하나 해보자
우리는 지금 하나의 객체를 두개의 스레드가 접근하고 있다고 해보자! - 코어는 싱글코어(cpu 1개)

귤 2박스에서 상한 귤 세기! -> 스레드 하나 당 한 박스를 담당!
badCounter를 공유!!

for (귤 in 귤 박스) {
	if (귤 상태 is 불량) {
    	badCounter.increament();
    }
}
public class Counter {
	private int state = 0;
    public void increment() { state++; }
    public int get() { return state; }
}

state++; 이라는 코드는 cpu명령에서도 한줄로 해석될까?

결론부터 말하면 그렇지 않다!!

LOAD state to R1 -> R1이라는 레지스터에 state 값을 저장
R1 = R1 + 1 -> 레지스터에서 1을 더함
STORE R1 to state -> 레지스터값을 state에 저장

increment() 함수를 호출 했을때 cpu안에서는 이 과정이 일어나게 된다!

차고로 싱글 코어이기 때문에 멀티 태스킹이 일어나게된다 -> 컨텍스트 스위칭을 걱정해야함!

만약 저 명령어들 중간에 컨텍스트 스위칭이 되어버린다면 제대로 state값이 올라가지 않고
다음 스레드를 실행하게 되어버리는 문제가 발생한다!!

한 작업이 다 끝나고 다음 작업을 해야하는 곳에 동기화를 해주자!!

race condition(경쟁 조건)
여러 프로세스/스레드가 동시에 같은 데이터를 조작할때 결과가 실제랑 달라질 수 있는 상황!

synchronization(동기화)
여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 보장

이미 실행중인 스레드가 있다면 다른 스레드가 사용 못하게 막기!!

결론

결국 동기화를 해야하는 이유는 제대로 작업을 처리하지 않고 다른 작업으로 가는걸
방지하기 위해서고,
cpu에서 명령어 실행은 코드가 1줄이라도 cpu 내 명령은 1줄이 아닐수 있다는걸 명심하자!!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글