10信号量与管程

18.1信号量

回顾

■并发问题

多线程并发导致资源竞争

■同步概念

协调多线程对共享数据的访问

任何时刻只能有一个线程执行临界区代码

■确保同步正确的方法

底层硬件支持

高层次的编程抽象

基本同步方法

信号量(semaphore)

■信号量是操作系统提供的一种协调共享资源访问的方法

软件同步是平等线程间的一种同步协商机制(线程是平等的)

OS是管理者,地位高于进程

用信号量表示系统资源的数量

■由Dijkstra在20世纪60年代提出

■早期的操作系统的主要同步机制

现在很少用(但还是非常重要在计算机科学研究)

■信号量是一种抽象数据类型

·由一个整形(sem)变量(共享资源数目)和两个原子操作组成

·P()(Prolaag(荷兰语尝试减少))

sem减1

如sem<0,进入等待,否则继续

·V()(Verhoog(荷兰语增加))

sem加1

如sem≤0,唤醒一个等待进程

信号量的特性

■信号量是被保护的整数变量

初始化完成后,只能通过P()和V()操作修改

由操作系统保证,PV操作是原子操作

■P()可能阻塞,V()不会阻塞

■通常假定信号量是“公平的”

线程不会被无限期阻塞在P()操作

假定信号量等待按先进先出排队

自旋锁能否实现先进先出?

自旋锁是需要占用CPU随时随地去查标志,有可能临界区的使用者退出的时候它刚改完标志,下一个进入者哪个线程去查,那它就能进去,如果说运气不好,正好是这个资源变成有效的时候,你去查的时候在你之前就有一个人已经查过了,就没有办法按照你等待的这个顺序来执行。

信号量的实现

18.2信号量的使用

精髓:

基本原理:两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。任何复杂的合作需求都可以通过适当的信号结构得到满足。为了发信号,需要使用一个称做信号量的特殊变量。信号量分类

■可分为两种信号量

·二进制信号量:资源数目为0或1(有些系统称为互斥锁)

·资源信号量:资源数目为任何非负值

·两者等价

基于一个可以实现另一个

■信号量的使用

·互斥访问

■临界区的互斥访问控制

·条件同步

线程间的事件等待

用信号量实现临界区的互斥访问

用一个信号量来对应一个临界区,,通过mutex的值来确定该资源的情况,P()减一V()加一,但mutex为负值的时候表示使用该资源的线程有在排队的,这样来实现互斥访问

用信号量实现条件同步

也是通过condition这个值来控制的,有一个资源B只在使用,只用通过V()操作加一后,condition的值小于等于0就知道有另一个线程A在等他,然后唤醒A。


生产者-消费者问题

用信号量解决生产者-消费者问题

P、V操作的顺序有影响吗?

P、V颠倒会出现死锁,原因是先检查空、满再去申请互斥访问,如果申请了互斥访问,申请的进程已经占用了临界资源,其他进程不能读写,但是里面发现又是满的(写者)或者是空的(读者),写也写不下去,读也读不到,其他进程也不能申请这个临界区,所以形成死锁。

使用信号量的困难

■读/开发代码比较困难

程序员需要能运用信号量机制

■容易出错(忘了一个P/V操作或者操作顺序颠倒)

使用的信号量已经被另一个线程占用

忘记释放信号量

■不能够处理死锁问题

概念:信号量的关键之处是它们原子地执行。

SMP系统必须提供其他加锁技术(如自旋锁),以确保wait()和signal()(即P()V())可原子地执行。

18.3管程

基本同步方法

管程(Moniter)

■管程是一种用于多线程互斥访问共享资源的程序结构

采用面向对象方法,简化了线程间的同步控制

任一时刻最多只有一个线程执行管程代码

正在管程中的线程可临时放弃管程的互斥访问,等待事件出现时恢复

■管程的使用

在对象/模块中,收集相关共享数据

定义访问共享数据的方法

概念:管程类型提供了一组由程序员定义的、在管程内互斥的操作。

管程的组成

■一个锁(入口)

控制管程代码的互斥访问

■0或者多个条件变量

管理共享数据的并发访问

只允许一个线程在管程内部执行,如果说在这个内部,没有其它共享数据的话这时候呢就和临界区是完全一样的

管程特有:用来管理共享数据的并发访问需要这些共享资源的时候,与相应的条件变量对应的互斥操作才能执行

条件变量(Condition Variable)

■条件变量是管程内的等待机制

进入管程的线程因资源被占用而进入等待状态

每个条件变量表示一种等待原因,对应一个等待队列

条件变量仅有的操作wait和signal

■Wait()操作

将自己阻塞在等待队列中

被signal()唤醒一个等待者或释放管程的互斥访问

■Signal()操作

将等待队列中的一个线程唤醒

如果等待队列为空,则等同空操作

条件变量实现

用管程解决生产者-消费者问题

管程条件变量的释放处理方式

Hansen管程与Hoare管程

18.4哲学家就餐问题

方案1(信号量)

方案2(临界区)

方案3(保证每个哲学家拿起不同方向的叉)

18.5读者-写者问题

用信号量解决读者-写者问题

用管程解决读者-写者问题

精髓:

17、18小结

现代操作系统的核心是多道程序设计、多处理器和分布式处理器,这些方案的基础以及操作系统设计技术的基础是并发。当多个进程并发执行时,不论是在多处理器系统的情况下,还是单处理器多道程序系统中,都会产生冲突和合作的问题。

并发进程可以按多种方式进行交互。互相之间不知道对方的进程可能需要竞争使用资源,如处理器时间或对I/O设备的访问。进程间由于共享访问一个公共对象,如一块内存空间或一个文件,可能间接知道对方,这类交互中产生的重要问题是互斥和死锁。

互斥指的是,对一组并发进程,一次只有一个进程能够访问给定的资源或执行给定的功能。互斥技术可以用于解决诸如资源争用之类的冲突,还可以用于进程间的同步,使得它们可以合作。后一种情况的一个例子是生产者/消费者模型,一个进程向缓冲区中放数据,另一个或更多的进程从缓冲区中取数据。

支持互斥的第二种方法涉及使用专门的机器指令,这种方法减少了开销,但由于使用了忙等待,效率较低。

支持互斥的另一种方法是在操作系统中提供相应的功能,其中最常见的两种技术是信号量和消息机制。信号量用于在进程间发信号,并可以很容易地实施一个互斥协议。消息对实施互斥是很有用的,它还为进程间的通信提供了一种有效的方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容