2.4.4 信号量的应用

1. 利用信号量实现进程互斥

  为使多个进程能互斥的访问某临界资源,只需为该资源设置一个互斥信号量mutex,并设置其初值为 1 ,然后讲个进程访问该资源的临界区CS置于wait(mutex)和signal(mutex)操作之间即可。

  • 利用信号量实现进程互斥,mutex作为互斥锁使用
semaphore mutex=1; //只有一个资源
void P1(void)
{
while(1)
{
P(mutex); //当 mutex < 0 时停止
critical section // 进入临界区
V(mutex);
}
}
void P2(void)
{
while(1)
{
P(mutex);
critical section
V(mutex);
}
}

(1)wait 和 signal必须成对出现

(2)缺少 wait 会导致系统混乱,不能保证对临界区资源的互斥

(3)缺少 signal 将会使临界资源永远不被释放,从而使因等待的资源阻塞进程不被唤醒


2. 利用信号量实现前趋关系(同步关系)——>(自主命题常考前趋图)

  为实现先后执行 ——> 这种前趋关系,只需要使进程P1和P2共享一个公用信号量S,其初值为0,将 signal 操作放在语句S1后面,而在S2语句前面插入 wait 操作。由于S被初始化为0,若P2先执行必定阻塞,只有在进程P1执行完S1、signal(S)后使S++,P2进程方能执行S2(在执行S2前先等待,故初值为0做wait操作)



前趋图要点:首先,你要知道该进程被谁阻塞;其次,你要知道要唤醒哪个进程;


2.4.5 管程机制(408出过2次选择,自主命题看学校)

1. 管程的定义(进程的秘书)

  用少量信息和对资源所执行的操作来表征该资源,而忽略它们的内部结构和实现细节。

  一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据



1.1 管程四部分————> 类似C++中的类

  • 管程的名称;
  • 局部与管程的共享数据结构说明
  • 对该数据结构进行操作的一组过程
  • 对局部与管程的共享数据设置初值的语句

