2 3 4

ch6 synchronization

process synchronization(进程同步)

  • 从一个并发执行的例子说起。。。

  • 这个程序的输出为:

  • Concurrency — Many problems arise, and must be addressed, when working
    on many things at once (i.e., concurrently) in the same program.

  • 协作进程能直接共享逻辑地址空间(即代码和数据),或能通过文件或消息来共享数据。前一种情况可以通过线程实现。

  • 然而,共享数据的并发访问可能导致数据的不一致。如上个例子所示

background

  • 进程调度程序可以快速切换进程来实现并发。一个进程在另一个进程被调度前可能只完成了部分执行。 如果在执行它的途中被中断,并且处理核用于执行其他进程的指令,那么就会导致数据的混乱!
  • 举个栗子

    这里counter逻辑上讲应该是52,实际上确实51!

    本质上是由不恰当的调度引起的!
  • 多个进程并发访问和操作同一个数据并且执行结果和特定访问顺序相关,称为竞争条件(race comdition)
  • 因此,我们要研究如何进行process synchronization(进程同步)

the critical-section problem(临界区问题)

  • n个进程{\(P_0\)~\(P_{N-1}\)},每个进程有一段代码,称为critical section,进程在执行该区时可能修改公共变量,更新一个表,写一个文件等

  • 当一个进程在临界区执行时,其它进程不允许在它们的临界区执行。

  • 临界区问题:设计一个协议(protocol)以便协作进程。

  • entry section: 进入临界区前,每个进程在进入区应请求许可
    exit section
    reminder section

  • an algorithm for process \(P_i\)

    这个算法正确吗?

  • 答案是不正确的。 表面上看这个算法可以实现进程之间的切换,但如果只有一个进程,它就会”陷入迷茫”

  • 临界区问题的解决方案应该满足三条要求:
    \(\color{red}{mutual~ exclusion(互斥)}\) :如果进程\(P_i\)在其临界区内执行,其他进程都不能在其临界区内执行
    \(\color{red}{progress(进步,空闲让进)}\) :如果没有进程在其临界区内执行,并且有进程需要进入临界区,那么只有那些不在剩余区内执行的进程可以参加选择来决定谁能下次进入临界区。 这种选择不能无限推迟
    \(\color{red}{bounded waiting(有限等待)}\): 请求访问的进程应该能在有限时间内进入临界区

  • Two approaches to handel in OS
    -preemptive kernel(抢占式内核):允许处于内核模式的内核被抢占
    -nonpreemptive kernel

//互斥--一山不容二虎
前进--临界区必须得有进程工作
有限等待--临界区不能被一个进程霸占

喂金鱼案例理解临界区问题(临时插一个网上找的很形象教程!

方案一


方案二


方案三



注:因为两个人可能先后先留下了纸条,还没来得及喂,就发现了对方的纸条,于是就都不喂了

方案四


总结

互斥锁

操作系统设计人员给我们提供一些软件工具,帮我们解决临界区带来的问题,这个最简单的软件工具就是互斥锁;
一个进程必须获得一把锁才可以进入临界区;
一个进程在退出临界区时候必须释放该锁;




Mutex Locks(互斥锁)

  • 一种解决方法是在临界区附近加“锁”来保护临界区,防止竞争条件
  • A lock is just a variable
  • How to use a lock:

  • 互斥锁是利用硬件特性的一种利用硬件性能的解决方法,可以简化编程工作,提高系统效率

Controlling Interrults

对于单处理器环境,临界区问题可以简单地解决:在修改共享变量时只要禁止中断出现。这样可以确保当前指令流有序执行,不会被抢占。由于不可能执行其他指令,因此共享变量也就不会被意外地修改。 这种方法通常为抢占式内核采用。
对于多处理器环境,这种解决方案不可行。多处理器中断禁止很耗时,因为消息要传到其它所有处理器,消息传递会延迟进入临界区,降低系统效率。 另外,如果系统时钟通过中断来更新的,它也会受到影响。


Peterson's Solution

这是一个用软件解决的算法

  • 适用于两个进程在临界区和剩余区间交替执行
    要求两个进程之间共享两个数据项
    变量turn表示哪个进程可以进入临界区
    数组flag表示哪个进程准备进入临界区
  • 网上奇妙的解释: peterson就是孔融让梨,我想要你也想要,我让给你,你让给我,最后就是我收下临界区(每个人只能让一次)

why failed?




Bakery Algorithm(面包店算法

  • 第一个试图进入临界区的进程\(P_i\)在没有其他进程竞争时顺利进入其临界区。满足progress需求
  • 当有竞争者\(P_k(i<k)\),且选的号码相同时,比较进程的名称,通过

    选择进入的进程
  • choosing[i]表示进程\(P_i\)是否在抓号,=1表示在抓号
    number[i]表示抓到的号码,初值为0表示没有抓号

conclusion

Teat And Set

Motivation of Teat-And_set:Why Failed?



Compare And Swap(这部分没大看懂呀。。)






condition variables

Semaphores

  • 信号量是一个与队列有关的整型变量。可以想象成一个数后面拖着一条排队的队列
    信号量S是个整型变量,除初始化外只能通过两个标准原子操作:wait(),signal(),信号量整数值的修改应不可分割地执行,也就是说,当一个进程修改信号量值时,没有其他进程可以同时修改同一信号量的值
    操作系统区分计数信号量和二进制信号量。二进制类似互斥锁。计数信号量可以控制访问具有多个实例的某种资源

信号量实现


  • 为克服忙等待需要,修改wait()和signal()的定义:当一个进程执行操作wait()并且信号值不为正时,它必须等待。然而,该进程不是忙等待而是阻塞自己。将一个进程放到与信号量相关的等待队列中,并且将进程状态切换为等待状态。然后,控制转到CPU程序,以便选择执行另一个进程。
    等待信号量S而阻塞的进程,在其他进程执行操作signal()后,应重新执行。进程的重新执行通过wakeup()来进行,它将进程从等待状态改为就绪状态,进程被添加到就绪队列
  • 每个信号量都有一个整数value和一个进程链表list。当一个进程必须等待信号量时,就被添加到进程链表。操作signal()从等待进程链表上取走一个进程,并加以唤醒

死锁(deadlock)与饥饿(starvation)

  • 具有等待队列的信号量实现可能导致这样的情况:两个或多个进程无限等待一个事件,而该事件只能由这些等待进程之一来产生。 这里的事件是执行singal().这种状态叫deadlocked

Basic Synchronization Patterns

signaling(信令)

Rendezvous(集合点)


线程A两个语句a1,a2,线程B两个语句b1,b2,要求a2在b1后发生,b2在a1中发生。
设计信号量a表示a到达集合点,b表示b到达集合点,即可实现
注意:发送一定要在等待前,不然会发生死锁

Mutex(互斥)


考虑如何通过信号量来实现对一个变量的互斥访问
为每个互斥变量安排一个信号量m,初态为1,然后在所有访问这个变量代码前后套上wait()和signal()

Multiplex(多路复用)


类似互斥,允许多个线程同时在临界区执行,并强制给定一个并发线程数的上限
为每个多路复用区安排一个信号量m,初态为其数量限制,所有访问这临界区的代码都应该套上wait() signal()

Barrier(屏障)

对集合点模式出发做的推广。即线程有多个,每个线程都执行步骤redenzvous和citica,需要保证只要有一个线程未完成第一步,就不存在任何一个线程进入第二步
需要两个部分:自带互斥锁的计数器counter和一个标识屏障是否被推到的信号量bar
每个线程执行玩rendezous后修改计数器,如果计数器等于n则推倒屏障,如果只推到一次是有问题的。两种解决方案:1.连续推倒n次 2.在每个线程等待屏障等到后再次推到屏障


这里barrier的wait和signal是快速连续的,把它称为旋转门,它一次只允许一个线程通过。可以锁定以组织所有线程
本例中,初态旋转门被锁定,第n个到达的线程将解锁它,然后n个线程都将可以通过

Resuable Barrier(可重用屏障)


我们希望在所有线程都通过屏障后,再次锁定旋转门
考虑到代码可能会循环执行,设置两个旋转门barrier1和barrier2,最初第一个被锁定,第二个被打开。所有线程到达第一个时,锁定第二个解锁第一个,对第二个同理

另一中方案是连续推到n次

Pairing(队列)

领袖和粉丝配对跳舞。当领袖到达时,会检查是否有粉丝在等,如果有,他们就结对做些事,没有就等待

一些同步问题

The Producer-Consumer Problem

posted @ 2022-04-25 20:20  kokomi~  阅读(64)  评论(0)    收藏  举报