进程
进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始状态,执行状态,等待状态,就绪状态,终止状态。通俗的讲,进程就是一个正在执行的程序。
线程
线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。
并发
并发是指在同一时间段内处理多个任务,通过多个任务之间的切换,使得在表面上看来是同时进行的。在 Go 语言中,可以使用 goroutine 和 channel 实现并发编程。
特点:
- 多个任务作用在一个CPU上面
- 同一时间点只能有一个任务执行
- 同一时间段内执行多个任务
并行
并行是指同时处理多个任务,即多个任务同时在不同的处理器上进行执行。并行可以显著提高程序的性能,特别是在多核 CPU 中,能够利用多个 CPU 核心进行计算。在 Go 语言中,可以使用 goroutine 和 runtime 包的 GOMAXPROCS 函数实现并行编程。
特点:
- 多个任务作用在多个CPU上面
- 同一时刻执行多个任务
- 通俗的讲,多线程程序在单核CPU上面运行就是并发,多线程程序在多核CUP上运行就是并行,如果线程数大于CPU核数,则多线程程序在多个CPU上面运行既有并行也有并发。
协程
协程(coroutine)是Go语言中的轻量级线程实现;与线程不同的是,协程不受操作系统调度,协程的调度由用户程序自行提供;Go语言中的协程调度器将协程调度到线程中运行
- 协程的开启(创建):在Go语言中,协程的创建很容易,关键字是Go:例如,用Go func()即开启了一个新的协程
- 与之相比的Java里的多线程,创建方法则略显复杂,需要通过thread类来开启一个线程。
协程的退出
在Go语言中,退出协程有两种方法: 1 通过 channel;2 通过 context ;
多协程和多线程
- Golang中每个goroutine(协程)默认占用内存比Java、C的线程少。
- OS线程(操作系统线程)一般都有固定的栈内存(通常为2MB左右),一个goroutine(协程)占用内存非常少,只有2KB左右,多协程切换调度开销方面远比线程要少。这也是为什么越来越多的大公司使用Golang的原因之一。
总结:
- 主线程是一个物理线程,直接作用在cpu 上的。是重量级的,非常耗费cpu 资源。
- 协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
- Golang 的协程机制是重要的特点,可以轻松的开启上万个协程。其它编程语言的并发机制是一般基于线程的
- 开启过多的线程,资源耗费大,这里就突显Golang 在并发上的优势了