Week6-同步机制2-Coursera北大操作系统课程-个人笔记


  声明:本文的图片和内容均来自Coursera课堂。

1. 管程(monitor)

1.1 基本概念

  什么是管程?
  管程是一个特殊的模块,拥有自己的名字(类似变量名),由关于共享资源的数据结构及在其上操作的一组过程组成。管程是由Brinch Hansen和Hoare提出的一种高级同步机制。

  为什么会出现管程?
  信号量机制的不足:程序编写困难、易出错。

  进程和管程的关系
  进程只能通过 调用管程中的过程间接地访问管程中的数据结构。

1.2 管程的功能

  1).管程要解决互斥问题
  管程是互斥进入的,为了保证管程中数据结构的数据完整性,管程的互斥性是由编译器负责保证的。

  2).管程要解决同步问题
  管程中设置条件变量及等待/唤醒操作以解决同步问题。
  可以让 一个进程或线程在条件变量上等待(此时,应先释放管程的使用权),也可以通过发送信号将等待在条件变量上的进程或线程唤醒。

1.3 应用管程时会遇到的问题

  1).是否会出现有多个进程同时在管程中出现?
  会的,假设P进程进入管程,然后因为某种原因执行了等待操作,此时P进程让出管程的使用权。然后Q进程进入管程,执行了唤醒操作,唤醒了P,那么此时就有两个进程在管程中同时处于活跃状态。这是不希望发生的。
  如何解决上述问题?有三种处理方法:

  • Q(唤醒者)等待P(被唤醒者)执行完再执行;(Hoare管程)
  • P(被唤醒者)等待Q(唤醒者)执行完再执行;(MESA管程)
  • 规定唤醒操作是管程中最后一个可执行的操作。(Hansen,并发pascal)

1.4 Hoare管程

在这里插入图片描述
  因为管程是互斥进入的,所以当一个管程已经被占用了,相当于上图中关上了门,其他想要进入该管程的进程,都要在门口的入口等待队列排队等待。
  入口等待的进程队列称为入口等待队列
  条件变量是管程内部说明和使用的一种特殊类型的变量,对于条件变量(var c:condition),可以执行两种操作:

  • wait( c ):如果紧急等待队列非空,则唤醒队首第一个等待进程;否则释放管程的控制权,执行该操作的进程进入条件变量c1对应的链的末尾;
  • signal( c ):如果c链为空,则相当于空操作,执行此操作的进程继续执行;否则,唤醒第一个c链中的等待者,执行此操作的进程进入紧急等待队列的队尾。

  假设此时P进程进入管程。这时,P进程由于条件c1执行了wait(c1),就进入了条件变量c1的等待队列。随后Q进程进入管程。
  如果进程Q唤醒进程P,则Q等待P执行;如果P执行中又唤醒了进程R,则P等待进程R执行,即被唤醒进程优先执行。经过上述过程,管程内部可能会出现多个因唤醒其他进程而等待的进程。
  此时,管程内设置一个紧急等待队列,将上述因唤醒其他进程而等待的进程放入该队列中。紧急等待队列的优先级高于入口等待队列。

1.5 管程的应用

  管程实现的两个主要途径:

  • 直接构造:效率高
  • 间接构造:用某种已经实现的同步机制区构造(如用PV操作构造管程)

  Hoare管程解决生产者消费者问题:
在这里插入图片描述
  生产者和消费者使用管程的方法都相比于信号量PV操作简单了很多。C++中没有管程的实现,而JAVA中是有相应实现的。

1.6 MESA管程

  针对Hoare管程的缺点:Hoare管程的做法会导致两次额外的进程切换(因为被唤醒者优先执行)
  MESA管程的解决方式将Hoare管程中的signal函数替换为notify函数。
  notify:当一个正在管程中的进程执行notify(x)时,它使得x条件队列得到通知,发信号的进程继续执行。
  注意

  • notify的结果,使得位于条件队列队首的进程在将来合适的时候且当处理器可用时恢复执行。
  • 由于不能保证在它之前没有其他进程进入管程,因而这个进程必须重新检查条件。MESA管程中,重新检查条件要用while循环代替if语句。
  • MESA管程的缺点是导致对条件变量至少多一次额外的检测(但不再有额外的进程切换),并且对等待进程在notify之后何时运行没有任何限制。

  MESA管程解决生产者消费者问题:
