概念

进程和线程

是什么? 比喻 关系
进程 一次执行过程 进程就是程序程序在操作系统中的一 次执行过程,是系统进行资源分配和调度的基本单位 迅雷下载文件夹,是一个进程,文件夹内有多个文件同时下载,这些叫线程

线程⊆进程
一个进程可以创建核销毁多个线程,
同一个进程中的多个线程可以并发执行
线程 一个执行实例 线程是进程的一个执行实例,是程序 执行的最小单元,它是比进程更小的能独立运行的基本单位. 一个程序至少有一个进程,一个进程至少有一个线程

局部解释:

  1. 任务管理器内可看到进程
    并发编程 - 图1
  2. 程序、进程、线程
    并发编程 - 图2
  3. 程序与进程的关系
    1. 静态与动态 程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而
      进程是程序在处理机上的一次执行过程,它是一个动态的概念。
    2. 生命周期
      程序可存于硬盘,进程创建后存于内存,断电丢失
    3. 用处
      进程更能真实地描述并发,而程序不能(没有 PCB)。
    4. 独立单位
      进程能够独立运行、独立分配资源和独立接受调度的基本单位,程序(没有 PCB)不能作为独立的单位运行。

并行和并发

是什么 比喻 需要什么支持?
并发 多线程程序在单核上运行,这就是并发 并发是两个队列交替使用一台咖啡机
并发编程 - 图3
软件
并行 多线程程序在多核上运行,就是并行 并行是两个队列同时使用两台咖啡机
并发编程 - 图4
硬件—多核处理器

解释:

  1. 并发具体解释
    因为是在一个cpu上,比如有10个线程,每个线程执行10毫秒(进行轮询操作), 从人的角度看,好像这10个线程都在运行,但是从微观上看,在某一个时间点看,其实只有一个线程在执行,这就是并发。
    并发编程 - 图5
  2. 并行
    并发编程 - 图6
  3. 一般而言,并行速度高于并发

go语言的并发

有人把 Go 比作 21 世纪的 C 语言,第一是因为 Go 语言设计简单,第二,21 世纪最重要的就是并行程序设计,而 Go 从语言层面就支持了并发。同时,并发程序的内存管理有时候是非常复杂的,而 Go 语言提供了自动垃圾回收机制。 Go 语言为并发编程而内置的上层 API 基于 CSP(communicating sequential processes, 顺序通信进程)模型。这就意味着显式锁都是可以避免的,因为 Go 语言通过相册安全的通道发送和接受数据以实现同步,这大大地简化了并发程序的编写。 一般情况下,一个普通的桌面计算机跑十几二十个线程就有点负载过大了,但是同样这台机器却可以轻松地让成百上千甚至过万个 goroutine 进行资源竞争

Go协程和主线程

  1. 概念理解
    1. 在go里,进程与线程➡主线程+协程
    2. 主线程=线程=进程
      (有的程序员直接这么讲)(俺很迷惑)
    3. 可以这么理解协程:
      协程是轻量级的线程(编译器做的优化)
  2. Go协程的特点(面试考点)
    1. 有独立的栈空间
    2. 共享程序堆空间
    3. 调度由用户控制
    4. 协程是轻量级别的线程

并发编程 - 图7