首页 > 编程语言 > 详细

进程、线程、协程

时间:2020-03-22 12:36:38      阅读:55      评论:0      收藏:0      [点我收藏+]

进程

进程是系统资源分配的最小单位, 系统由一个个进程(程序)组成 一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

  • 文本区域存储处理器执行的代码
  • 数据区域存储变量和进程执行期间使用的动态分配的内存;
  • 堆栈区域存储着活动过程调用的指令和本地变量。

因此进程的创建和销毁都是相对于系统资源,所以是一种比较昂贵的操作。 进程有三个状态:

  1. 等待态:等待某个事件的完成;
  2. 就绪态:等待系统分配处理器以便运行;
  3. 运行态:占有处理器正在运行。

进程是抢占式的争夺CPU运行自身,而CPU单核的情况下同一时间只能执行一个进程的代码,但是多进程的实现则是通过CPU飞快的切换不同进程,因此使得看上去就像是多个进程在同时进行.

通信问题:    由于进程间是隔离的,各自拥有自己的内存内存资源, 因此相对于线程比较安全, 所以不同进程之间的数据只能通过 IPC(Inter-Process Communication) 进行通信共享.

线程

  • 线程属于进程
  • 线程共享进程的内存地址空间
  • 线程几乎不占有系统资源 通信问题:   进程相当于一个容器,而线程而是运行在容器里面的,因此对于容器内的东西,线程是共同享有的,因此线程间的通信可以直接通过全局变量进行通信,但是由此带来的例如多个线程读写同一个地址变量的时候则将带来不可预期的后果,因此这时候引入了各种锁的作用,例如互斥锁等。

同时多线程是不安全的,当一个线程崩溃了,会导致整个进程也崩溃了,即其他线程也挂了, 但多进程而不会,一个进程挂了,另一个进程依然照样运行。

  • 进程是系统分配资源的最小单位
  • 线程是CPU调度的最小单位
  • 由于默认进程内只有一个线程,所以多核CPU处理多进程就像是一个进程一个核心

线程和进程的上下文切换

进程切换分3步:

  1. 切换页目录以使用新的地址空间
  2. 切换内核栈
  3. 切换硬件上下文

而线程切换只需要第2、3步,因此进程的切换代价比较大

协程

  Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法。一个运行的程序由一个或更多个goroutine组成。它与线程、协程、进程等不同。它是一个goroutine。

  创建的资源少(2K),使用的寄存器少;如同函数的 call/return 一样,有自己的调度器(G-P-M)进行协作式调度(不是抢占式);基于用户态线程执行,切换开销低;

                                                                                                                                     技术分享图片

  https://wudaijun.com/2018/01/go-scheduler/

进程、线程、协程

原文:https://www.cnblogs.com/linguoguo/p/11561179.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!