并发与同步
进程互斥
- 进程互斥的解决的办法
- 由竞争双方平等协商
- 引入进程管理者
-
资源共享的程度分为三个层次:互斥、死锁、饥饿
-
临界资源的访问过程:进入区、临界区、退出区、剩余区
进程同步机制应遵循的原则
- 空闲让进
- 忙则等待
- 优先等待
- 让权等待
进程互斥的硬件方法
1.TS指令 2. Swap指令 3.信 量(软件方法)
进程之间通信的方式
- 共享文件
- 消息机制
- 通过共享文件
同步
注意事项:
- 无论多个线程的指令序列怎样交替执行,程序都必须正常工作
-> 多线程程序具有不确定性和不可重现的特点
-> 不经过专门设计,调试难度很高 - 不确定性要求并行程序的正确性
-> 先思考清楚问题,把程序的行为设计清楚
-> 切忌急于着手编写代码,碰到问题再调试
信 量和管程
为什么需要信 量
- 回顾一下lock能解决并发问题中竞争条件(竞态条件)对资源的争夺;
- 但是lock不能解决同步问题,需要更高级的方式实现同步(包括多线程共享公共数据的协调执行;互斥与条件同步的实现(互斥是指同一时间只能有一个线程可以执行临界区));
- 信 量初始值设置为1,一个线程开头信 量减一锁上,完事后加一解锁;想一想,如果别的线程也想执行,当他执行P操作的时候,信 量为负数了,此时其它的线程就不得不等待,等到当前线程执行完后V操作了,另一个线程才能执行。
用二进制信 量实现线程同步(调度约束)
P()等待,V()发出信 。
生产者-消费者模型的正确性要求
->在任何一个时间只能有一个线程操作缓冲区(互斥);
->当缓冲区为空时,消费者必须等待(调度/同步约束);
->当缓冲区满了时,生产者必须等待(调度/同步约束);
生产者-消费者模型实现策略
->利用一个二进制信 量实现互斥,也就是锁的功能;
->用一个计数信 量fullbuffers来约束生产者;
->用一个计数信 量emptybuffers来约束消费者;
信 量的用途:互斥和条件同步(注意等待的条件是独立的互斥);
信 量的缺点:读/开发代码困难;容易出错(使用的信 量被另一个线程占用,完了释放信 量);不能够处理死锁;
管程monitor
(2)signal():
- 基本的硬件操作(禁用中断/原子指令/原子操作)是高层抽象(信 量/锁/条件变量)的基础,采取不同的高层抽象的算法策略,可以实现临界区和管程等不同的并发编程策略。
读者写者问题
- 目的:共享数据的访问;
使用者类型
-> 读者(不需要修改数据);
-> 写者(读取和修改数据)。
问题的约束
-> 允许同一时间有多个读者,但是任何时间只能有一饿写者;
-> 当没有写者时,读者才可以访问数据;
-> 当没有读者和其他写者时,写者才能访问数据;
-> 在任何时候只能有一个线程可以操作共享变量。
共享数据包括
-> 数据集;
-> 信 量CountMutex(初始值为1,约束读者);
-> 信 量WriteMutex(初始值为1,约束写者);
-> 读者数量Rcount(整数,初始值为1)。
基于信 量的读者优先
你知道的越多,你不知道的越多。
有道无术,术尚可求,有术无道,止于术。
如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!