Uncategorized

1 4 1 3 쓰레드 동기화 (뮤텍스, 크리티컬세션, 세마포어, 이벤트)

Written by

🚀 **이 문서는 보다 쉽게 이해할 수 있도록 정리되었습니다.**

쓰레드 동기화 개념
쓰레드는 기본적으로 비동기식으로 동작한다. 여러 개의 쓰레드가 동시에 수행되고 있는 상황에서는 자원에 대한 충돌이나 오류가 발생될 수 있다. 이러한 오류는 시스템이 더 이상 진행되지 못할 수 있는 데드락(Deadlock)과 같이 치명적인 상태로 될 수 있다.
쓰레드 동기화라는 것은 여러 개의 쓰레드가 동시에 동작될 때 생길 수 있는 문제를 예방하기 위해 자원에 대해서 접근을 순차적으로 하도록 하는 의미한다.
비동기식 처리란 여러 쓰레드가 각각의 일에 대하여 일의 순서를 정의하지 않고 처리하는 방식을 말한다. 동시에 수행된다는 의미이다. 하지만 동시에 수행되다 보면 자원의 사용이나 데이터의 무결성을 깨뜨릴 수가 있는데, 이때 동기화 처리가 필요하게 된다. 동기화 처리란 여러 쓰레드들에 의하여 수행되는 어떠한 일에 대하여 각각의 쓰레드들이 수행하는 일의 순서를 프로그래머가 명시하고 수행할 수 있도록 하는 처리 방법을 말한다.

비동기 병행 프로세스의 개념
멀티 프로세싱 환경에서 여러 개의 프로세스 또는 쓰레드가 동시에 어떠한 일을 수행하는 것이다. 이때 하나의 자원을 다수의 프로세스가 비동기적으로 공유하는 상황이 생길 수 있다.

동기화란 무엇인가?
동기화(Synchronization)란 멀티태스킹 환경에서 여러 개의 처리를 서로의 진행 상태에 맞추어 진행시키는 것을 말한다. 독립된 2개 이상의 프로세스들간의 주기적인 사건을 적절한 방법으로 결합, 제어함으로써 일정한 위상 관계(位相關係)를 지속시키는 프로세스 관리기법이다.

쓰레드 동기화의 필요성
쓰레드의 특성상 마치 동시에 수행되는 것처럼 보인다. 실제로는 동시가 아니지만, 그러한 이유로 쓰레드가 2개 이상 수행되고 있을 때는 쓰레드간의 동기화가 필요하다. 서로간의 작업이 관련이 없다면 동기화가 되지 않아도 상관이 없지만, 관련이 있는 경우라면 동기화가 필요하다.
동기화의 다른 측면은 공유 리소스의 접근 제어이다. 리소스의 종류에는 파일, 메모리, 비디오 카드, 하드디스크등의 물리적 장치들을 포함한다. 이러한 장치에 동시에 접근해서 제어를 하려고 하다 보면 원하는 결과와 다른 현상이 발생될 수 있다. 예를 들면 한쪽에서 데이터를 쓰고 있는 동안 그 값을 읽어오면 그 값을 신뢰할 수 없게 된다.

쓰레드 동기화의 상호 배제(Mutual Exclusion)
프로세스의 상호 교신에 대한 기본적인 조치는 공용 부분을 여러 프로세스가 동시에 사용하지 못하도록 한다. 임계지역을 실행하고 있는 프로세스가 하나도 없을 경우 임계지역에 진입을 요구한 프로세스에게 사용을 허가한다. 2개 이상의 프로세스가 임계지역에 들어오려 경쟁할 때 그 선택이 무기한 방치되어서는 안된다.

유저모드에서의 동기화 기능의 객체들
크리티컬 섹션(Critical Section)
유저 레벨의 동기화 방법 중 유일하게 커널 객체를 바로 사용하지 않는다. 내부 구조가 단순하기 때문에 동기화 처리를 하는 데 있어서 속도가 빠르다는 장점이 있다. 동일한 프로세스(Process)내에서만 사용할 수 있다는 제약이 있다.
이 동기화 방법은 커널 객체를 사용하지 않기 때문에 핸들을 사용하지 않고 대신 CRITICAL_SECTION라는 타입을 정의하여 사용하게 된다.

동기화 하기를 원하는 구역에 시작과 끝에 API함수를 호출하는 방식이다.
EnterCriticalSection()
… // 파일쓰기등의 동기화가 필요한 작업 수행
LeaveCriticalSection()

크리티컬 섹션은 프로세스 하나에 포함된 여러 개의 스레드가 공유 리소스에 접근할 때 베타적 제어를 하기 위한 구조다. 크리티컬 섹션 관련해서 기능은 다음과 같다.

초기화
소유권 획득(획득할 때까지 복귀하지 않음), 소유권 획득(획득 여부과 관계 없이 복귀)
소유권 해제
소멸

동기화 객체 (뮤텍스, 세마포어, 이벤트)
동기화를 위한 객체로 뮤텍스, 세마포어, 이벤트와 같은 객체가 있다. 프로세스(Process), 쓰레드(Thread), 파일(File)들까지도 동기화를 위한 커널 객체를 포함하고 있

Leave a Comment