并发执行
并发执行,不可避免地产生了多个进程对同一个共享资源访问,造成了资源的争夺。
进程的同步和互斥
同步与互斥的区别与联系
互斥:某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。互斥无法限制访问者对资源的访问顺序,即访问是无序访问。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有对资源的写入的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
机制设计上应遵循的原则
空闲让进
忙则等待
有限等待
让权等待
解决并发访问临界资源的问题
程序常见问题:使用大量while语句,造成忙等待(浪费CPU时间)
优先级反转:低优先级进程先进入临界区,高优先级进程一直忙等
使用信号量机制实现同步
信号量是Dijkstra1965年提出的一种方法,它使用一个整型变量来累计唤醒次数,供以后使用。在他的建议中引入了一个新的变量类型,称作信号(semaphore)。
Dijkstra建议设立两种操作,P(S)和V(S)操作。P、V分别是荷兰语的test(proberen)和increment(verhogen)。P操作也称为semWait或Down操作,V操作也称为semSignal或Up操作。PV操作属于进程的低级通信。
信号量是一类特殊的变量,程序对其访问都是原子操作,且只允许对它进行P(信号变量)和V(信号变量)操作。
信号量的定义
二元信号量的机制
通常使用二元信号量的PV操作实现两个进程的互斥。
应用时应注意:
• 每个进程中用于实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。
• P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
• 互斥信号量的初值一般为1。
-
semWait 操作(P操作)使信号量减1。若值为负,则执行semWait的进程被阻塞。否则进程继续执行。
-
semSignal操作(V操作)使信号量加1。若值小于或等于零,则被semWait操作阻塞的进程被解除阻塞。
S.value为正时表示资源的个数
S.value为负时表示等待进程的个数
信号量的应用
进程同步/互斥类问题求解方法
优点:
• 简单,而且表达能力强(用P.V操作可解决任何同步互斥问题)
缺点:• 不够安全;P.V操作使用不当会出现死锁;遇到复
杂同步互斥问题时实现复杂
进程间通信(Inter-Process-Comm)
共享内存
经典进程同步问题
生产者-消费者问题(the producer-consumer problem)
读者-写者问题(the readers-writers problem)
哲学家进餐问题(the dining philosophers problem)
(1)生产者-消费者问题
(2)读者-写者问题
行为分析
读进程的行为:
• 系统中会有多个读进程同时访问共享数据。
• 可分为三类:第一个进入的读进程(占有资源),最后一个离开的读进程(释放资源)和其他读进程。
• 需要设置一个计数器readcount来记录读进程的数目。
写进程的行为:排他性的使用资源。
确定同步与互斥关系:
• 读者-读者:共享Data, 互斥访问readcount
• 读者-写者:互斥访问Data
• 写者-写者:互斥访问Data
确定临界资源:
• Data, readcount
拓展性思考
写者优先含义解释:只要来了写者,在当前读者进程结束之后立刻执行写者,而不是让读者进程继续进入。
(3)哲学家就餐问题
解决方案: