嵌入式系统导论-死锁

来源:互联网 发布:周毅雕刻刀淘宝 编辑:程序博客网 时间: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.

原创粉丝点击