面试题答案
一键面试资源占用
- 多线程:共享进程资源,如内存空间、文件描述符等,线程自身只需少量栈空间用于局部变量和函数调用,资源占用相对少。例如一个HTTP服务器进程,多个线程可共享进程的网络连接池等资源。
- 多进程:每个进程有独立的地址空间、内存、文件描述符等,资源占用大。像一个多进程的数据库服务,每个进程都有自己独立的内存空间用于数据存储和处理。
通信方式
- 多线程:通过共享内存进行通信,简单直接,但需注意同步问题防止数据竞争。比如在一个图形渲染程序中,不同线程通过共享的图形数据缓冲区进行数据交互。
- 多进程:通信相对复杂,常用方式有管道(pipe)、消息队列、共享内存(需同步机制)、套接字(socket)等。如在一个分布式文件系统中,不同进程通过消息队列传递文件操作指令。
同步机制
- 多线程:由于共享资源,需使用互斥锁(mutex)、条件变量(condition variable)、信号量(semaphore)等同步机制来保护共享数据,避免竞争条件。例如在一个多线程的银行转账程序中,使用互斥锁保护账户余额这一共享数据。
- 多进程:同步机制类似,但由于进程独立性,同步实现相对复杂。例如在多个进程协作处理大数据的场景中,使用信号量控制对共享资源(如共享文件)的访问。
上下文切换开销
- 多线程:切换只需保存和恢复少量寄存器内容及栈指针,开销小。在一个实时音频处理程序中,多个线程频繁切换处理音频数据,因开销小能保证处理效率。
- 多进程:切换涉及整个地址空间的切换,包括内存映射、文件描述符等,开销大。如在一个多进程的大数据计算任务中,进程间切换开销较大影响整体性能。
适用场景
- 多线程适用场景:I/O 密集型应用,如Web服务器处理大量HTTP请求,线程间共享资源可高效处理请求,且上下文切换开销小;对响应速度要求高且数据共享频繁的场景,如实时游戏中的图形渲染和用户输入处理。
- 多进程适用场景:计算密集型应用,每个进程可充分利用多核CPU资源,且进程独立不会因一个进程崩溃影响其他进程,如科学计算中的大规模数据处理;对稳定性和安全性要求高的场景,如数据库服务,每个进程独立运行保障数据安全和服务稳定。