操作系统(5)

进程同步:解决的是多个进程按特定顺序执行的问题

进程异步:解决的是多个进程不能同时访问同一资源的问题

  • 对于临界资源(一次只一个进程访问的资源)的访问,需要互斥的进行

进程互斥的硬件实现方法:( TestAndSetSwap

TestAndSet(Ts/Tsl):它是一个原子操作,用于检查并修改内存值。它是实现自旋锁的基础。

可以保证"检查锁状态"和"上锁"这两个动作不会被中断。

  • 解决临界区最简单的方法就是:互斥锁

需要连续循环忙等的互斥锁,都可以称为:自旋锁(Ts指令、Swap指令)

P、V 操作

  • 可以这么理解,把信号量看作是一个资源,P操作是申请资源,V操作是释放资源

记录型信号量semaphore mutex = 1; //初始化信号量

  • 对不同的临界资源,需要设置不同的信号量

截屏2026-03-09 10.19

信号量机制实现进程互斥同步(前V后P)

  • 互斥:设置互斥信号量 初值为1, PV操作在一个进程里成对出现

  • 同步:设置同步信号量初值要看对应资源的初始值是多少,在“前操作”之后执行V,在“后操作”之前执行P

截屏2026-03-09 10.32

截屏2026-03-09 10.27

进程的前驱关系(本质上就是多级的进程同步)

截屏2026-03-09 10.45

⚠️ 生产者-消费者 问题

截屏2026-03-09 11.03

  • ⚠️请注意!!!!:实现互斥的P操作一定要放在实现同步的P操作之后,如果这两个P操作顺序颠倒(也就是先实现互斥P操作再实现同步P操作),就会产生死锁
    而两个V操作之间的顺序是可以颠倒的,不会导致进程阻塞

截屏2026-03-09 15.39

  • ⚠️ ! !

在生产者-消费者问题中,如果缓冲区大小为1,‘有可能不需要设置互斥信号量’就能实现 互斥访问缓冲区,但并不是绝对的

哲学家进餐问题

截屏2026-03-09 15.16

这种方式即不会出现死锁,也可以两人同时进餐

面试问题:⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

1. 如果面试官问:"P和V怎么实现互斥和同步?"

"P操作是申请资源,V操作是释放资源。

实现互斥的时候,把信号量初值设为1,用P和V把临界区包起来,保证只有一个进程能进去。

实现同步的时候,把信号量初值设为0,先执行的进程最后V一下,后执行的进程一开始就P一下,这样后执行的就会等先执行的做完。"

2.读写问题

如果面试官问:"你讲讲读者-写者问题怎么用信号量解决?"

你可以这样回答:

"读者-写者问题的核心是:读可以并行,写必须独占。

我用两个信号量:rw负责读写互斥,mutex保护读者计数器。第一个读者进来时要拿rw锁阻止写者,最后一个读者出去时要释放rw锁放行写者。中间的读者只增加计数,不碰rw锁,所以可以同时读。

不过这只是读者优先的方案,可能会导致写者饥饿。"

3. 你讲讲管程是什么,和信号量有什么区别?

"管程是一种高级同步机制,它把共享资源和操作封装在一起,自动保证互斥。和信号量相比:

  • 使用方式不同:信号量需要手动P/V操作,容易出错;管程自动处理同步,调用者只管用

  • 安全性不同:管程由编译器保证不会死锁(相对更安全)

  • 编程范式不同:管程更符合面向对象,把资源和方法封装在一起

  • 其实我平时用的synchronized就是管程的实现,用wait()和notify()来控制线程等待和唤醒,这就是管程思想在实际开发中的应用。"

synchronized:在java中,如果一个函数被关键字synchronized修饰,那么这个函数同一时间段内只能被一个线程调用

posted @ 2026-03-09 16:07  Lin_zx  阅读(1)  评论(0)    收藏  举报