在这里插入图片描述  改进notify

  • 给每个条件原语关联一个监视计时器,不论是否被通知,一个等待时间超时的进程将被设为就绪态;
  • 当该进程被调度时,会再次检查相关条件,如果条件满足则继续执行。
    上述改进可以防止饥饿状态,比如某些提供信号的进程在提供信号前失败了,则等待该信号的进程就会无限制地等待而处于饥饿状态。

  引入广播broadcast代替notify
  broadcast:使所有在该条件上等待的进程都被释放,并进入就绪队列。
  broadcast的应用情况:

  • 当一个进程不知道有多少进程将被激活时,这种方式比较方便。比如生产者消费者问题,生产者如果一次性生产多个信号,往缓冲区里添加了一批字符,它不需要知道等待的消费者准备消耗多少字符,只要执行broadcast激活所有等待的进程即可。
  • 当一个进程难以准确判断将激活哪个进程时,也可以用广播。

  Hoare管程与MESA管程的比较
  MESA管程优于Hoare管程之处在于MESA管程错误比较少。因为在MESA管程中,由于每个过程在收到信号后都重新检查管程变量,并且由于使用了while结构,一个进程不正确的broadcast广播或发信号notify不会导致收到信号的程序出错。收到信号的程序将检查相关的变量,如果期望的条件没有满足,它会重新继续等待。

1.7 管程总结

  管程:抽象的数据类型
  有一个明确定义的操作集合,通过它且只有通过它才能操纵该数据类型的实例。

  实现管程结构必须保证以下几点:
  1).只能通过管程的某个过程才能访问资源;
  2).管程是互斥的,某时刻只能有一个进程或线程调用管程中的过程

  条件变量:为提供进程与其他进程通信或同步而引入的变量,对应操作有:wait/signal、wait/notify或wait/broadcast。

1.8 Pthread中的同步机制API

在这里插入图片描述

2. 进程间通信(IPC,(Inter-Process Communication)

2.1 基本概念

  进程间有了管程、信号量等同步机制了,为什么还需要进程间通信机制?
  因为:1).信号量及管程能传递的信息较少;2).不适用于多处理器情况。

  进程通信机制:消息传递,包含send和receive原语。

  基本通信方式:

  • 消息传递
  • 共享内存
  • 管道
  • 套接字(适合网络、分布式系统)
  • 远程过程调用(适合网络、分布式系统)

2.2 消息传递

在这里插入图片描述  该通信方式,假设有发送进程S和接收进程R,由于两个进程之间没有共享的内存空间,因此两者互相无法在对方空间内读写数据。因此,需要操作系统帮助完成信息传递过程。操作系统在空间中分配多个消息缓冲区,每组消息缓冲区由特定数据结构组成:消息头(消息类型、接收进程ID、发送进程ID、消息长度、控制信息等)、消息体(消息内容)。通信过程如下:
  1).发送进程要调用发送原语,发送原语按结构准备好数据,陷入系统内核;
  2).由操作系统完成复制消息的任务;
  3).然后把该消息挂到接受进程PCB的消息队列末尾,等待响应。这时发送进程就可以继续做别的事。
  4).接收进程直到执行到接收原语后,陷入操作系统内核,由操作系统将对应信息复制到接收进程的地址空间。

  PV操作实现send原语
在这里插入图片描述

2.3 共享内存

在这里插入图片描述
  该通信方式需要解决两个问题:

  • 需要将两个进程中的某块地址空间,共同映射到同一个物理内存地址中。
  • 读写者问题,因为两个进程的地址空间是映射到同一个共享物理内存中,因此读写存在互斥和同步的关系。

2.4 管道通信方式PIPE

  利用一个缓冲传输介质——内存或文件——连接两个相互通信的进程。
