您的位置:首页 > 其它

操作系统第六章进程同步学习笔记

2019-04-25 23:04 253 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_42734344/article/details/89528237

进程同步

背景

弥补有限缓冲问题最多只有buffer-1项,加一个计数值count。但是并发执行时count值可能“count++”与“count–”同时执行,因此count值有三种可能。实际只应该有一种。即多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关,称为竞争条件。为避免竞争条件,需要确保一段时间内只有一个进程能操作变量。为了实现这种保证,要求进行进程同步。

临界区问题

临界区:在该区中可能改变共同变量,更新一个表,写一个文件。当一个进程进入临界区时,其他进程不可在临界区中执行。

临界区问题是设计一个协议:每个进程必须请求进入临界区。实现请求的代码进入区,进入临界区,执行完有退出区,其余为剩余区。

临界区必须满足三项要求:

  1. 互斥:一个进程执行中不允许其它进程进入
  2. 前进:没有进程在临界区时不在剩余区的进程可被选择进入临界区,且这种选择不能无限推迟。(空闲让进)
  3. 有限等待:从一个进程申请进入,到进入,其它进程进入临界区的次数有上限。(不能被饿死)

抢占内核与非抢占内核,非抢占内核不会出现竞争条件,但是非抢占内核更适合实时编程,因为其响应速度快,能够允许实时进程抢占处于内核模式允许的其它进程。

Peterson算法

假定两个进程分别为pi和pj,两个共享数据项:turn

Flag[2]。Turn=i表示进程pi可以进入临界区,flag[i]=true表示进程pi可以进入临界区。只有两个进程的时候可分析peterson算法满足三个条件。

硬件同步

临界区用锁同步,避免竞争条件。一个进程进入临界区前得到锁,退出临界区时释放锁。

单处理环境:修改共享变量时禁止中断。

多处理环境:进制中断费时,影响了系统时钟,降低效率。

原子执行:不可中断地检查和修改字的内容或交换两个字的内容。

几种实现算法:

TestAndSet

Lock 初始化为false。一个进程进入之后lock值被设置为true直至该进程完成。

  1. Swap操作

Lock初始化为false

以上两个算法都没满足有限等待条件。

  1. 一个满足利用TestAndSet满足三个条件的算法

公用数据waiting
和lock,均初始化为false

当一个进程退出临界区时,会循环扫描数组waiting[i],任何等待进入临界区的进程只需等待n-1次。

信号量

信号量是个整数变量,除初始化外,只能用wait()和signal()来访问。(PV操作)

一个进程修改信号量值时,不能有其他进程同时修改其值。

计数信号量:值域不受限制

二进制信号量:只能为0或1,有的系统称其为互斥锁

n个进程共享一个mutex,初始化为1.

信号量缺点是忙等待:一个进程进入临界区,其他试图进入的进程都在不断循环。也称为自旋锁。解决自旋锁的方案是将需循环的进程切换成等待状态,当可以执行时再唤醒。

死锁和饥饿

死锁:两个或多个进程无限地等待一个事件,而该事件只能由这些等待进程之一来产生。

经典同步问题

有限缓冲问题:mutex用于满足互斥要求,初始化为1,empty和full表示空缓冲项和满缓冲项。Empty初始化为n,full为0。

读者-写者问题

只读数据库的称为读者,进行读和写的称为写者。读者可以同时访问,但是写者不可以。

Muutex和wrt初始化为1,readcount初始化为0

哲学家进餐问题:

所有chopstic初始化为1。

只允许四个哲学家

只有两只筷子都可用才能拿起来

使用非对称

进程同步

背景

弥补有限缓冲问题最多只有buffer-1项,加一个计数值count。但是并发执行时count值可能“count++”与“count–”同时执行,因此count值有三种可能。实际只应该有一种。即多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关,称为竞争条件。为避免竞争条件,需要确保一段时间内只有一个进程能操作变量。为了实现这种保证,要求进行进程同步。

临界区问题

临界区:在该区中可能改变共同变量,更新一个表,写一个文件。当一个进程进入临界区时,其他进程不可在临界区中执行。

临界区问题是设计一个协议:每个进程必须请求进入临界区。实现请求的代码进入区,进入临界区,执行完有退出区,其余为剩余区。

临界区必须满足三项要求:

1.       互斥:一个进程执行中不允许其它进程进入

2.       前进:没有进程在临界区时不在剩余区的进程可被选择进入临界区,且这种选择不能无限推迟。(空闲让进)

3.       有限等待:从一个进程申请进入,到进入,其它进程进入临界区的次数有上限。(不能被饿死)

抢占内核与非抢占内核,非抢占内核不会出现竞争条件,但是非抢占内核更适合实时编程,因为其响应速度快,能够允许实时进程抢占处于内核模式允许的其它进程。

Peterson算法

假定两个进程分别为pi和pj,两个共享数据项:turn

Flag[2]。Turn=i表示进程pi可以进入临界区,flag[i]=true表示进程pi可以进入临界区。只有两个进程的时候可分析peterson算法满足三个条件。

硬件同步

临界区用锁同步,避免竞争条件。一个进程进入临界区前得到锁,退出临界区时释放锁。

单处理环境:修改共享变量时禁止中断。

< 3ff7 p>多处理环境:进制中断费时,影响了系统时钟,降低效率。

原子执行:不可中断地检查和修改字的内容或交换两个字的内容。

几种实现算法:

1.

TestAndSet

Lock 初始化为false。一个进程进入之后lock值被设置为true直至该进程完成。

2.       Swap操作

Lock初始化为false

以上两个算法都没满足有限等待条件。

3.       一个满足利用TestAndSet满足三个条件的算法

公用数据waiting
和lock,均初始化为false

当一个进程退出临界区时,会循环扫描数组waiting[i],任何等待进入临界区的进程只需等待n-1次。

信号量

信号量是个整数变量,除初始化外,只能用wait()和signal()来访问。(PV操作)

一个进程修改信号量值时,不能有其他进程同时修改其值。

计数信号量:值域不受限制

二进制信号量:只能为0或1,有的系统称其为互斥锁

n个进程共享一个mutex,初始化为1.

信号量缺点是忙等待:一个进程进入临界区,其他试图进入的进程都在不断循环。也称为自旋锁。解决自旋锁的方案是将需循环的进程切换成等待状态,当可以执行时再唤醒。

死锁和饥饿

死锁:两个或多个进程无限地等待一个事件,而该事件只能由这些等待进程之一来产生。

经典同步问题

有限缓冲问题:mutex用于满足互斥要求,初始化为1,empty和full表示空缓冲项和满缓冲项。Empty初始化为n,full为0。

读者-写者问题

只读数据库的称为读者,进行读和写的称为写者。读者可以同时访问,但是写者不可以。

Muutex和wrt初始化为1,readcount初始化为0

哲学家进餐问题:

所有chopstic初始化为1。

只允许四个哲学家

只有两只筷子都可用才能拿起来

使用非对称

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: