嵌入式系统导论-死锁
来源:互联网 发布:周毅雕刻刀淘宝 编辑:程序博客网 时间:2024/06/06 00:12
嵌入式系统导论实验报告
1. 实验题目
Deadlock
2. 实验过程及结果
(1) 死锁
死锁的定义:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
产生死锁的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
(2)程序实例
class A{ synchronized void methodA(B b){ b.last(); } synchronized void last(){ System.out.println("Inside a.last()"); }}class B{ synchronized void methodB(A a){ a.last(); } synchronized void last(){ System.out.println("Inside b.last()"); }}class Deadlock implements Runnable{ A a = new A(); B b = new B(); Deadlock(){ Thread t = new Thread(this); int count = 100; t.start(); while(count-->0); a.methodA(b); } public void run(){ b.methodB(a); } public static void main(String args[]){ new Deadlock(); }}
代码分析:
在本实验中主函数每执行一次有两个线程,对应代码块为a.methodA(b)和b.methodB(a),两者之间的延时为2000次运算。
判断是否死锁的四个必要条件:
- 线程的作用是打印出两行不同的文字因此调用的是相同的资源,而且函数的参数都是对方。-------循环等待条件
- 线程A、B都被synchronized修饰-------互斥条件/请求与保持条件/不剥夺条件。
javaC编译
生成(.bat/sh)文件
将批处理文件放在java程序(Deadlock.class)目录下,双击运行,观察结果.
运行结果显示及分析
死锁发生在第11次后。。。程序产生死锁的原因
批处理文件使main()函数执行上限为100次,每次执行时的时间轴是:分别创建A和B两个类的对象a和b,然后进入Deadlock构造函数,构造函数中创建了一个进程t,t.start之后,线程t被插入调度队列中(我理解的是相当于就绪队列),当调度到t时,就跑run()里面的代码,即执行b的methodB函数;延时2000次运算后,执行a的methodA函数,如果在执行a.method(b)之前线程t执行完相应的代码块,就可以把执行时占用的资源释放出了让a使用;而如果由于没有执行完,b占着资源不放a无法获得需要的资源,那么a无法执行自己的代码块,也死占着自己的资源不给b,然后a等b,b等a,死锁了.
3. 实验心得
(1)关键字 Synchronized
当synchronized用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行中所有其它synchronized同步代码块或同步方法的访问将被阻塞。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。某个线该段代码。当一个线程访问object的一个synchronized同步代码块或同步方法时,其他线程对object程若给一个对象上了锁,就可以知道没有其他线程能够访问该对象。那些试图访问一个上锁对象的线程通常会进入睡眠状态,直到上锁的线程开锁。一旦锁被打开,这些睡眠进程就会被唤醒并移到准备就绪队列中。
(2)死锁的补充
前面介绍了死锁发生时的四个必要条件,只要破坏这四个必要条件中的任意一个条件,死锁就不会发生。这就为我们解决死锁问题提供了可能。一般地,解决死锁的方法分为死锁的预防,避免,检测与恢复三种.可以参考博客
http://blog.csdn.net/abigale1011/article/details/6450845/
.
除了这次实验中的这个例子外,关于理解死锁还有一些其他的经典例子,比如https://segmentfault.com/a/1190000000377641
.
- 嵌入式系统导论-死锁
- 嵌入式系统导论
- 嵌入式系统导论
- 嵌入式系统导论:CPS方法
- 上课笔记--微处理器与嵌入式系统导论
- 嵌入式导论
- 嵌入式导论
- 嵌入式系统导论-DOL开发环境配置
- 嵌入式导论3:资源共享
- 嵌入式 GDB调试死锁示例
- 嵌入式 死锁&活锁含义
- [嵌入式]嵌入式系统概述
- 嵌入式系统
- 嵌入式系统
- 嵌入式系统
- 嵌入式系统
- 嵌入式系统
- 嵌入式系统
- VUE插值
- MacbookPro安装Hadoop2.8.1
- bandit算法(3)--UCB算法
- 数据结构实验之链表八:Farey序列
- 表变量与临时表的优缺点
- 嵌入式系统导论-死锁
- C# 解析Json串
- 【机器学习 吴恩达】CS229课程笔记notes2翻译-Part IV生成学习算法
- 马化腾——中国IT巨头之一
- Django框架环境的搭建
- hdoj 5584 LCM Walk
- 饿了么webapp之数据二级访问
- ArcEngine10.2+Eclipse4.3(Kepler)java开发(一)
- 找规律DP 七十和十七