go语言实现500毫秒等待与常驻进程

最近在整理面经,经过几次面试被问的最多的就是进程和线程。如果是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、浮点数寄存器


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空