• ↑↓ pour naviguer
  • pour ouvrir
  • pour sélectionner
  • ⌘ ⌥ ↵ pour ouvrir dans un panneau
  • ←→ pour naviguer
  • esc pour rejeter
⌘ '
raccourcis clavier

The Problem

Some resources have multiple identical instances (e.g., 3 printers, 5 buffer slots). Binary semaphore can’t handle this — we need to track how many instances are available.

Core Idea

A counting semaphore can take values 0 to N, where N is the number of available resources in the pool.

How It Works

  1. Initialize semaphore to N (number of available resources)
  2. Process requests resource: wait(S) → S—
  3. If S becomes negative, process blocks (no resources available)
  4. Process releases: signal(S) → S++, wake up a blocked process
counting_sem Pool Resource Pool N = 3 instances S Semaphore S = 3 Pool->S P1 Process 1 wait(S) P1->S S=2 P2 Process 2 wait(S) P2->S S=1 P3 Process 3 wait(S) P3->S S=0

Key Properties

  • Value range: 0 to N (N = resource count)
  • Used for resource management (buffer slots, printer pool)
  • Negative value = number of blocked processes
  • Classic use: producer-consumer bounded buffer

Connections

Edge Cases & Gotchas

  • Initializing to wrong N causes resource leaks or errors
  • Must ensure signal() is called exactly once per wait()
  • Priority inversion can happen with multiple priority levels