面试题答案
一键面试调度机制
- 协程:由用户空间代码控制调度,即程序员自己决定协程的切换时机。例如在Python的
asyncio
库中,通过await
关键字暂停当前协程,将执行权交给其他协程。这种调度方式是非抢占式的,只有当协程主动让出控制权时,其他协程才有机会执行。 - 线程:由操作系统内核进行调度。操作系统按照一定的调度算法(如时间片轮转、优先级调度等),在不同线程间分配CPU时间。这是一种抢占式调度,操作系统可以根据自身策略暂停一个线程,将CPU资源分配给其他线程。
资源占用
- 协程:资源占用极少。因为协程本质上是用户态的轻量级线程,创建和销毁的开销很小,且共享同一线程的资源,如内存空间、文件描述符等。一个进程内可以轻松创建成千上万的协程。
- 线程:每个线程都需要独立的栈空间(通常几MB大小)来保存自身的执行上下文和局部变量等,并且线程的创建、销毁以及管理都需要操作系统内核的参与,所以资源占用相对较大。在一个进程中创建过多线程会消耗大量系统资源,甚至导致系统性能下降。
上下文切换开销
- 协程:上下文切换开销极低。由于协程在用户空间内进行调度,切换时只需要保存和恢复少量的寄存器值等用户态上下文信息,不需要陷入内核态,所以切换速度极快。
- 线程:上下文切换开销较大。线程的上下文切换需要操作系统内核的介入,要保存和恢复线程的内核态上下文,包括寄存器值、栈指针等信息,涉及用户态与内核态的切换,这个过程相对复杂且耗时。