1. 进程同步
文章目录
1.1. 并发进程
1.1.1. 进程的并发性
-
概念:
- 进程执行的并发性:一组进程的执行在时间上是重叠的
- 并发性举例:有两个进程A(a1、a2、a3)和B(b1、b2、b3)并发执行
- 从宏观上看,并发性反映一个时间段中几个进程都在同一处理器上,处于运行还未运行结束状态。
- 从微观上看,任一时刻仅有一个进程在处理器上运行。
-
并发的实质是一个处理器在几个进程之间的多路复用,并发是对有限的物理资源强制行使多用户共享,消除计算机部件之间的互等现象,以提高系统资源利用率。
-
并发进程分类:无关的,交往的
无关的并发进程:
一组并发进程分别在不同的变量集合上操作,一个进程的执行与其他并发进程的进展无关交往的并发进程:
一组并发进程共享某些变量,一个进程的执行可能影响其他并发进程的结果。
-
并发程序设计的优点:
- 对于单处理器系统,可让处理器和各I/O设备同时工作,发挥硬部件的并行能力。
- 对于多处理器系统,可让各进程在不同处理器上物理地并行,加快计算速度。
- 简化了程序设计任务。
-
并发程序设计的目的
- 充分发挥硬件的并行性,提高系统效率。硬件能并行工作仅有了提高效率的可能性,硬部件并行性的实现需要软件技术去利用和发挥,这种软件技术就是并发程序设计。
- 并发程序设计是多道程序设计的基础,多道程序的实质就是把并发程序设计引入到系统中。
-
与时间有关的错误
- 结果不唯一
- 永远等待
1.2. 竞争与协作
-
竞争关系
- 系统中的多个进程之间彼此无关
- 系统中的多个进程之间彼此相关
- 资源竞争的两个控制问题:
- 一个是死锁(Deadlock)问题,
- 一个是饥饿(Starvation) 问题,既要解决饥饿问题,又要解决死锁问题。
-
互斥
- 进程互斥是指若干个进程因相互争夺独占型资源时所产生的竞争制约关系。
-
协作关系
- 某些进程为完成同一任务需要分工协作。
- 进程同步指为完成共同任务的并发进程基于某个条件来协调它们的活动,因为需要在某些位置上排定执行的先后次序而等待、传递信号或消息所产生的协作制约关系。
- 进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于协作进程的消息或信号,当一个进程没有得到来自于协作进程的消息或信号时需等待,直到消息或信号到达才被唤醒。
- 进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源,是对进程使用资源次序上的一种协调。
1.3. 互斥与临界区
-
并发进程中与共享变量有关的程序段叫“临界区”,共享变量代表的资源叫“临界资源”。
-
与同一变量有关的临界区分散在各进程的程序段中,而各进程的执行速度不可预知。
-
如果保证进程在临界区执行时,不让另一个进程进入临界区,即各进程对共享变量的访问是互斥的,就不会造成与时间有关的错误。
-
一次至多一个进程能够进入临界区内执行;
-
如果已有进程在临界区,其他试图进入的进程应等待;
-
进入临界区内的进程应在有限时间内退出,以便让等待进程中的一个进入。
-
临界区调度原则:
- 互斥使用、有空让进,忙则等待、有限等待,择一而入,算法可行;
-
临界区管理尝试
-
实现临界区管理的软件算法
Peterson算法 -
实现临界区管理的硬件设施
-
关中断
-
测试并建立指令
bool TS(bool &x) { if(x) { x = false;//true表示当前资源可用,于是占用,并置x为false retrun true; } else { retrun false; } } bool s = true; process Pi() { while(!TS(i));//上锁(持续检测直到x为true) s = true;//开锁 }
-
对换指令
void SWAP(bool &a,bool &b) { bool temp = a; a = b; b = temp; } bool lock false;//false表示当前资源可用 process Pi() { bool keyi = true; do{ SWAP(keyi,lock);//上锁(持续检测直到keyi为false,说明已经交换,占位成功) }while(keyi); SWAP(keyi,lock);//开锁 }
-
1.4. 信号量与PV操作
-
前面两种方法解决临界区调度问题的缺点:
- 对不能进入临界区的进程,采用忙式等待测试法,浪费CPU时间。
- 将测试能否进入临界区的责任推给各个竞争的进程会削弱系统的可靠性,加重了用户编程负担。
-
信号量和P、V操作
- 信号量:一种软件资源
- 原语:内核中执行时不可被中断的过程
- P操作原语和V操作原语
- 一个进程在某一特殊点上被迫停止执行直到接收到一个对应的特殊变量值,这种特殊变量就是信号量(semaphore),复杂的进程合作需求都可以通过适当的信号结构得到满足。
- 操作系统中,信号量表示物理资源的实体,它是一个与队列有关的整型变量。
- 实现时,信号量是一种记录型数据结构,有两个分量:一个是信号量的值,另一个是信号量队列的队列指针。
-
信号量按其用途可分为两种:
- 公用信号量,联系一组并发进程,相关的进程均可在此信号量上执行P、V操作,初值往往为1,用子实现进程互斥;
- 私有信号量,联系一组并发进程 ,仅允许此信号量所拥有的进程执行P操作,而其他相关进程可在其上施行v操作,初值往往为0或正整数,多用于并发进程同步。
-
信号量按其取值可分为两种:
- 二元信号量,仅允许取值为0或1,主要用于解决进程互斥问题;
- 一般信号量,又称计数信号量,允许取大于1的整型值,主要用于解决进程同步问题。
1.5. 哲学家就餐问题
- 问题描述:
五个哲学家围绕坐在一个圆形餐桌前,桌上放着五支筷子,每两个哲学家之间放一个筷子。哲学家的动作包括就餐和思考。思考不需要拿筷子,而就餐需要拿到两个筷子才能就餐。两个相邻的哲学家需要共享一个筷子(这个筷子就是一个共享资源)。
这种情况可能产生死锁,比如每个哲学家都拿着左手的筷子,永远都在等右边的筷子(或者相反)。
如何保证哲学家的动作有序进行,使得总有哲学家能拿到两个叉子就餐?
- 解决方法:
方法一:
同时只允许四位哲学家同时拿起同一边的筷子,这样就能保证一定会有一位哲学家能够拿起两根筷子完成进食并释放资源,供其他哲学家使用,从而实现永动,避免了死锁方法二:
使用AND信号量机制,意思就是如果想给某个哲学家筷子,就将他需要的所有资源都给他,然后让他进餐,否则就一个都不给他方法三:
规定奇数号哲学家先拿起他左边的筷子,然后再去拿他右边的筷子,而偶数号的哲学家则相反,这样的话总能保证一个哲学家能获得两根筷子完成进餐,从而释放其所占用的资源
1.6. 信号量解决生产者消费者问题
- 一个生产者、一个消费者共享一个缓冲区
- 一个生产者、一个消费者共享多个缓冲区
- 多个生产者、多个消费者共享多个缓冲区
1.7. 信号量解决读者-写者问题
- 有两组并发进程:读者和写者,共享一个文件F,要求:
- 允许多个读者同时执行读操作
- 任一写者在完成写操作之前不允许其它读者或写者工作
- 写者执行写操作前,应让已有的写者和读者全部退出
1.8. 信号量解决理发师问题
理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理发师如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开