考点频率★★★★★PV操作是软考下午题和选择题的绝对核心难度⭐⭐⭐建议务必理解P/V操作的原子性和具体动作这是后续解决所有同步互斥问题的“总纲”1️⃣ 为什么要引入信号量上一篇文章提到进程同步与互斥需要一套机制来协调对临界资源的访问。硬件层面的“关中断”或“测试并设置TS”指令虽然能实现互斥但它们往往采用忙等Busy Waiting不符合“让权等待”的原则即不能进入临界区的进程应释放CPU而不是死循环空转。为了更高效、更结构化地解决同步与互斥问题荷兰计算机科学家Dijkstra迪杰斯特拉在1965年提出了信号量Semaphore机制。2️⃣ 什么是信号量Semaphore信号量是一个特殊的整型变量通常用S表示它除了初始化外只能通过两个标准原子操作来访问P操作申请资源和V操作释放资源。P操作Proberen荷兰语“尝试”申请资源将信号量的值减1。V操作Verhogen荷兰语“增加”释放资源将信号量的值加1。⚠️原子性不可中断P和V操作在执行期间是不可分割的。即当一个进程正在执行P或V操作时其他进程不能打断它。这是信号量能够正确工作的前提。3️⃣ 两种类型的信号量3.1 整型信号量Integer Semaphore这是一种早期的实现值仅表示可用资源的数量。P操作忙等while(S 0) ;S S - 1;如果资源不足进程死循环等待V操作S S 1;缺点不满足“让权等待”进程在无法获取资源时会一直占用CPU空转造成资源浪费。3.2 记录型信号量Record Semaphore—— 软考默认指这种这是现代操作系统使用的实现方式除了整型值外还关联了一个进程等待队列。信号量S的数据结构包含S.value整型值表示可用资源数0有空闲0无空闲0绝对值表示等待进程数。S.L阻塞队列存放等待该资源的进程。P操作申请资源遵循让权等待S.value S.value - 1;if (S.value 0) block(S.L);资源不够将进程挂到阻塞队列让出CPUV操作释放资源S.value S.value 1;if (S.value 0) wakeup(S.L);仍有进程在等待唤醒一个进程关键理解当S.value为负数时其绝对值表示正在等待该资源的进程个数。4️⃣ 两种典型用法重点信号量初始值的设置决定了它的用途。这一区别是软考选择题的常考内容4.1 用于互斥访问临界资源场景打印机、共享变量。设置信号量初值设为1。逻辑P操作表示“锁上门”V操作表示“打开门”。保证了同一时刻只有一个进程能进入临界区。4.2 用于同步控制执行顺序场景生产者与消费者、前趋图A做完才能做B。设置信号量初值设为0。逻辑先执行的进程如生产者在完成操作后执行V(S)释放信号量后执行的进程如消费者在执行前执行P(S)。若信号量为0则P操作会阻塞直到先执行的进程唤醒它。5️⃣ 经典例题例题1若信号量S的当前值为 -3则表示 。A. 有3个进程在临界区内B. 有3个进程正在等待该信号量C. 有3个进程正在运行D. 临界区中有3个资源解析记录型信号量为负时绝对值表示等待进程数。选B。例题2若用信号量实现进程互斥信号量的初值应设为 。A. 0B. 1C. nn1D. 任意值解析互斥信号量资源数只有1个所以初值为1。选B。例题3概念以下关于P操作的叙述中错误的是 。A. P操作可能会导致进程进入阻塞状态B. P操作执行后信号量的值一定减小C. P操作在执行过程中可以被中断D. P操作是原子操作解析P操作必须具有原子性即一旦开始执行就不能被中断直到完成。C选项说“可以被中断”是错误的因为中断会导致原子性被破坏可能引发资源竞争错误。选C。6️⃣ 记忆口诀P申请V释放原子操作不可分。互斥初值设为1同步初值必须0。记录信号带队列阻塞唤醒不忙等。7️⃣ 小测验评论区对答案某系统采用记录型信号量机制信号量S的初值为3当前值为1此时若执行一次V(S)操作则S的值变为 。如果此后又执行一次P(S)操作则S的值变为 。A. 2, 1B. 2, 0C. 1, 0D. 1, 1本专栏日更2篇点击头像 → 专栏《软考中级高频考点》订阅第一时间接收新内容#软考中级 #软件设计师 #信号量 #PV操作 #进程同步 #操作系统