并发编程-进程与线程

93 阅读3分钟

一. 进程与线程

本节内容如下:

  1. 进程和线程的概念
  2. 并行与并发的概念
  3. 线程基本应用

1.1 进程

  • 程序是由指令和数据组成, 但是这些指令要运行, 数据要读写, 就必须把指令加载到cpu, 数据加载到内存. 在指令运行过程中还需要用到磁盘, 网络等设备. 进程就是用来加载指令, 管理内存, 管理IO的.
  • 当运行一个程序, 从磁盘加载程序到内存, 这时就开启了一个进程.
  • 进程可以视为程序的一个实例. 大部分程序(软件)可以运行多个实例进程(如: 记事本, 画图, 浏览器), 也有的程序(软件)只能启动一个实例进程(如: 网易云音乐, 360卫士).

1.2 线程

  • 一个线程就是一个指令流, 将指令流中的一条条指令按照一定的顺序交给CPU执行.
  • JAVA中, 线程是最小调度单位, 进程是资源分配的最小单位.

1.2.1 线程的作用

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

1.3 进程和线程对比

  • 进程基本是相互独立的, 而线程存在于进程内, 是进程的一个子集(一个进程可以包含一到多个线程, 这就是多线程, 比如看一段视频是进程, 视频中的画面, 声音, 广告就是多个线程).
  • 每个进程都有独立共享的资源(如: 内存空间, 供其内部的线程共享).
  • 进程间通信较为复杂, 同一台计算机的进程通信称为IPC(Inter-process communication); 不同计算机之间的进程通信则需要用到网络, 并遵循共同的协议, 例如:HTTP协议.
  • 线程通讯相对简单, 因为他们共享所属进程内的内存(如: 多个线程可以访问同一个共享变量)
  • 线程更轻量, 上下文切换成本比进程的上下文切换低

二. 并行与并发

单核CPU下, 线程实际上是串行执行的. 操作系统中有一个组件叫做任务调度器, 会将CPU的时间片分给不同的程序使用(Windows下时间片最小约为15毫秒), 只是CPU在线程间的切换非常快(时间片很短), 人类感觉是同时运行的. 总结为一句话就是: 微观串行, 宏观并行.

2.1 并发

并发: 多个线程轮流使用CPU的场景(同一时刻, 多个指令在单个CPU上交替执行).

image.png

image.png

2.2 并行

并行: 多核CPU下, 每个核(core)都可以调度运行线程(同一时刻, 多个指令在多核(core)CPU上同时执行).

image.png

image.png

2.3 总结

引用Rob Pike(golang语言创造者)的描述:

  • 并发(concurrent): 同一时间应对多件事情的能力(如: 我需要做饭, 到扫卫生, 孩子喂奶, 轮流交替做这些事情, 这就是并发);
  • 并行(parallel): 同一时间做多件事情的能力(如: 我雇了3个保姆, 一个人做饭, 一个人打扫卫生, 一个人喂奶, 这就是并行);

三. 同步和异步

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