最常见的死锁是发生在两个节点之间的直接存储转发死锁,也可能发生在一组节点之间,例如,A节点企图向B节点发送分组、B节点企图向C节点发送分组、而C节点又企图向A节点发送分组,但此时每个节点都无空闲缓冲区用于接收分组,这种情形称做间接存储转发死锁。当一个节点处于死锁状态时,所有与之相连的链路将被完全拥塞。
一种防止存储转发死锁的方法是,每个节点设置M+1个缓冲区,并以0到M编号。M为通信子网的直径,即从任一源节点到任一目的节点间的最大链路段数。每个源节点仅当其0号缓冲区空时才能接收源端系统来的分组,而此分组仅能转发给1号缓冲区空闲的相邻节点,再由该节点将分组转发给它的2号缓冲区空闲的相邻节点……最后,该分组或者顺利到达目的节点并被递交给目的端系统,或者到了某个节点编号为M的缓冲区中再也转发不下去,此时一定发生了循环,应该将该分组丢弃。由于每个分组都是按照编号递增规则分配缓冲区,所以节点之间不会相互等待空闲缓冲区而发生死锁现象。这种方法的不足之处在于,当某节点虽然有空闲缓冲区,但正巧没有所需要的特定编号的缓冲区时,分组仍要等待,从而造成了缓冲区和链路的浪费。
另一种防止存储转发死锁的方法是,使每个分组上都携带一个全局性的惟一的"时间戳",每个节点要为每条输入链路保留一个特殊的接收缓冲区,而其它缓冲区均可用于存放中转分组。在每条输出链路的队列上分组按时间戳顺序排队。例如,节点A要将分组送到节点B,若B节点没有空闲缓冲区,但正巧有要送到A节点的分组,此时A、B节点可通过特殊的接收缓冲区交换分组;若B节点既没有空闲缓冲区,也没有要送往A节点的分组,B节点只好强行将一个出路方向大致与A节点方向相同的分组与A节点互相交换分组,但此时A节点中的分组必须比B节点中的分组具有更早的时间戳,这样才能保证子网中某个最早的分组不受阻挡地转发到目的地。由此可见,每个分组最终总会成为最早的分组,并总能被一步一步地发送到目的节点,从而避免了死锁现象的发生。

存储转发死锁及其防止相关推荐

  1. 计算机网络重装死锁,网络中的路由和死锁.ppt

    网络中的路由和死锁 * * * * * * * * * HPM&S HPM&S 活动10 The Orange Game--网络中的路由和死锁 西安交通大学 高效能建模与仿真研究小组 ...

  2. 深入理解计算机网络-8网络层5

    目录 一.网络拥塞控制 (一)拥塞控制Congestion Control与流量控制Flow Control 1.产生拥塞的主要原因 2.解决拥塞的方法 (二)死锁及其预防 1.存储转发死锁及其防止 ...

  3. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  4. 操作系统学习笔记 第三章:处理机调度与死锁(王道考研)

    本文章基于网课: 2019 王道考研 操作系统 考试复习推荐资料:操作系统复习总结 - 百度文库 (baidu.com) 需要相关电子书的可以关注我的公众号BaretH后台回复操作系统 第一章:操作系 ...

  5. 死锁产生的原因和解锁的方法

    产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使 ...

  6. 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决

    Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决: 1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty\j ...

  7. mysql 1061原因_MySQL死锁问题分析及解决方法实例详解(转)

    出处:http://www.jb51.net/article/51508.htm MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1.MySQL常用存储 ...

  8. GIL+死锁与递归锁+信号量+event事件

    GIL全局解释器锁: GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程 必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线 ...

  9. Java线上问题排障:Linux内核bug引发JVM死锁导致线程假死

    Java本质上还是离不开操作系统,一来Java源码是用C/C++实现的,二来java进程还是需要依附于操作系统和硬件资源,有时候一些问题是操作系统级别导致的,下面的整个事件是源自一则真实的线上案例. ...

最新文章

  1. Java项目:个人博客系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  2. Python NLPIR2016 与 wordcloud 结合生成中文词云
  3. ios 静态库合成_iOS生成静态库方法-iOS集成静态库-iOS合并静态库
  4. eeprom的wp 引脚_EEPROM存储芯片24C02
  5. uva705--slash maze
  6. 十进制小数化为二进制小数的方法是什么_八进制转换成十进制,十进制转换成八进制...
  7. 浅入深出Vue:子组件与数据传递
  8. UOJ#218. 【UNR #1】火车管理 线段树 主席树
  9. bowtie1和bowtie2的比较
  10. Navicat Mac版中如何使用搜索筛选
  11. 基于JavaMail的Java邮件发送:简单邮件发送
  12. 一个Android项目被360报毒的解决方案
  13. 使用Python分析网易云歌曲评论信息,通过可视化处理我发现了这些有趣的规律...
  14. Ansible#Ansible-Jinja2模板介绍
  15. Flutter Text 行高相关
  16. Gold的共价对接操作流程与Moe结合处理共价键的前处理流程
  17. masked_softmax掩蔽softmax操作实现
  18. 矩阵的特征值、特征向量、特征值分解、奇异值分解之间的关系
  19. 由于目标计算机积极拒绝,无法连接(10061)
  20. 人体姿态估计-DeepPose

热门文章

  1. 上海的超级计算机,亚洲第一超级计算机在上海投入运行
  2. MySQL存储过程和触发器的实现--数据库学习笔记
  3. Linux 文件系统常用命令:cat命令
  4. Load和Initialize往死了问是一种怎样的体验?
  5. Solaris 10 系统维护
  6. 如何将mysql数据导入Hadoop之Sqoop安装
  7. php json_encode中提示的中文总是返回\u767b\u5f55\u6210\u529f\uff01的解决办法
  8. Node.js 究竟是什么?
  9. struts2学习 - action -3 动态方法调用 DMI
  10. DBA们不得不知的数据库硬件RAID常识