第十四章 并发编程初识
本章主要介绍了并发编程涉及的几个概念, 包括cpu执行任务的三种方式: 串行, 并行, 并发. 和程序的三种存在形式: 进程, 线程, 协程以及相关衍生概念. 再加上消息通信的两种方式: 同步, 异步
一句话概: 一个CPU上,按顺序完成多个任务
串行图解:
一句话概括: 一个cpu上, 交替执行多个任务
并发图解:
一句话概括: 多个cpu上, 同时执行多个任务(任务数<=CPU核数) 并行必须有多cpu才能实现,否则只能实现并发(伪并行)
并行图解:
串行, 并行, 并发总结如下:
进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例. 程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行.
进程的优点:
进程的缺点:
线程是程序执行时的最小单位,也是CPU调度和分派的基本单位. 一个进程可以由很多个线程组成,拥有自己独立的栈和共享的堆,共享堆,不共享栈,标准线程由操作系统调度. 线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行. 同样多线程也可以实现并发操作,每个请求分配一个线程来处理.
多线程
多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行. 多线程编程能够最大限度的利用CPU的资源: 如果某些线程不需要占用CPU时间片时, 可以让出当前时间片, 让其他线程获取到CPU资源. 以此来达到最大限度利用CPU资源的目的. 这个过程也被成为上下文切换.
线程生命周期
线程主要有“新建”(NEW)、“就绪”(RUNNABLE)、“运行”(RUNNING)、“阻塞”(BLOCKED)、“死亡”(DEAD)** 五种状态. 各状态间的转换如下图所示:
注意事项:
协程也叫作纤程(Fiber),是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理. 我们可以将协程理解为运行在线程上的代码块, 协程挂起并不会引起线程阻塞, 他的作用是提高线程的利用率… 协程之间可以依靠邮箱来进行通信和数据共享, 了避免内存共享数据而带来的线程安全问题. 因为其轻量和高利用率的特点, 即使创建上千个线程也不会对系统造成很大负担, 而线程则恰恰相反. 协程是一种设计思想,不仅仅局限于某一门语言. 在Go, Java, Python 等语言中均有实现
协程的核心(控制流的让出和恢复)
进程和线程之间的区别
线程, 进程, 协程之间区别如图所示:
同步和异步强调的是消息通信机制
同步(synchronous):A调用B,等待B返回结果后,A继续执行. 在同步的过程中, 存在一个等待的状态. 即: 某个事情执行时需要等待另一个个事情的结果, 才能继续向下执行.
以打电话为例:
A向B打电话时, 发出电话邀请, 只有B同意接听之后才会进行通话, 否则会一直处于等待状态(阻塞). 这一过程称为同步.
异步(asynchronous ):A调用B,A继续执行,不等待B返回结果;B有结果了,通知A,A再做处理.
以发短信为例:
A在给B发消息, 无需等待B的反馈, 便可以给C发消息. 这一过程成为异步.