在这里插入图片描述
  管道通信方式需要注意的地方

  • 字符流方式写入读出;
  • 先进先出顺序,先写先出;
  • 管道通信机制必须提供的协调能力:互斥(读写不能同时)、同步(管道内有东西才能继续读)、判断对方进程是否仍存活。

3. 典型操作系统的IPC机制

  常见系统具备的IPC机制
在这里插入图片描述
  具体的实现和应用可查阅相关系统的其他资料。

4. 本章重点

  • 管程
    • 如何保证互斥?
    • 如何保证同步?——条件变量wait/signal
    • Hoare管程
    • MESA管程
  • 进程间通信
    • 消息传递、共享内存、管道
  • Pthread中的同步机制
  • Linux的IPC机制

  重点概念:管程、Hoare管程、MESA管程、条件变量、wait/signal、Pthread中的互斥锁与条件变量、共享内存、消息传递、管道、Linus中的原子操作/屏障/读写锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Coursera-ml-andrewng-notes-master.zip是一个包含Andrew Ng的机器学习课程笔记和代码的压缩包。这门课程是由斯坦福大学提供的计算机科学和人工智能实验室(CSAIL)的教授Andrew Ng教授开设的,旨在通过深入浅出的方式介绍机器学习的基础概念,包括监督学习、无监督学习、逻辑回归、神经网络等等。 这个压缩包笔记和代码可以帮助机器学习初学者更好地理解和应用所学的知识。笔记包含了课程涉及到的各种公式、算法和概念的详细解释,同时也包括了编程作业的指导和解答。而代码部分包含了课程使用的MATLAB代码,以及Python代码的实现。 这个压缩包对机器学习爱好者和学生来说是一个非常有用的资源,能够让他们深入了解机器学习的基础,并掌握如何运用这些知识去解决实际问题。此外,这个压缩包还可以作为教师和讲师的教学资源,帮助他们更好地传授机器学习的知识和技能。 ### 回答2: coursera-ml-andrewng-notes-master.zip 是一个 Coursera Machine Learning 课程笔记和教材的压缩包,由学生或者讲师编写。这个压缩包包括了 Andrew Ng 教授在 Coursera 上发布的 Machine Learning 课程的全部讲义、练习题和答案等相关学习材料。 Machine Learning 课程是一个介绍机器学习的课程,它包括了许多重要的机器学习算法和理论,例如线性回归、神经网络、决策树、支持向量机等。这个课程的目标是让学生了解机器学习的方法,学习如何使用机器学习来解决实际问题,并最终构建自己的机器学习系统。 这个压缩包包含的所有学习材料都是免费的,每个人都可以从 Coursera 的网站上免费获取。通过学习这个课程,你将学习到机器学习的基础知识和核心算法,掌握机器学习的实际应用技巧,以及学会如何处理不同种类的数据和问题。 总之,coursera-ml-andrewng-notes-master.zip 是一个非常有用的学习资源,它可以帮助人们更好地学习、理解和掌握机器学习的知识和技能。无论你是机器学习初学者还是资深的机器学习专家,它都将是一个重要的参考工具。 ### 回答3: coursera-ml-andrewng-notes-master.zip是一份具有高价值的文件,其包含了Andrew Ng在Coursera上开授的机器学习课程笔记。这份课程笔记可以帮助学习者更好地理解掌握机器学习技术和方法,提高在机器学习领域的实践能力。通过这份文件,学习者可以学习到机器学习的算法、原理和应用,其包括线性回归、逻辑回归、神经网络、支持向量机、聚类、降维等多个内容。同时,这份笔记还提供了很多代码实现和模板,学习者可以通过这些实例来理解、运用和进一步深入研究机器学习技术。 总的来说,coursera-ml-andrewng-notes-master.zip对于想要深入学习和掌握机器学习技术和方法的学习者来说是一份不可多得的资料,对于企业从事机器学习相关工作的从业人员来说也是进行技能提升或者知识更新的重要资料。因此,对于机器学习领域的学习者和从业人员来说,学习并掌握coursera-ml-andrewng-notes-master.zip所提供的知识和技能是非常有价值的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值