进程的切换过程
用户态发生系统调用进入内核态
进程和线程的区别
- 进程是资源分配的最小单位,线程是 CUP 调度的最小单位。
- 所有与进程相关的资源都被记录在 PCB 中。
- 进程是抢占处理机的调度单位,线程属于某个进程,共享其资源
- 线程只由堆栈寄存器、程序计数器和 TCB 组成
- 线程不能看做独立的应用,而进程可看做独立应用
- 进程有独立的地址空间,相互影响,线程只是进程的不同执行路径
- 线程没有独立的地址空间,多进程的程序比多线程程序健壮
- 进程的切换比线程切换开销大
进程的通信实现
管道
半双工,速度慢,容量有限,只能父子间通信
命名管道
FIFO
任何进程间都能通信,速度慢
信号量
不能传递复杂消息,只能同步
共享内存
能够很容易控制容量,速度快
线程的通信实现
wait/notify机制
wait : 让当前线程释放对象锁,并进入阻塞状态。
notify :唤醒一个正在等待相应对象锁的线程,使其进入同步队列,以便在当前线程释放锁后竞争所,进而得到 CPU 的执行。在执行 notify 方法之后,当前线程并不能马上释放锁对象,呈 wait 状态的线程也并不能马上获取该对象锁,只有执行 notify 方法的线程退出 synchronized 代码块/方法后,当前线程才会释放锁,而呈 wait 状态的线程才会去竞争锁。
notityAll :唤醒所有正在等待相应对象锁的线程。
Condition
await
singal
singalAll
生产者消费者模型
管道 PipedOutStream/PipedInputStream
Join
假如在main线程中调用thread.join方法,则main线程会等待thread线程执行完毕或者等待一定的时间。join 是调用 wait 方法实现,同样会让宿主线程交出 CPU 的执行权限,会让线程释放对一个对象持有的锁,如果调用了 join 方法,必须捕获 InterruptedException 异常或者将该异常向上层抛出。