golang创建linux线程,Go:内核线程、LWP、用户线程? 还是协程?-Go语言中文社区

1.三种概念——内核线程、轻量级进程、用户线程:

内核线程:

使用内核栈和和寄存器空间,但是调度成本高,等价于进程

内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核。

轻量级进程(LWP):

共用父进程的资源,调度同普通进程

轻量级进程(LWP)是建立在内核之上并由内核支持的用户线程,它是内核线程的高度抽象,每一个轻量级进程都与一个特定的内核线程关联。内核线程只能由内核管理并像普通进程一样被调度。

用户线程:

与所属进程共享进程地址空间和系统资源,调度:由在用户空间实现的线程库,在所属进程内进行调度

用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全又库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。

2.用户多线程的实现方式:

a.LWP作为多线程方案

缺点:LWP数量存在限制,LWP利用率较低

eaa5fea06bf7ceb8b9916f9479a2ee95.png

b.纯用户空间多线程方案

缺点:如果某个用户线被阻塞,导致进程同样被阻塞

60196a93201e8ce130af7bc9069443d6.png

c.混合版多线程方案

用户线程底层对应多LWP,减少线程切换代价的同时,提升并行能力

4a81aee17fb6569a431f981bede9f2c2.png

3.linux的线程实现:

Linux 线程采用LWP实现,一个线程对应一个LWP,一对一关系

4.核心线程和用户线程的区别:

5.协程:

a.协程相比于线程的优势

资源占用小,堆栈大小只有若干 kb,可以进行增减,并将数据存储于堆空间中

OS内核线程复用程度更高,1个线程可以对应N个goroutine

协程使用信道(Channel)来进行通信。

简单来说:调度(M:N)、单个协程资源占用

b.Go的协程执行原理

c.Go 调度器

调度原理图:

M:核心线程

P:执行器

G:goroutine任务

goroutine任务会首先放到global queue中,然后再下放到具体的goroutine执行器队列中

3d0288b9ca8cea4093e2d681be4a7d32.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值