이전에 멀티쓰레드가 하나의 자원을 공유함을 확인해 보았다. 그리고 쓰레드가 비동기 흐름을 갖기 때문에 동시에 같은 데이터를 수정할 수 있고, 이러한 이유로 의도하지 않은 오류가 날 수 있음을 확인해보았다.
그래서 공유자원을 안전하게 관리하기 위해서는 공유자원에 접근하는 부분인 임계 구역(Critical section)을 다른 쓰레드, 프로세스가 동시에 사용하지 않음을 보장하는 상호배제(Mutual exclusion)를 달성해야 한다.
동기화 방법은 세마포어와 뮤텍스가 있고, 이 두가지의 정의와 차이에 대해서 알아보자.
1. 세마포어
A. 세마포어란?
공유 자원(보호 영역, critical section) 접근을 제어하기 위한 변수 혹은 추상 데이터이다.
이 구현을 위한 함수들은 semaphore.h에 정의되어 있다.
세마포어의 사용 흐름을 보자
세마포어 오픈
-> (접근 가능 확인, 대기, 세마포어 잠금 -> 데이터 접근 및 수정 -> 세마포어 해제) X N
-> 세마포어 제거
이제 이 세마포어를 위한 함수를 알아보자.
B. 세마포어 함수
- a. 세마포어 오픈 : sem_open
인자로는 다음이 필요하다.
name : 세모파오의 이름
oflag : 특성 정의
mode : 권한 정보 설정
value : 세마포어 초기값
여기서 flag와 mode는 여느 파일을 열때와 같다.
리턴값은 성공시에는 세마포어 접근을 위한 sem_t포인터를 리턴하고, 실패시엔 SAM_FAILED를 리턴한다.
이제 이렇게 연 세마포어를 통해 어떻게 공유 데이터를 동기화할 수 있는지 확인해보자.
- b. 세마포어 접근 가능 여부 확인, 사용 중일 경우 대기, 다른 접근으로 부터 블락 : sem_wait
이 함수는 좀 까다로운 흐름을 갖는다.
우선 세마포어를 통해 보호 영역에 접근 가능한지 확인해본다. 만약 가능하지 않다면 가능할 때 까지 대기를 하고, 가능하다면 다른 프로세스, 스레드로 부터의 해당 보호 영역으로의 접근을 막는다.
인자로써는 생성된 세마포어를 전달해야할 것이고, 성공한다면 0을 리턴되고, 실패한다면 -1이 리턴될 것이다.
이 함수는 세마포어 값을 확인하고 해당 값이 0인 경우, 그 값이 양수가 될 때까지 보호되는 영역에 대한 접근을 대기상태로 전환한다.
앞서 세마포어에 접근을 제한하는 함수를 보았고, 이젠 그 제한을 푸는 함수에 대해서 알아보자.
- c. 보호 영역에 대한 제한 해제 : sem_psot
보호되는 영역을 사용한 후, 종료되면 다른 프로세스가 해당 영역에 진입할 수 있도록 sem_post를 통해 허용한다.
인자와 리턴은 sem_wait과 같다.
이제 연 세마포어를 제거해보자.
- d. 세마포어 제거
다음과 같은 방식으로 세마포어를 삭제할 수 있다.
인자와 리턴은 앞선 함수들과 같다.
2. 뮤텍스
이제 공유 자원의 접근을 제한하는 두번 째 방식인 뮤텍스에 대해서 알아보자.
뮤텍스도 마찬가지로 데이터의 접근을 제한하는 방법이다. 뮤텍스와 세마포어의 차이에 대해서는 우선 뮤텍스의 작동을 먼저 알아보고 확인해보자.
우선 뮤텍스를 정의하는 것이다. 인자로써 뮤텍스 객체와 뮤텍스의 속성을 전달하고 함수를 호출하면 그 인자에 뮤텍스 객체가 저장된다. 리턴값으로는 성공, 실패(오류 값)이 주어진다.
이렇게 생성된 뮤텍스 객체를 활용하여 이제 데이터의 접근 흐름을 제어할 것이다.
위 함수들을 통해 세마포어 처럼 데이터의 접근을 잠구고 풀 수 있다.
이제 뮤텍스를 삭제한다.
3. 세마포어와 뮤텍스의 차이
이제 데이터의 접근을 제어하는 두가지 기술의 차이점에 대해서 알아보자.
앞서 함수에 대해서 보았다면 알 수 있겠지만, 인자가 가장 큰 차이점임을 알 수 있다. 세마포어의 경우에는 sem_t 즉, unsigned int형 데이터를 통해 접근중인 쓰레드를 카운팅 하여 접근 여부를 판단하는 방식이었고, 뮤텍스의 경우 데이터에 대해 단 하나의 스레드, 프로세스만 가질 수 있는 뮤텍스 객체를 통해서 접근할 수 있게 하여 제어하는 것이다.
정리하자면 세마포어는 접근중인 프로세스, 쓰레드의 수를 카운팅해서 제한하는 것이고, 뮤텍스의 경우 하나의 객체에 대해 존재하는 단 하나의 키(객체)를 이용하여 접근을 제한하는 것이다.
'학교 공부 > 네트워크' 카테고리의 다른 글
Multiplexing을 통한 싱글 프로세스의 다중 클라이언트 연결 (0) | 2021.04.14 |
---|---|
멀티 쓰레드를 활용한 멀티 클라이언트 TCP 통신 (0) | 2021.04.14 |
멀티 프로세스를 활용한 다중 클라이언트 TCP 통신, 좀비 프로세스 삭제 (0) | 2021.04.11 |
네트워크 프로그래밍 (VM의 NAT와 Bridge, UDT) (0) | 2021.04.01 |