面试题答案
一键面试1. 性能差异
内存使用
- 进程:每个进程都有独立的内存空间,包括代码段、数据段、堆、栈等。这意味着进程间内存隔离,一个进程的崩溃不会影响其他进程,但也导致内存占用较大。例如,若有多个进程都运行同样的 Ruby 程序,每个进程都需要完整加载程序代码及相关资源到内存。
- 线程:同一进程内的所有线程共享进程的内存空间,如堆、全局变量等。线程只需分配自己的栈空间用于局部变量和函数调用等,因此内存占用相对进程要小很多。比如一个 Ruby 程序创建多个线程处理不同任务,线程间共享程序的全局数据,大大节省内存。
上下文切换开销
- 进程:进程上下文切换开销大,因为切换时需要保存和恢复整个进程的内存空间、寄存器状态、文件描述符等众多信息。例如,在多进程的 Ruby 应用中,当操作系统调度从一个进程切换到另一个进程时,需要花费较多时间来保存当前进程的所有状态并加载下一个进程的状态。
- 线程:线程上下文切换开销相对较小,因为线程共享进程的大部分资源,切换时主要保存和恢复线程的栈指针、寄存器状态等少量信息。例如在 Ruby 的多线程应用中,线程间切换速度比进程间切换要快很多,因为不需要重新加载整个内存空间。
2. 任务场景选择
CPU 密集型任务
- 选择进程:由于 CPU 密集型任务长时间占用 CPU 资源,多线程在这种情况下会因为全局解释器锁(GIL)的存在,无法真正利用多核 CPU 优势。而进程可以利用多核,每个进程独立运行在不同 CPU 核心上,提高整体计算效率。例如,在一个 Ruby 编写的科学计算程序中,需要进行大量的数值计算,使用多进程可以并行处理不同部分的计算任务,充分利用多核 CPU。
- 案例:假设开发一个基因序列比对程序,该程序需要对大量基因数据进行复杂的比对计算,属于 CPU 密集型任务。采用多进程架构,每个进程负责一部分基因数据的比对,不同进程在多核 CPU 上并行运行,能够显著提高比对速度。
I/O 密集型任务
- 选择线程:I/O 密集型任务大部分时间都在等待 I/O 操作完成,如文件读取、网络请求等,此时线程不会长时间占用 CPU,GIL 的影响较小。多线程可以在等待 I/O 时让出 CPU 资源给其他线程,提高程序的并发性能。例如,一个 Ruby 编写的网络爬虫程序,需要频繁进行网页请求和文件下载,使用多线程可以在一个线程等待网络响应时,其他线程继续发起新的请求,提高爬取效率。
- 案例:开发一个图片下载程序,程序需要从多个 URL 下载图片,属于 I/O 密集型任务。使用多线程,一个线程负责发起网络请求下载图片,在等待下载完成时,其他线程可以继续处理下一个图片的下载请求,从而加快整体下载速度。