『面试问答』:过程、线程和协程有什么区别?
进程 VS 线程流程是程序的执行过程,是操作系统资源分配和调度执行的基本单位。
线程是过程中的执行单位,是程序执行的最小单位。
主要区别如下
资源占用过程是一个独立的执行单位,具有独立的内存空间和系统资源,包括文件描述符、过程上下文等;线程是过程中的实体,共享过程资源,每个线程都有自己的程序计数器、堆栈空间和私人数据;
调度和切换成本过程切换需要更多的保存和恢复,而线程切换相对较轻,只需要保存和恢复堆栈和寄存器的状态;
通信和同步过程之间的通信需要操作系统提供的过程之间的同步机制:如管道、共享内存、消息队列等;线程可以通过共享内存进行数据交换和通信,同时也需要使用同步机制来避免竞争条件;
独立过程有独立的地址空间,在保护模式下不会影响其他过程;线程共享过程资源,线程错误可能导致整个过程崩溃;
协程是一种不受操作系统核心管理的用户状态,完全由用户控制,比线程更轻;一个过程可以有多个线程,一个线程也可以有多个协程;
用户状态执行,性能大大提高:操作系统负责调度线程切换,协议由用户自行调度,从而减少上下文切换,提高效率。
协程有自己的寄存器上下文和堆栈。协程调度切换时,将寄存器上下文和堆栈保存到线程堆区。切割时,恢复以前保存的寄存器上下文和堆栈。直接操作堆栈基本上没有核心切换成本,可以不锁定地访问全局变量,因此协程的上下文切换非常快。
上下文切换是指?当一个线程的时间片用完时,它将再次处于准备状态,并将其用于其它线程。这个过程属于上下文切换。
在执行过程中,线程会有自己的运行条件和状态(也称为上下文),如程序计数器、栈信息等。
以下情况会出现上下文切换
主动让出 CPU,比如调用了
sleep()
,wait()
等。时间片用完了,因为操作系统应该防止长时间占用一个线程或过程 CPU 导致其他线程或过程饿死。
调用阻塞类型的系统中断,如请求 IO,线程被堵塞。