프로세스 / 쓰레드에서 공유 자원의 접근을 제어하는 정수형 변수입니다. 즉, 자원이 몇개 남았는지 나타내는 카운터입니다.
여러 스레드가 같은 변수 / 버퍼 / 장치 등에 동시에 접근하면 잘못된 결과를 낼 수 있기때문에 사용합니다.

value 가 3이면 동시에 3개의 쓰레드가 접근 가능)P() 또는 wait() 또는 down()V() 또는 signal() 또는 up()자원이 없을 때 계속 루프를 돌면서 대기하는 방식입니다.
while (sema.value == 0) {
// 아무 일도 안 하고 기다림
}
// 자원 사용
sema.value--;
문제점
장점
사용 예
자원이 없을 때 스레드를 block시키고, 자원이 생기면 wakeup시켜서 다시 실행되게 하는 방식입니다.
if (sema.value == 0) {
block_this_thread(); // 스케줄러에게 CPU 반납
} else {
sema.value--;
}
// sema_up()에서 자원이 생길시
sema.value++;
wakeup_one_waiter(); // 기다리던 스레드 중 하나 깨움
장점
단점
사용 예
thread_block()으로 스레드를 막고, thread_unblock()으로 깨웁니다./* Pintos 세마포어 초기화 */
sema_init(&sema, 1);
/* 자원 획득 (down) */
sema_down(&sema);
/* 자원 해제 (up) */
sema_up(&sema);
Pintos의 thread/synch.c 에서 sema_down, sema_up 함수가 사용되며, 우선 순위 기아 현상 방지를 위해 보완하여야 합니다.
Pintos에서는 세마포어가 semaphore 구조체에 정의되어 있습니다.