主页

死锁

2020-04-12
操作系统

系统资源 #

  1. 可抢占资源:某进程获得该类资源后,该资源可以被系统或其他进程访问。比如CPU、内存。
  2. 不可抢占资源:某进程获得该类资源后,该资源不能被其他进程抢占,只能在进程使用完毕后由该进程自己释放。讨论死锁所指的资源一般指不可抢占资源

死锁产生的必要条件 #

  1. 互斥条件:任一时刻一个资源仅被一个进程占用。
  2. 请求和保持条件:一个进程请求资源得不到满足而阻塞自己时,并不释放已经分配给它的资源。
  3. 不剥夺条件:进程获得的资源在未使用完毕不可能被其他进程占有,只能由该进程自己释放。
  4. 循环等待:若干进程形成一个循环等待链,链中每一个进程都在等待改链中下一个进程占有的资源。

死锁的预防 #

  1. 破坏请求和保持条件:每个进程在运行之前一次性申请他所需要的全部资源,并在资源未满足时不运行。
  2. 破坏不剥夺:当一个已经占有资源的进程又提出新的资源请求,而并没有得到满足时,则必须释放他所获取的所有资源而进入阻塞状态。
  3. 破坏循环等待:采用资源有序分配策列,将系统中的资源进行编号,进程必须按照顺序去申请资源。

死锁的避免 #

  • 安全状态是指在某一时刻,系统中存在一个包含所有进程的进程序列,按照该进程序列的顺序为所有进程分配资源,则所有进程的资源需求都可以得到满足。

银行家算法 #

  • 在进程提出资源申请时,先判断此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让进程先阻塞。

内部类

2020-04-09
java

成员内部类 #

  • 成员内部类可以使用外部类的所有属性方法。

局部内部类 #

  • 如果希望访问所在方法的局部变量,那么这个局部变量就必须是有效final的。
  • 从java8开始,只要局部变量事实不变,那么final关键字可以省略。
  • 可以使用外部类的所有属性和方法。

匿名内部类 #

  • 参考局部内部类。

interface

2020-04-09
java

  • 接口中的抽象方法,修饰符必须是public abstract,这两个关键字可以选择性的忽略。
  • 接口中的属性,修饰符必须是public static final,这三个关键字可选择性的忽略。
  • 接口中的常量必须赋值,且命名建议完全大写(多个单词之间用“_”隔开)。
  • jdk8及以后版本:
    • 被default修饰的方法,修饰符必须是public,可省略。子类可覆盖重写default方法。
    • 被static修饰的方法,修饰符必须是public,可以省略。
    • 不能通过接口实现类的对象来调用接口中的static方法。

final

2020-04-09
java

  • final修饰局部变量
public void test1(){
    //正确写法
    final int a;
    a=10;
    
    //正确写法
    final int b=10;
    
    //定义后不能再次进行赋值
    a=10;//错误
}
//tips:final如果修饰一个对象,那么该对象的引用的地址不能改变,但是对象的属性可以改变。
  • final修饰对象属性
//正确写法,即在属性定义处赋值
class Student{
    private final int a=10;
}

//正确写法,当在属性处没有赋值时,必须在该类的所有构造方法中进行赋值
class Student2{
    private final int a;
    
    public Student2(){
    	a=10;    
    }
    public Student2(int a){
    	this.a=a;
    }
}
//tips:不能既在属性定义处赋值,又在类的构造方法中赋值

临界资源

2020-04-09
操作系统

  • 临界资源:某段时间内只能允许一个进程使用的资源。
  • 临界区:进程中访问临界资源的代码段。
进程P1
tmp1=s;
tmp1=tmp1+1;
s=tmp1;

进程P2
tmp2=s;
tmp2=tmp2-1;
s=tmp2;

当并发执行进程P1和进程P2时,可能会造成s的结果无法预测
此时,我们可以将s设置为临界资源,让进程P1P2互斥的访问sP1P2的代码就叫做临界区。

系统调用

2020-04-09
操作系统

  • 系统调用是操作系统提供给应用程序使用的接口,应用程序可以发出系统调用请求来获取操作系统的服务。
  • 在用户程序中,凡是和资源有关的操作(如存储分配、io操作、文件管理等),都必须由系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性。
  • 系统调用的相关处理运行在核心态。
  • 有些库函数会封装一些系统调用。

中断

2020-04-09
操作系统

  • 当中断发生时,cpu立即进入核心态。
  • 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理。
  • 用户态 —>核心态 是通过中断实现的,并且中断是唯一途径。
  • 核心态—>用户态 是通过执行一个特权指令,将程序状态字psw的标志设置为“用户态”。

中断处理过程 #

中断

  1. 执行完每个指令后,cpu会检查当前是否有外部中断信号。
  2. 如果检测到了外部中断信号,则需要保护现场。
  3. 根据中断信号类型转入相应的中断处理程序。
  4. 恢复原进程的cpu环境并退出中断,返回原程序并继续执行。

管程

2020-04-07
操作系统

管程是一种特殊的软件模块,由这些部分组成: #
  1. 局部与管程的共享数据结构说明;
  2. 对该数据结构进行操作的一组过程;
  3. 对局部于管程的共享数据设置初始值的语句;
  4. 管程有一个名字。
管程的基本特征: #
  1. 局部于管程的数据只能被局部于管程的过程访问;
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
  3. 每次仅允许一个进程在管程内执行某个内部过程。