세마포어
멀티프로그래밍 환경에서 공유자원에 대한 접근 제어를 하는 방법으로 사용되며, 1개의 공유되는 자원에 제한된 개수의 프로세스(Process), 또는 스레드(Thread)만 접근할 수 있도록 한다.
- value와 wait Q를 가짐초기화 중요초기 값 적절하게 설정해야 함구슬 주머니에서 구슬을 넣고 빼는 동작과 비슷
- 초기화 중요
- 초기 값 적절하게 설정해야 함
- 구슬 주머니에서 구슬을 넣고 빼는 동작과 비슷
☁️ sem_wait
- value 값 감소(구슬을 가져가는 것)
- wait Q에 넣고 sleep
☁️ sem_post
- value 값 증가(구슬을 넣는 것)
- wait Q에서 제거하여 Ready Q로 옮김
이진 세마포어(락)
- 초기 value 값 1로 설정
순서 보장 세마포어
- 초기 value 값 0으로 설정
- 컨디션 변수를 사용했던 것과 유사하게 동작
Producer/Consumer 문제 (유한 버퍼 문제)
- 세마포어 value가 컨디션 변수의 count를 대신함
- empty 세마포어의 초기 value 값 MAX(producer 개수)로 설정
- full 세마포어의 초기 value 값 0으로 설정
- put, get에 의해 경쟁 조건 발생 ← atomic 하지 않음
- mutex lock 설정
- 이진 세마포어이므로 초기 value 값 1로 설정
- wait 할 때 lock을 가지고 sleep하면 안 됨 ← Deadlock 발생
- lock, unlock을 wait, post 사이에 들어오도록 바꿈
Dining Pilosopher
- 왼쪽 포크 잡기 → 오른쪽 포크 잡기 → 식사 → 왼쪽 포크 내려놓기 → 오른쪽 포크 내려놓기
- 포크를 잡는 순서에 의해 종속성이 생김 → Deadlock
- 마지막 쓰레드만 오른쪽 포크를 잡고 왼쪽 포크를 잡으면 해결
제마포어
- 컨디션 변수 + 세마포어
- value 값을 음수가 안되도록 구현
- value가 음수가 되면 sleep
RW lock
- Bad
- Read 실행 중 Write가 들어온 후 새로운 Read 들어와도 새로운 Read 실행
- Good
- Read 실행 중 Write가 들어온 후 새로운 Read가 들어오면 Sleep
- wake는 Write 먼저 깨우며 Read만 남았을 때는 Read 모두 동시에 깨울 수 있음
728x90
반응형
'OS' 카테고리의 다른 글
[OS] Hard Disk Drives (1) | 2024.04.29 |
---|---|
[OS] Common Concurrency Problems (1) | 2024.04.29 |
[OS] Condition Variables (0) | 2024.04.29 |
[OS] Locks (0) | 2024.03.31 |
[OS] Concurrency and Threads (0) | 2024.03.31 |