04进程通信.ppt

  1. 1、本文档共119页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
04进程通信

进程通信 主要内容 互斥的基本概念 互斥实现技术 进程死锁 进程间的数据通信 Linux进程间通信 程序的执行结果是什么? #include unistd.h #include sched.h #include wait.h #DEFINE NUM 10000 volatile int sum=0; int child_task() { int i; for(i=0;i NUM;i++) sum++; } 代码分析:sum++对应的汇编指令 // thread A LOAD R1,(R2); ADDI R1, #1 STORE R1, (R2) 代码分析 // thread A LOAD R1,(R2); ADDI R1, #1 STORE R1, (R2) 进程互斥 两个或两个以上的进程同时竞争某资源,而该资源在同一时刻只应被一个进程使用。 需要提供一种资源分配机制,来控制为这些进程分配资源的顺序,既保证各进程能够使用资源,又能保证各进程互斥使用资源。 临界资源 临界资源:一个时刻只能被一个进程访问或使用的资源。临界资源可能是硬件设备,也可能是软件资源。 临界区 临界区:是一段代码。进程通过这段代码访问临界资源。当一个进程进入这段代码时,不允许其他进程进入。 又称临界段或互斥段。 进入临界区:进程开始执行临界区的代码。 离开临界区:进程由执行临界区代码到不再执行临界区内的代码。 临界区的基本特征 原子性:一个临界区对应临界资源的一次完整操作; 可嵌套:一个临界资源的临界区可能包含在另一个资源的临界区中。 可中断:进程进入临界区,仍然能被剥夺处理器 临界区必须满足的要求 互斥 任何时刻只能有一个进程位于临界区 进入(Progress) 当临界区空闲,而且有多个进程想进入临界区时,应保证有一个进程能够进入临界区 防止饥饿 保证进程能够公平进入临界区 互斥实现方法 基于CPU特殊指令或硬件支持 关中断 特殊指令,如test_and_set, swap 软件方法 Peterson方法 严格交替法 程序语言支持的方法 如JAVA的管程(Monitor) 操作系统支持的方法 信号量 基于CPU支持的实现方法 关中断 原子操作指令 中断禁用法 缺点: 仅能用于单处理器系统 临界区无法嵌套 为什么? 如果临界段需要执行的时间较长,将会降低系统处理其它事件的能力 系统可靠性降低 如果忘记开中断,将导致什么后果? 基于CPU特殊指令的互斥方法 test_and_set test_and_clear swap fetch_and_add 原子操作指令的原理 通常情况下,对于计算机系统的一个内存单元,任何时刻只允许一个CPU进行访问(多CPU竞争使用系统总线) 通过硬件机制扩展,将对内存的多个操作(如read,write)设计为原子操作,即为原子操作指令; 多个CPU对同一个内存单元的上述操作是互斥的 可以利用原子操作指令实现互斥 test_and_set 首先测试锁变量的值,如为1,则立即返回1;如为0,则立即将锁变量的值置为1,并返回0 指令语义: bool test_and_set(bool *flag) { bool old = *flag; *flag = true; return old; } 由于test_and_set是一条完整的指令,而在一条指令的执行中间是不会被“中断” 的,故保证了锁的测试和释放操作的原子性。 应用 bool lock = 0; thread1( ) { While(test_and_set(lock)); Critical Section lock = 0; } thread2( ) { While(test_and_set(lock)); Critical Section lock = 0; } 交换指令swap 该指令实现两个变量之间的内容交换。 指令语义: void swap(bool data, bool *mem) { bool temp= *mem; *mem = data; data = temp; } bool lock=0; thread_i() { register reg = 1; while (reg == 1) swap(reg, lock); Critical section swap (reg, lock); /* other code */ } 机器指令法的优点 简单易证明 适用于单处理器和共享内存的多处理器环境 通常在OS内核使用,用于等待时间很短的场合 机器指令法的缺点 使用了忙等待 浪费C

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档