概述

进程:程序是静止的,进程实体的运行过程就是进程,是系统进行资源分配的基本单位

进程的特征:并发性、异步性、动态性、独立性、结构性

线程:线程是属于进程的,是一个基本的 CPU 执行单元,是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度的基本单位,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,与同属一个进程的其他线程共享进程所拥有的全部资源

关系:一个进程可以包含多个线程,这就是多线程,比如看视频是进程,图画、声音、广告等就是多个线程

线程的作用:使多道程序更好的并发执行,提高资源利用率和系统吞吐量,增强操作系统的并发性能

并发并行:

  • 并行:在同一时刻,有多个指令在多个 CPU 上同时执行
  • 并发:在同一时刻,有多个指令在单个 CPU 上交替执行

同步异步:

  • 需要等待结果返回,才能继续运行就是同步
  • 不需要等待结果返回,就能继续运行就是异步

参考视频:https://www.bilibili.com/video/BV16J411h7Rd

笔记的整体结构依据视频编写,并随着学习的深入补充了很多知识


对比

线程进程对比:

  • 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集

  • 进程拥有共享的资源,如内存空间等,供其内部的线程共享

  • 进程间通信较为复杂

    同一台计算机的进程通信称为 IPC(Inter-process communication)

    • 信号量:信号量是一个计数器,用于多进程对共享数据的访问,解决同步相关的问题并避免竞争条件
    • 共享存储:多个进程可以访问同一块内存空间,需要使用信号量用来同步对共享存储的访问
    • 管道通信:管道是用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件 pipe 文件,该文件同一时间只允许一个进程访问,所以只支持半双工通信
      • 匿名管道(Pipes):用于具有亲缘关系的父子进程间或者兄弟进程之间的通信
      • 命名管道(Names Pipes):以磁盘文件的方式存在,可以实现本机任意两个进程通信,遵循 FIFO
    • 消息队列:内核中存储消息的链表,由消息队列标识符标识,能在不同进程之间提供全双工通信,对比管道:
      • 匿名管道存在于内存中的文件;命名管道存在于实际的磁盘介质或者文件系统;消息队列存放在内核中,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才被真正删除
      • 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收

    不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP

    • 套接字:与其它通信机制不同的是,可用于不同机器间的互相通信
  • 线程通信相对简单,因为线程之间共享进程内的内存,一个例子是多个线程可以访问同一个共享变量

    Java 中的通信机制:volatile、等待/通知机制、join 方式、InheritableThreadLocal、MappedByteBuffer

  • 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低