세마포어 개요 :
- 동기화 기법
- cs(임계영역) 문제 해결 위해 사용
- 세마포어 초기설정 정수변수, 초기화 후 P(wait), V(signal)인 세가지 연산들로만 접근 가능
- 종류 : 0과 1 두 종류 값( 이진 세마포어)
: 0이상의 모든 정수 값( 카운팅 세마포어)
-P(),V()연산을 분리 불가능 연산(두개는 세트)
-세마포어 S는 P,V에 의해서만 접근 될 수 있는 정형변수
-통제된 변수는 P,V초기값에 의해서만 엑세스 또는 변경 ㄹ가능
- 임이의 세마포어 S는 하나의 대기큐 Qs가 할당됨.
- 바쁜 대기 (busy waiting)문제 해결
동기화
1. 공유된 메모리에 둘 이상의 스레드가 동시 접근하는 것을 막는 행위
2. 둘 이상의 스레드 실행 순서를 컨트롤 하는 행위
- 대표적인 동기화 기법: 세마포아, 뮤텍스
<뮤텍스>
-pthread_mutex_t 타입의 변수를 가리켜 뮤텍스라고 한다
-일종의 문고리에 해당
기본원리:
1, 임계영역에 들어갈 때 문고리를 잠그고 들어간다
2. 임계영역에서 빠져나올 때 뮤텍스를 풀고 나온다
<세마포어>
-sem_t 타입의 변수를 가리켜 흔히 세마포어라고 표현
기본원리:
-세마포어는 항상 정수를 지닌다 : 정수값 0이면 실행불가 , 1이상이되면 실행 가능의미
- 0미만 될 수 없고 1이상 가능
- 0과 1의 상태만을 지니는 세마포어를 바이너리 세마포어라고한다.
작동원리 :
1. 차단을 원하는 자원에 대해서 세마포어 생성
-> 해당 자원을 가리키는 세마포어 값이 할당
-> 숫자값은 현재 세마포어를 적용하고 있는 자원에 접근 가능한 프로세스의 숫자
-> 값이 0이면 접근 할 수 있는 프로세스의 숫자 0
-> 0보다 큰 정수면 그 크기만큼 프로세스가 자원에 접근 가능
2. 자원에 접근하기 전에 세마포어 값을 검사
-> 값이 0이면 자원을 사용할 수 있을 때까지 기다린다.
-> 0보다 클 경우 (1이라 가정) 자원에 접근하여 값을 1감소, 0으로 만든다
-> 자원 사용이 끝나면 다시 1 증가시켜 계속 사용할 수 있게한다
(이 작업을 하기위해 P,V 연산을 가지고 제어한다)
<세마포어의 단점>
: 한 프로세스가 임계영역에 있는 상황에서 또 다른 프로세스가 임계영역에 진입을 원할 경우 진입영역에서 무한루프를 돌면서 진입여부 검사 반복한다 (될 때까지 기다리니까 그동안 놀고 있을 수 밖에 없음)
*이게 busy waiting(바쁜 대기 시간)
해결방안: wait과 wakeup연산 활용
1. wait 연산
: 진입 영역에서 진입 조건을 만족하지 않으면 그 프로세스는 대기 상태로 변환하여 queue(큐)에 대기
2. wakeup 연산
: 프로세스 상태를 대기상태에서 준비상태로 변경
(자원이 해제되어 이를 기다리던 프로세스들이 모두 깨어났을 때 이 중 한 프로세스만 자원을 획득하도록 해주는 동기화 기법)
<세마포어의 구현>
공유변수 : S
P(s)연산
: 조건을 검사하여 프로세스의 임계영역으로의 진입을 검토하여 불가능한 경우의 프로세스를 대기 행렬 (큐)에 넣는다.
V(s)연산
: 임계영역에 실행중이던 프로세스가 종료 시 대기 행렬에 대기중인 프로세스가 있으면 임계영역에서 실행할 수 있도록 한다.
세마포어 개요 :
- 동기화 기법
- cs(임계영역) 문제 해결 위해 사용
- 세마포어 초기설정 정수변수, 초기화 후 P(wait), V(signal)인 세가지 연산들로만 접근 가능
- 종류 : 0과 1 두 종류 값( 이진 세마포어)
: 0이상의 모든 정수 값( 카운팅 세마포어)
-P(),V()연산을 분리 불가능 연산(두개는 세트)
-세마포어 S는 P,V에 의해서만 접근 될 수 있는 정형변수
-통제된 변수는 P,V초기값에 의해서만 엑세스 또는 변경 ㄹ가능
- 임이의 세마포어 S는 하나의 대기큐 Qs가 할당됨.
- 바쁜 대기 (busy waiting)문제 해결
동기화
1. 공유된 메모리에 둘 이상의 스레드가 동시 접근하는 것을 막는 행위
2. 둘 이상의 스레드 실행 순서를 컨트롤 하는 행위
- 대표적인 동기화 기법: 세마포아, 뮤텍스
<뮤텍스>
-pthread_mutex_t 타입의 변수를 가리켜 뮤텍스라고 한다
-일종의 문고리에 해당
기본원리:
1, 임계영역에 들어갈 때 문고리를 잠그고 들어간다
2. 임계영역에서 빠져나올 때 뮤텍스를 풀고 나온다
<세마포어>
-sem_t 타입의 변수를 가리켜 흔히 세마포어라고 표현
기본원리:
-세마포어는 항상 정수를 지닌다 : 정수값 0이면 실행불가 , 1이상이되면 실행 가능의미
- 0미만 될 수 없고 1이상 가능
- 0과 1의 상태만을 지니는 세마포어를 바이너리 세마포어라고한다.
작동원리 :
1. 차단을 원하는 자원에 대해서 세마포어 생성
-> 해당 자원을 가리키는 세마포어 값이 할당
-> 숫자값은 현재 세마포어를 적용하고 있는 자원에 접근 가능한 프로세스의 숫자
-> 값이 0이면 접근 할 수 있는 프로세스의 숫자 0
-> 0보다 큰 정수면 그 크기만큼 프로세스가 자원에 접근 가능
2. 자원에 접근하기 전에 세마포어 값을 검사
-> 값이 0이면 자원을 사용할 수 있을 때까지 기다린다.
-> 0보다 클 경우 (1이라 가정) 자원에 접근하여 값을 1감소, 0으로 만든다
-> 자원 사용이 끝나면 다시 1 증가시켜 계속 사용할 수 있게한다
(이 작업을 하기위해 P,V 연산을 가지고 제어한다)
<세마포어의 단점>
: 한 프로세스가 임계영역에 있는 상황에서 또 다른 프로세스가 임계영역에 진입을 원할 경우 진입영역에서 무한루프를 돌면서 진입여부 검사 반복한다 (될 때까지 기다리니까 그동안 놀고 있을 수 밖에 없음)
*이게 busy waiting(바쁜 대기 시간)
해결방안: wait과 wakeup연산 활용
1. wait 연산
: 진입 영역에서 진입 조건을 만족하지 않으면 그 프로세스는 대기 상태로 변환하여 queue(큐)에 대기
2. wakeup 연산
: 프로세스 상태를 대기상태에서 준비상태로 변경
(자원이 해제되어 이를 기다리던 프로세스들이 모두 깨어났을 때 이 중 한 프로세스만 자원을 획득하도록 해주는 동기화 기법)
<세마포어의 구현>
공유변수 : S
P(s)연산
: 조건을 검사하여 프로세스의 임계영역으로의 진입을 검토하여 불가능한 경우의 프로세스를 대기 행렬 (큐)에 넣는다.
V(s)연산
: 임계영역에 실행중이던 프로세스가 종료 시 대기 행렬에 대기중인 프로세스가 있으면 임계영역에서 실행할 수 있도록 한다.