第六章 进程同步(synchronization)
协作进程可以在系统内执行其他进程相互影响的进程。可以共享逻辑地址空间(代码和数据)共享数据的并发性,可能会产生数据的不一致,本章讨论确保共享同一逻辑地址的进程有序执行,维护数据的一致性。
Processes can execute concurrently
May be interrupted at any time, partially completing execution
Concurrent access to shared data may result in data inconsistency
Maintaining data consistency requires mechanisms to ensure the orderly execution of cooperating processes.
Illustration of the problem
本章目标:
临界区域问题,可以确保共享数据的一致性(the critical-section problem consistency)
临界区域的软件、硬件解决方案硬件同步(Peterson’s Solution synchronization Hardware)
死锁问题(deadlock),并发进程(concurrent processes),信号量
同步的经典问题的方法论(classic problems od synchronization methodology)
操作系统示例(operating systems examples)
生产者消费者模型
回顾一下recall,
在缓冲区最多只有BUFFER_SIZE-1项 ,修改这一算法缺陷
增加一个整数变量counter,初值为0,增加一项,counter+1移走一项递减。
跟踪缓存区的数量(track of the number of full buffer)
存在的问题在于如果并发执行,++,- -会造成错误的结果。
竞争条件(race condition)
多个进程并发访问和操作统一数据执行结果和访问发生的特定顺序有关
进程同步(process synchronization)
协调(coordination)
临界区问题
临界区(critical section)
一个进程进入临界区的时候呀,没有其他进程可以进入在临界区执行。
进程可以改变变量。更新表格,写文件等;
进入区(entry section)
退出区(exit section)
剩余区(remainder section)
临界区问题接待的三项要求:
- 互斥(mutual exclusion)只能同时执行一个进程
- 前进(progress)临界区无进程,有进程要进临界区,参与选择进入,有限等待。
- 有限等待(bounded waiting)进程可以经过有限的等待时间进入临界区
两种方法处理临界区问题
抢占内核(preemptive kernel)允许处于内核模式的进程抢占,Linux,UNIX(Solaris)
非抢占内核(nonpreemptive kernel)Windos XP
Peterson 算法(基于软件的临界区解答)
数据结构:
两个进程 P0,P1,(Pi,Pj)j=1-i
共享数据项:
Int turn; //那个进程可以进入临界区
Boolean flag[2]; //哪个进程想要进入临界区
算法说明:
Turn的值决定了那个进程可以进入临界区
只需要证明上面叙述的3个临界区的要求即可
硬件同步
任何临界区问题都需要一个简单的工具——锁
采用的从硬件到应用程序员课件的软件API技术
Atomic= non-interruptible
Either test memory word and set value
Or swap contents of two memory words.
TestandSet()解决方法
特殊硬件执行可以原子的(不可中断的执行)
声明一个
Boolean lock=false;
数据结构:
Boolean waiting[n]; 初始值为false,true进入等待队列
Boolean lock;
只有waiting[i]=false,或者key=false;进入临界区;
互斥锁 mutex locks
Os designers 给我们的软件工具——mutex lock
信号量 semaphore
数据结构:
信号量S是个整数变量,初始化
Wait() 减少信号量计数
Signal() 增加信号量计数
两个函数中的对整型的修改不可分的进行
两个信号量的类型
more sophisticated ways (than mutex locks) for processes to synchronize their activities.
计数信号量 初始化为可用资源的个数
二进制信号量 mutex初始化为1
针对进入自循环等待的信号量叫做(spinlock)
被阻塞之后放入等待序列之中。
死锁和饥饿
两个或多个进程无限的等待一个事件,该事件只能由这些等待进程之一来实现
经典同步问题
有限缓冲问题
信号量 Empty(空缓冲项)初始化为n, full(满缓冲项)个数,初始化为0
读者-写者问题
矛盾问题描述:
读者可以同时访问数据,写者不可以访问数据,写者在写的时候读者不可访问数据
数据结构:
Semaphore mutex,wrt; 初始化均为1
Int readcount; 初始化为0
哲学家用餐问题
哲学家消耗生命吃饭和思考
不能和邻居交流,有时拿起两个筷子(一次)开始吃饭
需要一双筷子吃饭,吃完之后放下一双筷子
哲学家问题的解决方法:
最多只有4个哲学家可以坐在座子上
两个筷子都可使用的时候才允许一个哲学家拿起来
非对称解决方法,拿起筷子的顺序不一样