- 1、本文档共116页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.3 进程的同步与通信 2.3.1 进程同步的基本概念 2. 临界资源和临界区 Solution Requirements Mutual Exclusion Only one process can be in the critical section at any time Progress Decision on who enters CS cannot be indefinitely postponed No deadlock Bounded Waiting Bound on #times others can enter CS, while I am waiting No livelock Also efficient (no extra resources), fair, simple, … 2.3.2 如何解决互斥问题 2.3.3 信号量机制 2.3.4 信号量应用 2.4 经典进程同步问题 2.4.1 生产者─消费者问题 2.3.3.哲学家就餐问题 2.4.3.读者写者问题 【作业】 p68 22,23,24,26 Sleeping Barber Problem One Solution One Solution 2.5 管程机制 2.5.1 管程的引入 2.5.2 管程的基本概念 2.5.3 利用管程解决生产者—消费者问题 2.6 进程通信 2.6.1 概述 2.6.2 消息传递通信的实现方法 2.6.3 通信链路、消息格式和同步方式 2.6.4 消息缓冲队列通信机制: 2.6.5 管道(Pipe)通信方式 2.7 线程 2.7.1线程的基本概念 例子: 2.7.2 线程间的同步与通信 2.7.3 线程控制 1. 核心支持线程(KST): 内核支持线程的优点和缺点: 2.用户级线程(ULT) Solaris 操作系统中的线程 内核支持线程(Kernel Supported Threads) 用户级线程(User-Level Threads) 两者结合的方法 与进程的管理和调度相似, 用户和系统进程的所有线程的管理和调度都直接由OS的核心完成, 可直接利用系统调用为它服务。 没有线程库, 直接用系统调用 核心维护进程和线程的上下文 线程之间的切换需要核心支持 以线程为基础进行调度 例子:Windows NT,OS/2 优点: 对多处理器, 内核可以同时调度同一进程的多个线程, 多个线程能同时运行于多个处理器上。 阻塞是在线程一级完成的 内核例程是多线程的 缺点: 在同一进程内的线程切换要调用内核, 导致速度下降。 2. 条件变量: 于管程通常是用于管理资源的。当进入管程的进程因资源被占用等原因不能继续运行时,管程使其等待。为了区别等待的原因,在管程内部可以说明和使用一种特殊类型的变量, 称作条件变量: var x,y:condition; 对于条件型变量, 可以执行wait和signal操作: x.wait: 如果紧急等待队列非空, 则唤醒该队列队首进程; 否则释放管程的互斥权, 将执行此操作的进程的PCB插入x链尾部。 x.signal: 如果x链为空, 则相当于空操作 (不同于信号量的signal操作 s:=s+1), 执行此操作的进程继续; 否则唤醒第一个等待者,执行此操作的进程的PCB入紧急等待队列的尾部。 生产者和消费者进程: producer: begin repeat produce an item in nextp; PC.put(item); until false; end; consumer:begin repeat PC.get(item); consume the item in nextc; until false; end; type producer-consumer =monitor; {管程名说明} var in,out,count:integer; buffer:array[0..n-1] of item; nf,ne:condition; {条件变量:非满非空} proceduer entry put(item); {产品放入缓冲区过程} begin if count=n then nf.wait; {满则等待} buffer[in]:=nextp; in:=(in+1) mod n; count:=count+1; if ne.queue the
文档评论(0)