OS #22 쓰레드 동기화

underlier12·2020년 4월 5일
0

OS

목록 보기
22/35

22. 쓰레드 동기화

동기화 이슈

동기화란 작업이 병렬로 진행 될 때 각 실행 작업의 시점을 일치시키는 것을 말한다. 특히 여러 쓰레드가 동일한 자원(데이터)에 접근 시 동기화 이슈가 발생하며 동일 자원을 동시 수정 시 각 쓰레드 결과에 영향을 준다.

코드 예제

다음 파이썬 코드를 보면 쓰레드를 50개 생성하여 1,000,000을 더해 총 합을 마지막에 구하도록 하는 작업인데 50,000,000이 나와야됨에도 불구하고 훨씬 적은 값이 나오는 것을 확인할 수 있다. 이를 동기화 이슈가 발생한 것으로 볼 수 있다.

동기화 이슈 발생 원리

g_count = g_count + 1

위의 코드 상으로는 한줄일지라도 내부를 들여다 보면 다음과 같이 3가지 작업으로 분리되어 있다. 읽고 / 연산하고 / 저장하는 과정이다.

하지만 쓰레드도 컨텍스트 스위칭을 통해 각 작업이 중단되는 일이 발생하는데 하필 연산이 진행 후 저장 직전에 넘어가고 저장되지 않는 값을 불러와 다음 쓰레드가 일을 처리하고 저장하는 식의 과정이 반복되며 누락되는 연산이 생겨난다.

Mutual Exclusion

따라서 위와 같은 불상사를 방지하기 위해서는 공유 변수에 대해 Exclusive Access가 필요하다. 어느 한 쓰레드가 공유 변수를 갱신하는 동안은 접근하지 못하도록 막는 것이다. 다음에서 threading 라이브러리 내에 Lock 클래스에 있는 acquire/release 함수를 통해 갱신 중 타 쓰레드 작업을 막는다.

이 때 공유되는 자원을 임계 자원(critical resource), 해당 구간을 임계 영역(critical section)이라고 한다.

profile
logos and alogos

0개의 댓글