1、什么是进程?
进程是指系统中正在运行的应用程序,程序一旦运行就是进程;
进程是系统分配资源的独立实体,且每个进程之间都是相互独立的,一个进程是无法直接访问另一个进程的,除非通过对应的工具或者方式才可以访问;
一个进程可以由多个线程组成;
2、什么是线程?
线程是进程的一个实体,是进程的执行路径;
3、进程和线程之间的区别?
1> 地址空间和其他资源文件:进程之间是相互独立的,但是对于同一个进程中的线程来说是共享的;
2> 通信:
进程间:通过管道、信号量、共享内存、消息队列等;
同一个进程的线程:直接读写;
3> 调度和切换:线程上下文切换比进程上下文切换块;
4> 在多线程中,进程不是一个可执行的实体;
4、如何选择进程与线程?
1> 频繁的销毁与创建则选择线程,因为进程的创建和销毁代价很大;
2> 线程的切换速度很快,所以需要大量的计算,切换频繁时使用线程,还有就是耗时性的操作使用线程可以提高应用的响应速度;
3> 对CPU的使用率来说,线程更占优势,多机分布式采用进程,多核分布式使用线程;
4> 并行操作使用线程,例如C/S架构的服务器端并发线程响应用户的请求;
5> 追求稳定安全时,选择进程,追求执行速度时选择线程;
5、死锁是什么?
多个并发进程因争夺系统资源而产生的相互等待的现象;
例如:a与b同时要进门,但是门一次只能容许一个人进,a等待b让路,b等待a让路,若无外力作用,导致俩人都无法进去;
死锁的原因:
1> 系统资源的不足;
2> 进程的推进不合理;
6、产生死锁的四大必要条件?
互斥:一个系统资源在同一时间只能有一个进程可以使用;
不可抢占条件:一个进程在获得资源且未使用完之前,其他进程不能抢夺,只能等待当前进程使用完成后释放获得;
占有且申请条件:一个进程在获得一个资源A时候,申请另一个资源B,但是B资源是其他线程持有的,导致当前进程无法执行;
循环等待条件:俩个或者多个进程的执行需要多个资源,但是所属的资源互相背其他线程占用,导致循环等待持有资源的进程释放资源的情况;
7、如何解决死锁?
1> 最简单的办法就是不让上述的条件都满足;
互斥性是无法改变的;
打破不可抢占条件:当前进程持有部分资源却有申请其他资源,而其他资源被占用时,释放当前进程所持有的资源;
打破占有且申请条件:不需要在执行前得到全部的资源才执行,得到可以开始执行的资源后就开始执行,执行完响应的资源之后释放,并且执行过程中需要其他资源时在进行申请;
打破循环等待:资源的有序分配,将资源从小到大排序,进程的申请顺序必须从小到大(及当其占用了小的资源时申请大的资源才会给分配,否则拒绝);
2> 合理地分配资源;
3> 使用银行家算法:如果进程申请的资源系统的剩余内存可以满足,则分配;
8、多线程的实现方式?
(1)继承Thread类;
(2)实现Runable接口(如果当前类需要继承其他类则可以使用);
(3)使用匿名内部类(Thread类或者是Runable接口):只执行一次的线程;
(4)定时器:
(5)线程池的方式:线程和数据库连接这些资源是很宝贵的;
(6)通过Spring的注解:通过@Async来定义一个线程任务;
9、线程同步的方式?
https://www.cnblogs.com/goody9807/p/6522176.html
(1)同步方法、同步块;
(2)wait()、notify、sleep;
(3)voliate关键字;
(4)ThreadLocal线程本地变量;
(5)显示索ReentranLock
(6)使用阻塞的队列;