进程和线程

进程的切换过程

用户态发生系统调用进入内核态

进程和线程的区别

  • 进程是资源分配的最小单位,线程是 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 异常或者将该异常向上层抛出。

-------------本文结束感谢您的阅读-------------