0%

进程同步

💡 TIP

image-20241220204542857

相关链接|死锁的必要条件

概念

临界区

  • 临界区:进程中涉及临界资源的代码段

  • 进入区.用于检查是否可以进入临界区的代码段。

  • 退出区:将临界区正被访问的标志恢复为未被访问标志。

  • 剩余区:其他代码

image-20241220192132479

同步进制应该遵守的准则

image-20241220192225160

进程同步机制

软件同步机制

  • 软件同步机制

    使用编程方法解决临界区问题

  • 硬件同步机制

    使用特殊的硬件指令,可有效的实现进程互斥

  • 信号量机制

  • 管程机制

信号量机制

image-20241220192922246

image-20241220192858207

信号量的使用

  1. 定义信号量

    一种临界资源,定义一个信号量

    互斥 —— 临界资源 —— s

  2. 初值

    s.value = 资源总数

  3. PV操作

    进临界区前 P(s)

    退出临界区V(s)

💡 TIP

做题小点

V操作是唤醒一个进程

并不是说停下当前进程执行另一进程

而是,将唤醒进程从当前信号量的阻塞队列中取出,放入就绪队列,等待系统调度。

利用信号量实现前驱/同步

image-20241220193803461

管程机制

管程定义的是公共的数据结构,如消息队列

进程定义的私有的数据结构,对进程是封闭的,进程无法访问

感觉像是将进程的同步与互斥封装到资源的使用中

就像是,在使用套接字时,会有个函数专门管理连接请求,在使用的过程中,我们发现,会有一个模式:即,当调用函数进行网络连接时,如果当前没有连接请求,调用函数的进程就会阻塞,而程序中不用显示的引用PV操作,而是利用库函数,对进程状态进行管控,简化了同步过程。

在进程访问资源时,都会调用管程,以申请资源,从而达到进程互斥的效果。

管程的三个特性

  • 模块化(封装性)

  • 抽象数据类型

  • 信息隐蔽

经典的进程同步问题

生产者消费者模型

一个生产者,一个消费者,一个缓冲区

image-20241220201806894

多个生产者,多个消费者,n个缓冲区

首先,生产者们与消费者们会相互竞争缓冲区队列,因为他们都会对缓冲区队列状态产生改变

其中,生产者们要竞争空位,以放入产品,消费者们要相互竞争产品。

所以还有空位信号量和物品信号量

image-20241220202557051

但申请空位/商品,必须在申请缓冲区队列之前,可以这样理解,先申请空位/商品,在申请进入缓冲区放/拿商品。

而且如果先申请进入队列,而恰好没有空位,此时进程会阻塞,而进程已经进入 进入队列的临界区,此时其他进程也讲无法进入队列临界区,导致消费者无法进入临界区消费,最后导致死锁。

读者写者问题

image-20241220203146955

image-20241220203455858

写者需要等待所有读者进程均退出后才能接着写

如果当前无读者,则可能资源处于“写”状态,需要申请;

如果当前有读者,说明当前资源处于“读”状态,无需申请;

如果当前所有读者均读完(readcount == 0  即没有读者了),可能等待队列中有写者在被阻塞,则最后一个读者负责唤醒“写进程”。

image-20241220204045095

哲学家进餐问题

image-20241220204127428

💡 TIP

破坏死锁的任何一个必要条件即可死锁的必要条件

信号量使用总结

image-20241220204453017

image-20241220204510426

image-20241220204530903


(完)