浅谈操作系统中进程、线程、协程的联系

前言:

最近在学习golang语法特性,golang和其它语言最大区别莫过于goroutine,这块知识点博主已经太久没有温固,对协程认知已经处于盲点。因此本文主要带你认知操作系统中进程、线程、协程。

进程

在Window系统中,打开任务管理器,你可以看到当前操作系统中正在运行的进程详细信息。

在Linux系统中,运行top命令,你可以看到当前操作系统中正在运行的进程详细信息。

因此在三程中,进程是最容易直观理解的对象:进程是程序的基本执行实体。当程序开始运行时,操作系统将为进程分配一个内存结构体给程序,该结构体定义为:

此外,操作系统将为进程分配CPU时间片。因此,对操作系统来讲,进程是资源分配的最小单位。

进程在操作系统中共有五种状态:

1.创建状态

程序启动,操作系统为其进程分配内存结构体等资源后,插入到运行队列中。

2.就绪状态

进程获取除CPU使用权限外的所有必要资源。当操作系统有多个进程处于就绪状态时,按照一定策略分配CPU使用权限。

3.运行状态

进程获得CPU使用权限,开始进行程序内部逻辑操作。对于CPU来说,同一时刻,每个核心只能处理一个进程。

4.阻塞状态

进程发生阻塞,比如IO请求等。当前进程不在执行逻辑操作,操作系统会将CPU使用权限分配给其他就绪状态的进程。

5.终止状态

程序运行结束,操作系统收回分配给进程的资源。

线程

1、对操作系统来讲,线程是能够进行运算调度的最小单位。

2、进程是线程的容器,线程是进程实际运行的单位。因此进程至少用于一个线程(主线程)。

3、单个进程,可以拥有多个线程,线程间共享进程资源。

4、单个进程的多个线程可以并发运行。

5、对于操作系统来说,开启线程的性价比高于进程,以此我们在处理并发业务时,一般使用多线程开发。

协程

1、一个线程可以拥有多个协程。协程不是被操作系统所管理的,而是完全由程序所控制。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。

2、因为线程是能够进行运算调度的最小单位,所以线程内部多个协程是串行运行。因此提升CPU核心数量,不能够提升协程效率。

3、因为多线程共享进程资源,因此线程间访问资源需要加线程读写锁。但是多协程编程,只有一个线程,不存在资源同时访问,因此对于共享资源不需要加锁,执行效率要高的多。

协程是由程序进行控制,因此每个协程库所使用的模型可能并不相同。下面介绍一下golang中的协程模型。

GOLANG协程模型

1、每一个线程都绑定一个处理器,线程在运行期间会从处理器的协程队列中,获取协程执行。

2、全局协程队列会和各个处理器协程队列互相交换协程

3、线程运行协程切换时间是10ms,也就是说 协程 最多执行10ms就会被 M 切换到下一个协程。

4、协程10ms运行完被线程中断后。将寄存器里的栈信息,保存到自己的 协程对象里面。

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值