1.死锁和竞争的关系
竞争不一定会导致死锁,造成死锁的原因主要为:1.竞争不可抢占资源。2.竞争可消耗资源。3.进程推进顺序不当。
死锁的必要条件:1.互斥条件(内存这种就不会发生死锁)。2.不剥夺条件,只能主动释放。3.请求和保持条件(就很贪心)。4.循环等待条件(如果同类资源数大于1,循环等待未必会发生死锁,但是如果每类都只有一个,那么与死锁就是充要条件了)。
死锁的处理策略:
1.预防死锁:破坏四个必要条件中的一个,是一种静态的方法,不会有死锁发生
2.避免死锁:银行家算法,是一种动态的方法,不会有死锁发生。
3.死锁的检测和解除:已经发生死锁了。检测用两种结点和两种边(这里就不详细说明了,可以画出请求分配图)。解除有三种方法:①资源剥夺法。②撤销进程法(对谁下手?可以通过优先级,使用了多少资源等等来决定撤销哪一些进程,让它们把资源吐出来)。③进程回退法:记录历史信息,设置还原点,退回到没有发生死锁的状态重新来过。
2.程序和进程的区别
1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据集上运行的全部动态过程。
2)进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点正是程序无法做到的,由于程序没有和数据产生直接的联系,既使是执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运行在几个不同的数据集上)。
3)进程还具有并发性和交往性,这也与程序的封闭性不同。
3. 线程和进程的区别
进程与线程的区别总结
线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
4.并发和并行的区别
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
5.中断的过程
中断(interrupt)是异步的事件,典型的比如由I/O设备触发;异常(exception)是同步的事件,典型的比如处理器执行某条指令时发现出错了等等。
中断又可以分为可屏蔽中断和非可屏蔽中断,异常又分为故障、陷阱和异常中止3种;
中断处理过程:①关中断②保存断点和PSW(为什么要保存PSW,因为为了服务多重中断,即再来的一个中断结束后是返回上一个中断还是返回主程序)③引出中断服务子程序④保存现场和屏蔽字⑤开中断⑥执行中断服务子程序⑦关中断⑧恢复现场和屏蔽字⑨开中断,中断返回
注:1.①②③是属于中断响应阶段,由中断隐指令完成(即硬件自动完成)2.④到⑨时由中断服务程序完成。3.中断响应阶段包含cpu用于I/O的时间。4.在等待I/O完成的期间,其实进程也是在被服务的,所以不计入等待时间(在计算平均等待时间那里需要考虑到这个)。
6.覆盖和重载的区别
重载和覆盖是java多态性的不同的表现方式。其中,重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,他们或有不同的参数个数,或有不同的参数类型,或参数顺序不同。与访问修饰符和返回值类型无关。
覆盖是指子类函数覆盖父类函数。覆盖一个方法并对其进行重写,以达到不同的作用。
覆盖和重载的区别如下:
1) 覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
2) 覆盖只能由一对方法产生关系,重载是多个方法之间的关系。
3) 覆盖要求参数列表相同,重载要求参数列表不同。
4) 覆盖关系中,调用方法是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。