Monitor monitor_name //管程名
{
share variable declarations;
cond declarations; //条件变量
public:
void P1(){} //PV操作
void P2(){}
{initialization code;//初始化}
}

2.条件变量

  利用管程实现进程同步时,必须设置同步工具,如两个同步操作原语 wait 和 signal。

  当某进程通过管程请求获得临界资源而未能满足时,管程便调用 wait 原语使该进程等待,并将其排在等待队列上。仅当另一个进程访问完成并释放该资源后,管程才又调用signal原语,唤醒等待队列中的队首进程。



注意事项:

(1)管程对每个条件变量,都须予以说明,其形式为:condition x,y

(2)该变量应置于wait 和 signal 之前,可表示为X.wait 和 X.signal



例如:由于共享数据被占用而使调用进程等待,该条件变量形式为:condition nonbusy

wait 原语 ————> nonbusy.wait 或 cwait(nonbusy)

signal 原语 ————> nonbusy.signal

  • X.signal 操作的作用:重启一个被阻塞的进程,如果没有被阻塞进程,则X.signal操作不产生任何后果。这与信号量机制中的signal操作不同,这是由于信号量机制总要执行s=s+1操作,总会改变信号量的状态。

第二章 信号量及条件变量(三)——> 重点的更多相关文章

  1. Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句

    第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...

  2. QThread中的互斥、读写锁、信号量、条件变量

    该文出自:http://www.civilnet.cn/bbs/browse.php?topicno=78431 在gemfield的<从pthread到QThread>一文中我们了解了线 ...

  3. 【Qt开发】QThread中的互斥、读写锁、信号量、条件变量

    在gemfield的<从pthread到QThread>一文中我们了解了线程的基本使用,但是有一大部分的内容当时说要放到这片文章里讨论,那就是线程的同步问题.关于这个问题,gemfield ...

  4. 27 python 初学(信号量、条件变量、同步条件、队列)

    参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html  semaphore 信号量: condition 条件变量: event 同步条件:条件 ...

  5. Python:Day29 信号量、条件变量

    信号量:semaphore 信号量是用来控制线程并发数的.(理解:虽然GIL任意时刻都只有一个线程被执行,但是所有线程都有资格去抢,semaphore就是用来控制抢的GIL的数量,只有获取了semap ...

  6. 第二章 js数据类型和变量

    一.驼峰命名法 第一个单词首字母大写,如果有多个单词的话其他的单词首字母大写. eg:nickName 二.prototype现象 新的命名规范. 常用的:以下划线为首字母(变量为对象的私有成员变量) ...

  7. 《JAVA多线程编程核心技术》 笔记:第二章:对象及变量的并发访问

    一.基本概念1.安全的变量和不安全的变量2.脏读的理解3.锁重入:4.锁释放5.死循环:二.synchronized 的理解:三.synchronized 同步方法3.1 同步方法不具有继承性.3.2 ...

  8. Java多线程编程核心技术,第二章,对象和变量并发访问

    1,方法内部变量是线程安全的 2,实例变量非线程安全 3,synchronized是锁对象不是锁方法(锁对象是可以访问非synchronized方法,不可访问同个和其他synchronized方法 4 ...

  9. 《Java从入门到失业》第二章:Java环境(三):Java命令行工具

    2.3Java命令行工具 2.3.1编译运行 到了这里,是不是开始膨胀了,想写一段代码来秀一下?好吧,满足你!国际惯例,我们写一段HelloWorld.我们在某个目录下记事本,编写一段代码如下: 保存 ...

随机推荐

  1. 第11.8节 Python正则表达式的重复匹配模式及元字符“?”、 “*”、 “+”功能介绍

    符号"?".""."+"这三个元字符修饰符在Python中都表示重复匹配的模式,即要求匹配的字符串满足重复次数的要求,但具体重复次数要求不同 ...

  2. PyQt(Python+Qt)学习随笔:Qt Designer中部件的layoutDirection属性

    layoutDirection属性保存的是部件的布局方向,有三个取值: 在部件上设置布局方向时,它将传播到部件的子级,但不会传播到作为窗口的子级,也不会传播到已显式调用setLayoutDirecti ...

  3. PyQt(Python+Qt)学习随笔:设定toolButton弹出菜单的方法

    在Qt Designer中toolButton可以通过popupMode设定菜单弹出的模式,但并不能在Qt Designer中指定toolButton的弹出菜单,toolButton只能通过代码来指定 ...

  4. Zookeeper的基本原理(zk架构、zk存储结构、watch机制、独立安装zk、集群间同步复制)

    1.Hbase集群的高可用性与伸缩性 HBase可以实现对Regionserver的监控,当个别Regionserver不可访问时,将其负责的分区分给其他Regionsever,其转移过程较快,因为只 ...

  5. TMOOC-1692-分西瓜

    题目 描述 今天是阴历七月初五,首师大附中信息社团队员GDC的生日.GDC正在和SCX.WXY在首师大附中集训.他想给这两位兄弟买点什么庆祝生日,经过调查,GDC发现SCX和WXY都很喜欢吃西瓜,而且 ...

  6. NPM相关知识点

    1.Windows环境变量的配置 npm config set prefix "D:\Program Files\nodejs\node_global" npm config se ...

  7. Hexo博客框架10分钟搭建个人博客

    首先是先给大家打个招呼 最近看网上看到了很多的的关于搭建博客的视频,我自己也学着自己搭建了一个博客"我自己的博客链接"(欢迎大家来我的博客跟我深入交♂流),今天我把搭建的过程记录下 ...

  8. C++ 纯虚函数与抽象类——virtual 和纯说明符 “=0”

    什么时候使用纯虚函数 某些类,在现实角度和项目角度都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数只是为了提供一个形式上的接口,准备上子类来做具体的实现.此时这个方法就可以定义为&qu ...

  9. K8s 终将废弃 docker,TKE 早已支持 containerd

    近日 K8s 官方称最早将在 1.23版本弃用 docker 作为容器运行时,并在博客中强调可以使用如 containerd 等 CRI 运行时来代替 docker.本文会做详细解读,并介绍 dock ...

  10. [python学习手册-笔记]004.动态类型

    004.动态类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...