golang干货,一文弄懂进程、线程、协程

最近在整理面经,经过几次面试被问的最多的就是进程和线程。如果是golang开发,那么协程也会必问。

这里整理一下所有的资料,彻底把这个问题解决。

首先,进程是程序的某段执行过程。进程的存在是为了执行作业。进程是动态的,程序是静态的。其存在标志是pcb(进程控制块)+程序段+数据段。

线程分为内核级线程和用户级线程。一个进程中有一个或多个线程,是一种包含关系。引入线程的目的是为了提升资源利用率,提升计算机的性能。

协程是纯用户级的,对于操作系统来说协程必定是透明的。他是go语言中一种轻量级线程,具有非常强的性能。因为它的创建销毁代价都非常小,而且支持动态分配内存(从2kb起)。

这三者是从大到小的包含关系。

区别:

1、进程是内存分配的最小单位,线程是cpu调度的最小单位。

2、进程、线程调度由操作系统决定,但协程调度可以由用户设计。

3、进程独享内存空间,但线程可以共享内存。

4、切换进程需要切换内存空间,代价很大,切换线程代价小,协程切换代价最小。

5、进程通信方式:共享内存区域,管程,管道,消息队列,信号量

6、线程间通信方式:互斥量、信号量、事件

7、协程比线程优越的地方就在于可以优化调度方式,更轻量更高效(但也更容易出bug)

补充问题:线程调度时需要保存什么数据?

首先,线程调度时需要保存现场,一组通用寄存器。

其次,将要执行的下一条指令。也就是包含了,rip,rsp,rbp寄存器。

最后,还要切换的是函数调用栈。

从以上三点去回答。

协程调度与哪些寄存器相关?

实际上广义的协程就是用户级线程。

所以上面那条回答依旧是可以参考的,这里总结一个更精确的版本:

1、下一条指令地址rip

2、栈指针rsp

3、一组通用寄存器

返回值寄存器:rax
参数寄存器:rdi、rsi、rdx、rcx、r8、r9
Callee-Saved Register: rbx、rbp、r12、r13、r14、r15
Caller-Saved Register: r10、r11

4、状态寄存器

5、sse、浮点数寄存器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值