5.1 进程、线程
线程
线程与进程比较
进程是资源分配的单位,线程是CPU调度的单位
进程拥有一个完整的资源平台,线程只独享必不可少的资源,如寄存器和栈
线程同样有就绪、阻塞、执行三种基本状态,同样有状态之间的转换关系
线程能减少并发执行的时间和空间开销
5.2 进程间有哪些通信方式
管道
linux命令中|
就是管道
$ ps auxf | grep mysql
将前一个命令的输出,作为后一个命令的输入
可见是单向传输的
上面是匿名管道
命名管道需要通过mkfifo命令定义
$ mkfifo myPipe
管道通信效率低,不适合频繁交换数据
消息队列
是保存在内容中的消息链表
类似发邮件
但是通信不及时,附件大小有限制
不适合比较大数据的传输
通信过程中,存在用户态和内核态的数据拷贝开销
共享内存
拿出一块虚拟地址空间,映射到相同的物理内存中
信号量
实现进程间的互斥与同步
有p,v操作
p是进入共享资源之前
v是离开共享资源之后
互斥初始化为1
同步初始化为0
信号
异常情况下的工作模式
唯一的异步通信机制
进程对信号的处理方式:
1.执行默认操作
2.捕捉信号
3.忽略信号
Socket
跨网络与不同主机上的进程通信
5.3 多线程冲突怎么办
互斥与同步的实现和使用
锁
使用加锁和解锁解决并发线程/进程的互斥问题
任何进入临界区的线程都要加锁
加锁成功则进入,访问后解锁
忙等待锁,也称自旋锁,获取不到锁就一直忙等
无等待锁不用自旋
信号量
5.4 怎么避免死锁
死锁概念
死锁条件:
1.互斥
2.持有并等待
3.不可剥夺
4.环路等待
避免死锁问题的发生
资源有序分配法
线程都得按照相同的顺序申请自己想要的资源
5.5 乐观锁、悲观锁
互斥、自旋、读写都是悲观锁
悲观锁访问资源前要上锁
乐观锁先修改资源,再验证有无冲突,全程没有加锁,也叫无锁编程
5.7 线程崩溃了,进程也会吗
线程崩溃,进程一定会崩溃吗
如果是因为非法访问内存,则会,因为各个线程地址空间是共享的
为什么线程崩溃不会导致JVM进程崩溃
JVM定义了自己的信号处理函数,拦截了SIGSEGV信号,针对这两者不让他们崩溃