最近在整理面经,经过几次面试被问的最多的就是进程和线程。如果是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、浮点数寄存器
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删